奇怪的问题,InvalidateRect最后一个参数在XP下无效
2016-04-17 18:12
393 查看
一直用的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。
http://blog.csdn.net/ringphone/article/details/2866719
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。
http://blog.csdn.net/ringphone/article/details/2866719
相关文章推荐
- ARM内部大家族详解---嵌入式回归第四篇
- 复习笔记之矩阵快速幂(不定时更新)
- char*,string,char a[], const char *,之间的转换
- java程序员面试中的多线程问题
- Android 多状态按钮ToggleButton
- 根据字节码探讨java自增运算符的原理
- 数据库范式通俗解释
- Caffe实战系列:如何将CRFAsRNN移植到caffe-windows上去
- Android-Tips(实用Android开发技巧)
- 十五、图的算法之无向图
- Activity生命周期
- linux 软件安装提示错误
- 立项说明书之可行性分析
- Matlab隐函数求导作图
- 遍历list集合删除指定元素方法
- 南京理工大学第八届程序设计大赛(校外镜像)
- jQuery选择器探究:语法汇总
- Java中的多态
- 20145110《Java程序设计》第七周学习总结
- mongo入门--java连接mongo数据库