2013-07-22 3 views
0

Я прочитал совсем немного о предмете, но либо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); 

Ваша помощь очень ценится

+1

Вы управляете 'WM_MOUSEMOVE', а также отслеживаете фактическое перетаскивание? И 'WM_LBUTTONUP' прекратить перетаскивание при отпускании кнопки? 'InvalidateRect' - это правильный способ принудительного повторного рисования вашего окна, но вам нужно сделать это в ответ на правильные входные данные. –

+0

Нет, я не обращался ни с одним из них. Мой журнал для этого не имеет значения, когда он перемещен или выпущен, если кнопка не работает, он хочет установить окно в это место. –

+0

Это все еще не работает. –

ответ

2

Это работает для меня, когда я пытаюсь его, используя в основном код, как вы написали это. Однако пара вещей. Непонятно, где вы устанавливаете значение POINT. Однако вам не нужно беспокоиться. Включите windowsx.h и используйте GET_X_LPARAM и GET_Y_LPARAM.

case WM_LBUTTONDOWN: 
    boxdragmode = true; 
    break; 

case WM_MOUSEMOVE: 
    if(boxdragmode) 
    { 
     boxx = GET_X_LPARAM(lParam); 
     boxy = GET_Y_LPARAM(lParam); 
    } 
    break; 

case WM_LBUTTONUP: 
    boxdragmode = false; 
    InvalidateRect(hWnd, 0, TRUE); 
    break; 

Вам не нужно звонить ScreenToClient, потому что координаты мыши из WM_LBUTTONDOWN, WM_MOUSEMOVE или WM_LBUTTONUP сообщений уже в координатах клиента. Пока boxdragmode, boxx и boxy определены так, что они будут сохраняться между звонками , которые будут работать. Однако, поскольку вы не аннулируете область клиента до WM_LBUTTONUP, окно не будет перетаскиваться мышью. Он просто рисует, когда отпускаешь.

+0

A ha! Поэтому, по-видимому, когда я назвал «случай WM_NCHITTEST:» и вернул «HTCAPTION», если он был в строке заголовка, я должен был вернуть «HTCLIENT» в противном случае. Это приводит меня к следующему вопросу. Когда я поставил под сомнение координаты щелчка в 'WM_NCHITTEST', мне пришлось делать« ScreenToClient (hWnd, & ps) », иначе он работал неправильно. Почему «WM_NCHITTEST» требует «ScreenToClient», однако никакого другого сообщения нет? –

+1

Сообщения мыши WM_NC * '(например,' WM_NCLBUTTONDOWN') также дают координаты экрана. Часть «NC» означает неклиент. Было бы нецелесообразно предоставлять неклиентскую информацию в координатах клиента. – Joel

+0

Joel - Большое спасибо. Это было очень полезно. Джонатан - Это не помогло. –

Смежные вопросы