[WinApi] GDI, Regions

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.

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

0

Niestety nie jest to takie proste, EllipticRgn korzysta chyba z innego algorytmu czy coś, w każdym 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?

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)

0

Poczytaj o Paths.

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

0

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

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