@@ -31,6 +31,7 @@ namespace {
3131constexpr UINT_PTR WINDOW_SUBCLASS_ID = 0 ;
3232constexpr UINT_PTR REBAR_SUBCLASS_ID = 1 ;
3333constexpr UINT_PTR BUTTON_SUBCLASS_ID = 2 ;
34+ constexpr UINT_PTR EDIT_SUBCLASS_ID = 3 ;
3435
3536auto GetClassName (HWND hwnd) -> std::wstring
3637{
@@ -73,18 +74,43 @@ ThemeRenderer& ThemeRenderer::Instance()
7374 return *s_instance;
7475}
7576
77+ HBRUSH ThemeRenderer::GetBrush (BrushType type) const
78+ {
79+ switch (type) {
80+ case BrushType::Body:
81+ return m_brushes.body ;
82+ case BrushType::BodyBg:
83+ return m_brushes.body_bg ;
84+ case BrushType::Secondary:
85+ return m_brushes.secondary ;
86+ case BrushType::SecondaryBg:
87+ return m_brushes.secondary_bg ;
88+ case BrushType::Border:
89+ return m_brushes.border ;
90+ case BrushType::Primary:
91+ return m_brushes.primary ;
92+ case BrushType::PrimaryBg:
93+ return m_brushes.primary_bg ;
94+ case BrushType::PrimaryBorder:
95+ return m_brushes.primary_border ;
96+ default :
97+ return m_brushes.body_bg ; // デフォルトは本文背景を返す
98+ }
99+ }
76100
77- void ThemeRenderer::SetTheme (BOOL isDarkMode, Colors colors)
101+ void ThemeRenderer::SetTheme (BOOL isDarkMode, const ThemeColors& colors)
78102{
79103 m_isDarkMode = isDarkMode;
80104 m_colors = colors;
81105
82- m_brushes.face .CreateSolidBrush (colors.face );
83- m_brushes.bg .CreateSolidBrush (colors.bg );
84- m_brushes.hot .CreateSolidBrush (colors.hot );
85- m_brushes.hotSelected .CreateSolidBrush (colors.hotSelected );
86- m_brushes.selected .CreateSolidBrush (colors.selected );
87- m_brushes.selectedNotFocus .CreateSolidBrush (colors.selectedNotFocus );
106+ m_brushes.body .CreateSolidBrush (colors.body );
107+ m_brushes.body_bg .CreateSolidBrush (colors.body_bg );
108+ m_brushes.secondary .CreateSolidBrush (colors.secondary );
109+ m_brushes.secondary_bg .CreateSolidBrush (colors.secondary_bg );
110+ m_brushes.border .CreateSolidBrush (colors.border );
111+ m_brushes.primary .CreateSolidBrush (colors.primary );
112+ m_brushes.primary_bg .CreateSolidBrush (colors.primary_bg );
113+ m_brushes.primary_border .CreateSolidBrush (colors.primary_border );
88114
89115 for (const auto & hwnd : m_windows) {
90116 ApplyTheme (hwnd);
@@ -106,6 +132,9 @@ void ThemeRenderer::Register(HWND hwnd)
106132 else if (className == WC_BUTTON) {
107133 ::SetWindowSubclass (childWindow, DefaultSubclassProc, BUTTON_SUBCLASS_ID, reinterpret_cast <DWORD_PTR>(self));
108134 }
135+ else if (className == WC_EDIT) {
136+ ::SetWindowSubclass (childWindow, DefaultSubclassProc, EDIT_SUBCLASS_ID, reinterpret_cast <DWORD_PTR>(self));
137+ }
109138 return TRUE ;
110139 }, reinterpret_cast <LPARAM>(this ));
111140
@@ -120,21 +149,21 @@ void ThemeRenderer::ApplyTheme(HWND hwnd)
120149 if (className == TOOLBARCLASSNAME) {
121150 COLORSCHEME scheme{
122151 .dwSize = sizeof (COLORSCHEME),
123- .clrBtnHighlight = self->m_colors .selected ,
124- .clrBtnShadow = self->m_colors .face ,
152+ .clrBtnHighlight = self->m_colors .primary_bg ,
153+ .clrBtnShadow = self->m_colors .secondary_bg ,
125154 };
126155 ::SendMessage (childWindow, TB_SETCOLORSCHEME, 0 , reinterpret_cast <LPARAM>(&scheme));
127156 }
128157 else if (className == WC_TREEVIEW) {
129- TreeView_SetBkColor (childWindow, self->m_colors .bg );
130- TreeView_SetTextColor (childWindow, self->m_colors .fg );
158+ TreeView_SetBkColor (childWindow, self->m_colors .secondary_bg );
159+ TreeView_SetTextColor (childWindow, self->m_colors .secondary );
131160 ::SetWindowTheme (childWindow, self->m_isDarkMode ? L" DarkMode_Explorer" : L" Explorer" , nullptr );
132161 }
133162 else if (className == WC_LISTVIEW) {
134- ListView_SetBkColor (childWindow, self->m_colors .bg );
135- ListView_SetTextColor (childWindow, self->m_colors .fg );
163+ ListView_SetBkColor (childWindow, self->m_colors .secondary_bg );
164+ ListView_SetTextColor (childWindow, self->m_colors .secondary );
136165 ListView_SetTextBkColor (childWindow, CLR_NONE);
137- ::InvalidateRect (childWindow, NULL , TRUE );
166+ ::SetWindowTheme (childWindow, self->m_isDarkMode ? L" DarkMode_Explorer " : L" Explorer " , nullptr );
138167 }
139168 return TRUE ;
140169 }, reinterpret_cast <LPARAM>(this ));
@@ -150,6 +179,8 @@ LRESULT CALLBACK ThemeRenderer::DefaultSubclassProc(HWND hWnd, UINT uMsg, WPARAM
150179 return self->RebarProc (hWnd, uMsg, wParam, lParam);
151180 case BUTTON_SUBCLASS_ID:
152181 return self->ButtonProc (hWnd, uMsg, wParam, lParam);
182+ case EDIT_SUBCLASS_ID:
183+ return self->EditProc (hWnd, uMsg, wParam, lParam);
153184 default :
154185 break ;
155186 }
@@ -162,9 +193,16 @@ LRESULT ThemeRenderer::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lP
162193 case WM_ERASEBKGND: {
163194 RECT rc{};
164195 ::GetClientRect (hWnd, &rc);
165- ::FillRect ((HDC)wParam, &rc, m_brushes.face );
196+ ::FillRect ((HDC)wParam, &rc, m_brushes.body_bg );
166197 return TRUE ;
167198 }
199+ case WM_CTLCOLOREDIT:
200+ {
201+ HDC hdc = (HDC)wParam;
202+ ::SetTextColor (hdc, m_colors.secondary);
203+ ::SetBkColor (hdc, m_colors.secondary_bg);
204+ return (LRESULT)(HBRUSH)m_brushes.secondary_bg ;
205+ }
168206 case WM_NCDESTROY:
169207 ::RemoveWindowSubclass (hWnd, DefaultSubclassProc, REBAR_SUBCLASS_ID);
170208 m_windows.erase (hWnd);
@@ -179,7 +217,7 @@ LRESULT ThemeRenderer::RebarProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPa
179217 case WM_ERASEBKGND: {
180218 RECT rc{};
181219 ::GetClientRect (hWnd, &rc);
182- ::FillRect ((HDC)wParam, &rc, m_brushes.face );
220+ ::FillRect ((HDC)wParam, &rc, m_brushes.secondary_bg );
183221 return TRUE ;
184222 }
185223 case WM_NCDESTROY:
@@ -196,7 +234,7 @@ LRESULT ThemeRenderer::ButtonProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lP
196234 case WM_ERASEBKGND: {
197235 RECT rc{};
198236 ::GetClientRect (hWnd, &rc);
199- ::FillRect ((HDC)wParam, &rc, m_brushes.face );
237+ ::FillRect ((HDC)wParam, &rc, m_brushes.body_bg );
200238 return TRUE ;
201239 }
202240 case WM_NCDESTROY:
@@ -206,3 +244,30 @@ LRESULT ThemeRenderer::ButtonProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lP
206244 }
207245 return ::DefSubclassProc (hWnd, uMsg, wParam, lParam);
208246}
247+
248+ LRESULT ThemeRenderer::EditProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
249+ {
250+ switch (uMsg) {
251+ case WM_NCPAINT: {
252+ HDC hdc = GetWindowDC (hWnd);
253+ RECT rect;
254+ GetWindowRect (hWnd, &rect);
255+ OffsetRect (&rect, -rect.left , -rect.top );
256+
257+ HWND hFocusWnd = GetFocus ();
258+ if (hFocusWnd == hWnd) {
259+ FrameRect (hdc, &rect, m_brushes.primary_border );
260+ } else {
261+ FrameRect (hdc, &rect, m_brushes.border );
262+ }
263+
264+ ReleaseDC (hWnd, hdc);
265+ return TRUE ;
266+ }
267+ case WM_NCDESTROY:
268+ ::RemoveWindowSubclass (hWnd, DefaultSubclassProc, EDIT_SUBCLASS_ID);
269+ m_windows.erase (hWnd);
270+ break ;
271+ }
272+ return ::DefSubclassProc (hWnd, uMsg, wParam, lParam);
273+ }
0 commit comments