このコードを使用して、丸みを帯びたエッジを持つフォーム(FormBorderStyle = none)を作成しています。
[DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
private static extern IntPtr CreateRoundRectRgn
(
int nLeftRect, // x-coordinate of upper-left corner
int nTopRect, // y-coordinate of upper-left corner
int nRightRect, // x-coordinate of lower-right corner
int nBottomRect, // y-coordinate of lower-right corner
int nWidthEllipse, // height of ellipse
int nHeightEllipse // width of ellipse
);
public Form1()
{
InitializeComponent();
Region = System.Drawing.Region.FromHrgn(CreateRoundRectRgn(0, 0, Width, Height, 20, 20));
}
そして、これはPaintイベントにカスタム境界線を設定します。
ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, Color.Black, 5, ButtonBorderStyle.Solid, Color.Black, 5, ButtonBorderStyle.Solid, Color.Black, 5, ButtonBorderStyle.Solid, Color.Black, 5, ButtonBorderStyle.Solid);
しかし、これを参照してください 。
内側のフォームの長方形には、丸みを帯びたエッジがありません。
スクリーンショットのように見えないように、青い内側のフォームを長方形にしてエッジも丸くするにはどうすればよいですか?
リージョンプロパティは、単に角を切り落とします。真の丸みを帯びた角を得るには、丸みを帯びた長方形を描く必要があります。
必要な形の画像を描き、それを透明なフォームに配置する方が簡単な場合があります。描画は簡単ですが、サイズを変更することはできません。
CreateRoundRectRgn() によって返されるハンドルがリークしていることに注意してください。使用後は、 DeleteObject() で解放する必要があります。
Region.FromHrgn()は定義をコピーするため、ハンドルが解放されません。
[DllImport("Gdi32.dll", EntryPoint = "DeleteObject")]
public static extern bool DeleteObject(IntPtr hObject);
public Form1()
{
InitializeComponent();
IntPtr handle = CreateRoundRectRgn(0, 0, Width, Height, 20, 20);
if (handle == IntPtr.Zero)
; // error with CreateRoundRectRgn
Region = System.Drawing.Region.FromHrgn(handle);
DeleteObject(handle);
}
(コメントとして追加しますが、評判は高くなります)