listview - tablacus/TablacusDark GitHub Wiki
SysListView32(リストビュー)のダークモード対応
文字色をListView_SetTextColor
で背景色をListView_SetTextBkColor
とListView_SetBkColor
で設定する。
#define TECL_DARKTEXT 0xffffff
#define TECL_DARKBG 0x202020
ListView_SetTextColor(hwnd1, g_bDarkMode ? TECL_DARKTEXT : GetSysColor(COLOR_WINDOWTEXT));
ListView_SetTextBkColor(hwnd1, g_bDarkMode ? TECL_DARKBG : GetSysColor(COLOR_WINDOW));
ListView_SetBkColor(hwnd1, g_bDarkMode ? TECL_DARKBG : GetSysColor(COLOR_WINDOW));
ヘッダーをダークモード化
HWND hHeader = ListView_GetHeader(hwnd1);
if (hHeader) {
SetWindowTheme(hHeader, g_bDarkMode ? L"darkmode_itemsview" : L"explorer", NULL);
}
ヘッダーの文字を白に変更するにはListViewをサブクラス化してWM_NOTIFYのNM_CUSTOMDRAWで文字色を設定する。
オーナードローする方法もあるがこっちの方がお勧め
case WM_NOTIFY:
if (g_bDarkMode) {
if (((LPNMHDR)lParam)->code == NM_CUSTOMDRAW) {
LPNMCUSTOMDRAW pnmcd = (LPNMCUSTOMDRAW)lParam;
if (pnmcd->dwDrawStage == CDDS_PREPAINT) {
return CDRF_NOTIFYITEMDRAW;
}
if (pnmcd->dwDrawStage == CDDS_ITEMPREPAINT) {
SetTextColor(pnmcd->hdc, TECL_DARKTEXT);
return CDRF_DODEFAULT;
}
}
DefSubclassProc(hwnd, LVM_SETSELECTEDCOLUMN, -1, 0);
}
break;
※DefSubclassProc(hwnd, LVM_SETSELECTEDCOLUMN, -1, 0);
はソートカラムが強調されて白くなるのを抑制するために入れている。
グループの部分やスクロールバーをダークモードに対応させる方法
1. darkmode_itemsviewを使う
SetWindowTheme(hwnd, L"darkmode_itemsview", NULL);
- ◎選択はグレーで良い感じ。(プログラム名の所のグレーはマウスホーバー)
- ◎グループがちゃんと読める
- △スクロールバーがライトモード
スクロールバー以外は理想的
2. dakemode_explorer を使う
SetWindowTheme(hwnd, L"darkmode_itemsview", NULL);
- 〇選択の部分がクラシックスタイル(一行選択じゃない場合は長さが異なる・マウスホーバーなし)
- △グループが青で読みにくい
- ◎スクロールバーがダークモード
グループ使わなければアリ
3. AllowDarkModeForWindow してから explorer を使う
_AllowDarkModeForWindow(hwnd1, TRUE);
SetWindowTheme(hwnd, L"explorer", NULL);
- △選択がちょっと見にくい
- △グループが青で読みにくい
- ◎スクロールバーがダークモード
もうちょい
4. Tablacus Explorer方式
3.にカスタムドローでグループを調整し、CDDS_ITEMPREPAINT で 背景をFillRectする 3の方法は選択部分が半透明で描画されるので背景色を先に変えると影響されます。
- 〇選択もそこそこ
- ◎グループがちゃんと読める
- ◎スクロールバーがダークモード
5. IAT Hook で 1.のdarkmode_itemsviewのスクロールバーをダークモードに
こちらのページで行っている方法。
https://github.com/ysc3839/win32-darkmode
見た目はすごい良い感じだけど、IAT Hookはちょっと敷居が高い