[英]Win32 C++ repaint the window
我已經讀了很多關於這個主題的文章,但是
A.我不太確定如何使用該解決方案,或者B.該解決方案無法正常工作。
為了我自己的學習,我試圖在C ++窗口中制作一個可拖動的框。 我最初通過LRESULT CALLBACK WndProc
的WM_PAINT
消息繪制矩形:
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);
非常感謝您的幫助
當我基本上使用您編寫的代碼嘗試它時,它對我有用。 不過有兩件事。 不清楚您在哪里設置POINT值。 不過,您實際上並不需要打擾。 包括GET_X_LPARAM
並使用GET_X_LPARAM
和GET_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_LBUTTONDOWN
, WM_MOUSEMOVE
或WM_LBUTTONUP
消息的鼠標坐標已經在客戶端坐標中。 只要定義了boxdragmode
, boxx
和boxy
,它們就可以在WndProc
調用之間持久存在。 但是,由於在WM_LBUTTONUP
之前不會使工作區無效,因此該框不會用鼠標拖動。 放開時它就會畫出來。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.