我有一个CWind类的孩子,我正在订阅OnPaint事件:
BEGIN_MESSAGE_MAP(MyListBox, CWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
如果在OnPaint处理程序中我在窗口中绘制一些简单的东西,比如边框,一切都很好。但是,如果我要添加Sleep(50);
(通过这样做我模拟一些硬绘图操作),我的窗口将闪烁。我不明白为什么会发生这种情况......可能会出现问题,就是经常调用OnPaint函数,大约每秒2-3次。
更新:我正在使用双biffering:首先我在PaintDeviceContent中绘制窗口内容,然后将此DC复制到窗口的DC。
Update2:这是代码:
void CDirectionsListBox::OnPaint()
{
CRect rectClient;
GetClientRect(rectClient);
CPaintDC dc(this); // device context for painting
CDC DCMem;
DCMem.CreateCompatibleDC( &dc );
// Draw window here, workign with DCMem
dc.BitBlt(0, 0, rectClient.Width(), rectClient.Height(), &DCMem, 0, 0, SRCCOPY);
}
答案 0 :(得分:4)
默认情况下,通过使用背景画笔清除客户区域来绘制背景。你想把它关掉。处理WM_ERASEBKGND
并且什么也不做,因为无论如何你都要在任何现有图像的顶部进行blit。
另见How to avoid flicker while handling WM_ERASEBKGND in Windows dialog
答案 1 :(得分:1)
您的窗口闪烁的原因是因为它正在尝试显示尚未完成绘制的内容。
使用MFC绘图时,如果绘图操作非常重要,则需要手动双重缓冲要绘制的窗口。从本质上讲,您要做的是在内存中创建绘图上下文,然后绘制到该内容。绘图完成后,将内存上下文中的内容复制到窗口上下文中。