簡體   English   中英

Win32 C ++重新繪制窗口

[英]Win32 C++ repaint the window

我已經讀了很多關於這個主題的文章,但是

A.我不太確定如何使用該解決方案,或者B.該解決方案無法正常工作。

為了我自己的學習,我試圖在C ++窗口中制作一個可拖動的框。 我最初通過LRESULT CALLBACK WndProcWM_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_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);

非常感謝您的幫助

當我基本上使用您編寫的代碼嘗試它時,它對我有用。 不過有兩件事。 不清楚您在哪里設置POINT值。 不過,您實際上並不需要打擾。 包括GET_X_LPARAM並使用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_LBUTTONUP消息的鼠標坐標已經在客戶端坐標中。 只要定義了boxdragmodeboxxboxy ,它們就可以在WndProc調用之間持久存在。 但是,由於在WM_LBUTTONUP之前不會使工作區無效,因此該框不會用鼠標拖動。 放開時它就會畫出來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM