使用鼠标绘图

可以通过在处理 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; 

启用绘图的应用程序(如本示例所示)通常记录点或线,以便每当更新窗口时都可以重新绘制线条。 绘图应用程序通常使用内存设备上下文和关联的位图来存储使用鼠标绘制的线条。