リージョンの結合
WindowsMobileでは長方形のリージョンしか作成できません。そのため複雑な図形の描画には適していませんが、リージョンの結合はサポートされています。二つの長方形を組み合わせた図形をリージョンとすることが出来ます。
CombineRgn関数
int CombineRgn(
HRGN hrgnDest, // 結合先リージョンのハンドル
HRGN hrgnSrc1, // 結合元リージョンのハンドル
HRGN hrgnSrc2, // 結合元リージョンのハンドル
int fnCombineMode // リージョンの結合モード
);
hrgnDest このリージョンに、他の 2 つのリージョンを結合した結果が格納されます。結合先リージョンはどのようなものでもかまわないため、サンプルプログラムではCreateRectRgn(0,0,1,1)としています。
hrgnSrc1 1番目の結合元リージョンのハンドルを指定します。
hrgnSrc2 2番目の結合元リージョンのハンドルを指定します。
fnCombineMode 2 つのリージョンの結合方法を指定します。
fnCombineModeは次の値を指定できます。
値 | 説明 |
RGN_AND | 2 つのリージョンの重なり合う領域 |
RGN_COPY | hrgnSrc1 で識別されているリージョンのコピー |
RGN_DIFF | hrgnSrc1 リージョンのうち、hrgnSrc2 リージョンの一部ではない領域 |
RGN_OR |
両方のリージョンを結合 |
RGN_XOR | 両方のリージョンが重なり合う領域を除いた領域 |
では早速、RGN_XORで結合したリージョンでクリッピングしてみましょう。
ソースは前回「リージョン」と同じですので、ウインドウプロシージャ「WndProc関数」のみ記載します。
// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
PAINTSTRUCT ps;
HDC hdc;
HGDIOBJ hPen,hOldPen,hBrush,hOldBrush;
HRGN hRgnDest;
HRGN hRgn1;
HRGN hRgn2;
switch (msg){
case WM_PAINT:
hdc = BeginPaint(hWnd,&ps); // 描画処理を開始します。
hPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); // 赤色のペンを作成
hOldPen = SelectObject(hdc, hPen); // 作成したペンを選択する
hBrush = CreateSolidBrush(RGB(0, 255, 0)); // 緑色のブラシを作成
hOldBrush = SelectObject(hdc, hBrush); // 作成したペンを選択する
hRgn1 = CreateRectRgn(0,0,60,60); // リージョン1の作成
hRgn2 = CreateRectRgn(40,40,100,100); // リージョン2の作成
hRgnDest = CreateRectRgn(0,0,1,1); // 結合先リージョンの作成
CombineRgn(hRgnDest,hRgn1,hRgn2,RGN_XOR); // リージョン1と2を結合してhRgnDestへ格納
SelectClipR
gn(hdc,hRgnDest); // デバイスコンテキストにリージョンを設定
Ellipse(hdc, 0, 0, 100, 100); // 円を描く
SelectObject(hdc, hOldPen); // ペンを元に戻す
SelectObject(hdc, hOldBrush); // ブラシを元に戻す
DeleteObject(hPen); // 作成したペンを削除
DeleteObject(hBrush); // 作成したブラシを削除
DeleteObject(hRgn1); // 作成したリージョンを削除
DeleteObject(hRgn2); // 作成したリージョンを削除
DeleteObject(hRgnDest); // 作成したリージョンを削除
EndPaint(hWnd,&ps); // 描画処理を終了します。
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}
きょうはここまでです。