combobox - tablacus/TablacusDark GitHub Wiki
テーマをdarkmode_cfd
にするとコンボボックスのボタンなどがダークモードに対応します。
::SetWindowTheme(hwnd1, g_bDarkMode ? L"darkmode_cfd" : L"cfd", NULL);
その際にサブクラス化してそこで EDIT と同じようにすると入力ボックス等がダークモード化します。 ※ダイアログの場合はサブクラス化しないで親ウインドウに WM_CTLCOLOREDIT が飛んできます。
次にドロップダウンメニュー等をダークモードに対応します。
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);
あとはスクロールバーをダークモードに対応させます。
WM_CTLCOLORLISTBOX で lParam
に ComboLBox
のウインドウハンドルが入っているのでテーマを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;
}
}
}
※ウインドウを閉じる際にその子孫ウインドウの物は削除しています。