MFC OnPaint函数得问题
梦竹 2011-11-22 09:59:10 各位大侠,我正在学习MFC,对MFC掌握不足,所以有很多问题希望大家帮忙。
最近写一个控件,建立的是dlg的app工程(用vs2005做的),在其中写了一个Cmyctrl类,继承自CWnd
实现的目标是要用鼠标拖动一个坐标的x,y轴来得到交叉点的位置。
主要代码如下:
//按下按钮的时候捕获按下的消息,将(BOOL)m_LBtnDown 设置为真
void Cmyctrl::OnLButtonDown(UINT nFlags, CPoint point)
{
m_LBtnDown = TRUE;
this->SetCapture();
}
//放开鼠标时释放
void Cmyctrl::OnLButtonUp(UINT nFlags, CPoint point)
{
m_LBtnDown = FALSE;
ReleaseCapture();
}
//移动的时候如果移动到坐标线的轴上的时候改变鼠标形状,并判断是在横坐标还是纵坐标上,然后跟踪鼠标位置,重画界面
void Cmyctrl::OnMouseMove(UINT nFlags, CPoint point)
{
HWND hwnd = ::GetActiveWindow();
if(point.x==pcenter.x && !m_LBtnDown)
{
m_VLineSelected = TRUE;
m_HLineSelected = FALSE;
SetCursor(LoadCursor(NULL,IDC_SIZEWE));
}
else if(point.y == pcenter.y && !m_LBtnDown)
{
m_HLineSelected = TRUE;
m_VLineSelected = FALSE;
SetCursor(LoadCursor(NULL,IDC_SIZENS));
}
else if(!m_LBtnDown)
{
m_HLineSelected = FALSE;
m_HLineSelected = FALSE;
SetCursor(LoadCursor(NULL,IDC_ARROW));
}
if(m_LBtnDown && m_HLineSelected)
{
pcenter.y = point.y;
::InvalidateRect(hwnd,NULL,TRUE);
}
else if(m_LBtnDown && m_VLineSelected)
{
pcenter.x = point.x;
::InvalidateRect(hwnd,NULL,TRUE);
}
}
//OnPaint函数
void Cmyctrl::OnPaint()
{
CPaintDC dc(this);
CDC * pDC = new CDC;
CRect rectClient;
CBitmap bitmaptmp,*pOldBitmap;
//获取客户区信息
GetClientRect(rectClient);
TRACE(L"%d,%d,%d,%d\n",rectClient.left,rectClient.top,rectClient.right,rectClient.bottom);
//创建位图内存
bitmaptmp.CreateCompatibleBitmap(&dc,rectClient.Width(),rectClient.Height());
pDC->CreateCompatibleDC(&dc);
pOldBitmap = pDC->SelectObject(&bitmaptmp);
//填充客户区
pDC->FillSolidRect(&rectClient,0xff3030);
//画坐标线
pDC->MoveTo(rectClient.left,pcenter.y);
pDC->LineTo(rectClient.right,pcenter.y);
pDC->MoveTo(pcenter.x,rectClient.top);
pDC->LineTo(pcenter.x,rectClient.bottom);
dc.BitBlt(0, 0, rectClient.Width(), rectClient.Height(), pDC, 0, 0, SRCCOPY);
pDC->SelectObject(pOldBitmap);
ReleaseDC(pDC);
delete pDC;
}
这样做有个问题,就是在拖动坐标线的时候会不停闪屏,特别不舒服,请大虾指教,怎么做才能不出现闪屏,还能正常拖动坐标线。