为什么它会使整个窗口重绘
    HWND hwnd=0;
    InvalidateRect(hwnd,&oldrect,false);
    //or InvalidateRect(hwnd,&oldrect,true);
效果都一样
我只想重绘我显示时间的一个40*120的区域

解决方案 »

  1.   

    抹掉?真笨,你用COLOR_WINDOW颜色填充一下不就可以了,在写上去?重绘区域用RedrawWindow()。
      

  2.   

    先用Xor方式重写一下原来的时间,然后在写新时间
      

  3.   

        方法一:在程序开始时,先用CBitmap的CreateCompatibleBitmap(...)建立一个CBitmap对象,然后将桌面上对应区域的内容拷进来,留作备份,然后你就可以在该区域写时间,下一次写时间实现把备份内容恢复就可以了。如果想改善该区域的显示效果,你也可以先把备份内容再拷一份,将时间写在上面,一起贴到桌面上,这样就不会出现闪烁现象。(注意,用InvalidateRect更新时rect为你写时间的区域)。
        上面的方法一定是可行的。
        方法二:刷新时间前先将桌面属性设为透明(这样时间的背景仍是原桌面),再用SetROP2将绘图属性设为异或。这样,要抹去以前的内容,只需在原处绘制同样的内容即可(两次异或输出的结果与没有输出时的结果一样)。
        这种方法编程十分简单,只是我不知道SetROP2会不会影响TextOut,如果影响的话,应该就没问题了,否则,就不行了。还有,用第二种方法在每次刷新完时间后,最好将桌面的绘图属性恢复过来(刷新前先作备份),应为桌面是一个共享的资源,别的程序可能也会用到。
      

  4.   

    你可以用获取的窗口句柄HWND 然后用SetwindowText()函数
      

  5.   

    我如何才能用InvalidateRect()只更新我写时间的区域
    我用InvalidateRect()时,为什么他老引起整个桌面的重绘
      

  6.   

    如果考虑桌面背景变化的情况,那就麻烦了,你需要关注桌布是否发生了变化,如果发生了变化,一切都从头开始。至于桌布的变化,你可以在程序中察看\HKEY_CURRENT_USER\Control Pannel\Desktop中的Wallpaper键。