2013-01-09 75 views
0

我处理WM_NCCALCSIZE消息,并尝试手动设置dest窗口客户端矩形。如何调整客户端大小?

case WM_NCCALCSIZE: 
     { 
      RECT *rect = (LPRECT)lParam; 
      if (wParam == TRUE) 
      { 
       ////缩小客户区的范围 
       //RECT *rect = (LPRECT)lParam; 
       //rect->left += 8; 
       //rect->right -= 8; 
       //rect->top += 30; 
       //rect->bottom = 8; 
       InflateRect(rect, -50, -50); 
       RECT dstRect = *(LPRECT)lParam; 
       RECT srcRect = rect[1]; 
       rect[1] = dstRect; 
       rect[2] = srcRect; 

       //DefWindowProc(hWnd, message, wParam, lParam); 
       return 0; 
       //return WVR_REDRAW; 
      } 
      else 
      { 
       DWORD lRet = DefWindowProc(hWnd, message, wParam, lParam); 
       return lRet; 
      } 

但效果不好,enter image description here 当我调整窗口的DrawText绘制文本不会被擦除干净。

如何完全清除背景?

+1

“你好程序”:你是怎么用中文写“Hello,world”的? :) - 开玩笑。这里(http://msdn.microsoft.com/en-us/library/windows/desktop/ms632634(v=vs.85).aspx)它说你应该返回'WVR_REDRAW'来重新绘制窗口,我看到你已经注释掉了。为什么? –

+0

@AndyProwl:因为它不起作用。 – Jichao

+0

查看WM_NCCALCSIZE文档(http://msdn.microsoft.com/en-us/library/ms632634(VS.85).aspx),了解各种问题的解释......该消息很少用到,我猜你并不需要它。你究竟想在这里做什么? – HerrJoebob

回答

2

这里的根本原因是如果您更改了客户端大小,您更改了非客户端区域大小。 但WM_ERASEBKGND处理程序只会删除客户区域背景,但不会删除非客户区域大小。

因此,如果您更改了客户端大小,您还需要处理WM_NCPAINT以清除非客户端区域背景并使用DefWindowProc绘制框架。

相关问题