2017-04-08 24 views
0

我想通過點擊並從點移動光標以,我剛纔複製下面的代碼我的任何WindowProcedure看起來像畫一條線:圖Line WINAPI

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    //PAINTSTRUCT ps; 
    HDC hdc; 
    bool draw = false; 
    int x = 0, y=0; 

    //InvalidateRect(hwnd, NULL, true); 
    switch (uMsg) 
    { 
    case WM_LBUTTONDOWN: 
      draw = true; 
      x = LOWORD(lParam); 
      y = HIWORD(lParam); 
      return 0; 

    case WM_LBUTTONUP: 
     if (draw) 
     { 
      hdc = GetDC(hwnd); 
      MoveToEx(hdc, x, y, NULL); 
      LineTo(hdc, LOWORD(lParam), HIWORD(lParam)); 
      ReleaseDC(hwnd, hdc); 
     } 
     draw = FALSE; 
     return 0; 

    case WM_MOUSEMOVE: 
     if (draw) 
     { 
      hdc = GetDC(hwnd); 
      MoveToEx(hdc, x, y, NULL); 
      LineTo(hdc, x = LOWORD(lParam), y = HIWORD(lParam)); 
      ReleaseDC(hwnd, hdc); 
     } 
     return 0; 


    case WM_DESTROY: 
     PostQuitMessage(0); 
     return 0; 

    } 
    return DefWindowProc(hwnd, uMsg, wParam, lParam); 
    } 

但是當我點擊沒有任何反應,它就像只有一個案件可以處理,是正確的嗎?當我評論前兩種情況時,它會畫出線條,所以它進入切換狀態,但它不是我想要做的。任何建議?

+0

這不是繪畫的工作原理。根據WM_PAINT做繪畫。 –

+0

好,我不喜歡的東西: 情況WM_PAINT: \t \t如果(繪製) \t \t { \t \t \t HDC =的GetDC(HWND);設置像素(hdc,x,y,RGB(50,50,50));以及其中, \t \t \t ReleaseDC(hwnd,hdc); \t \t \t \t } \t \t 返回\t 0; 並且它仍然不起作用。 @編輯,我想我不能添加代碼來評論... – Ravo

+0

不,那不是如何做到這一點。不要猜測。不要這樣做。研究這個話題。沒有人學會通過猜測來編程Win32。 –

回答

-2
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    //PAINTSTRUCT ps; 
    HDC hdc; 
    static bool draw = false; // ←static 
    static int x = 0, y=0;  // ← 

這個怎麼樣?

+0

筆設置不是必需的WM_PAINT也不是必需的 – nariuji

+1

不處理WM_PAINT當窗口被刷新時,試圖將窗口移出屏幕並返回或最小化和恢復,這樣你的繪圖就會被刪除 – zett42

+0

這很明顯。在WM_PAINT的情況下,InvalidateRect()也是必需的。 – nariuji