See*_*eer 2 winapi mfc gdi visual-c++
我有一个 CWind 班的孩子,我在那里订阅 OnPaint 事件:
BEGIN_MESSAGE_MAP(MyListBox, CWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
Run Code Online (Sandbox Code Playgroud)
如果在 OnPaint 处理程序中我在窗口中绘制一些简单的东西,比如边框,一切都很好。但是如果我添加Sleep(50);(通过这样做我模拟了一些硬绘图操作)我的窗口将闪烁。我不明白为什么会发生这种情况......可能的问题是经常调用 OnPaint 函数,大约一秒内调用 2-3 次。
更新:我正在使用双重比对:首先我在 PaintDeviceContent 中绘制窗口内容,然后将此 DC 复制到窗口的 DC。
更新2:这是代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,通过使用背景画笔清除客户区来绘制背景。你想把它关掉。处理WM_ERASEBKGND什么都不做,因为无论如何你都会在任何现有图像的顶部进行 blit。
另请参阅如何在 Windows 对话框中处理 WM_ERASEBKGND 时避免闪烁