combobox - tablacus/TablacusDark GitHub Wiki

COMBOBOX(コンボボックス、リストボックス?)のダークモード対応

image

テーマをdarkmode_cfdにするとコンボボックスのボタンなどがダークモードに対応します。

::SetWindowTheme(hwnd1, g_bDarkMode ? L"darkmode_cfd" : L"cfd", NULL);

image

その際にサブクラス化してそこで EDIT と同じようにすると入力ボックス等がダークモード化します。 ※ダイアログの場合はサブクラス化しないで親ウインドウに WM_CTLCOLOREDIT が飛んできます。

image

次にドロップダウンメニュー等をダークモードに対応します。

image

WM_CTLCOLORLISTBOX も WM_CTLCOLOREDIT と同じ処理を行うとダークモードに対応します。

case WM_CTLCOLORLISTBOX://Combobox
case WM_CTLCOLOREDIT:
	SetTextColor((HDC)wParam, TECL_DARKTEXT);
	SetBkColor((HDC)wParam, TECL_DARKBG);
	SetDCBrushColor((HDC)wParam, TECL_DARKEDITBG);
	return (LRESULT)GetStockObject(DC_BRUSH);

image

あとはスクロールバーをダークモードに対応させます。 WM_CTLCOLORLISTBOX で lParamComboLBox のウインドウハンドルが入っているのでテーマをdarkmode_explorerに設定します。 毎回設定すると画面がかなりチラつくので1つのウインドウハンドルに付き1回だけ設定するようにしてください。 私はstd::unordered_mapを使っています。

std::unordered_map<HWND, HWND> g_umDlgProc;

if (msg == WM_CTLCOLORLISTBOX) {
	if (_AllowDarkModeForWindow) {
		auto itr = g_umDlgProc.find((HWND)lParam);
		if (itr == g_umDlgProc.end()) {
			SetWindowTheme((HWND)lParam, g_bDarkMode ? L"darkmode_explorer" : L"explorer", NULL);
			g_umDlgProc[(HWND)lParam] = hwnd;
		}
	}
}

※ウインドウを閉じる際にその子孫ウインドウの物は削除しています。

image

⚠️ **GitHub.com Fallback** ⚠️