+ -
当前位置:首页 → 问答吧 → mfc中不断进行窗口的重绘该怎么解决

mfc中不断进行窗口的重绘该怎么解决

时间:2011-12-22

来源:互联网

我在画大位图时,用loadimage读取了图片,并添加了滚动条可以滚动。当我滚动多次的时候,窗口会不停地重绘,求解释。。。
以下是OnPaint中的内容。
CBitmap m_bmp;
HBITMAP m_worldMap;
m_bar,m_vbar分别为水平和垂直滚动条
  if(m_bmp.m_hObject != NULL)
m_bmp.Detach();
if(m_worldMap != NULL)
DeleteObject(m_worldMap);
m_worldMap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), "F:\\study\\大三上学期\\软件工程\\EditBitmap\\世界地图.bmp",
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if( m_worldMap == NULL )
{
MessageBox("Load failed");
return ;
}
m_bmp.Attach(m_worldMap);

PAINTSTRUCT ps;
HDC hdc = ::BeginPaint(GetSafeHwnd(), &ps);

HDC hdcMem = CreateCompatibleDC(hdc);
SelectObject(hdcMem, m_bmp);
CRect h, v;
CRect rect;
GetDlgItem(IDC_STATIC)->GetWindowRect(&rect);
ScreenToClient(&rect); //转成客户区坐标,否则显示位置不正确
m_bar.GetWindowRect(&h);
m_vbar.GetWindowRect(&v);
BitBlt(hdc, rect.left, rect.top, h.Width(), v.Height(), hdcMem, m_xPos, m_yPos, SRCCOPY);

::EndPaint(GetSafeHwnd(), &ps);
CDialog::OnPaint();

作者: includeintmain   发布时间: 2011-12-22

拖动滚动条肯定会重绘的,要不然你的图片就不能正常显示了,重要的是你滚动条拖动完,是否还是一直重绘,图片显示是否正确

作者: hnwyllmm   发布时间: 2011-12-22

滚动完后我用的是这两句
... //这里是改变滑块的位移
InvalidateRect(&rect);
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);

作者: includeintmain   发布时间: 2011-12-22

1、把LoadImage之类的工作放到其他地方,比如初始化或者按钮响应之类的,反正不要在OnPaint/OnDraw
2、双缓冲贴图,先画到MemDC,再在OnPaint里贴到屏幕DC

作者: just_swizard   发布时间: 2011-12-22

具体应该怎么做呢?我对双缓冲还不太熟..可否给个例子?

作者: includeintmain   发布时间: 2011-12-22

而且我滚动的时候需要位图也跟着移动,
BitBlt(hdc, rect.left, rect.top, h.Width(), v.Height(), hdcMem, m_xPos, m_yPos, SRCCOPY);
我试过,如果不重新LoadImage一次,就显示不出来...

作者: includeintmain   发布时间: 2011-12-22

求解释。。。

作者: includeintmain   发布时间: 2011-12-24