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;
}
}
}※ウインドウを閉じる際にその子孫ウインドウの物は削除しています。
