使用鼠标绘制

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

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