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?