私はこの主題についてかなり読んだことがありますが、どちらか
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_MOUSEMOVE
たWM_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);
あなたの助けは大歓迎です