Windows11で角丸なしのウィンドウを作りたい(Win32Api)
Windows11でウィンドウの角丸を取る方法を調べたので、備忘録として記しておきます。
動機
クライアント領域の四隅の1ドットを赤色に変えていますが、デフォルトのウィンドウの方は角丸の所為で下の角の部分が見えなくなってしまっています。
これをどうにかできないかと思って調べたのがきっかけです。
デフォルトのウィンドウ
環境
環境は以下の通りです。
OS : Windows 11 Pro
バージョン : 22H2
ビルド : 22621.1992
方法
DwmSetWindowAttribute関数を使用してウィンドウの角の丸みの設定が可能です。
第一引数に設定したいウィンドウのハンドル
CreateWindowなどで作成したウィンドウのハンドルを指定します。
第二引数に設定する属性値(DWMWINDOWATTRIBUTE)
どの属性を変更するかを指定する項目です。
今回はDWMWA_WINDOW_CORNER_PREFERENCE
を指定します。
第三引数に設定値
設定値のオブジェクトのポインターを指定します。
第二引数に指定した属性値に応じてオブジェクトの型が変わります。
DWMWINDOWATTRIBUTEのドキュメントに、DWMWA_WINDOW_CORNER_PREFERENCE
を指定した場合はDWM_WINDOW_CORNER_PREFERENCE
の値を指定するよう記述されています。
DWMWCP_DONOTROUND
で角を丸めないように指定します。
DWMWA_WINDOW_CORNER_PREFERENCE
DwmSetWindowAttribute で を使用します。 ウィンドウの角の丸みを帯びた設定を指定します。 pvAttribute パラメーターは、DWM_WINDOW_CORNER_PREFERENCE型の値を指します。
第四引数に第三引数に指定したオブジェクトのサイズ
第三引数に使用した型のサイズを指定します。
サンプルプログラム
作成済みのウィンドウの角丸を取り除く関数のサンプルです。
属性のDWMWA_WINDOW_CORNER_PREFERENCE
はWindows 11 ビルド 22000 以降でサポートされているため、それ以前のバージョンでは失敗する可能性があります。(動作確認できていません。ご了承ください。)
#include <dwmapi.h>
#pragma comment(lib, "Dwmapi.lib")
bool TryDisableWindowCornerRound(HWND windowHandle)
{
const DWM_WINDOW_CORNER_PREFERENCE cornerReference = DWMWCP_DONOTROUND;
const HRESULT hr = ::DwmSetWindowAttribute(
windowHandle,
DWMWA_WINDOW_CORNER_PREFERENCE,
&cornerReference,
sizeof(DWM_WINDOW_CORNER_PREFERENCE)
);
return hr == S_OK;
}
比較
対応した場合とそうでない場合の比較です。
角丸なしのウィンドウの方は下の角の部分も見えています。
デフォルトのウィンドウ
角丸なしのウィンドウ
以上、Windows11でも角のあるウィンドウを表示できることがわかりました。
参考になれば幸いです。
Discussion