3

wndProc()を強制的WM_NCHITTEST caseに戻す関数を使用するフチなしウィンドウを作成しましたHTCAPTION;。これにより、ユーザーはカーソルの位置に関係なくウィンドウをドラッグできます。
問題は、カスタムカーソルを設定したことですが、上記の方法では、カーソルは常にに戻されIDC_ARROWます。
これを修正するにはどうすればよいですか?

編集:私もで使用SetCursor()してみましたWM_NCHITTEST caseが、うまくいきませんでした。

4

3 に答える 3

3

WM_SETCURSORメッセージを使用して、カーソルをオーバーライドできます。lParamのLOWORDは、WM_NCHITTESTハンドラーで変更したヒットテストコードを示します。これはうまくいきました:

static HCURSOR CustomCursor;

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_NCHITTEST: {
        LRESULT result = DefWindowProc(hWnd, message, wParam, lParam);
        if (result == HTCLIENT) result = HTCAPTION;             
        return result;
    }
    case WM_SETCURSOR: 
        if (LOWORD(lParam) == HTCAPTION) {
            SetCursor(CustomCursor);
            return TRUE;
        }
        return DefWindowProc(hWnd, message, wParam, lParam);
    // etc...
}

ウィンドウの初期化でCustomCursorを初期化します。言う:

CustomCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_SIZEALL));
于 2013-01-21T00:28:15.973 に答える
0

に加えてSetCursorWM_NCHITTESTもやってみてSetCursorくださいWM_SETCURSOR

于 2012-11-18T09:50:33.463 に答える
0

通常、カーソルを設定する正しい方法は、WM_SETCURSORメッセージに応答して設定することです。( http://blogs.msdn.com/b/oldnewthing/archive/2005/05/25/421707.aspxも参照してください)

ただし、マウスがキャプチャされた場所でマウスドラッグを処理している場合、ウィンドウはメッセージを受信しません。その場合、ハンドラーにWM_SETCURSORカーソルを設定する以外に方法はないと思います。WM_MOUSEMOVE

于 2012-11-18T10:04:04.850 に答える