- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 WindowProcess,它会在按下鼠标左键时创建一个线程:
case WM_LBUTTONDOWN: {
InvalidateRect(hwnd, NULL, TRUE);
_beginthread(mouseMoveThread, 0, ¶ms);
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_MOUSEMOVE
、WM_LBUTTONDOWN
、WM_LBUTTONUP
。例如,您可以使用 Event
对象进行通信。
如果您的“渲染线程”有自己的消息循环,AttachThreadInput
可能会很有趣。
但这似乎毫无意义。只需在主线程中执行即可;无论如何,没有理由在这里为最好在 GUI 线程中完成的事情创建一个单独的线程。您正在尝试处理 WM_MOUSEMOVE
事件以跟随鼠标光标。这只需要在 GUI 线程中处理事件。你这样做的方式,你会做完全相同的事情,除了从不同的线程。 你引入了很多卷积完全没有收获。
关于您的代码的一些其他评论:
InvalidateRect
,这将引发 WM_PAINT
。 SetPixel
是一个“流氓”调用——系统不会对此进行跟踪,如果您在 WM_PAINT
中绘制,那么您的 SetPixel
调用总会被覆盖。出于这个原因,大多数应用仅在WM_PAINT
中进行绘画。WM_PAINT
中绘画,如果您的窗口被隐藏并重新显示,您的 SetPixel
调用仍然会被遗忘。所有这些绘画业务的正常解决方案是保留一个“后台缓冲区”,您可以在其中绘制一些私有(private)位图,然后在 WM_PAINT
上将其复制到窗口。while(WM_LBUTTONDOWN)
,它也将是一个紧凑的循环。如果您的鼠标保持不动,您的循环将继续以 100% 的 CPU 在同一位置一遍又一遍地调用 SetPixel
。static
局部变量。这意味着所有线程都将使用相同的变量。这里有几个同步问题。例如,如果 iCount
在调用 GetCursorPos
和 ScreenToClient
之间发生变化。iCount
是否超出范围。关于c++ - 检查线程中的 WM_LBUTTONDOWN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21496774/
出于某种原因,我似乎无法在标签(“STATIC”窗口)上捕捉到 WM_LBUTTONDOWN 事件。使用 Winspector 进行监视时,消息似乎总是到达父窗口。但是,根据 docs ,消息应该发布
我有一个 WindowProcess,它会在按下鼠标左键时创建一个线程: case WM_LBUTTONDOWN: { InvalidateRect(hwnd, NULL, TRUE);
MSG的结构如下: typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam;
我正在使用 win32 创建一个带有自定义标题栏和边框的窗口。我的问题是,当我使用 WM_NCHITTEST WM_LBUTTONDOWN 时,点击事件不会被触发。当我没有使用 WM_NCHITTES
我创建了顶层窗口,但由于未知原因,我的 WNDPROC 没有收到 WM_LBUTTONDOWN/WM_LBUTTONUP 和 WM_MOUSEMOVE 消息。 有什么建议吗? 相关代码: WNDCLA
我有一些关于 WM_COMMAND 的问题。 如果我在 WM_COMMAND 的 case 分支中更改变量 x 是否有可能在 WM_LBUTTONDOWN 的 case 分支中获得这个新值?我总是在
我正在创建一个带有如下下拉列表的窗口: 如果我单击前四个选项中的任何一个,包括它们的子选项,那么我想处理该选项。问题是我需要在这些选项中使用 WM_LBUTTONDOWN、WM_LBUTTONUP 和
我正在运行 theForger's Win32 API Programming Tutorial .在 page 4他建议在列出所有 WM_* 消息的 API 头文件中找到 #define 语句列表会
我是一名优秀的程序员,十分优秀!