如何设置Win32窗口(本地)的非客户区大小

10

如何设置Win32窗口(本地)的非客户区大小。

我想要的是让标题栏变得更加粗壮。

我已经阅读并听说过应该处理WM_NCCALCSIZE,但文档中没有任何清晰的信息。

来自MSDN:

WM_NCCALCSIZE通知


当必须计算窗口的客户区的大小和位置时,会发送 WM_NCCALCSIZE 消息。通过处理此消息,应用程序可以在窗口的大小或位置更改时控制窗口客户区域的内容。

窗口通过其WindowProc函数接收此消息。

wParam 如果wParam为TRUE,则指定应用程序应指示客户区的哪个部分包含有效信息。 系统将有效信息复制到新客户区的指定区域内。 如果wParam为FALSE,则应用程序无需指示客户区的有效部分。

lParam 如果wParam为TRUE,则lParam指向包含应用程序可以用于计算客户矩形的新大小和位置的NCCALCSIZE_PARAMS结构。 如果wParam为FALSE,则lParam指向RECT结构。 在进入时,该结构包含窗口的建议窗口矩形。 在退出时,该结构应包含相应窗口客户区域的屏幕坐标。


你的意思是想设置整个窗口(包括非客户区)的大小,还是更改非客户区度量,如边框宽度或标题栏高度? - Jerry Coffin
刚刚编辑完,我想让标题栏变粗一些。 - noripcord
1个回答

14

通过处理 WM_NCCALCSIZE 消息可以设置非客户区域的大小。但是,除非您打算通过处理 WM_NCPAINT 来完成所有的非客户区绘制,否则不要这样做。

编辑:下面有两个代码片段,一个处理 WM_NCCALCSIZE 并提供简单的 n 像素边框,另一个在 DefWindowProc 完成默认处理后添加一些额外的像素。

case WM_NCCALCSIZE:
  {
  lRet = 0;
  const int cxBorder = 2;
  const int cyBorder = 2;
  InflateRect((LPRECT)lParam, -cxBorder, -cyBorder);
  }

case WM_NCCALCSIZE: 
  {
  LPNCCALCSIZE_PARAMS pncc = (LPNCCALCSIZE_PARAMS)lParam;
  //pncc->rgrc[0] is the new rectangle
  //pncc->rgrc[1] is the old rectangle
  //pncc->rgrc[2] is the client rectangle

  lRet = DefWindowProc (hwnd, WM_NCCALCSIZE, wParam, lParam);
  pncc->rgrc[0].top += ExtraCaptionHeight;
  }

通过将WM_NCCALCSIZE传递给DefWindowProc并查看NCCALCSIZEPARAM的值,您可以学到很多东西。


我确实绘制了非客户区,也阅读了WM_NCCALCSIZE的文档,但是我并不理解它。 - noripcord
是的,这有点麻烦。我有一些很久以前写的代码。我会看看能不能找到它。 - John Knoeller
John Knoeller,你知道如何实际触发WM_NCCALCSIZE消息吗?我尝试了SetWindowPos和MoveWindow,但只有在新大小和旧大小不同时才会触发WM_NCCALCSIZE。 - user13947194

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接