..::CRgn::..

Je t°φda slou₧φcφ pro prßci s regiony, co₧ jsou vlastn∞ libovolnΘ 2D plochy. Pomocφ funkce CDC::FillRgn(...) jej lze vykreslit na obrazovku, nebo pomocφ jeho Φlensk²ch funkcφ lze zjistit, zda se dva regiony protφnajφ atd.

VybranΘ ΦlenskΘ funkce:

D∙le₧itΘ:

Po skonΦenφ pou₧φvßnφ regionu by m∞la b²t zabranß pam∞¥ uvoln∞na pomocφ funkce CRgn::DeleteObject().

P°φklady:

Vytvo°enφ n-·helnφkovΘho regionu

POINT body[5];

body[0].x = 0;

body[0].y = 0;

body[1].x =50 ;

body[1].y = 0;

body[2].x = 100;

body[2].y = 50;

body[3].x = 50;

body[3].y = 100;

body[4].x = 0;

body[4].y = 100;

 

CRgn rgn;

rgn.CreatePolygonRgn(&body,5,ALTERNATE);

ZjiÜt∞nφ zda se dva regiony protφnajφ

CRgn rgn1, rgn2;

...

...    // Inicializace rgn1, rgn2

...

CRgn vysledek;

BOOL protinaji_se;

if (vysledek.CombineRgn(&rgn1, &rng2, RGN_AND) == NULLREGION) protinaji_se = FALSE;

else protinaji_se = TRUE;

Vytvo°enφ okna ve tvaru elipsy

(OdzkouÜeno na dialogu.)

Do deklarace t°φdy okna p°idejte Φlenskou prom∞nnou typu CRgn. (nap°. CRgn wnd_rgn;)

Do reakce na zprßvu WM_CREATE - funkce OnCreate p°idejte za volßnφ CWnd::OnCreate(...) nßsledujφcφ zdrojov² k≤d (je uveden bez testovßnφ nßvratov²ch hodnot)

wnd_rgn.CreateEllipticRgn(0,0,400,300);

SetWindowRgn(wnd_rgn,TRUE);

To zm∞nφ tvar okna z klasickΘho obdΘlnφku na elipsu (Nefunguje u aplikace s architekturou dokument/pohled). Pokud region inicializujete v jinΘm tvaru, zφskßte jin² tvar okna.

V destruktoru volejte vnd_rgn.DeleteObject(); pro uvoln∞nφ pam∞ti zabranΘ regionem. Nema₧te jej d°φve, proto₧e okno jej nadßle pou₧φvß.

PootoΦenφ a posunutφ regionu

Mßme inicializovan² region rgn a chceme jej pootoΦit o ·hel alfa a posunout o dx, dy.

XFORM xf;

xf.eM11 = cos(alfa);

xf.eM12 = sin(alfa);

xf.eM21 = -sin(alfa);

xf.eM22 = cos(alfa);

xf.eDx = dx;

xf.eDy = dy;

 

int nCount = rgn.GetRegionData(NULL,0);

 

RGNDATA* pData = (RGNDATA*) new BYTE[nCount];

 

rgn.GetRegionData(pData,nCount);

 

CRgn vysledek;

vysledek.CreateFromData(&xf, nCount, pData);

 

delete[] pData;

 

U tohot poslednφho p°φkladu nezaruΦuji, ₧e je sprßvn∞ (teoreticky je), proto₧e jsem jej nezkouÜel. Napsal jsem jej Φist∞ podle nßpov∞dy.