50分求教MFC对话框中双缓冲绘图避免闪烁的问题

2025-05-20 07:35:36
推荐回答(2个)
回答(1):

楼上回答的仍然是Win32API实现的双缓冲,我来给个用MFC实现的。例子可能特殊了一点,不过应该能看明白。双缓冲当然需要一个缓冲C,如果你要画的东西总需要固定的背景(比如图片)的话,可能还需要一个背景DC:
在窗口类的声明中,即头文件中:
CDC m_dcMem,m_dcBack; //缓冲DC和背景DC
在窗口类的实现,即CPP文件中:
在OnInitDialog或者OnCreate里初始化两个DC,以下的m_nWidth和m_nHeight之类的变量肯定要换成你自己的:
m_dcMem.CreateCompatibleDC(GetDC());
m_dcBack.CreateCompatibleDC(GetDC());
CBitmap tmp,tmpp;
tmp.CreateCompatibleBitmap(GetDC(), m_nWidth, m_nHeight);
tmpp.CreateCompatibleBitmap(GetDC(), m_nWidth, m_nHeight);
m_dcBack.SelectObject(&tmp);
m_dcMem.SelectObject(&tmpp);
tmp.DeleteObject();
tmpp.DeleteObject();
然后每次先把背景DC画到缓冲DC上:
m_dcMem.BitBlt(0, 0, m_nWidth, m_nHeight, &m_dcBack, 0, 0, SRCCOPY);
然后再画自己的东西
m_dcMem.XXXXXX
(如果不需要背景DC,则直接把内容画到缓冲DC上)
最后记得在OnPaint里将缓冲DC画到实际的窗口上:
GetDC()->BitBlt(m_nLeft, m_nTop, m_nWidth, m_nHeight, &m_dcMem, 0, 0, SRCCOPY);

回答(2):

头文件里定义:
//双缓存
HDC m_MemDC;
HBITMAP m_hbitMap;//背景图片
HBRUSH m_bkBrush;
在onpaint函数里这样写:记得把hdc换成你paint里的dc.hdc,这里我懒得改了.拷我写的程序,你应该可以改的过来.

m_MemDC = ::CreateCompatibleDC(hdc);
m_hbitMap = ::CreateCompatibleBitmap(hdc,1024,768);
::SelectObject(m_MemDC,m_hbitMap);
m_bkBrush = ::CreateSolidBrush(RGB(150,150,150));
RECT rc ={0,0,1024,768};
::FillRect(m_MemDC,&rc,m_bkBrush);

//这里用m_MemDC绘制你的东西.
//
::BitBlt(hdc,0, 0, 1024, 768, m_MemDC, 0, 0, SRCCOPY);