РЕДАКТИРОВАТЬ: Я использовал следующий код, чтобы нарисовать кнопку в не-клиентской области (строке заголовка) моего окна. Итак, мой вопрос: возможно ли обработать событие щелчка мышью с этой кнопки?
bool MainWindow::winEvent(MSG *pMessage, long *result)
{
UINT m = pMessage->message;
if(m == WM_NCPAINT || m == WM_ACTIVATE)
{
HWND id = winId();
HDC hDeviceContext = GetWindowDC(id);
RECT rc = {10, 10, 65, 25};
DrawFrameControl(hDeviceContext, &rc, DFC_BUTTON, DFCS_BUTTONPUSH);
ReleaseDC(id, hDeviceContext);
return true;
}
return QWidget::winEvent(pMessage, result);
}
Да, это довольно легко сделать. Windows предоставляет несколько сообщений специально для не клиентской области. Например, у вас есть WM_NCMOUSEMOVE, который может быть обработан так же, как WM_MOUSEMOVE, но специально для не клиентской области. Большинство сообщений работают как их аналоги в клиентской области и обычно с одинаковыми структурами данных. Ниже приведен список сообщений, не относящихся к области клиента.
WM_NCCREATE
WM_NCDESTROY
WM_NCCALCSIZE
WM_NCHITTEST
WM_NCPAINT
WM_NCACTIVATE
WM_NCMOUSEMOVE
WM_NCLBUTTONDOWN
WM_NCLBUTTONUP
WM_NCLBUTTONDBLCLK
WM_NCRBUTTONDOWN
WM_NCRBUTTONUP
WM_NCRBUTTONDBLCLK
WM_NCMBUTTONDOWN
WM_NCMBUTTONUP
WM_NCMBUTTONDBLCLK
WM_NCXBUTTONDOWN
WM_NCXBUTTONUP
WM_NCXBUTTONDBLCLK
WM_NCMOUSEHOVER
WM_NCMOUSELEAVE
Других решений пока нет …