gpt4 book ai didi

c++ - Win32 C++ 重新绘制窗口

转载 作者:行者123 更新时间:2023-11-28 00:43:08 25 4
gpt4 key购买 nike

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

一个。我不太确定如何使用该解决方案,或者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_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 值。不过,你真的不需要打扰。包含 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 之前您不会使客户区无效,所以框不会用鼠标拖动。当您放手时,它会自动绘制。

关于c++ - Win32 C++ 重新绘制窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17797144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com