【问题标题】:Resizing Ellipse调整椭圆大小
【发布时间】:2011-05-25 03:40:07
【问题描述】:

我不明白为什么这不起作用。在消息 WM_LBUTTONDOWN 上,存储指针的坐标。然后在 WM_MOUSEMOVE 上,如果左键按下,我希望它用原始点和鼠标现在所在的新点绘制一个椭圆。但是当我调试时没有任何反应。这是我的WindowProc

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
PAINTSTRUCT ps;
HDC hdc;


switch (uMsg)
{

    case WM_DESTROY: 
    {
    DestroyWindow(hwnd);
    PostQuitMessage(0);
    break;

    }
    case WM_PAINT:
    {
        hdc = BeginPaint(hwnd, &ps);
        EndPaint(hwnd, &ps);
        break;
    }
    case WM_LBUTTONDOWN:
    {
        pnt.x = GET_X_LPARAM(lParam);
        pnt.y = GET_Y_LPARAM(lParam);
        break;
    }
    case WM_MOUSEMOVE:
    {
        if(wParam == MK_LBUTTON)
        {
            hdc = BeginPaint(hwnd, &ps);
            Ellipse(hdc, pnt.x, pnt.y, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); // nothing happens
            EndPaint(hwnd, &ps);
        }
        break;
    }
    return 0;
}
   return  DefWindowProc(hwnd, uMsg, wParam, lParam);
 }

【问题讨论】:

    标签: c++ winapi gdi+ gdi


    【解决方案1】:

    您还没有使窗口的任何区域无效,所以BeginPaint 不会做任何事情。您应该将点存储在 WM_MOUSEMOVE 上(在与pnt 类似的结构中),然后调用InvalidateRect()。然后,在 WM_PAINT 中进行绘画。请参阅此link 了解更多信息。

    【讨论】:

      【解决方案2】:

      试试这样的代码:

      static POINT begin, end;
      static BOOL drawing = false;
      
      // ...
      
      
      case WM_PAINT:
          hdc = BeginPaint(hWnd, &ps);
          if (drawing)
              Ellipse(hdc, begin.x, begin.y, end.x, end.y);
          EndPaint(hWnd, &ps);
          break;
      
      case WM_LBUTTONDOWN:
          begin.x = GET_X_LPARAM(lParam);
          begin.y = GET_Y_LPARAM(lParam);
          SetCapture(hWnd);
          drawing = true;
          break;
      
      case WM_LBUTTONUP:
          ReleaseCapture();
          drawing = false;
          break;
      
      case WM_MOUSEMOVE:
          end.x = GET_X_LPARAM(lParam);
          end.y = GET_Y_LPARAM(lParam);
          { 
              RECT invalid = {begin.x, begin.y, end.x, end.y};
              InvalidateRect(hWnd, &invalid, true);
          }
          break;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-23
        • 2021-06-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多