У меня есть WindowProcess, который создает Thread, когда левая кнопка мыши недоступна:
case WM_LBUTTONDOWN: {
InvalidateRect(hwnd, NULL, TRUE);
_beginthread(mouseMoveThread, 0, ¶ms);
return 0;
}
И нить 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();
}
Но как я могу проверить while-loop, что левая кнопка не работает???
Ваш поток GUI должен перенаправить соответствующие сообщения в поток рендеринга. Возможно, для вашего случая WM_MOUSEMOVE
, WM_LBUTTONDOWN
, WM_LBUTTONUP
. Вы могли бы сообщить об этом, например, с объектами Event
.
Если ваш "поток рендеринга" имеет свой собственный цикл сообщений, AttachThreadInput
может представлять интерес.
Но это кажется бессмысленным. Просто делайте это в основной теме; нет причин создавать отдельный поток здесь для чего-то, что лучше всего делать в потоке графического интерфейса в любом случае. Вы пытаетесь обрабатывать события WM_MOUSEMOVE
чтобы следовать указателю мыши. Для этого требуется только обработка событий в потоке графического интерфейса пользователя. Как вы это делаете, вы будете делать то же самое, кроме как из другого потока. Вы внедрили много сверток для абсолютно никакой выгоды.
Еще пара комментариев о вашем коде:
InvalidateRect
который будет вызывать WM_PAINT
. SetPixel
- это вызов "изгоев" - система не отслеживает это, и если вы SetPixel
в WM_PAINT
, ваши вызовы SetPixel
всегда будут перезаписаны. По этой причине большинство приложений только WM_PAINT
в WM_PAINT
.SetPixel
в WM_PAINT
, ваши вызовы SetPixel
все равно будут забыты, если ваше окно будет скрыто и пересмотрено. Обычным решением для всего этого бизнеса рисования является сохранение "заднего буфера", в котором вы рисуете какой-то частный растровый рисунок, а затем на WM_PAINT
вы просто копируете его в окно.while(WM_LBUTTONDOWN)
, это был бы замкнутый цикл. Если ваша мышка оставалась неподвижной, ваш цикл будет продолжать вызывать SetPixel
в том же месте снова и снова при 100% CPU.static
локальные переменные. Это означает, что все потоки будут использовать одни и те же переменные. Здесь у вас несколько проблем с синхронизацией. Например, если iCount
изменяет между вызовами GetCursorPos
и ScreenToClient
.iCount
за пределы.