Mam's WebSite

Mamの覚書Q&A検索


大項目:「 Delphi 」 - 中項目:「 API 」

「 丸いウィンドウや、穴の開いたウィンドウを作成するには 」

リージョンを使って丸いウィンドウや、穴の開いたウィンドウを作成するには。


回答

リージョンを作成して、ウィンドウに適用すると自由な形のウィンドウを作成することができます。
 
CreateEllipticRgn 楕円のリージョンを作成する
CreateRoundRectRgn 角の丸い長方形のリージョンを作成する
CreatePolygonRgn 多角形のリージョンを作成する
CreateRectRgn 長方形のリージョンを作成する
 
CombineRgn 2つのリージョンを結合したリージョンを作成する
 
SetWindowRgn リージョンをウィンドウに適用する

ソース

//楕円のウィンドウを作成する
procedure TForm1.FormCreate(Sender: TObject);
var rgn:HRgn;
begin
  //楕円のリージョンを作成(左上xy,右下xy座標)
  rgn:=CreateEllipticRgn(0,30,Width,Height);
  //ウィンドウに適用する
  SetWindowRgn(handle,rgn,true);
end;
 

//角の丸い長方形のウィンドウを作成する
procedure TForm1.FormCreate(Sender: TObject);
var rgn:HRgn;
begin
  //角の丸い長方形のリージョンを作成してウィンドウに適用する(左上xy,右下xy,角丸めxy)
  rgn:=CreateRoundRectRgn(0,0,Width,Height,100,50);
  //ウィンドウに適用する
  SetWindowRgn(handle,rgn,true);
end;
 

//三角形に長方形を結合した形のウィンドウを作成する
procedure TForm1.FormCreate(Sender: TObject);
var rgn1,rgn2:HRgn;
    xy:array[0..2] of TPoint;
begin
  //多角形のリージョンを作成する
  xy[0].X:=0;
  xy[0].Y:=0;
  xy[1].X:=Width div 2;
  xy[1].Y:=Height div 2;
  xy[2].X:=0;
  xy[2].Y:=Height;
  rgn1:=CreatePolygonRgn(xy,length(xy),Winding);
  //長方形のリージョンを作成する
  rgn2:=CreateRectRgn(width div 3,height div 3, width,height div 3 * 2);
  //2つのリージョンを結合したリージョンを作成する
  CombineRgn(rgn1,rgn1,rgn2,RGN_OR);
  SetWindowRgn(handle,rgn1,true);
end;
 

//中央に穴の開いたウィンドウを作成する
procedure TForm1.FormCreate(Sender: TObject);
var rgn1,rgn2:HRgn;
begin
  //長方形のリージョンを作成する
  rgn1:=CreateRectRgn(0,0, width,height);
  //楕円のリージョンを作成する
  rgn2:=CreateEllipticRgn(width div 3,height div 3,Width div 3 * 2,Height div 3 * 2);
  //長方形のリージョンから楕円のリージョンを除外したリージョンを作成する
  //(真ん中に穴が開いたウィンドウになる)
  CombineRgn(rgn1,rgn1,rgn2,RGN_DIFF);
  SetWindowRgn(handle,rgn1,true);
end;

Copyright 2019 Mam