0

私はこの主題についてかなり読んだことがありますが、どちらか

A. ソリューションの使用方法がよくわからない、または B. ソリューションが機能しない。

私自身の学習のために、C++ ウィンドウでドラッグ可能なボックスを作成しようとしています。WM_PAINT私は最初にメッセージを介して長方形を描きますLRESULT CALLBACK WndProc:

case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);

    DrawRect(hdc, 0, 0, width, 20, RGB(60, 60, 60));

    DrawRect(hdc, boxx, boxy, boxx + 100, boxy + 20, RGB(0, 100, 255));

    EndPaint(hWnd, &ps);
    break;

ボックスを描画するため、DrawRect 関数が正常に機能していると確信しています。

ボックスをドラッグ可能にするために、メソッドを配置しました。まず、ウィンドウに対するカーソルのポイントを定義します。

POINT pt;
pt.x = ((int)(short)LOWORD(lParam));
pt.y = ((int)(short)HIWORD(lParam));
ScreenToClient(hWnd, &pt);

次に、メッセージ WM_LBUTTONDOWN: ボックスの x 座標と y 座標を設定します。

case WM_LBUTTONDOWN:
    boxx = pt.x;
    boxy = pt.y;
    break;

これによりボックスの x 座標と y 座標が設定されますが、ウィンドウがボックスを再度描画しようとしないことがわかりました。この問題を解決するInvalidateRect(hWnd, 0, NULL);ために、コードに追加しようとしましたが、役に立ちませんでした。

私の質問は続きますが、プログラムにウィンドウを再描画または再描画させるにはどうすればよいですか?

編集:両方を処理するようにコードを変更しましWM_MOUSEMOVEWM_LBUTTONUP

case WM_LBUTTONDOWN:
    boxdragmode = true;
    break;
case WM_MOUSEMOVE:
    if(boxdragmode)
    {
        boxx = pt.x;
        boxy = pt.y;
    }
    break;
case WM_LBUTTONUP:
    boxdragmode = false;
    InvalidateRect(hWnd, 0, TRUE);
    break;

それでもウィンドウが更新されないか、ボックス座標が更新されない可能性があります。私はこれを通して座標を取得します:

POINT pt;
pt.x = ((int)(short)LOWORD(lParam));
pt.y = ((int)(short)HIWORD(lParam));
ScreenToClient(hWnd, &pt);

あなたの助けは大歓迎です

4

1 に答える 1

3

基本的にあなたが書いたコードを使って試してみるとうまくいきます。ただし、いくつかのことがあります。POINT 値を設定している場所が明確ではありません。ただし、特に気にする必要はありません。windowsx.h をインクルードし、 and を使用GET_X_LPARAMGET_Y_LPARAMます。

case WM_LBUTTONDOWN:
    boxdragmode = true;
    break;

case WM_MOUSEMOVE:
    if(boxdragmode)
    {
        boxx = GET_X_LPARAM(lParam);
        boxy = GET_Y_LPARAM(lParam);
    }
    break;

case WM_LBUTTONUP:
    boxdragmode = false;
    InvalidateRect(hWnd, 0, TRUE);
    break;

、、またはメッセージScreenToClientからのマウス座標は既にクライアント座標にあるため、を呼び出す必要はありません。、、およびが呼び出し間で保持されるように定義されている限り、それは機能します。ただし、ボックスがマウスでドラッグされなくなるまで、クライアント領域を無効にしないためです。手を離すと描画されます。WM_LBUTTONDOWNWM_MOUSEMOVEWM_LBUTTONUPboxdragmodeboxxboxyWndProcWM_LBUTTONUP

于 2013-07-23T00:57:56.330 に答える