在 OnPaint 中闪烁

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)

Ben*_*igt 5

默认情况下,通过使用背景画笔清除客户区来绘制背景。你想把它关掉。处理WM_ERASEBKGND什么都不做,因为无论如何你都会在任何现有图像的顶部进行 blit。

另请参阅如何在 Windows 对话框中处理 WM_ERASEBKGND 时避免闪烁