社区
界面
帖子详情
如何解决窗口大小改变时控件闪烁问题?
wyc
2004-02-08 06:19:14
窗口中含有背景图, 在OnSize()调用Invalidate()使窗口重绘时控件会出现闪烁现象,请问各位大峡如何解决? 谢谢了!
...全文
501
2
打赏
收藏
如何解决窗口大小改变时控件闪烁问题?
窗口中含有背景图, 在OnSize()调用Invalidate()使窗口重绘时控件会出现闪烁现象,请问各位大峡如何解决? 谢谢了!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
yajunmao
2004-07-12
打赏
举报
回复
mark
huaboy408
2004-07-12
打赏
举报
回复
来这里看看
http://community.csdn.net/Expert/topic/2806/2806670.xml?temp=1.659572E-03
1、将Invalidate()替换为InvalidateRect()。
Invalidate()会导致整个窗口的图象重画,需要的时间比较长,而InvalidateRect()仅仅重画Rect区域内的内容,所以所需时间会少一些。虫虫以前很懒,经常为一小块区域的重画就调用Invalidate(),不愿意自己去计算需要重画的Rect,但是事实是,如果你确实需要改善闪烁的情况,计算一个Rect所用的时间比起重画那些不需要重画的内容所需要的时间要少得多。
2、禁止系统搽除你的窗口。
系统在需要重画窗口的时候会帮你用指定的背景色来搽除窗口。可是,也许需要重画的区域也许非常小。或者,在你重画这些东西之间还要经过大量的计算才能开始。这个时候你可以禁止系统搽掉原来的图象。直到你已经计算好了所有的数据,自己把那些需要搽掉的部分用背景色覆盖掉(如:dc.FillRect(rect,&brush);rect是需要搽除的区域,brush是带背景色的刷子),再画上新的图形。要禁止系统搽除你的窗口,可以重载OnEraseBkgnd()函数,让其直接返回TRUE就可以了。如
BOOL CMyWin::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
//return CWnd::OnEraseBkgnd(pDC);//把系统原来的这条语句注释掉。
}
3、有效的进行搽除。
搽除背景的时候,不要该搽不该搽的地方都搽。比如,你在一个窗口上放了一个很大的Edit框,几乎占了整个窗口,那么你频繁的搽除整个窗口背景将导致Edit不停重画形成剧烈的闪烁。事实上你可以CRgn创建一个需要搽除的区域,只搽除这一部分。如
GetClientRect(rectClient);
rgn1.CreateRectRgnIndirect(rectClient);
rgn2.CreateRectRgnIndirect(m_rectEdit);
if(rgn1.CombineRgn(&rgn1,&rgn2,RGN_XOR) == ERROR)//处理后的rgn1只包括了Edit框之外的客户区域,这样,Edit将不会被我的背景覆盖而导致重画。
{
ASSERT(FALSE);
return ;
}
brush.CreateSolidBrush(m_clrBackgnd);
pDC->FillRgn(&rgn1,&brush);
brush.DeleteObject();
注意:在使用这个方法的时候要同时使用方法二。别忘了,到时候又说虫虫的办法不灵。
4、使用MemoryDC先在内存里把图画好,再复制到屏幕上。
这对于一次画图过程很长的情况比较管用。毕竟内存操作比较快,而且复制到屏幕又是一次性的,至少不会出现可以明显看出一个东东从左画到右的情况。
void CMyWin::OnPaint()
{
CPaintDC dc1(this); // device context for painting
dcMemory.CreateCompatibleDC(&dc1);
CBitmap bmp;//这里的Bitmap是必须的,否则当心弄出一个大黑块哦。
bmp.CreateCompatibleBitmap(&dc1,rectClient.Width(),rectClient.Height());
dcMemory.SelectObject(&bmp);
//接下来你想怎么画就怎么画吧。
//dcMemory.FillRect(rectClient,&brush);
dc1.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&dcMemory,0,0,SRCCOPY);
dcMemory.DeleteDC();
// Do not call CWnd::OnPaint() for painting messages
}
导致窗口闪烁的可能性很多:
1. 不适当的UpdateWindow调用.Windows给paint消息指定比较低的优先级,以防止窗口不必要的重画.但是,使用API函数UpdateWindow,迫使窗口立即被重画.不适当的UpdateWindow调用导向导致不必要的重画。
2. 调用InvalidateRect而不指定更新矩形。API函数InvalidateRect允许用户指定更新矩形,使得重画只限于需要重画的区域的区域;可以传递一个空指针给InvalidateRect函数来更新整个窗口,但是这样画图需要更长时间,结果是不必要的闪烁和低速的画图。
3. 调用InvalidateRect,而将擦除背景参数不适当的设置为真。如果背景不需要重画,你可以将InvalidateRect函数中擦出背景的参数(系统默认为true)设为false。
4. 不适当的使用CS_HREDRAW和CS_VREDRAW窗口风格。仅当客户区的大小改变需要重画整个窗口时,才需要设置这两种窗口风格。如果窗口中的某些元素需要注重放置,这是必要的;但是大多数的窗口不需要居中排列任何东西,所以没有必要使用这类风格。MFC默认使用的就是这两种风格,所以需要在窗口构造函数中去掉这两个属性。
CStatic静态
控件
透明-完美
解决
为公司开发的静态
控件
,
解决
了所有的透明显示
问题
1.动态刷新,文字重叠
问题
2.父窗口放大之后,背景不对
问题
3.频繁刷新闪动
问题
。 csdn有个帖子几十页也没
解决
,足见开发的难度之高。
C#可透明并且不
闪烁
的Panel
C# 可透明Panel(不
闪烁
) 在重绘的有背景窗体中使用 在
窗口大小
改变
的
时
候绝对不
闪烁
C#自定义
控件
之-winform美化
对于系统自带的窗体,博主实在不敢恭维,测试
时
使用方便快捷,但真正项目中无法使用,只因不美观的外表,每次都很头疼窗体的美化,这里列出一些需要
解决
的
问题
和自己收集到的
解决
方法,如有错误请指出。
MFC自定义界面HUI,高效简单,含详细注释和示例
MFC自定义界面HUI,高效简单,含详细注释和示例。 HUI包括基本
控件
、按钮、标签、编辑框、表格、悬停提示等,可组合出更多功能。资源占用少,效率高,能在低端机上运行,流畅不
闪烁
,完全满足工控等各种专业软件实现个性化要求。 本资源是“http://download.csdn.net/detail/hhhh63/6961889”的正式发布版。包括3个项目,Hui、HuiDemo1和HuiDemo2。 一、Hui项目 本项目是DLL项目,包括完整的界面库,使用双缓存,局部重画等技术,性能优异。为保证在不同的MFC版本中使用,本次上传提供了这部分的源码,一般不要对其改动。 二、HuiDemo1 简单的应用示例,包括窗口分割,控制面板和主显示区等,展示
控件
各方向停靠、自动充满、全屏切换、记忆窗口位置和大小、选项设置和保存注册表等功能,用户可直接以此为基础开发新项目。如需扩展其它功能,可从HuiDemo2查找复制相应代码。 三、HuiDemo2 除HuiDemo1的所有功能外,还包括界面库的全部功能和其它实用扩展功能,左中右三栏式分布,左右固定宽度,中间栏大小可变。 1、左边是属性栏,固定宽度,上边是
时
钟,下边是鼠标信息,当鼠标移到中间的图像区
时
显示鼠标位置和图像值。 2、中间是图像区,演示如何动态生存索引图像,从下向上移动,自适应大小,长宽比不变,点右边的调色板按钮
改变
颜色,点保存按钮把当前图像保存到桌面。 3、右边上边是控制栏,在中间的图像区中画各种几何图形,并计算几何图形包围的图像数据的最大值,最小值和平均值。 4、右边下边是表格演示,显示Windows文件夹下的文件列表,自动充满窗口区,随
窗口大小
改变
显示项数,保证界面美观,最下面是搜索和定位功能。 四、运行环境,VC2010或更高版本。 欢迎大家下载并提意见,本资源版权归作者所有,分享供大家研究学心,不得用于商业用途,如有特殊要求请与本人联系。
Visual C++ 程序开发范例宝典光盘源码 (第二版)1/7
第1章 窗体与界面设计 1.1 菜单应用实例 实例001 在系统菜单中添加菜单项 实例002 带图标的程序菜单 实例003 根据表中数据动态生成菜单 实例004 浮动的菜单 1.2 弹出菜单应用实例 实例005 在
控件
上单击右键弹出菜单 实例006 个性化的弹出菜单 实例007 任务栏托盘弹出菜单 1.3 工具栏应用实例 实例008 带背景的工具栏 实例009 带图标的工具栏 实例010 带下拉菜单的工具栏 实例011 可调整按钮位置的工具栏 实例012 XP风格工具栏 实例013 动态设置是否显示工具栏按钮文本 实例014 具有提示功能的工具栏 1.4 状态栏应用实例 实例015 带进度条的状态栏 实例016 动画效果的状态栏 实例017 滚动字幕的状态栏 1.5 导航界面应用实例 实例018 Outlook导航界面 实例019 树状导航界面 实例020 按钮导航界面 实例021 图片导航界面 1.6 界面窗体应用实例 实例022 使用位图设计畸形界面 实例023 椭圆形的程序界面 实例024 自绘窗体界面 实例025 以
时
钟显示界面 实例026 窗体融合技术 实例027 限制对话框最大
时
的
窗口大小
实例028 分割视图窗口 实例029 对话框全屏显示 1.7 多媒体宣传光盘应用实例 实例030 多媒体宣传光盘主界面 实例031 自动运行的多媒体宣传光盘 1.8 多媒体触摸屏程序应用实例 实例032 采购中心多媒体触摸屏程序 实例033 为触摸屏程序添加虚拟键盘 1.9 窗体位置应用实例 实例034 不可移动的窗体 实例035 始终在最上面的窗体 实例036 以动画形式显示窗体 实例037 磁性窗体 1.10 窗体标题栏应用实例 实例038
闪烁
的窗体标题栏 实例039 拖动没有标题栏的窗体 实例040 禁用标题栏上的最大化、最小化或关闭按钮 1.11 窗体形状及应用 实例041 半透明窗体 实例042 创建字型窗体 实例043 设计桌面精灵 1.12 通用对话框的应用 实例044 打开位图预览对话框 实例045 打开Windows新型对话框 实例046 同
时
选择多个文件 实例047 文本替换对话框 实例048 字体选择对话框 第2章
控件
应用 2.1 按钮
控件
典型实例 实例049 AVI动画按钮 实例050 GIF动画按钮 实例051 图文按钮 实例052 不规则按钮 实例053 热点按钮 2.2 编辑框
控件
典型实例 实例054 为编辑框设置新的系统菜单 实例055 为编辑框
控件
添加列表选择框 实例056 多彩边框的编辑框 实例057
改变
编辑框文本颜色 实例058 不同文本颜色的编辑框 实例059 位图背景编辑框 2.3 静态文本
控件
典型实例 实例060 电子计
时
器 实例061 使用静态文本
控件
设计群组框 实例062 制作超链接
控件
2.4 列表框
控件
典型实例 实例063 利用列表框
控件
实现标签式数据选择 实例064 具有水平滚动条的列表框
控件
实例065 列表项的提示条 实例066 位图背景列表框
控件
2.5 组合框
控件
典型实例 实例067 将数据表中的字段添加到组合框
控件
实例068 带查询功能的组合框
控件
实例069 自动调整组合框的宽度 实例070 颜色组合框 实例071 多列显示的组合框 实例072 带图标的组合框 实例073 显示系统盘符组合框 2.6 列表视图
控件
典型实例 实例074 Windows资源管理器 实例075 利用列表视图
控件
浏览数据 实例076 利用列表视图
控件
制作导航界面 实例077 在列表视图中拖动视图项 实例078 具有排序功能的列表视图
控件
实例079 具有文本录入功能的列表视图
控件
实例080 使用列表视图设计登录界面 2.7 树视图
控件
典型实例 实例081 多级数据库树状结构数据显示 实例082 节点拖动功能的树
控件
实例083 带复选功能的树状结构 实例084 三态效果树
控件
实例085 修改树
控件
节点连线颜色 实例086 位图背景树
控件
实例087 显示磁盘目录 实例088 树型提示
界面
15,977
社区成员
115,866
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章