Skip to content

Commit f1c5771

Browse files
committed
Make gridlines use edge color
1 parent c22e4f0 commit f1c5771

File tree

1 file changed

+171
-64
lines changed

1 file changed

+171
-64
lines changed

DarkMode/DarkModeSubclass.cpp

Lines changed: 171 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -3087,15 +3087,179 @@ namespace DarkMode
30873087
return ::DefSubclassProc(hWnd, uMsg, wParam, lParam);
30883088
}
30893089

3090+
static void drawListviewItem(LPNMLVCUSTOMDRAW& lplvcd, bool isReport, bool hasGridlines)
3091+
{
3092+
HWND& hList = lplvcd->nmcd.hdr.hwndFrom;
3093+
const auto isSelected = ListView_GetItemState(hList, lplvcd->nmcd.dwItemSpec, LVIS_SELECTED) == LVIS_SELECTED;
3094+
const bool isHot = (lplvcd->nmcd.uItemState & CDIS_HOT) == CDIS_HOT;
3095+
3096+
if (DarkMode::isEnabled())
3097+
{
3098+
HBRUSH hBrush = nullptr;
3099+
3100+
if (isSelected)
3101+
{
3102+
lplvcd->clrText = DarkMode::getTextColor();
3103+
lplvcd->clrTextBk = DarkMode::getSofterBackgroundColor();
3104+
hBrush = DarkMode::getSofterBackgroundBrush();
3105+
}
3106+
else if (isHot)
3107+
{
3108+
lplvcd->clrText = DarkMode::getTextColor();
3109+
lplvcd->clrTextBk = DarkMode::getHotBackgroundColor();
3110+
hBrush = DarkMode::getHotBackgroundBrush();
3111+
}
3112+
3113+
if (hBrush != nullptr)
3114+
{
3115+
if (!isReport || (isReport && hasGridlines))
3116+
{
3117+
::FillRect(lplvcd->nmcd.hdc, &lplvcd->nmcd.rc, hBrush);
3118+
}
3119+
else
3120+
{
3121+
const auto hHeader = ListView_GetHeader(hList);
3122+
const auto nCol = Header_GetItemCount(hHeader);
3123+
const LONG paddingLeft = DarkMode::isThemeDark() ? 1 : 0;
3124+
const LONG paddingRight = DarkMode::isThemeDark() ? 2 : 1;
3125+
3126+
LVITEMINDEX lvii{ static_cast<int>(lplvcd->nmcd.dwItemSpec), 0 };
3127+
RECT rcSubitem{
3128+
lplvcd->nmcd.rc.left
3129+
, lplvcd->nmcd.rc.top
3130+
, lplvcd->nmcd.rc.left + ListView_GetColumnWidth(hList, 0) - paddingRight
3131+
, lplvcd->nmcd.rc.bottom
3132+
};
3133+
::FillRect(lplvcd->nmcd.hdc, &rcSubitem, hBrush);
3134+
3135+
for (int i = 1; i < nCol; ++i)
3136+
{
3137+
ListView_GetItemIndexRect(hList, &lvii, i, LVIR_BOUNDS, &rcSubitem);
3138+
rcSubitem.left -= paddingLeft;
3139+
rcSubitem.right -= paddingRight;
3140+
::FillRect(lplvcd->nmcd.hdc, &rcSubitem, hBrush);
3141+
}
3142+
}
3143+
}
3144+
else if (DarkMode::isThemeDark() && hasGridlines)
3145+
{
3146+
HBRUSH hbrDarkTheme = ::CreateSolidBrush(g_bgColor);
3147+
::FillRect(lplvcd->nmcd.hdc, &lplvcd->nmcd.rc, hbrDarkTheme);
3148+
::DeleteObject(hbrDarkTheme);
3149+
}
3150+
}
3151+
3152+
if (isSelected)
3153+
{
3154+
::DrawFocusRect(lplvcd->nmcd.hdc, &lplvcd->nmcd.rc);
3155+
}
3156+
else if (isHot && !hasGridlines)
3157+
{
3158+
::FrameRect(lplvcd->nmcd.hdc, &lplvcd->nmcd.rc, DarkMode::isEnabled() ? DarkMode::getHotEdgeBrush() : ::GetSysColorBrush(COLOR_WINDOWTEXT));
3159+
}
3160+
}
3161+
3162+
static void drawGridlines(LPNMLVCUSTOMDRAW& lplvcd)
3163+
{
3164+
HWND& hList = lplvcd->nmcd.hdr.hwndFrom;
3165+
const HBRUSH& hBrush = DarkMode::getEdgeBrush();
3166+
3167+
HWND hHeader = ListView_GetHeader(hList);
3168+
RECT rcHeader{};
3169+
::GetClientRect(hHeader, &rcHeader);
3170+
const int nCol = Header_GetItemCount(hHeader);
3171+
3172+
const int wGrid = ::GetSystemMetrics(SM_CXBORDER);
3173+
3174+
RECT rcGridline{
3175+
0
3176+
, rcHeader.bottom
3177+
, wGrid
3178+
, lplvcd->nmcd.rc.bottom
3179+
};
3180+
3181+
HBRUSH hbrDarkTheme = nullptr;
3182+
if (DarkMode::isThemeDark())
3183+
hbrDarkTheme = ::CreateSolidBrush(g_bgColor);
3184+
3185+
const int iLastItem = ListView_GetItemCount(hList);
3186+
3187+
LVITEMINDEX lvii{ iLastItem, 0 };
3188+
RECT rcGridlineTmp{};
3189+
for (int i = 1; i < nCol; ++i)
3190+
{
3191+
ListView_GetItemIndexRect(hList, &lvii, i, LVIR_BOUNDS, &rcGridlineTmp);
3192+
3193+
rcGridline.left = rcGridlineTmp.left;
3194+
rcGridline.right = rcGridline.left + wGrid;
3195+
3196+
::FillRect(lplvcd->nmcd.hdc, &rcGridline, hBrush);
3197+
3198+
if (hbrDarkTheme != nullptr)
3199+
{
3200+
rcGridline.top = rcGridlineTmp.top;
3201+
::OffsetRect(&rcGridline, -2, 0);
3202+
::FillRect(lplvcd->nmcd.hdc, &rcGridline, hbrDarkTheme);
3203+
rcGridline.top = rcHeader.bottom;
3204+
}
3205+
}
3206+
3207+
rcGridline.left = rcGridlineTmp.right;
3208+
rcGridline.right = rcGridline.left + wGrid;
3209+
::FillRect(lplvcd->nmcd.hdc, &rcGridline, hBrush);
3210+
3211+
if (hbrDarkTheme != nullptr)
3212+
{
3213+
rcGridline.top = rcGridlineTmp.top;
3214+
::OffsetRect(&rcGridline, -2, 0);
3215+
::FillRect(lplvcd->nmcd.hdc, &rcGridline, hbrDarkTheme);
3216+
}
3217+
3218+
if (hbrDarkTheme != nullptr)
3219+
{
3220+
::DeleteObject(hbrDarkTheme);
3221+
hbrDarkTheme= nullptr;
3222+
}
3223+
3224+
rcGridline = lplvcd->nmcd.rc;
3225+
RECT rcItem{};
3226+
ListView_GetItemIndexRect(hList, &lvii, 1, LVIR_BOUNDS, &rcItem);
3227+
const int hItem = rcItem.bottom - rcItem.top;
3228+
3229+
int iGridline = rcHeader.bottom + hItem - wGrid;
3230+
3231+
while (iGridline < lplvcd->nmcd.rc.bottom)
3232+
{
3233+
rcGridline.top = iGridline;
3234+
rcGridline.bottom = iGridline + wGrid;
3235+
::FillRect(lplvcd->nmcd.hdc, &rcGridline, hBrush);
3236+
iGridline += hItem;
3237+
}
3238+
}
3239+
30903240
static LRESULT darkListViewNotifyCustomDraw(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool isPlugin)
30913241
{
30923242
auto lplvcd = reinterpret_cast<LPNMLVCUSTOMDRAW>(lParam);
3243+
HWND& hList = lplvcd->nmcd.hdr.hwndFrom;
3244+
const auto lvStyle = ::GetWindowLongPtr(hList, GWL_STYLE) & LVS_TYPEMASK;
3245+
const bool isReport = (lvStyle == LVS_REPORT);
3246+
bool hasGridlines = false;
3247+
if (isReport)
3248+
{
3249+
const auto lvExStyle = ListView_GetExtendedListViewStyle(hList);
3250+
hasGridlines = (lvExStyle & LVS_EX_GRIDLINES) == LVS_EX_GRIDLINES;
3251+
}
30933252

30943253
switch (lplvcd->nmcd.dwDrawStage)
30953254
{
30963255
case CDDS_PREPAINT:
30973256
{
30983257
LRESULT lr = CDRF_NOTIFYITEMDRAW;
3258+
if (isReport && hasGridlines)
3259+
{
3260+
lr |= CDRF_NOTIFYPOSTPAINT;
3261+
}
3262+
30993263
if (isPlugin)
31003264
{
31013265
lr |= ::DefSubclassProc(hWnd, uMsg, wParam, lParam);
@@ -3106,70 +3270,7 @@ namespace DarkMode
31063270

31073271
case CDDS_ITEMPREPAINT:
31083272
{
3109-
HWND& hList = lplvcd->nmcd.hdr.hwndFrom;
3110-
const auto isSelected = ListView_GetItemState(hList, lplvcd->nmcd.dwItemSpec, LVIS_SELECTED) == LVIS_SELECTED;
3111-
const bool isHot = (lplvcd->nmcd.uItemState & CDIS_HOT) == CDIS_HOT;
3112-
3113-
if (DarkMode::isEnabled())
3114-
{
3115-
HBRUSH hBrush = nullptr;
3116-
3117-
if (isSelected)
3118-
{
3119-
lplvcd->clrText = DarkMode::getTextColor();
3120-
lplvcd->clrTextBk = DarkMode::getSofterBackgroundColor();
3121-
hBrush = DarkMode::getSofterBackgroundBrush();
3122-
}
3123-
else if (isHot)
3124-
{
3125-
lplvcd->clrText = DarkMode::getTextColor();
3126-
lplvcd->clrTextBk = DarkMode::getHotBackgroundColor();
3127-
hBrush = DarkMode::getHotBackgroundBrush();
3128-
}
3129-
3130-
if (hBrush != nullptr)
3131-
{
3132-
const auto lvStyle = ::GetWindowLongPtr(hList, GWL_STYLE) & LVS_TYPEMASK;
3133-
if (lvStyle != LVS_REPORT)
3134-
{
3135-
::FillRect(lplvcd->nmcd.hdc, &lplvcd->nmcd.rc, hBrush);
3136-
}
3137-
else
3138-
{
3139-
const bool& isThemeDark = DarkMode::isThemeDark();
3140-
const auto hHeader = ListView_GetHeader(hList);
3141-
const auto nCol = Header_GetItemCount(hHeader);
3142-
const LONG paddingLeft = isThemeDark ? 1 : 0;
3143-
const LONG paddingRight = isThemeDark ? 2 : 1;
3144-
3145-
LVITEMINDEX lvii{ static_cast<int>(lplvcd->nmcd.dwItemSpec), 0 };
3146-
RECT rcSubitem{
3147-
lplvcd->nmcd.rc.left
3148-
, lplvcd->nmcd.rc.top
3149-
, lplvcd->nmcd.rc.left + ListView_GetColumnWidth(hList, 0) - paddingRight
3150-
, lplvcd->nmcd.rc.bottom
3151-
};
3152-
::FillRect(lplvcd->nmcd.hdc, &rcSubitem, hBrush);
3153-
3154-
for (int i = 1; i < nCol; ++i)
3155-
{
3156-
ListView_GetItemIndexRect(hList, &lvii, i, LVIR_BOUNDS, &rcSubitem);
3157-
rcSubitem.left -= paddingLeft;
3158-
rcSubitem.right -= paddingRight;
3159-
::FillRect(lplvcd->nmcd.hdc, &rcSubitem, hBrush);
3160-
}
3161-
}
3162-
}
3163-
}
3164-
3165-
if (isSelected)
3166-
{
3167-
::DrawFocusRect(lplvcd->nmcd.hdc, &lplvcd->nmcd.rc);
3168-
}
3169-
else if (isHot)
3170-
{
3171-
::FrameRect(lplvcd->nmcd.hdc, &lplvcd->nmcd.rc, DarkMode::isEnabled() ? DarkMode::getHotEdgeBrush() : ::GetSysColorBrush(COLOR_WINDOWTEXT));
3172-
}
3273+
DarkMode::drawListviewItem(lplvcd, isReport, hasGridlines);
31733274

31743275
LRESULT lr = CDRF_NEWFONT;
31753276

@@ -3181,6 +3282,12 @@ namespace DarkMode
31813282
return lr;
31823283
}
31833284

3285+
case CDDS_POSTPAINT:
3286+
{
3287+
DarkMode::drawGridlines(lplvcd);
3288+
return CDRF_SKIPDEFAULT;
3289+
}
3290+
31843291
default:
31853292
break;
31863293
}

0 commit comments

Comments
 (0)