Popis třídy CRgn (MFC a C++)

Tato třída slouží k práci s regiony (2D plochami). Obsahuje mnoho členských funkcí, pomocí kterých se dá zjistit např. jestli se nějaký bod nachází v regionu. Některé z nich si zde popíšeme. A na co regiony vlastně jsou? Můžeme pomocí nich změnit tvar okna na eliptický nebo kreslit exotické obrazce na obrazovce. Práce s regiony je ale velmi pomalá, takže pokud je nemusíte používat, tak je nepoužívejte.

Výsledek bude vypadat asi nějak takhle:

Výsledek naší práce

Vytvoření a zrušení regionu

Za všeho nejdříve je potřeba region vytvořit. To se provádí jednou z následujících funkcí (nejsou zde všechny):

BOOL CreateRectRgn( int x1, int y1, int x2, int y2 );
Vytvoří obdélníkový region. Něco jako CRect.

BOOL CreateEllipticRgn( int x1, int y1, int x2, int y2 );
Vytvoří eliptický region. Parametry udávají obdélník opisující elipsu.

BOOL CreatePolygonRgn( LPPOINT lpPoints, int nCount, int nMode );
Vytvoří n-úhelníkový region. lpPoint je pole obsahující vrcholy, nCount je počet vrcholů a nMode určuje způsob vyplnění (ALTERNATE nebo WINDINGS).

BOOL CreateRoundRectRgn( int x1, int y1, int x2, int y2, int x3, int y3 );
Vytvoří obdélníkový region se zahnutými rohy. První 4 parametry určují obdélník a další dva šířku a výšku elipsy, která bude zaoblovat rohy.

Region je vždy potřeba poté, co už není potřeba, smazat a to funkcí DeleteObject() .

Práce s regiony

Pro práci s regiony je tu opět mnoho funkcí, my si zde některé uvedeme:

int CombineRgn( CRgn* pRgn1, CRgn* pRgn2, int nCombineMode );
Vytvoří region, který bude kombinací dvou, které zadáte do parametrů. Poslední parametr nCombineMode určuje způsob spojení.

RGN_AND - výsledkem je průnik regionů
RGN_COPY - výsledek je kopií prvního regionu
RGN_DIFF - výsledek je tvořen odečtením druhého regionu od prvního
RGN_ON - výsledek je tvořen sloučením regionů
RGN_XOR - výsledek je tvořen částmi regionů, které nejsou společné


BOOL EqualRgn( CRgn* pRgn ) const;
Zjistí, zda jsou dva regiony stejné

BOOL PtInRegion( int x, int y ) const;
BOOL PtInRegion( POINT point ) const;
Zjistí, zda je nějaký bod v regionu

BOOL RectInRegion( LPCRECT lpRect ) const;
Zjistí, zda je nějaká část obdélníku v regionu

Příklady

Teď uvidíte, co se dá s regiony všechno udělat:

Vytvoření n-úhelníkového regionu (trojúhelník)

POINT body[3];

body[0].x=100;   //zadání pozic jednotlivých bodů
body[0].y=100;
body[1].x=200;
body[1].y=100;
body[2].x=150;
body[2].y=200;

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

Vykreslení regionu

CRgn rgn;
CClientDC dc(this);
CBrush stetec(RGB(255,0,0)); //červená

rgn.CreateEllipticRgn(100,100,500,300);
dc.FillRgn(&rgn,&stetec);

Vytvoření eliptického okna (možno stáhnout)

protected    //členská proměnná
  CRgn m_rgn;
  
...

m_rgn.CreateEllipticRgn(0,0,500,300);   //WM_CREATE
SetWindowRgn(m_rgn,TRUE);

...

m_rgn.DeleteObject();   //WM_DESTROY

Stáhnout zdrojový kód (25kb)

UPOZORNĚNÍ: Jedná se o archiv článků z let 2003 - 2005, uvedené technologie či postupy již mohou být neaktuální.