gpt4 book ai didi

c++ - 检查线程中的 WM_LBUTTONDOWN

转载 作者:行者123 更新时间:2023-11-27 23:08:51 25 4
gpt4 key购买 nike

我有一个 WindowProcess,它会在按下鼠标左键时创建一个线程:

case WM_LBUTTONDOWN: {
InvalidateRect(hwnd, NULL, TRUE);
_beginthread(mouseMoveThread, 0, &params);
return 0;
}

并且线程 mouseMoveThread 设置像素,在左键按下期间:

void mouseMoveThread(PVOID pvoid)
{
HDC hdc;
PPARAMS pparams = (PPARAMS) pvoid;
static POINT pt[MAXPOINTS];
static int iCount;

while(WM_LBUTTONDOWN){
if(GetCursorPos(&pt[iCount]))
{
if (ScreenToClient(pparams->hwnd, &pt[iCount]))
{
iCount++;
hdc = GetDC(pparams->hwnd);
SetPixel(hdc, pt[iCount-1].x, pt[iCount-1].y,(COLORREF)RGB(0,255,0));
ReleaseDC(pparams->hwnd, hdc);
}
}
}
_endthread();
}

但是我如何在 while 循环中检查左侧按钮是否已按下???

最佳答案

您的 GUI 线程应将适当的消息转发给渲染线程。对于您的情况,可能是 WM_MOUSEMOVEWM_LBUTTONDOWNWM_LBUTTONUP。例如,您可以使用 Event 对象进行通信。

如果您的“渲染线程”有自己的消息循环,AttachThreadInput 可能会很有趣。

但这似乎毫无意义。只需在主线程中执行即可;无论如何,没有理由在这里为最好在 GUI 线程中完成的事情创建一个单独的线程。您正在尝试处理 WM_MOUSEMOVE 事件以跟随鼠标光标。这只需要在 GUI 线程中处理事件。你这样做的方式,你会做完全相同的事情,除了从不同的线程。 你引入了很多卷积完全没有收获

关于您的代码的一些其他评论:

  • 您正在调用 InvalidateRect,这将引发 WM_PAINTSetPixel 是一个“流氓”调用——系统不会对此进行跟踪,如果您在 WM_PAINT 中绘制,那么您的 SetPixel 调用总会被覆盖。出于这个原因,大多数应用WM_PAINT中进行绘画。
  • 如果您不是在 WM_PAINT 中绘画,如果您的窗口被隐藏并重新显示,您的 SetPixel 调用仍然会被遗忘。所有这些绘画业务的正常解决方案是保留一个“后台缓冲区”,您可以在其中绘制一些私有(private)位图,然后在 WM_PAINT 上将其复制到窗口。
  • 您的线程循环没有意义,但即使您可以while(WM_LBUTTONDOWN),它也将是一个紧凑的循环。如果您的鼠标保持不动,您的循环将继续以 100% 的 CPU 在同一位置一遍又一遍地调用 SetPixel
  • 您的线程使用static 局部变量。这意味着所有线程都将使用相同的变量。这里有几个同步问题。例如,如果 iCount 在调用 GetCursorPosScreenToClient 之间发生变化。
  • 您永远不会测试 iCount 是否超出范围。
  • 如果用户在左键仍处于按下状态时关闭您的应用程序会怎样?您需要更多由父线程驱动的退出条件。

关于c++ - 检查线程中的 WM_LBUTTONDOWN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21496774/

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