[C++ WinApi] Program do rysowania elips

0

Czy jak chcę rysować elipsy, to czy muszę zapamiętywać współrzędne wszystkich punktów gdy naciśnięto mysz (lewy przycisk myszy) i wszystkich punktów gdy ją zwolniono? (Oczywiście w obszarze roboczym).

0

Nie musisz

0

a jak inaczej to zrobić?

0

Pytanie w stylu "czy jak chce upiec ciasto to potrzebuje czterech jablek?". Dane mozesz pobierac na rozne sposoby, tak samo mozesz uzyc roznych algorytmow do tego samego zadania.

0

Czy mógłby ktoś podać sposób, w jaki można rysować elipsy (kilka elips) i żeby po ponownym odmalowaniu okna nadal było je widać. Chodzi mi o rysowane elipsy przez użytkownika. Sposób w którym nie trzeba będzie pamiętać wszystkich współrzędnych.

0

PS. Bo jak się narysuje 10 elips, to wystarczy 20 struktur POINT, ale jak 1000 to już 2000.

0

Napisałem program, który rysuje elipsy (wersja próbna), ale nie działa tak jak bym chciał. Po odświeżeniu widać tylko jedną elipsę. Czy może mi ktoś powiedzieć, jak zrobić, aby było je wszystkie widać?

 #include <windows.h>

POINT pt[2] = {{0}};
HWND uchwytOkna = 0;

LRESULT CALLBACK ProceduraOkna(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
void RysujElipse(HWND uO, INT lewo, INT gora, INT prawo, INT dol);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    WNDCLASSEX wndclassex;

    wndclassex.cbSize = sizeof (WNDCLASSEX);
    wndclassex.style = CS_VREDRAW | CS_HREDRAW;
    wndclassex.lpfnWndProc = ProceduraOkna;
    wndclassex.cbClsExtra = 0;
    wndclassex.cbWndExtra = 0;
    wndclassex.hInstance = hInstance;
    wndclassex.hIcon = LoadIcon(0, (LPCTSTR)IDI_APPLICATION);
    wndclassex.hCursor = LoadCursor(0, (LPCTSTR)IDC_ARROW);
    wndclassex.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    wndclassex.lpszMenuName = 0;
    wndclassex.lpszClassName = "Standardowe Okno";
    wndclassex.hIconSm = LoadIcon(0, (LPCTSTR)IDI_APPLICATION);

    RegisterClassEx(&wndclassex);

    uchwytOkna = CreateWindowEx(
                0,
                "Standardowe Okno",
                "Program \"Rysowanie Elips v. 1.0\"",
                WS_OVERLAPPEDWINDOW,
                0, 0,
                800, 500,
                0,
                0,
                hInstance,
                0);

    ShowWindow(uchwytOkna, SW_NORMAL);
    UpdateWindow(uchwytOkna);

    MSG msg;

    for (;;)
    {
        if (0 != GetMessage(&msg, 0, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        if (msg.message == WM_QUIT) break;
    }

    return (int)msg.wParam;
}

LRESULT CALLBACK ProceduraOkna(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_LBUTTONDOWN:
            {
                pt[0].x = LOWORD(lParam);
                pt[0].y = HIWORD(lParam);
            }
            return 0;
        case WM_LBUTTONUP:
            {
                pt[1].x = LOWORD(lParam);
                pt[1].y = HIWORD(lParam);
                RysujElipse(hWnd, pt[0].x, pt[0].y, pt[1].x, pt[1].y);
            }
            return 0;
        case WM_PAINT:
            RysujElipse(hWnd, pt[0].x, pt[0].y, pt[1].x, pt[1].y);
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}

void RysujElipse(HWND uO, INT lewo, INT gora, INT prawo, INT dol)
{
    HDC hdc = 0;
    hdc = GetDC(uO);

    Ellipse(hdc, lewo, gora, prawo, dol);

    ReleaseDC(uO, hdc);
    ValidateRect(uO, 0);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1