2017-04-08 30 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