Как установить размер области Non-client окна Win32 (нативный) - PullRequest
10 голосов
/ 25 января 2010

Как установить размер области Non-client окна Win32 (собственный).

То, что я хочу, это сделать полосу заголовка / заголовка толще.

Я прочитал и мне сказали, что я должен обработать WM_NCCALCSIZE, но я не могу найти ничего ясного в документации.

От MSDN:

WM_NCCALCSIZE Уведомление


Сообщение WM_NCCALCSIZE отправляется, когда необходимо вычислить размер и положение клиентской области окна . Обрабатывая это сообщение, приложение может управлять содержимым клиентской области окна при изменении размера или положения окна.

Окно получает это сообщение через функцию WindowProc.

WPARAM Если wParam равен TRUE, это означает, что приложение должно указывать, какая часть клиентской области содержит действительную информацию. Система копирует действительную информацию в указанную область в новой клиентской области. Если wParam ЛОЖЬ, приложению не нужно указывать действительную часть клиентской области.

LPARAM Если wParam равен TRUE, lParam указывает на структуру NCCALCSIZE_PARAMS, которая содержит информацию, которую приложение может использовать для вычисления нового размера и позиции клиентского прямоугольника . Если wParam ЛОЖЬ, lParam указывает на структуру RECT. На входе структура содержит предложенный прямоугольник окна для окна. При выходе структура должна содержать экранные координаты соответствующего окна клиентской области.

1 Ответ

11 голосов
/ 25 января 2010

вы устанавливаете размер не клиентской области, обрабатывая сообщение 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 до и после.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...