读书人

Invalidate() question.该怎么解决

发布时间: 2012-03-09 21:42:54 作者: rapoo

Invalidate() question..
void SelectImage()
{
CFileDialog f(......)
hBitmap = (HBITMAP)::LoadImage(....,f.GetPathName...);
}

void BitbltDraw()
{
//Invalidate(); //问题在于这,为什么加上Invalidate这句后,图片不能被绘制到控件上
//而不加Invalidate就可以正常绘制..
//我的意图是:下一次选择图片时不是覆盖于原图上,而是用Invalidate把绘制的清空,再绘新的图
CWnd *pWnd = GetDlgItem(IDC_IMAGE);
CDC *pDC = pWnd->GetDC();
CDC dcImage;
dcImage.CreateCompatibleDC(pDC);
hOldBmp = (HBITMAP)dcImage.SelectObject(hbitmap);

pDC->BitBlt(0, 0, m_Bm.bmWidth, m_Bm.bmHeight, &dcImage, 0, 0, SRCCOPY);
dcImage.SelectObject(hOldBmp);
}



[解决办法]
上面已经说了Invalidate会触发WM_PAINT消息,在你这个函数执行完后界面被刷新了,所以最终界面显示的是OnPiant()或者OnDraw()里面的内容。

很简单,在SelectImage最后调用Invalidate,在OnPaint或者OnDraw中调用BitbltDraw,把pDC指针传进去而不要在函数中自己获取DC。

读书人网 >VC/MFC

热点推荐