お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"リージョンの結合"



CombineRgn という API を使ったリージョンの結合の例です。

Windows95/98 では BeginPath 〜 EndPath の間に Rectangle や
RoundRect, Ellipse といった関数を使ってもうまくいきません。
これらのリージョンを使用するためには CreateRectRgn, 
CreateRoundRectRgn, CreateEllipticRgn といった API 群を使用
しなければなりません。他の図形と組み合わせる場合は作成した
リージョンを、他のリージョンと CombineRgn で合成します。







フォームにボタンを二つ置いてクリックイベントに以下のように記述します。

procedure TForm1.Button1Click(Sender: TObject);
var
  Rgn1, Rgn2, Rgn3, Rgn4: hRgn;
  PointArray: array[1..3]of TPoint;
begin
  Rgn1 := CreateRectRgn(10, 10, 120, 120);      //矩形リージョン

  Rgn2 := CreateEllipticRgn(60, 60, 180, 180);  //楕円形リージョン

  PointArray[1] := Point( 30, 180);
  PointArray[2] := Point( 90,  80);
  PointArray[3] := Point(150, 180);             //多角形リージョン
  Rgn3 := CreatePolygonRgn(PointArray, 3, ALTERNATE);

  Rgn4 := CreateRectRgn(0, 0, 10, 10);          //結合用の仮のリージョンを作成

  CombineRgn(Rgn4, Rgn2, Rgn1, RGN_OR);         //リージョンを結合する
  CombineRgn(Rgn4, Rgn4, Rgn3, RGN_XOR);

  with Canvas do begin
    Brush.Color := clRed;
    Brush.Style := bsCross;
    FillRgn(Handle, Rgn4, Brush.Handle);        //リージョンを描画
    Brush.Color := clBlue;
    Brush.Style := bsSolid;
    FrameRgn(Handle, Rgn4, Brush.Handle, 1, 1);
  end;

  DeleteObject(Rgn1);                           //リージョンの破棄
  DeleteObject(Rgn2);
  DeleteObject(Rgn3);
  DeleteObject(Rgn4);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Rgn1, Rgn2, Rgn3: hRgn;
begin
  Rgn1 := CreateRoundRectRgn(210, 10, 410, 110, 5, 5);      //矩形リージョン

  Rgn2 := CreateEllipticRgn(260, 60, 360, 160);  //円形リージョン

  Rgn3 := CreateRectRgn(0, 0, 10, 10);           //結合用の仮のリージョンを作成

  CombineRgn(Rgn3, Rgn1, Rgn2, RGN_DIFF);        //リージョンを結合する

  with Canvas do begin
    Brush.Color := clGreen;
    Brush.Style := bsDiagCross;
    FillRgn(Handle, Rgn3, Brush.Handle);         //リージョンを描画
    Brush.Color := clBlack;
    Brush.Style := bsSolid;
    FrameRgn(Handle, Rgn3, Brush.Handle, 5, 5);
  end;

  DeleteObject(Rgn1);                            //リージョンの破棄
  DeleteObject(Rgn2);
  DeleteObject(Rgn3);
end;

    平成10年8月25日(火)  fumika(YRK00111@nifty.ne.jp)
         ★☆★ http://www2m.biglobe.ne.jp/~fumika/ ★☆★

Original document by fumika    氏 ID:(YRK00111)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum