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


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

Вы можете разрешить пользователю рисование линий с помощью мыши, нарисовав процедуру окна при обработке сообщения 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; 

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