Oni*_*ni1 0 c++ windows winapi
我有一个 WindowProcess,当鼠标左键按下时它会创建一个线程:
case WM_LBUTTONDOWN: {
InvalidateRect(hwnd, NULL, TRUE);
_beginthread(mouseMoveThread, 0, ¶ms);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并且线程 mouseMoveThread 在左键按下期间设置 Pixel:
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();
}
Run Code Online (Sandbox Code Playgroud)
但是我如何在 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并且您的窗口被隐藏并重新显示,您的调用仍然会被忘记。所有这些绘画业务的正常解决方案是保留一个“后台缓冲区”,您可以在其中绘制一些私有位图,然后将WM_PAINT其复制到窗口。while(WM_LBUTTONDOWN),它也会是一个紧密的循环。如果您的鼠标保持静止,您的循环将以SetPixel100% CPU 继续在同一位置一遍又一遍地调用。static局部变量。这意味着所有线程将使用相同的变量。您这里有几个同步问题。例如,如果iCount在调用GetCursorPos和之间发生变化ScreenToClient。iCount超出范围。| 归档时间: |
|
| 查看次数: |
605 次 |
| 最近记录: |