【问题标题】:How to set the size of the Non-client area of a Win32 window (native)如何设置 Win32 窗口非客户区的大小(原生)
【发布时间】:2011-01-09 06:07:35
【问题描述】:

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

【问题讨论】:

  • 您的意思是要设置整个寡妇(包括非客户区)的大小,还是要更改边框宽度或标题栏高度等非客户指标?
  • 刚刚编辑。我想让标题栏加粗。

标签: c winapi


【解决方案1】:

您通过处理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,阅读文档但我不明白。
  • 是的,有一点。我有一些很久以前写的代码。我看看能不能找到。
  • 伙计.. 非常感谢!这个非常古老的答案救了我的命!
  • John Knoeller,您知道如何实际生成 WM_NCCALCSIZE 消息吗?我尝试了 SetWindowPos 和 MoveWindow,但它们只有在新大小和旧大小不同时才会触发 WM_NCCALCSIZE。
猜你喜欢
  • 2010-10-14
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 2021-08-16
  • 1970-01-01
相关资源
最近更新 更多