VC如何实现完全无闪烁的界面自绘,别说什么双缓存,也不要界面库

Howard-Lu 2011-08-31 10:45:30
使用DirectUI的界面渲染效果非常好,比如QQ,飞信这种,但我发现比如酷我音乐盒和360安全卫士,仍然是采用ATL和win32实现的,因为用Spy++可以探测到窗体句柄,但是它们都没有丝毫闪烁。我在使用GDI自绘的时候总会有或多或少的闪烁,双缓存绘制也是。要完全无闪烁该怎么办才好?
...全文
1569 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
牛 魔 王 2011-12-16
  • 打赏
  • 举报
回复
嘘唏了
大道曙光 2011-09-20
  • 打赏
  • 举报
回复
马瑞卡 学习
jic5566 2011-09-04
  • 打赏
  • 举报
回复
跟着高手学习学习
dfasri 2011-09-02
  • 打赏
  • 举报
回复
缩小区域, 必须要有数学基础, 其实也就只是简单的加减乘除, 得到重画区域要重画什么然后画上去而已.
像一个无窗口句柄的按钮, 假如这个按键要改变状态, 调用整个窗口句柄invalidate的话, 那肯定会闪, 但假如只单纯调用个UpdateRect(&ButtonRect), 然后再由Button具体的状态画上相应的东西, 那肯定不会闪屏.
滚动时, 其实整个界面要刷新的只单纯是窗口相应滚动方向的像素, 假如为了求简单, 滚动也只是个Invalidate的话, 肯定全屏在闪, 即使双缓冲也照样闪的, 但假如计算出滚动出来的内容, 只补画上这部分内容, 那就肯定不会感觉闪. 刷新滚动区域等等这类操作, VC下有个例子的, 教你怎样画表格的.
Howard-Lu 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 g_spider 的回复:]

是没有用非客户区。
[/Quote]

你这个效果蛮漂亮哎,VC什么版本?或者是WPF?
Howard-Lu 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 citroen_kimi 的回复:]

你这也叫双缓冲?我没觉得你在内存绘图,虽然用到了bitblt,但是你还有很多的pDC->PatBlt,DrawText之类的,你试下全部放内存绘,显示只用一次BitBlt看看,应该不会闪烁,再说你的界面绘制频率应该不会太高,看起来就是个聊天窗口一样
[/Quote]

这里显然不是,这是非客户区的绘制。这是标题栏的绘制,所以来找点建议。因为标题栏的自绘我以前没有做过。
G_Spider 2011-09-02
  • 打赏
  • 举报
回复
是没有用非客户区。
G_Spider 2011-09-02
  • 打赏
  • 举报
回复
我那个例子就没有用客户区。加个WS_POPUP.
[Quote=引用 33 楼 zerolusta 的回复:]
引用 31 楼 g_spider 的回复:

引用 30 楼 gibsonboy 的回复:
界面圆角处理。

用这么多代码?
CreateRoundRectRgn() 没用过吗。


这个在取消了非客户区的时候应该不行
[/Quote]
pgmsoul 2011-09-02
  • 打赏
  • 举报
回复
主窗口用 WS_EX_COMPOSITED,系统给你双缓冲,不用自己费劲。
citroen_kimi 2011-09-02
  • 打赏
  • 举报
回复
你这也叫双缓冲?我没觉得你在内存绘图,虽然用到了bitblt,但是你还有很多的pDC->PatBlt,DrawText之类的,你试下全部放内存绘,显示只用一次BitBlt看看,应该不会闪烁,再说你的界面绘制频率应该不会太高,看起来就是个聊天窗口一样
G_Spider 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 zerolusta 的回复:]
引用 41 楼 g_spider 的回复:

是没有用非客户区。


你这个效果蛮漂亮哎,VC什么版本?或者是WPF?
[/Quote]
汇编,也就是显示了一张bmp位图而已。带alpha通道,效果跟玻璃差不多。
Howard-Lu 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 g_spider 的回复:]

引用 11 楼 dfasri 的回复:

不闪烁的重点, 是在于怎样减小要重画的区域. 只要区域小, ……


完全同意,尽量不要使整个窗口失效。

例子:没有用双缓冲,但是不闪。
http://download.csdn.net/source/3082195
[/Quote]

你能用汇编做界面,很厉害。但是我不知道应该怎么样控制重绘次数和重绘区域,求指点
Howard-Lu 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chinatcp 的回复:]

一般的双缓冲只是在内存中绘制,再拷贝到前端。绘制复杂的画,还是有闪烁的。

应该在首次绘制完毕后直接保存到内存中,以后每次背景刷新直接从内存中复制,不用重新绘制。
[/Quote]

麻烦你看看我的绘图代码,有点多,不好在这里贴,谢谢!
http://download.csdn.net/source/3565277
Howard-Lu 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 starsunyzl 的回复:]

用双缓冲完全可以无闪烁的实现类似酷我、360的这种界面,可能楼主的双缓冲实现方法有问题吧,或者遗漏了什么没处理,比如WM_ERASEBKGND。
[/Quote]

谢谢帮忙,同上!
Howard-Lu 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dfasri 的回复:]

引用楼主 zerolusta 的回复:
使用DirectUI的界面渲染效果非常好,比如QQ,飞信这种,但我发现比如酷我音乐盒和360安全卫士,仍然是采用ATL和win32实现的,因为用Spy++可以探测到窗体句柄,但是它们都没有丝毫闪烁。我在使用GDI自绘的时候总会有或多或少的闪烁,双缓存绘制也是。要完全无闪烁该怎么办才好?


不闪烁的重点, 是在于怎样减小要重画的区域. 只要区域小,……
[/Quote]

谢谢你的指教,那应该如何控制重绘次数和重绘区域呢?这个问题我一直不是很清楚
Howard-Lu 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hurryboylqs 的回复:]

你把自己的代码贴出来 看下就知道了,不要说双缓存不行,可能是你没用对
或者理解错了

要解决闪烁和拖动卡,OnPaint这个函数里面耗时不能超过100毫秒
也就是说你不能在这个函数里执行太多的计算,基于此 你使用一个缓冲
在OnPaint里直接拷贝到屏幕DC,这个速度是很快的
其二、 不要随意的去刷背景,频繁刷背景可能会闪的
[/Quote]

谢谢那你的指点,因为我还重绘了NC区域,代码很多,所以不好贴,我把代码上传了,如果可以的话你看看该怎么修改好,就是希望没有任何闪烁。另外如果你有别的经验的啊希望不吝赐教啊
http://download.csdn.net/source/3565277
Howard-Lu 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 chinatcp 的回复:]

引用 10 楼 alexander_david 的回复:
少文件:
fatal error C1083: 无法打开包括文件:“../Common/RichEditCtrlOpt.h”: No such file or directory


下载后还不能打开,崩溃。。。。
[/Quote]

这只是客户端,完整是一个工作区,这个是工作区里面的一个工程,common的文件没有放进来,但是看代码够了。自绘NC区域和客户区的代码都在里面。谢谢。
Howard-Lu 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 alexander_david 的回复:]

少文件:
fatal error C1083: 无法打开包括文件:“../Common/RichEditCtrlOpt.h”: No such file or directory
[/Quote]

这只是客户端,完整是一个工作区,这个是工作区里面的一个工程,common的文件没有放进来,但是看代码够了。自绘NC区域和客户区的代码都在里面。谢谢。
罗平 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 alexander_david 的回复:]
少文件:
fatal error C1083: 无法打开包括文件:“../Common/RichEditCtrlOpt.h”: No such file or directory
[/Quote]

下载后还不能打开,崩溃。。。。
橘色的喵 2011-09-01
  • 打赏
  • 举报
回复
靠,下载还要分,看个毛
加载更多回复(23)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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