Изменение размера эллипса - PullRequest
0 голосов
/ 25 мая 2011

Я не понимаю, почему это не работает. В сообщении 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);
 }

Ответы [ 2 ]

2 голосов
/ 25 мая 2011

Вы не сделали недействительной ни одну область окна, поэтому BeginPaint не собирается ничего делать. Вы должны сохранить точку в WM_MOUSEMOVE (в структуре, аналогичной pnt) и вызывать InvalidateRect () в это время. Затем сделайте свою живопись в WM_PAINT. См. ссылку для получения дополнительной информации.

1 голос
/ 25 мая 2011

Попробуйте код примерно так:

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;
...