有关绘制位图时的屏幕闪烁

dandycheung 2001-04-16 01:34:00
VC中有两个例子显示bmp文件,使用MFC的diblook和使用sdk的showdib,showdib在改变窗口大小时非常优雅,而diblook却闪烁的很厉害,如何能使diblook也和showdib的性能一样?是什么导致此问题的发生?好像showdib并没有使用双缓冲之类的技术。
...全文
319 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
rockswang 2001-04-24
  • 打赏
  • 举报
回复
DrawDIB函数族是直接操作显存的,当然快得多。
eastrock 2001-04-24
  • 打赏
  • 举报
回复
我在Dialog中放置了一些按钮,如果用了OnEraseBkgnd(我在放置按钮的地方Brush成红色),会使得那些从control上抓下来的按钮给“淹没”了,这要如何。
eastrock 2001-04-24
  • 打赏
  • 举报
回复
把答案共享一下吧。谢谢.
dandycheung 2001-04-24
  • 打赏
  • 举报
回复
我将ShowDIB中的Dib.c分离了出来,自己用SDK创建了一个简单的程序,使用Dib.c中的函数向客户区作图,发现竟然和在dibLook中的现象一样,屏幕在不停的闪烁。于是我将ShowDIB程序中其他的代码一概删去,只剩下一个几乎和我的程序一模一样的东西,问题也依然存在。于是我认为问题不在代码中,经过仔细比较发现ShowDIB中的窗口类风格中没有包含通常我们注册窗口类时指定的CS_VREDRAW和CS_HREDRAW,大喜过望,把我的窗口类中的相应风格去掉后,果然也非常平滑。于是我使用Spy++查看了MFC生成的MDI子窗口的类风格,缺省都有CS_VREDRAW和CS_HREDRAW。用以下步骤改动程序后即可:
1、在CxxxView中添加BOOL静态成员变量m_bGrace并初始化为FALSE;
2、在OnCreate函数中添加以下代码:
if(!m_bGrace)
{
dwStyle = ::GetClassLong(m_hWnd, GCL_STYLE);
dwStyle &= ~(CS_VREDRAW|CS_HREDRAW);
m_bGrace = ::SetClassLong(m_hWnd, GCL_STYLE, dwStyle);
}

凭印象写的但大致不会错。
jumbo6 2001-04-24
  • 打赏
  • 举报
回复
a
jesun 2001-04-23
  • 打赏
  • 举报
回复
答案是什么?说出来大家分享一下先
dandycheung 2001-04-23
  • 打赏
  • 举报
回复
我找到答案了。
moony_blue 2001-04-19
  • 打赏
  • 举报
回复
可以试试用DirecDraw SDK来写屏,使用它的双缓冲技术可以基本保证刷新画面不会有闪烁。
dandycheung 2001-04-19
  • 打赏
  • 举报
回复
问题被淹没的太快了。
dandycheung 2001-04-19
  • 打赏
  • 举报
回复
问题被淹没的太快了。
dandycheung 2001-04-19
  • 打赏
  • 举报
回复
顺便说一下,视图窗口是处在另一个窗口的客户区之内。
dandycheung 2001-04-19
  • 打赏
  • 举报
回复
感谢大家的捧场,但是希望各位在回答前最好先把这两个例子编译比较一下,按照您自己的想法修改成功后再发表,千万不要想当然。
To Xiaoy:血狼所说的“影子位图”就是我提到的双缓冲。
freejam 2001-04-18
  • 打赏
  • 举报
回复
用影子位图
xiaoy 2001-04-18
  • 打赏
  • 举报
回复
麻烦“血狼”解释一个,什么是“影子位图”?谢谢!
jesun 2001-04-16
  • 打赏
  • 举报
回复
可以在视图类中设一个public变量bool m_bEraseBkgnd
在CMainFrame(多文档中是CChildFrame)的OnSize中将该变量设为false.
在视图类中重载WM_ERASEBKGND消息的处理函数OnEraseBkgnd(CDC* pDC),其内容修改为:
if (!m_bEraseBkgnd)
{
m_bEraseBkgnd=true;
return false;
}
else
return CScrollView::OnEraseBkgnd(pDC);
这样其他不需要刷新的地方只要将m_bEraseBkgnd=false就可以了。
cianiao 2001-04-16
  • 打赏
  • 举报
回复
我也认为是窗口背景擦除引起闪烁
cianiao 2001-04-16
  • 打赏
  • 举报
回复
我也认为是窗口背景擦除引起闪烁
tlovexyj 2001-04-16
  • 打赏
  • 举报
回复
留意WM_ERASEBKGND事件,默认中WINDOWS会以当前BRUSH把背景刷一下。这样就产生了闪烁。在此事件处理中return true;吧

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧