[WinApi] GDI, Regions

Odpowiedz Nowy wątek
2007-05-27 02:27

Rejestracja: 12 lat temu

Ostatnio: 12 lat temu

0

Witam wszystkich serdecznie [browar] jestem nowy na tym forum, mam nadzieje że uzyskam odpowiedz na nurtujące mnie pytanie ;-)

Potrzebuję stworzyć region który odpowiadałby rozmiarem dokładnie narysowanemu prymitywowi, konkretnie elipsy, uwzględniając obrysowanie itd.

//...
        HDC hdc;
        HRGN hRgn;

case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
//... Tu miejsce na tworzenie regionu

        SelectClipRgn(hdc, hRgn);
        Ellipse(x1, y1, x2, y2);
        DeleteObject(hRgn);
        EndPaint(hWnd, &ps);
return 0;

Da się to jakoś zrobić? Dobrze by było aby sposób można było wykorzystać także do innych prymitywów.

Pozostało 580 znaków

2007-05-27 09:11

Rejestracja: 15 lat temu

Ostatnio: 9 lat temu

0

MSDN ?!

CreateEllipticRgn

ogolnie
MSDN Library▶Win32 and COM Development▶Graphics and Multimedia▶Windows GDI▶Regions

http://msdn2.microsoft.com/en-us/library/ms536684.aspx


Pozostało 580 znaków

2007-05-27 11:21

Rejestracja: 12 lat temu

Ostatnio: 12 lat temu

0

Niestety nie jest to takie proste, EllipticRgn korzysta chyba z innego algorytmu czy coś, w każdym bądź razie nie tworzy regionu identycznego z obszarem narysowanym przez Ellipse.

Może przedstawie problem szerzej, to jest programik w obecnej wersji:

http://download.yousendit.com/452192AC43B4A028

a oto kod odpowiedzialny za tworzenie regionów dla obiektów:

HRGN CreateObjectRgn(LPOBJECT lpObject, TYP Typ)
{
    switch(Typ)
    {
    case IDO_RECTANGLE:
        return(CreateRectRgn(((LPORECTANGLE)lpObject)->Left,
                             ((LPORECTANGLE)lpObject)->Top,
                             ((LPORECTANGLE)lpObject)->Right,
                             ((LPORECTANGLE)lpObject)->Bottom));

    case IDO_ELLIPSE:
        return(CreateEllipticRgn(((LPOELIPSE)lpObject)->Left,
                                ((LPOELIPSE)lpObject)->Top,
                                ((LPOELIPSE)lpObject)->Right,
                                ((LPOELIPSE)lpObject)->Bottom));

    }
    return NULL;
}

regiony wykorzystywane są do odświeżania zawartości okna przy tworzeniu nowego obiektu:

case WM_MOUSEMOVE:
        if(Drawing)
        {
            hdc = GetDC(hwnd);
            SetWindowOrgEx(hdc, -Sheet.xpos, -Sheet.ypos, NULL);

            pt.x = LOWORD(lParam);
            pt.y = HIWORD(lParam);
            DPtoLP(hdc, &pt, 1);
            if(pt.x >= 0 && pt.x <= Sheet.width && \
               pt.y >= 0 && pt.y <= Sheet.height)
               SetObjectMetrics(lpDObject, DTyp, 0, 0, pt.x, pt.y, OM_POS2);

            hRgn = CreateObjectRgn(lpDObject, DTyp);
            OffsetRgn(hRgn, Sheet.xpos, Sheet.ypos);
            InvalidateRgn(hwnd, hPrevRgn, FALSE);
            ValidateRgn(hwnd, hRgn);
            UpdateWindow(hwnd);
            DrawObject(hdc, lpDObject, DTyp);
            DeleteObject(hPrevRgn);
            hPrevRgn=hRgn;

            ReleaseDC(hwnd, hdc);
        }
        return 0;

Tak aby odrysowane zostało miejsce wyłącznie tam gdzie zostało odkryte przez przesunięcie myszki. Dla Rectangle działa idealnie, Ellipse tworzy niedokładny region.

Może zrobić jakąś maskę or sth?

Pozostało 580 znaków

2007-05-27 11:35

Rejestracja: 15 lat temu

Ostatnio: 9 lat temu

0

Niby mozna robic maske na podstawie narysowanej elipsy, ale to kosztowne (pamiec, czas)

mozna tez sprobowac odswierzac elipse o jeden pixel wieksza (te resztki wynikaja z tego, ze kola/alipsy rysuje sie w przyblizony spsob - chociaz to dziwne, ze az tyle)


Pozostało 580 znaków

2007-05-27 11:53

Rejestracja: 14 lat temu

Ostatnio: 7 godzin temu

0

Poczytaj o Paths.

Pozostało 580 znaków

2007-05-27 11:57

Rejestracja: 12 lat temu

Ostatnio: 12 lat temu

0

Po wyłączeniu obrysowania (Edycja --> obrysowanie -> brak) wszystko jest w porządku, tak więc to one powoduje kłopoty.. Ale da się jakoś je uwzględnić? z rysowaniem o jeden większej dalej zostają krzaki

Pozostało 580 znaków

2007-05-27 12:47

Rejestracja: 15 lat temu

Ostatnio: 9 lat temu

0

chodzilo mi o region do odswiezania o jeden (dwa) pixele wiekszy, istotnie dzial paths moze byc bardziej pomocny (a przynajmniej bedzie pozadnie).


Pozostało 580 znaków

Odpowiedz

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