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


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

    1. case WM_PAINT:
    2.             hdc = BeginPaint(hWnd, &ps);
    3.             // TODO: Add any drawing code here...
    4.             RECT rt;
    5.             GetClientRect(hWnd, &rt);
    6.             InflateRect(&rt,-20,-20);
    7.             BitBlt(hdc,rt.left,rt.top,rt.right-rt.left,rt.bottom-rt.top,hdc,0,0,BLACKNESS);
    8.             EndPaint(hWnd, &ps);
    9.             break;

    效果是在窗口中间显示一个黑框,编译后调整窗口大小时画面闪烁,这是正常的。把窗口类型的CS_HREDRAW | CS_VREDRAW取消掉,即把ATOM MyRegisterClass(HINSTANCE hInstance)函数里改成

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

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

    1. case WM_SIZE:
    2.             InvalidateRect(hWnd,NULL,FALSE);
    3.             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

  • 相关阅读:
    SWT的TableVierer的使用二(数据排序)
    SWT的TableVierer的使用一
    SWT的TreeVierer的使用
    SWT中一些细节的说明
    SWT中各种参数大全
    SWT的GridLayout一些参数解释
    SWT中的GridLayout(转)例子不错
    鼠标放到按钮上,实现的动画
    关于文字下方线消失的动画
    超出部分用省略号代替,鼠标放上去显示多余部分内容
  • 原文地址:https://www.cnblogs.com/findumars/p/5401701.html
Copyright © 2020-2023  润新知