2012-02-25 101 views
0

我制作了一个自定义非客户区域的程序。除了处理WM_NCPAINT之外,我还将WM_NCCALCSIZE中的客户区大小设置为零,然后通过处理WM_NCHITTEST来模拟非客户区。所有绘制到窗口的内容都是在WM_PAINT中处理的。当我启动程序并且程序需要重新绘制时,WM_PAINT工作正常。但是,一旦我通过调用ShowWindow(hwnd,SW_MINIMIZE)来最小化程序,然后通过在任务栏中单击它来还原程序,WM_PAINT不再有效。我检查了WM_PAINT中的每个函数调用,它们都返回成功,但窗口只显示为黑色。任何人有什么想法为什么?WM_PAINT在最小化和恢复窗口后停止工作

下面是我的WM_PAINT处理程序的代码:

http://pastebin.com/MXmWzb4M

下面是输出到控制台窗口:

BeginPaint的成功

hdcBuffer有效

MainWindow- > hbmBuffer有效

hdcMem有效

所以,看到我在WM_PAINT处理每一个函数调用返回成功,为何显示为黑色的我的整个窗口?

+0

你不是应该在这种情况下,使用'WM_NCPAINT'? – pezcode 2012-02-25 14:44:04

+0

@pezcode它并不重要,因为这两个处理程序基本上都是一样的。 – Gogeta70 2012-02-25 14:56:56

+0

我已经解决了这个问题,我会在6-7小时内添加答案,当stackoverflow将让我> _ < – Gogeta70 2012-02-25 15:53:08

回答

0

原来,问题出在处理WM_NCCALCSIZE消息以删除非客户区域。这里的替代方案,我用:

 DWORD dwStyle = GetWindowLong(hwnd, GWL_STYLE); 
     dwStyle &= ~WS_OVERLAPPEDWINDOW; 
     SetWindowLong(hwnd, GWL_STYLE, dwStyle); 
+1

您将希望使用'GetWindowLongPtr'和'SetWindowLongPtr'以实现未来的64位兼容性。 – 2012-02-26 07:39:45

+0

非Ptr版本适用于样式(GWL_ * STYLE),但可能很容易出现C&P错误,因此切换到SetWindowLongPtr是个不错的建议... – Anders 2012-02-26 07:56:57

+0

啊我明白了。我会记住这一点以备将来参考,谢谢指出。^_ ^ – Gogeta70 2012-02-26 12:22:26