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