Windows11でスタイルがまた角丸になったウィンドウをC#のWinFormアプリで適用する方法を備忘録的に投稿します。
詳しい内容は公式ページの「Windows 11 向けデスクトップ アプリケーションで角の丸めを適用する」にあります。
フォームのタイトルバーを消すと丸くならない問題
そもそも、Windows側で上手くやってくれるのでフォームアプリを開発する上で、ウィンドウのスタイルを気にすることはない。
しかし、フォームの[FormBorderStyle]プロパティを変更した時に問題になってくる。
例えば、次のようなコードをフォームに追加して実行してみる。
this.FormBorderStyle = FormBorderStyle.None;
するとタイトルバーが非表示になり、フォームがリサイズ出来ないようになるが、角の丸めがなくなり長方形になってしまう。
余談になるが、別の方法で次のコードを追加した際は角の丸みは残るが、タイトルバーの一部が非表示にならない。
this.ControlBox = false;
this.Text = "";
調べてみると、Windows11のタイトルバーはシステム設定(既定値は23ピクセル)よりも高くなっていて、32ピクセルに設定されている。その差9ピクセル分が残ってしまうので、上の画像のように一部が表示されてしまうと考えられる。
両方とも、カッコが悪いので[FormBorderStyle.None]を設定した時でも角が丸くなるようにするのが、今回の目的。
レジストリから取得
公式ページのやり方によると、[DwmSetWindowAttribute]APIで角の丸みを適用できるらしい。
まずはDllImportで dwmapi.dll を読み込む。
public enum DWMWINDOWATTRIBUTE
{
DWMWA_WINDOW_CORNER_PREFERENCE = 33
}
public enum DWM_WINDOW_CORNER_PREFERENCE
{
DWMWCP_DEFAULT = 0,
DWMWCP_DONOTROUND = 1,
DWMWCP_ROUND = 2,
DWMWCP_ROUNDSMALL = 3
}
[DllImport("dwmapi.dll", CharSet = CharSet.Unicode, PreserveSig = false)]
internal static extern void DwmSetWindowAttribute(IntPtr hwnd,
DWMWINDOWATTRIBUTE attribute, ref DWM_WINDOW_CORNER_PREFERENCE pvAttribute, uint cbAttribute);
DWMWINDOWATTRIBUTEとDWM_WINDOW_CORNER_PREFERENCEの部分は定数定義なので、そのまま数値を代入しても大丈夫。(後で分からなくなるのを防止するために定数を使ってます)
後はフォームのコンストラクター部分で[DwmSetWindowsAttribute]APIを呼び出して角の丸みを適用します。
var attribute = DWMWINDOWATTRIBUTE.DWMWA_WINDOW_CORNER_PREFERENCE;
var preference = DWM_WINDOW_CORNER_PREFERENCE.DWMWCP_ROUND;
DwmSetWindowAttribute(this.Handle, attribute, ref preference, sizeof(uint));
実行すると、こんな感じ。
無事に丸くなりました。
まとめ
今回は短い記事ですが、Windows11で適用されたウィンドウの角の丸みをフォームに適用するには、[DwmSetWindowsAttribute]APIを呼び出すことで実現できました。
そもそも実行時にWindowsが上手に適用してくれるので、実際に使うケースが少ないですが、フォームのタイトルバーを消す場合や、ボーダーのスタイルを変更した場合などで角の丸みが無くなってしまった際に使えます。
C#のフォームアプリで、Windows11の角の丸みが適用したい場合の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。