Win32 C ++重绘窗口

时间:2013-07-22 20:48:44

标签: c++ winapi visual-c++ user-interface

我已经阅读了很多关于这个主题的内容,但是

一个。我不太确定如何使用该解决方案,或者 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);

非常感谢您的帮助

1 个答案:

答案 0 :(得分:3)

当我基本上使用你编写的代码时,它对我有用。但有几件事情。目前尚不清楚您在哪里设置POINT值。不过,你真的不需要打扰。包含windowsx.h并使用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之前不会使客户区失效,所以不会使用鼠标拖动框。当你放手时它会画画。