window - tablacus/TablacusDark GitHub Wiki

Window 全体のダークモード対応

非公開APIを使ってもダークモード化するのはタイトル バーとメニューだけです。(メニューバー除く)

image

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

image

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;

image

STATIC、BUTTON、COMBOBOX 以外のコントロールがある場合はデフォルトの処理を行います。 理由は以下のカラー選択ダイアログの様に描画させなければおかしくなるものがあるためです。

image