您可以通过在处理WM_MOUSEMOVE消息时绘制窗口过程,允许用户使用鼠标绘制线条。只要用户在窗口中移动光标,Windows就会向窗口过程发送WM_MOUSEMOVE消息。要绘制线条,窗口过程可以检索一个显示DC,并在当前和之前光标位置的窗口中画一条线。
在以下示例中,当用户按住鼠标左键(发送WM_LBUTTONDOWN消息))时,窗口过程将准备进行绘图。当用户在窗口内移动光标时,窗口过程接收一系列WM_MOUSEMOVE消息。对于每个消息,窗口过程绘制连接前一位置和当前位置的线。要绘制线,该过程使用GetDC检索显示DC;那么,一旦绘图完成并且在从消息返回之前,该过程使用ReleaseDC函数来释放显示器DC。一旦用户释放鼠标按钮,窗口过程将清除该标志,并且绘图停止(发送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;
如本例所示,启用绘图的应用程序通常会记录点或线,以便每当窗口更新时都可以重新绘制线条。绘图应用程序通常使用存储器DC和关联位图来存储通过使用鼠标绘制的线。