window - tablacus/TablacusDark GitHub Wiki
Window 全体のダークモード対応
非公開APIを使ってもダークモード化するのはタイトル バーとメニューだけです。(メニューバー除く)
WM_ERASEBKGND
まずは背景色を WM_ERASEBKGND で設定します。
case WM_ERASEBKGND:
RECT rc;
GetClientRect(hwnd, &rc);
FillRect((HDC)wParam, &rc, g_hbrDarkBackground);
return 1;
背景色のブラシはよく使うのであらかじめ作っておきます。
#define TECL_DARKBG 0x202020
g_hbrDarkBackground = CreateSolidBrush(TECL_DARKBG);
WM_PAINT
MessageBoxダイアログ、SHRunDialog の場合、ボタンの周りなどグレーのバーができます。これを排除するには WM_PAINT を使います。
ダイアログをダーク化しない場合は対応しない方が良いです。
CHAR pszClassA[MAX_CLASS_NAME];
case WM_PAINT:
HWND hwndChild;
hwndChild = NULL;
BOOL bHandle;
bHandle = TRUE;
while (hwndChild = FindWindowEx(hwnd, hwndChild, NULL, NULL)) {
GetClassNameA(hwndChild, pszClassA, MAX_CLASS_NAME);
if (bHandle && !PathMatchSpecA(pszClassA, WC_STATICA ";" WC_BUTTONA ";" WC_COMBOBOXA)) {
bHandle = FALSE;
}
}
if (bHandle) {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
EndPaint(hwnd, &ps);
}
break;
STATIC、BUTTON、COMBOBOX 以外のコントロールがある場合はデフォルトの処理を行います。 理由は以下のカラー選択ダイアログの様に描画させなければおかしくなるものがあるためです。