listview - tablacus/TablacusDark GitHub Wiki

SysListView32(リストビュー)のダークモード対応

image

文字色をListView_SetTextColorで背景色をListView_SetTextBkColorListView_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));

image

ヘッダーをダークモード化

HWND hHeader = ListView_GetHeader(hwnd1);
if (hHeader) {
	SetWindowTheme(hHeader, g_bDarkMode ? L"darkmode_itemsview" : L"explorer", NULL);
}

image

ヘッダーの文字を白に変更するには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);はソートカラムが強調されて白くなるのを抑制するために入れている。

image

グループの部分やスクロールバーをダークモードに対応させる方法

1. darkmode_itemsviewを使う

SetWindowTheme(hwnd,  L"darkmode_itemsview", NULL);

itemsview

  • ◎選択はグレーで良い感じ。(プログラム名の所のグレーはマウスホーバー)
  • ◎グループがちゃんと読める
  • △スクロールバーがライトモード

スクロールバー以外は理想的

2. dakemode_explorer を使う

SetWindowTheme(hwnd,  L"darkmode_itemsview", NULL);

darkmode_explorer

  • 〇選択の部分がクラシックスタイル(一行選択じゃない場合は長さが異なる・マウスホーバーなし)
  • △グループが青で読みにくい
  • ◎スクロールバーがダークモード

グループ使わなければアリ

3. AllowDarkModeForWindow してから explorer を使う

_AllowDarkModeForWindow(hwnd1, TRUE);
SetWindowTheme(hwnd, L"explorer", NULL);

allow_explorer

  • △選択がちょっと見にくい
  • △グループが青で読みにくい
  • ◎スクロールバーがダークモード

もうちょい

4. Tablacus Explorer方式

3.にカスタムドローでグループを調整し、CDDS_ITEMPREPAINT で 背景をFillRectする 3の方法は選択部分が半透明で描画されるので背景色を先に変えると影響されます。

tablacus

  • 〇選択もそこそこ
  • ◎グループがちゃんと読める
  • ◎スクロールバーがダークモード

5. IAT Hook で 1.のdarkmode_itemsviewのスクロールバーをダークモードに

こちらのページで行っている方法。

https://github.com/ysc3839/win32-darkmode

見た目はすごい良い感じだけど、IAT Hookはちょっと敷居が高い