社区
界面
帖子详情
VC如何实现完全无闪烁的界面自绘,别说什么双缓存,也不要界面库
Howard-Lu
2011-08-31 10:45:30
使用DirectUI的界面渲染效果非常好,比如QQ,飞信这种,但我发现比如酷我音乐盒和360安全卫士,仍然是采用ATL和win32实现的,因为用Spy++可以探测到窗体句柄,但是它们都没有丝毫闪烁。我在使用GDI自绘的时候总会有或多或少的闪烁,双缓存绘制也是。要完全无闪烁该怎么办才好?
...全文
1569
49
打赏
收藏
VC如何实现完全无闪烁的界面自绘,别说什么双缓存,也不要界面库
使用DirectUI的界面渲染效果非常好,比如QQ,飞信这种,但我发现比如酷我音乐盒和360安全卫士,仍然是采用ATL和win32实现的,因为用Spy++可以探测到窗体句柄,但是它们都没有丝毫闪烁。我在使用GDI自绘的时候总会有或多或少的闪烁,双缓存绘制也是。要完全无闪烁该怎么办才好?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
用
VC
#.NET+OpenGL开发交互式CAD系统
本课程用
VC
#.NET结合OpenGL,从无到有开发一个功能较完整的小型交互式CAD系统。 作者有交互式CAD系统、动态几何系统开发经验。出版过交互式CAD系统开发方面的图书。 课程先讲准备知识,然后讲整个系统的开发思路和...
VC
双缓冲
绘
图技术介绍
VC
双缓冲
绘
图技术介绍 双缓冲
绘
图,它是一种基本的图形图像
绘
图技术。首先,它在内存中创建一个与屏幕
绘
图区域一致的对象,然后将图形
绘
制到内存中的这个对象上,最后把这个对象上的图形数据一次性地拷贝并显示到...
VC
无
闪烁
刷屏技术的
实现
在
实现
绘
图的过程中,显示的图形总是会
闪烁
,笔者曾经被这个问题折磨了好久,通过向高手请教,搜索资料,问题基本解决,现将文档整理出来以供大家参考.1.显示的图形为什么会
闪烁
我们的
绘
图过程大多放在OnDraw或者...
VC
绘
图,使用双缓冲技术
实现
用
VC
做的画图程序,当所画的图形大于屏幕时,在拖动滚动条时屏幕就会出现严重的
闪烁
,为了解决这一问题,就得使用双缓冲来解决。程序产生严重的
闪烁
问题是因为画图过程中前后两次的画面反差很大造成的人的视觉的
闪烁
...
VC
双
缓存
绘
图 闪屏
再来解释一下前面
说
的为什么不能用全局变量保存DC问题:其实DC也是用句柄来标识的,所以也具有句柄的不确定性,就是只能随用随取,不同时间两次取得的是不同的(使用过文件句柄地话,应该很容易理解的)。...
界面
15,979
社区成员
115,896
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章