我用自定义非客户区制作了一个程序。我没有处理WM_NCPAINT,而是在WM_NCCALCSIZE中将客户区大小设置为零,然后通过处理WM_NCHITTEST来模拟非客户区。窗口的所有绘画都在WM_PAINT中处理。 WM_PAINT在我启动程序时以及程序需要重新绘制时工作正常。但是,一旦我通过调用ShowWindow(hwnd,SW_MINIMIZE)来最小化程序,然后通过在任务栏中单击它来恢复程序,WM_PAINT将不再起作用。我检查了WM_PAINT中的每个函数调用,它们都返回成功,但窗口只显示为黑色。有人为什么有任何想法?
这是我的WM_PAINT处理程序的代码:
这是控制台窗口的输出:
BeginPaint成功
hdcBuffer有效
MainWindow-> hbmBuffer有效
hdcMem有效
因此,看到我的WM_PAINT处理程序中的每个函数调用都返回成功,为什么我的整个窗口显示为黑色?
答案 0 :(得分:0)
原来问题在于处理WM_NCCALCSIZE消息以删除非客户区域。这是我使用的替代方案:
DWORD dwStyle = GetWindowLong(hwnd, GWL_STYLE);
dwStyle &= ~WS_OVERLAPPEDWINDOW;
SetWindowLong(hwnd, GWL_STYLE, dwStyle);