..::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:
- BOOL CreateRectRgn( int x1, int y1,
int x2, int y2 );
- Vytvo°φ obdΘlnφkov² region, tedy obdobu CRect
- BOOL CreateEllipticRgn( int x1, int
y1, int x2, int y2 );
- Vytvo°φ region ve tvaru elipsy. Parametry udßvajφ obdΘlnφk
obsahujφcφ elipsu.
- BOOL CreatePolygonRgn( LPPOINT lpPoints,
int nCount, int nMode );
- Vytvo°φ region tvo°en² n-·helnφkem.
- Parametry
- lpPoints - Pole bod∙ udßvajφcφch vrcholy n-·hlenφku
- nCount - PoΦet bod∙.
- nMode - UrΦuje zp∙sob vypln∞nφ (bu∩ ALTERNATE nebo WINDINGS)
- Pokud je to nutnΘ, tato funkce uzav°e n-·helnφk spojenφm prvnφho
a poslednφho bodu.
- BOOL CreatePolyPolygonRgn( LPPOINT lpPoints,
LPINT lpPolyCounts, int nCount, int
nPolyFillMode );
- Vytvo°φ region tvo°en² n∞kolika n-·hlenφky
- Parametry
- lpPoints - Ukazatel na pole bod∙ definujφcφch n-·helnφky.
Poslednφ bod ka₧dΘho n-·helnφku se musφ rovnat jeho prvnφmu
bodu.
- lpPolyCounts - Ukazatel na pole Φφsel urΦujφcφch, kolik bod∙
z p°edchozφho pole odpovφdß odpovφdajφcφmu n-·helnφku.
- nCount - poΦet prvk∙ p°edchozφho pole
- nPolyFillMode - zp∙sob vypln∞nφ
- P°φklad - vytvo°enφ regionu ve tvaru dvou troj·helnφk∙.
POINT body[8];
body[0].x = 0;
body[0].y = 0;
body[1].x =20 ;
body[1].y = 10;
body[2].x = 10;
body[2].y = 20;
body[3].x = 0;
body[3].y = 0;
body[4].x = 100;
body[4].y = 100;
body[5].x = 120;
body[5].y = 110;
body[6].x = 110;
body[6].y = 120;
body[7].x = 100;
body[7].y = 100;
int pocet[2];
pocet[0] = 4;
pocet[1] = 4;
CRgn rgn;
rgn.CreatePolyPolygonRgn(&body,&pocet,2,ALTERNATE);
- BOOL CreateRoundRectRgn( int x1, int
y1, int x2, int y2, int
x3, int y3 );
- Vytvo°φ region ve tvaru obdΘlnφku se zaoblen²mi rohy.
- Prvnφ Φty°i parametry udßvajφ lev² hornφ a prav² dolnφ roh
obdΘlnφku. Poslednφ dva udßvajφ Üφ°ku a v²Üku elipsy, kterß
se pou₧ije k zaoblenφ roh∙.
- int CombineRgn( CRgn* pRgn1, CRgn*
pRgn2, int nCombineMode );
- Vytvo°φ region jako kombinaci dvou existujφcφch
- Parametry
- pRgn1, pRgn2 - v²chozφ regiony
- nCombineMode - zp∙sob spojenφ
- RGN_AND - v²sledek je tvo°en pr∙nikem region∙
- RGN_COPY - v²sledek je kopiφ pRgn1
- RGN_DIFF - v²sledek je tvo°en Φßstφ pRgn1, kterß
zßrove≥ nenφ v pRgn2 (rozdφl)
- RGN_OR - v²sledek je tvo°en slouΦenφm pRgn1 a
pRgn2. (souΦet)
- RGN_XOR - v²sledek je tvo°en Φßstmi pRgn1 a pRgn2,
kterΘ nejsou spoleΦnΘ.
- Nßvratovß hodnota
- COMPLEXREGION - V²sledek mß p°ekr²vajφcφ se okraje
- ERROR - funkce nebyla ·sp∞Ünß -> nebyl vytvo°en
region
- NULLREGION - v²sledkem je prßzdn² region. To lze vyu₧φt
pro testovßnφ pr∙niku dvou region∙.
- SIMPLEREGION - v²sledek nemß p°esahujφcφ se okraje
- int CopyRgn( CRgn* pRgnSrc );
- vytvo°φ kopii existujφcφho regionu
- nßvratovß hodnota stejnß jako u p°edchozφ funkce
- BOOL CreateFromData( const XFORM* lpXForm,
int nCount, const RGNDATA* pRgnData
);
- vytvo°φ region otoΦenφm, posunutφm nebo zm∞nou velikosti existujφcφho
regionu
- p°φklad je na konci Φlßnku
- BOOL EqualRgn( CRgn* pRgn ) const;
- Zjistφ zda jsou dva regiony stejnΘ
- int GetRgnBox( LPRECT lpRect ) const;
- vrßtφ obdΘlnφk obsahujφcφ region
- int OffsetRgn( int x, int y
);
int OffsetRgn( POINT point );
- Posune region o zadanou vzdßlenost.
- BOOL PtInRegion( int x, int y
) const;
BOOL PtInRegion( POINT point ) const;
- Zjistφ zda je zadan² bod v regionu.
- BOOL RectInRegion( LPCRECT lpRect ) const;
- Zjistφ zda je n∞jakß Φßst obdΘlnφku v regionu.
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.