奇怪的问题,InvalidateRect最后一个参数在XP下无效

ringphone 2008-09-02 03:16:17
一直用的WIN2K系统,写的一个程序在本机正常,到XP系统的机器运行发现调整窗口大小时界面闪得厉害,程序比较大,而且这种闪烁还不好调试,因为单步调试没有闪烁效果,只能排除法找原因,最后以为找到原因了,就写了一个测试程序,就是用VC6向导自动生成API的Hello World程序,然后修改一下其WM_PAINT代码:

case WM_PAINT: 
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);
InflateRect(&rt,-20,-20);
BitBlt(hdc,rt.left,rt.top,rt.right-rt.left,rt.bottom-rt.top,hdc,0,0,BLACKNESS);
EndPaint(hWnd, &ps);
break;
效果是在窗口中间显示一个黑框,编译后调整窗口大小时画面闪烁,这是正常的。把窗口类型的CS_HREDRAW | CS_VREDRAW取消掉,即把ATOM MyRegisterClass(HINSTANCE hInstance)函数里改成

wcex.style = 0;//CS_HREDRAW | CS_VREDRAW;



这下不闪了,但是也不画黑框了,因为不刷新了,需要在WM_SIZE消息里面通知刷新一下:

case WM_SIZE: 
InvalidateRect(hWnd,NULL,FALSE);
return DefWindowProc(hWnd, message, wParam, lParam);

按道理这段代码造成的效果应该是:黑框跟着窗口尺寸变化,但是背景会花,因为InvalidateRect的最后一个参数如果是FALSE,是不刷新背景的。在WIN2000下运行的确是这个效果,而在XP下,不管这最后一个参数是TRUE还是FALSE,效果跟原始代码是一样的,黑框闪烁得厉害,好象这个参数在XP下无效了。



解决方案是响应WM_ERASEBKGND,直接返回TRUE,在WIN2000和XP下就表现一致了。但是这个InvalidateRect的最后一个参数无效的问题就不知道怎么回事了,不知道是不是XP的BUG。




...全文
102 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
AutoWalk 2008-09-03
  • 打赏
  • 举报
回复
画面闪烁厉害是因为你刷新了全界面,计算出你需要刷新的区域,只刷新那一部分即可
oo_v_oo 2008-09-03
  • 打赏
  • 举报
回复
LZ可以试着更改一下XP环境下的显示优化配置,比如恢复到2000显示效果
确认是不是操作系统优化的结果

如果问题依然存在,WINAPI底层更新了,只能适应变化了
菜牛 2008-09-03
  • 打赏
  • 举报
回复
建议楼主搜索一下“双缓冲”。
ringphone 2008-09-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shizhusz110 的回复:]
up!!! 顺便请教大哥问题:我想做个类似画板的dd,正常最小最大化没出现黑斑,拖动哪个画布也没出现??但是拖动滚动条就出现了???我绘制画布是放在OnDraw里面??应该滚动是件不用调invalidate啊!!!
[/Quote]
拖动滚动条如果出现花屏应该InvalidateRect一下
king820802 2008-09-02
  • 打赏
  • 举报
回复
InvalidateRect的最后一个参数是有作用的,但是和2k相比,可能改了很多

反正尽量少用刷新了,以拷代刷,效果好很多的,可以试一下
Yofoo 2008-09-02
  • 打赏
  • 举报
回复
可能不同系统 DefWindowProc效果不一样
shizhusz110 2008-09-02
  • 打赏
  • 举报
回复
up!!! 顺便请教大哥问题:我想做个类似画板的dd,正常最小最大化没出现黑斑,拖动哪个画布也没出现??但是拖动滚动条就出现了???我绘制画布是放在OnDraw里面??应该滚动是件不用调invalidate啊!!!

15,979

社区成员

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

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