MFC中鼠标响应textOut()输出文本

最近在工作中有个关于MFC的需求:点击Table中的粗略信息,在页面中显示对应的历史详细信息。本身不是很难,但是其中因为忽视了一个小问题耽误了很多时间。由于涉及公司内部代码,只贴出部分并修改供理解思想。

1.继承CView类

2.实现输出信息的方法

void 类名::DrawStkInfo_AllHisInfo(POINT ptLeftTop,POINT ptRightDown,CDC *pDC)
{
        int nRow = 1;
        CRect m_rectCurrLocName[5]
        //设置响应范围
        list::iterator iter = m_listInfo.begin();
        while(iter != m_listInfo.end())
	{
		if(nRow < 5)
		{
			m_rectCurrLocName[nRow-1].left = m_dArrayDrawTextStatrX_T2[0]+1;
			m_rectCurrLocName[nRow-1].right = m_dArrayDrawTextStatrX_T2[1]-1;
			m_rectCurrLocName[nRow-1].top = m_dArrayDrawTextStatrY_T2[nRow]+1;
			m_rectCurrLocName[nRow-1].bottom = m_dArrayDrawTextStatrY_T2[nRow+1]-1;
			cDisable.CreateSolidBrush(RGB(108, 131, 139));
			pDC->FillRect(m_rectCurrLocName[nRow-1],&cDisable);
			cDisable.DeleteObject();
		}
        }

	CString strHistory = "";
	list::iterator iter = m_listInfo.begin();
	CString strTemp="";
	int nInterval=25;
	int nCurHsyIndex = (*iter)->ucCurHsyIdx;
	mapStk.Lookup((*iter)->stArrProcessHistory[nCurHsyIndex].usType,strTemp);
		
	advance(iter,m_nIndClickTab); //将iterator向后移动m_nIndClickTab位

	if(iter!=m_listInfo.end())
	{
		for(int i=0; i < 20 ; i++)
			strHistory.Format("PrcType=%d[%s],-->%d[%s],iter所指向list的信息}	
                pDC->TextOut(ptLeftTop.x +90 , ptRightDown.y +40 + i*nInterval , strHistory);
	}
}

3.设置鼠标响应并实时更新

void 类名::OnLButtonDown(UINT nFlags, CPoint point)
{
   
    for(int i =0; i<5; i++)
    {
		if(PtInRect(m_rectCurrLocName[i],point) && !m_bStkInfoView)
		{
			m_nIndClickTab = i;
			this->Invalidate();
			this->UpdateWindow();
			m_bStkAllHisInfoView = true;  //用于判断是否Table中有信息被点击
		}
    }
}

4.在onDraw()中调用draw方法

void CLBMViewerView::OnDraw(CDC* pDC)
{    
    CDC memDC;
    memDC.CreateCompatibleDC(pDC);//创建一个和pDC相同的内存pDC

    if(m_bStkAllHisInfoView)
		DrawStkInfo_AllHisInfo(ptLeftTop,ptRightDown,&memDC);
}

之前犯下的错误是把显示信息的操作直接放到了鼠标响应中,即鼠标左键按下后调用pDC->testOut(),结果是怎么都显示不出字符信息。显然这样是不行的,因为MFC的GDI中的所有draw操作都需要放在onDraw中,这样在有许多信息同时需要在界面进行刷新显示时才不会出现冲突。

你可能感兴趣的:(MFC中鼠标响应textOut()输出文本)