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

no_*_*ord 10 c winapi

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

我想要的是使CAPTION/TITLE栏更加强烈.

我已经阅读并被告知我应该处理WM_NCCALCSIZE,但我在文档中找不到任何明确的内容.

来自MSDN:

WM_NCCALCSIZE通知


所述WM_NCCALCSIZE当的尺寸和位置被发送消息窗口的客户区必须计算.通过处理该消息,当窗口的大小或位置改变时,应用程序可以控制窗口的客户区域的内容.

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

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

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

Joh*_*ler 11

您可以通过处理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;
  }
Run Code Online (Sandbox Code Playgroud)

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