web-dev-qa-db-ja.com

カスタムボーダーと丸みを帯びたエッジを持つC#フォーム

このコードを使用して、丸みを帯びたエッジを持つフォーム(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);

しかし、これを参照してください screenshot

内側のフォームの長方形には、丸みを帯びたエッジがありません。

スクリーンショットのように見えないように、青い内側のフォームを長方形にしてエッジも丸くするにはどうすればよいですか?

12
Meredith

リージョンプロパティは、単に角を切り落とします。真の丸みを帯びた角を得るには、丸みを帯びた長方形を描く必要があります。

角丸長方形の描画

必要な形の画像を描き、それを透明なフォームに配置する方が簡単な場合があります。描画は簡単ですが、サイズを変更することはできません。

9
Erno de Weerd

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);
}

(コメントとして追加しますが、評判は高くなります)

0
Phi