首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OnPaint中闪烁

在OnPaint中闪烁
EN

Stack Overflow用户
提问于 2012-02-06 16:54:01
回答 2查看 1.4K关注 0票数 2

我有一个CWind类的子类,在那里我订阅了OnPaint事件:

代码语言:javascript
复制
BEGIN_MESSAGE_MAP(MyListBox, CWnd)
    ON_WM_PAINT()
END_MESSAGE_MAP()

如果在OnPaint处理程序中,我在窗口中绘制了一些简单的东西,比如边框,一切都很好。但是,如果我添加Sleep(50);(通过这样做,我模拟了一些硬绘制操作),我的窗口将会闪烁。我不明白为什么会发生这种事。可能的问题是OnPaint函数经常被调用,大约每秒2-3次。

更新:我使用了双重区分:首先我在PaintDeviceContent中绘制窗口内容,然后将这个DC复制到window的DC中。

Update2:下面是代码:

代码语言:javascript
复制
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);
}
EN

回答 2

Stack Overflow用户

发布于 2012-02-08 12:37:37

默认情况下,通过使用背景画笔清除工作区来绘制背景。你想把它关掉。处理WM_ERASEBKGND,什么也不做,因为你无论如何都要在任何已存在的图像上进行blit。

另请参阅How to avoid flicker while handling WM_ERASEBKGND in Windows dialog

票数 5
EN

Stack Overflow用户

发布于 2012-02-06 17:08:34

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9157627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档