イネマルのプログラミング備忘録

趣味プログラマのメモ

【WinAPI】C++ Windows11 環境でウィンドウの角丸を制御する

ウィンドウの角丸を制御する

Windows11 から、デフォルトでウィンドウの四つ角が丸められます。
これを、Windows10 のような丸められていない状態などに変更するには、DwmSetWindowAttribute を使用します。
Windows11 以降で利用可能 な方法です。それ以前の古い環境で、APIは動作しません。

実装

ウィンドウハンドルを指定してAPIを呼び出すだけで変更できます。

インクルード周り

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <dwmapi.h>
#pragma comment(lib, "dwmapi.lib")

角丸の種類と呼び出し方

// 例:ウィンドウの角を丸めない
static const auto attr = DWMWA_WINDOW_CORNER_PREFERENCE;
static const auto pref = DWMWCP_DONOTROUND;
::DwmSetWindowAttribute(hWnd, attr, &pref, sizeof(pref));

pref の値は、下記を参照。

列挙値 説明
DWMWCP_DEFAULT ウィンドウの角を丸めるかどうかをシステムに決めさせます。
DWMWCP_DONOTROUND ウィンドウの角は丸められません。
DWMWCP_ROUND 必要に応じて、角を丸めます。
DWMWCP_ROUNDSMALL 必要に応じて角を丸め、半径を小さくします。

その他

DWM をサポートしている環境かどうかのチェック処理は下記の通り。
(現行環境では、呼び出す必要はないはず。)

BOOL isDwmEnable = FALSE;
auto hResult = ::DwmIsCompositionEnabled(&isDwmEnable);
if (hResult != S_OK || isDwmEnable == FALSE) {
    return; // 非サポート
}

参考