Я прочитал совсем немного о предмете, но либоWin32 C++ перекрашивать окно
A. Я не совсем уверен, как использовать решение, или B. Решение не работает.
Для моего собственного обучения, я пытаюсь сделать перетаскиваемый ящик в окне C++. Я изначально нарисовать прямоугольник через WM_PAINT
сообщений в LRESULT CALLBACK WndProc
:
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 сообщения: Я поставил ящик координаты х и у :
case WM_LBUTTONDOWN:
boxx = pt.x;
boxy = pt.y;
break;
Хотя это установить окно координаты х и у, я пришел к выводу, что окно никогда не пытается сделать коробку еще раз. Поэтому, чтобы исправить эту проблему, я попытался добавить InvalidateRect(hWnd, 0, NULL);
в мой код, но безрезультатно.
Так что мой вопрос сохраняется, как мне заставить программу перерисовывать или перерисовывать окно?
EDIT: Я изменил код, чтобы обрабатывать как WM_MOUSEMOVE
и WM_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);
Ваша помощь очень ценится
Вы управляете 'WM_MOUSEMOVE', а также отслеживаете фактическое перетаскивание? И 'WM_LBUTTONUP' прекратить перетаскивание при отпускании кнопки? 'InvalidateRect' - это правильный способ принудительного повторного рисования вашего окна, но вам нужно сделать это в ответ на правильные входные данные. –
Нет, я не обращался ни с одним из них. Мой журнал для этого не имеет значения, когда он перемещен или выпущен, если кнопка не работает, он хочет установить окно в это место. –
Это все еще не работает. –