首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

Invalidate() question.该怎么解决

2012-03-09 
Invalidate() question..void SelectImage(){CFileDialog f(......)hBitmap (HBITMAP)::LoadImage(....,

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。

热点排行