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

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

В примере ниже, оконная процедура готовится к рисованию, когда пользователь нажимает и удерживает левую кнопку мыши (отправка сообщения WM_LBUTTONDOWN). Поскольку пользователь перемещает курсор внутри окна, оконная процедура получает ряд сообщений WM_MOUSEMOVE. Для каждого сообщения оконная процедура чертит линию, устанавливая связь предыдущей позиции и текущей позиции. Чтобы нарисовать линию, процедура использует функцию GetDC, чтобы извлечь контекст устройства (DC) отображения; затем, как только рисование завершается и перед тем, как произойдет возвращение значения из сообщения, процедура использует функцию 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; 

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

Назад в оглавление
На главную страницу

Hosted by uCoz