MFC应用程序闪烁的问题

          在软件综合实习的时候,遇到了写的mfc应用程序闪烁的问题,即:当放大缩小窗口的时候,重绘操作速度很慢,导致了mfc应用程序不流畅。

  假设新图需要画part_1,part_2,part_3三部分,如果采用直接画图的方法,就会相应三次WM_PAINT消息,每一次响应WM_PAINT消息,都要调用一次OnDraw()函数:首先用白色画布覆盖,然后再白色画布上画新图。因此频繁调用WM_PAINT会造成闪烁问题。

          如果只调用一次WM_PAINT呢?

          这就不会闪烁了,我们可以先在内存中建立一个画布,将需要画的内容先画在画布之中,然后将新的画布统一画入屏幕。

 以下是代码,来源于baidu百科:


首先给出实现的程序,然后再解释,同样是在OnDraw(CDC *pDC)中:
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象
//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画 ^_^
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小,也可以自己定义(如:有滚动条时就要大于当前窗口的大小,在BitBlt时决定拷贝内存的哪部分到屏幕上)
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//先用背景色将位图清除干净,这里我用的是白色作为背景
//你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));
//绘图
MemDC.MoveTo(……);
MemDC.LineTo(……);
//将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
//绘图完成后的清理
//把前面的pOldBit选回来.在删除MemBitmap之前要先从设备中移除它
MemDC.SelectObject(pOldBit);
MemBitmap.DeleteObject();
MemDC.DeleteDC();


发布了92 篇原创文章 · 获赞 18 · 访问量 12万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章