在OnPaint中闪烁

时间:2012-02-06 08:54:01

标签: winapi visual-c++ mfc gdi

我有一个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);
}

2 个答案:

答案 0 :(得分:4)

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

另见How to avoid flicker while handling WM_ERASEBKGND in Windows dialog

答案 1 :(得分:1)

您的窗口闪烁的原因是因为它正在尝试显示尚未完成绘制的内容。

使用MFC绘图时,如果绘图操作非常重要,则需要手动双重缓冲要绘制的窗口。从本质上讲,您要做的是在内存中创建绘图上下文,然后绘制到该内容。绘图完成后,将内存上下文中的内容复制到窗口上下文中。