Прочитать на английском

Поделиться через


Рисование с помощью мыши

Вы можете разрешить пользователю рисовать линии с помощью мыши, нарисовав процедуру окна во время обработки сообщения WM_MOUSEMOVE . Система отправляет WM_MOUSEMOVE сообщение в процедуру окна всякий раз, когда пользователь перемещает курсор в окне. Для рисования линий процедура окна может получить контекст отображаемого устройства и нарисовать линию в окне между текущей и предыдущей позицией курсора.

В следующем примере процедура окна подготавливается к рисованию, когда пользователь нажимает и удерживает левую кнопку мыши (отправляя сообщение WM_LBUTTONDOWN ). Когда пользователь перемещает курсор в пределах окна, процедура окна получает ряд WM_MOUSEMOVE сообщений. Для каждого сообщения процедура окна рисует линию, соединяющую предыдущую и текущую позицию. Чтобы нарисовать линию, процедура использует GetDC для получения контекста отображаемого устройства; после завершения рисования и перед возвратом из сообщения процедура использует функцию ReleaseDC для освобождения контекста отображаемого устройства. Как только пользователь отпустит кнопку мыши, процедура окна снимает флаг, и рисование останавливается (что отправляет сообщение WM_LBUTTONUP ).

BOOL fDraw = FALSE; 
POINT ptPrevious; 
 
  . 
  . 
  . 
 
case WM_LBUTTONDOWN: 
    fDraw = TRUE; 
    ptPrevious.x = LOWORD(lParam); 
    ptPrevious.y = HIWORD(lParam); 
    return 0L; 
 
case WM_LBUTTONUP: 
    if (fDraw) 
    { 
        hdc = GetDC(hwnd); 
        MoveToEx(hdc, ptPrevious.x, ptPrevious.y, NULL); 
        LineTo(hdc, LOWORD(lParam), HIWORD(lParam)); 
        ReleaseDC(hwnd, hdc); 
    } 
    fDraw = FALSE; 
    return 0L; 
 
case WM_MOUSEMOVE: 
    if (fDraw) 
    { 
        hdc = GetDC(hwnd); 
        MoveToEx(hdc, ptPrevious.x, ptPrevious.y, NULL); 
        LineTo(hdc, ptPrevious.x = LOWORD(lParam), 
          ptPrevious.y = HIWORD(lParam)); 
        ReleaseDC(hwnd, hdc); 
    } 
    return 0L; 

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