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