2010-08-20 87 views
2

我的应用程序有一个标准的应用程序顶层窗口。我需要强制重绘窗口镶边(也称为窗口的非客户区域)。我不在乎客户区是否也重新涂漆,但是铬本身需要被强制重漆。C/C++/C#:如何强制重新窗口铬在Windows 7上重绘?

特别是我需要这个在Windows 7上工作。无论它在其他操作系统版本上工作,在我的特殊情况下无关紧要。解决方案可以是C,C++,C#或任何其他语言。

+0

我会认为窗户会自己涂刷铬。什么情况下Windows的行为异常? – obelix 2010-08-20 03:32:54

+0

是否this.Invalidate()不更新chrome?我想不出一个快速/简单的测试来自己尝试.... – overslacked 2010-08-20 08:25:38

+0

overslacked:无效()导致重绘客户区但不是窗口镶边。 obelix:问题很复杂。在Windows 7下(但不是其他),使用WM_NCPAINT自定义镶边绘图的新模式窗口偶尔不会绘制任何东西。大多数情况下,它工作正常,然后50次中有1次没有,就好像窗户根本就没有。如果我能检测到这种情况发生,我想强制重画整个窗口,希望它随后出现。我试图重绘客户端,并没有帮助。 – 2010-08-20 12:48:56

回答

3

MSDN,似乎

RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_FRAME); 

是你在找什么。

RDW_FRAME导致与更新区域相交的窗口的非客户区域的任何部分都收到WM_NCPAINT消息。 RDW_INVALIDATE标志也必须指定;否则,RDW_FRAME不起作用。除非指定了RDW_UPDATENOW或RDW_ERASENOW,否则通常在执行RedrawWindow期间不会发送WM_NCPAINT消息。
-2

,也许你可以发送WM_NCPAINT消息窗口

http://msdn.microsoft.com/en-us/library/dd145212%28VS.85%29.aspx

+1

对不起,但是这个消息是由操作系统发送的,当它已经决定需要绘制窗口时。将此消息发送到窗口不会导致屏幕上的镶边更新,而只会让代码绘制到我必须提供给自己的DC中。 – 2010-08-20 04:59:25