社区
界面
帖子详情
如何解决窗口大小改变时控件闪烁问题?
wyc
2004-02-08 06:19:14
窗口中含有背景图, 在OnSize()调用Invalidate()使窗口重绘时控件会出现闪烁现象,请问各位大峡如何解决? 谢谢了!
...全文
482
2
打赏
收藏
如何解决窗口大小改变时控件闪烁问题?
窗口中含有背景图, 在OnSize()调用Invalidate()使窗口重绘时控件会出现闪烁现象,请问各位大峡如何解决? 谢谢了!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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有个帖子几十页也没
解决
,足见开发的难度之高。
窗口最大化
时
移动
控件
位置
窗口最大化
时
移动
控件
位置 会出现 2个 画面,多了一个最大化化后
控件
还没有移动的画面。通过使用 WindowUpdate(); 禁止了这个画面,从而保证屏幕不
闪烁
。
C#可透明并且不
闪烁
的Panel
C# 可透明Panel(不
闪烁
) 在重绘的有背景窗体中使用 在
窗口大小
改变
的
时
候绝对不
闪烁
位图随着
控件
的大小而变化
位图随着
控件
的大小而变化,让
控件
不再闪,呵呵。
VC++常用的共用函数100多页
相关网站 7 设置窗口最大最小 7 设置窗口标题 7 去掉主菜单 7 修改应用程序图标 7 系统只能允许一个程序运行 7 在状态栏中添加
时
间 8 研究调用存储过程 8 得到本机的IP地址 9 vc调用chm文件 10 最高窗口的实现 10 防止Edit框中的Password不保密 11 在同一系统中显示GB字符和BIG5字符 12
改变
颜色(整个窗体的
控件
) 13
改变
工程表头栏 13 ◆如何找开一个DiaLog的窗口◆ 13 ◆得到系统中设置的窗口颜色◆ 14 ◆如何让点下去的菜单成为V状态◆ 14 ◆如何调用WINDOWS的颜色板◆ 14 ◆如何产生一个MDI的主窗口◆ 15 ◆如何让一个文本
控件
显示出值◆ 15 ◆如何让一个
控件
显示出相应的值◆ 16 ◆在调试中怎么样MESSAGEBOX一个数字◆ 16 ◆如何控制
控件
的焦点◆ 16 ◆如何对析构函数中对象进行释放◆ 16 ◆如何关闭一个模态窗口◆ 17 ◆如何将一个提示的声音发到声卡上◆ 17 ◆如何得到打开exe的带的参数◆ 17 ◆如何在框架上建立一个工具条◆ 17 ◆如何生成一个主窗口下方的状态条◆ 18 ◆如何让Cscrollview类中控制其可以流动区域大小◆ 19 ◆MFC中
控件
的一些基本控制方法◆ 19 ◆如何让一个数字型变量化为字符型变量◆ 19 ◆如何使用“拉动条”,“上下选择”◆ 19 ◆如何使用postmessage来异步触发某事件◆ 21 ◆如何使用Sendmessage来异步触发某事件◆ 22 ◆如何修改父类的相关
控件
属性◆ 22 ◆如何在程序中得到
控件
的名◆ 22 ◆如何控制菜单的事件程序◆ 22 ◆如何使用
控件
中的数据录入的控制属性◆ 23 ◆哪些函数是文档、视图相互处理用的◆ 23 ◆如何建立一个基于对话框一程序◆ 23 ◆如何建立一个线程◆ 24 ◆如何让窗口产生一个图标(从应用程序资源中取出)◆ 24 ◆如何得到一个edit的录入的值◆ 24 ◆如何启动TIMER事件◆ 25 ◆如何使用ctrllist
控件
实现表格◆ 25 ◆如何从INI文件中得到值◆ 25 ◆如何将图标文件写到窗口中◆ 26 ◆如何得到本机的IP地址◆ 26 ◆如何使用全局变量◆ 26 ◆如何让一个字符加上回车、换行◆ 26 ◆如何定义、使用结构◆ 26 ◆如何在任意程序中显示MessageBox◆ 27 ◆如何在程序判断出debug状态◆ 27 ◆当对话框中有一个滚动条是,当滚动滚动条
时
的消息控制函数◆ 27 ◆将一个CWnd指针转换成一个
控件
ID(整数)注意用GetDlgItem()函数是从一个
控件
ID转换成一个CWnd的指针◆ 28 ◆如果在对话框中自定义一个消息的方法,假设对话框名为CXX◆ 28 ◆消息传递◆ 29 ◆在一个函数引用另外的一个对话框◆ 29 ◆全局函数的申明
问题
◆ 29 ◆在应用程序中*APP.CPP中的InitInstance()的事件◆ 29 ◆给执行文件加一个图标◆ 30 ◆如何在全局函数中通过传入的窗口句柄操作窗口◆ 30 ◆如何使桌面文字背景透明?◆ 30 ◆怎样才能在VC里产生一个唯一的字符串◆ 31 ◆如何隐藏进程(在系统状态栏和进程列表里不可见)◆ 31 ◆如何得到一个确定大小的视?◆ 31 ◆如何实现点击窗口任意地方拖动窗口?◆ 32 ◆如何在启动
时
阻止MDI应用程序创建一个新文档?◆ 33 ◆如何在多文档MFC程序中制作独立的File|New菜单?◆ 33 ◆如何检测视是否处于分割状态?◆ 34 ◆如何使程序保持极小状态?◆ 34 ◆如何确定当前进程实例是否为唯一实例?◆ 35 ◆如何向一个文档附加多个视?◆ 35 ◆如何获得文件的图标、属性、大小、类型等参数?◆ 36 ◆如何得到鼠标下面的窗口?◆ 37 ◆设置鼠标的形状◆ 38 ◆在对话框中设置编辑EDIT的值◆ 38 1. 如何获取应用程序的实例句柄? 38 2. 如何通过代码获得应用程序主窗口的指针? 38 3. 如何在程序中获得其他程序的图标? 38 4. 如何编程结束应用程序?如何编程控制windows的重新引导? 39 5.怎样加载其他的应用程序? 39 6. 确定应用程序的路径 39 7. 获得各种目录信息 40 8. 如何自定义消息 40 9. 如何
改变
窗口的图标? 40 10. 如何
改变
窗口的 缺省风格? 40 11. 如何将窗口居中显示? 41 12. 如何让窗口和 MDI窗口一启动就最大化和最小化? 41 13. 如何使程序保持极小状态? 41 14. 如何限制窗口的 大小? 41 15. 如何使窗口不可见? 41 16. 如何使窗口始终在最前方? 41 17、如何创建一个字回绕的CEditView 42 18、通用
控件
的显示窗口 42 19、移动窗口 42 20、重置窗口的大小 42 21、如何单击除了窗口标题栏以外的区域使窗口移动 43 22、如何
改变
视窗的背景颜色 43 23、如何
改变
窗口标题 44 24、如何防止主框窗口在其说明中显示活动的文档名 44 25、如何获取有关窗口正在处理的当前消息的信息 45 26、如何创建一个不规则形状的窗口 45 27、如何在代码中获取工具条和状态条的指针 47 28、如何使能和禁止工具条的工具提示 47 29、如何设置工具条标题 48 30、如何创建和使用无模式对话框 48 31、如何在对话框中显示一个位图 49 32、如何
改变
对话或窗体视窗的背景颜色 49 33、如何获取一个对话
控件
的指针 50 34、如何禁止和使能
控件
50 35、如何
改变
控件
的字体 50 36、如何在OLE
控件
中使用OLE_COLOR数据类型 51 37、在不使用通用文件打开对话的情况下如何显示一个文件列表 51 38、为什么旋转按钮
控件
看起来倒转 51 39为什么旋转按钮
控件
不能自动地更新它下面的编辑
控件
52 40、如何用位图显示下压按钮 52 41、如何一个创建三态下压按钮 52 42、如何动态创建
控件
52 43、如何限制编辑框中的准许字符 53 44、如何
改变
控件
的颜色 54 45、当向列表框中添加多个项
时
如何防止
闪烁
55 46、如何向编辑
控件
中添加文本 55 47、如何访问预定义的GDI对象 55 48、如何获取GDI对象的属性信息 56 49、如何实现一个橡皮区矩形 56 50、如何更新翻转背景颜色的文本 58 51、如何创建一个具有特定点大小的字体 58 52、如何计算一个串的大小 59 53、如何显示旋转文本 59 54、如何正确显示包含标签字符的串 60 55、串太长
时
如何在其末尾显示一个省略号 60 56、如何快速地格式化一个CString对象 61 57、为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态 61 58、如何给系统菜单添加一个菜单项 61 59、如何确定顶层菜单所占据的菜单行数 62 60、在用户环境中如何确定系统显示元素的颜色 62 问:如何控制窗口框架的最大最小尺寸? 63 问:如何
改变
窗口框架的颜色? 63 问:如何将应用程序窗口置于屏幕正中? 64 问:VC6.0对VC5.0的兼容性? 64 问:打印和打印机的
问题
? 64 问:CRichEditCtrl滚动条的
问题
? 65 问:从数据库中读大于32k的内容? 65 问:如何获得CRichEditCtrl中字符的位置? 66 问:如何限制mdi子框架最大化
时
的大小? 66 问:如何切换视口而不破坏它们? 66 问:
改变
列表控制
时
发生
闪烁
现象? 68 问:处理列表
控件
可见项的
问题
? 68 问:产生线程的
问题
? 68 问:CFile使用了缓冲区吗? 69 问:DAO的密码? 69 问:如何知道CListBox什么
时
候滚动了? 70 问:视口的不活动性如何处理? 70 问:如何使用COleClientItem的IDispatch接口? 70 问:关于用户自定义的消息使用? 71 问:在打开一个文档
时
退出? 71 问:在CListCtrl
控件
中多选择项的删除? 71 问:工作线程的登录状态? 72 问:如何控制菜单的大小? 72 问:
改变
LVIS_SELECTED的状态颜色? 73 问:如何只存储文档的某一部分? 73 问:保存工具条菜单有bug吗? 73 问:Tip of the day的bug 73 问:如何让我的mfc应用程序可以在最上面? 74 问:如何增加视图中ActiveX
控件
的事件处理函数? 75 问:如何创建一个动态的Tree
控件
? 75 问:SDI程序开始
时
不打开文档? 75 问:List
控件
中整栏选择? 75 问:如何重载MRU文件? 76 问:CImageList
控件
中图象橙色被显示为黄色? 76 问:无法正确
改变
应用程序的图标? 78 问:工具条状态的
问题
? 78 问:在SDI应用程序中使用Active
控件
? 79 问:有RichEdit
控件
的对话框无法正常显示? 79 问:DLL中的模板成员函数? 79 问:CFormView中的上下文帮助? 80 问:CArchive类的WriteObject函数
问题
? 80 问:RegisterWindowMessage中的BroadcastSystemMessage如何处理? 80 问:CListCtrl中选择变化
时
如何获得通知? 81 问:如何向ATL-COM对象传送一个数组? 81 问:如何选择CTreeCtrl中的节点文本进行编辑? 82 问:如何
改变
默认的光标形状? 82 问:如何用键盘滚动分割的视口? 83 问:如何在线程中处理状态条? 83 问:如何阻止WINDOWS关闭? 83 问:如何使一个按钮Disable? 83 问:怎样从MFC扩展动态链结库(DLL)中显示一个对话框? 84 问:想隐藏用户界面怎么办? 85 问:如何实现SDI与MDI的转换? 85 问:CDC中的竖排文本? 86 问:如何激活变灰的弹出菜单? 86 问:线程消息? 87 问:TreeCtrl控制的显示速度太慢? 87 怎样使窗口总是浮现在最上面? 88
改变
拖放
时
的光标外形? 89 如何定位到最新的记录上? 90 MVC和Doc-View? 90 被禁止(Disable)的
控件
如何
改变
其文本或背景色? 90 有ODBC的查找函数吗? 91 多个MRU菜单的
问题
91 校验框类
问题
93 CFormView类的Fold按钮 94 视的背景色 94 隐藏
控件
台程序 94 修改SDI窗口标题 95 焦点
问题
95 从一个OCX调用另一个OCX的方法。 95 得到视 96 字符转化
时
间 96 二进制还是文本方式? 99 发送消息 99 怎样知道菜单运行
时
的状态 99 DLL编译出错 100 通用
控件
的显示窗口 100 如何禁止和使能
控件
100 如何在OLE
控件
中使用OLE_COLOR数据类型 100 在不使用通用文件打开对话的情况下如何显示一个文件列表 100 为什么旋转按钮
控件
看起来倒转 101 为什么旋转按钮
控件
不能自动地更新它下面的编辑
控件
101 如何动态创建
控件
101 如何显示旋转文本 101 在TreeList中使用Edit功能 102 TreeList control中使用check box 103 有关属性对话框(property sheet )的几个提示 108 在MFC加入"这是什么?"的帮助提示 111 精通工具条 112 如何
改变
视窗的背景颜色 112 为MFC应用程序添加全屏幕显示功能 112 VC常用数据类型使用转换详解 114 用Visual C++操作INI文件 117 单文档加入背景图 119 更新窗体方法 120 更改窗口
控件
的能动和不能动(以按钮
控件
为例) 120 窗口响应键盘事件 120 密码框输入受保护 121 最高窗口的实现 122 实现窗口动态写入汉字和
改变
汉字颜色形状 123
界面
15,980
社区成员
115,867
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章