2

編集:次のコードを使用して、ウィンドウの非クライアント領域 (タイトル バー) にプッシュ ボタンを描画しました。だから私の質問は:このボタンからマウスクリックイベントを処理することは可能ですか?

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);
}
4

1 に答える 1

2

はい、これは非常に簡単です。Windows は、非クライアント領域専用のいくつかのメッセージを提供します。たとえば、WM_MOUSEMOVE と同じように処理できる WM_NCMOUSEMOVE がありますが、特に非クライアント領域用です。ほとんどのメッセージは、対応するクライアント領域と同じように機能し、通常は同じデータ構造を使用します。以下は、非クライアント領域メッセージのリストです。

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
于 2013-05-19T20:50:25.877 に答える