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

时间:2010-01-25 19:41:35

标签: 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结构。在输入时,该结构包含窗口的建议窗口矩形。退出时,结构应包含相应窗口客户区的屏幕坐标。

1 个答案:

答案 0 :(得分: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;
  }

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