016:リージョンを結合する

リージョンの結合

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へ格納

           SelectClipRgn(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;
}

きょうはここまでです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です