主对话框里有一个子对话框,子对话框里有一个按钮,这个按钮是png贴图,然后通过把子对话框改为WS_EX_LAYERED属性再UpdateLayeredWindow绘画的。现在有一个问题,就是Win键+D最小化所有窗口后,再还原,那个png按钮就变成以桌面为背景绘画了。原因估计是那个png按钮没有等到主对话框显示好了再去取主对话框的背景。请问怎样解决这个问题?谢谢!

解决方案 »

  1.   

    通过 Win键 + D 还原窗口,窗口收到的消息是WM_SIZE,SIZE_RESTORE == wParam,这个时候窗口还没重绘。另外关键一点啊,只要那个png按钮把桌面当作背景后,无论Invalidate()多少次,都不会使它的背景改变。这是UpdateLayeredWindow()的机制问题吧,把桌面当作背景画上去以后,那些背景又成为了主对话框的背景了,所以刷来刷去都是看到桌面的背景。
      

  2.   

    Invalidate(TRUE)也没用?好吧,Invalidate是走消息队列的
    实在不行,尝试RedrawWindow
      

  3.   

    楼上的大哥,http://topic.csdn.net/u/20120813/11/c4aa5ebe-188f-45a6-9079-996165852830.html请问关于这个帖你找到代码了吗?试了下,RedrawWindow也是不行。据我了解,RedrawWindow就是Invalidate()和UpdateWindow()的合体而已,既然Invalidate()无效,那么这个也无效了。现在我发现,原来反而是对主对话框Invalidate()就能刷新那个png按钮的背景了。。现在我用了一种特别特别挫的办法临时解决了,就是在收到WM_SIZE,SIZE_RESTORE == wParam的时候,Set了个Timer,30毫秒后对主对话框的那个子对话框的部分Invalidate()了一下。但是窗口还原时会闪一下,而且我觉得这个也不是常规的办法。挫啊挫~~