@@ -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