+ syscolFg = COLOR_WINDOWTEXT;
+ syscolBg = COLOR_BTNFACE;
+
+ // don't grey out the icon in this case neither
+ nmcd.uItemState &= ~CDIS_SELECTED;
+ }
+
+ pLVCD->clrText = ::GetSysColor(syscolFg);
+ pLVCD->clrTextBk = ::GetSysColor(syscolBg);
+ }
+ //else: not selected, use normal colours from pLVCD
+
+ HDC hdc = nmcd.hdc;
+ RECT rc = GetCustomDrawnItemRect(nmcd);
+
+ ::SetTextColor(hdc, pLVCD->clrText);
+ ::FillRect(hdc, &rc, AutoHBRUSH(pLVCD->clrTextBk));
+
+ // we could use CDRF_NOTIFYSUBITEMDRAW here but it results in weird repaint
+ // problems so just draw everything except the focus rect from here instead
+ const int colCount = Header_GetItemCount(ListView_GetHeader(hwndList));
+ for ( int col = 0; col < colCount; col++ )
+ {
+ pLVCD->iSubItem = col;
+ HandleSubItemPrepaint(pLVCD, hfont, colCount);
+ }
+
+ HandleItemPostpaint(nmcd);
+}
+
+static WXLPARAM HandleItemPrepaint(wxListCtrl *listctrl,
+ LPNMLVCUSTOMDRAW pLVCD,
+ wxListItemAttr *attr)
+{
+ if ( !attr )
+ {
+ // nothing to do for this item
+ return CDRF_DODEFAULT;
+ }
+
+
+ // set the colours to use for text drawing
+ pLVCD->clrText = attr->HasTextColour()
+ ? wxColourToRGB(attr->GetTextColour())
+ : wxColourToRGB(listctrl->GetTextColour());
+ pLVCD->clrTextBk = attr->HasBackgroundColour()
+ ? wxColourToRGB(attr->GetBackgroundColour())
+ : wxColourToRGB(listctrl->GetBackgroundColour());
+
+ // select the font if non default one is specified
+ if ( attr->HasFont() )
+ {
+ wxFont font = attr->GetFont();
+ if ( font.GetEncoding() != wxFONTENCODING_SYSTEM )
+ {
+ // the standard control ignores the font encoding/charset, at least
+ // with recent comctl32.dll versions (5 and 6, it uses to work with
+ // 4.something) so we have to draw the item entirely ourselves in
+ // this case
+ HandleItemPaint(pLVCD, GetHfontOf(font));
+ return CDRF_SKIPDEFAULT;
+ }
+
+ ::SelectObject(pLVCD->nmcd.hdc, GetHfontOf(font));
+
+ return CDRF_NEWFONT;
+ }
+
+ return CDRF_DODEFAULT;
+}
+
+WXLPARAM wxListCtrl::OnCustomDraw(WXLPARAM lParam)
+{
+ LPNMLVCUSTOMDRAW pLVCD = (LPNMLVCUSTOMDRAW)lParam;
+ NMCUSTOMDRAW& nmcd = pLVCD->nmcd;
+ switch ( nmcd.dwDrawStage )
+ {
+ case CDDS_PREPAINT:
+ // if we've got any items with non standard attributes,
+ // notify us before painting each item
+ //
+ // for virtual controls, always suppose that we have attributes as
+ // there is no way to check for this
+ if ( IsVirtual() || m_hasAnyAttr )
+ return CDRF_NOTIFYITEMDRAW;
+ break;
+
+ case CDDS_ITEMPREPAINT:
+ // get a message for each subitem
+ return CDRF_NOTIFYITEMDRAW;
+
+ case CDDS_SUBITEM | CDDS_ITEMPREPAINT:
+ const int item = nmcd.dwItemSpec;
+ const int column = pLVCD->iSubItem;
+
+ // we get this message with item == 0 for an empty control, we
+ // must ignore it as calling OnGetItemAttr() would be wrong
+ if ( item < 0 || item >= GetItemCount() )
+ break;
+ // same for columns
+ if ( column < 0 || column >= GetColumnCount() )
+ break;
+
+ return HandleItemPrepaint(this, pLVCD, DoGetItemColumnAttr(item, column));
+ }
+
+ return CDRF_DODEFAULT;
+}
+
+#endif // NM_CUSTOMDRAW supported
+
+// Necessary for drawing hrules and vrules, if specified
+void wxListCtrl::OnPaint(wxPaintEvent& event)
+{
+ const int itemCount = GetItemCount();
+ const bool drawHRules = HasFlag(wxLC_HRULES);
+ const bool drawVRules = HasFlag(wxLC_VRULES);
+
+ if (!InReportView() || !(drawHRules || drawVRules) || !itemCount)
+ {
+ event.Skip();
+ return;
+ }
+
+ wxPaintDC dc(this);
+
+ wxControl::OnPaint(event);
+
+ // Reset the device origin since it may have been set
+ dc.SetDeviceOrigin(0, 0);
+
+ wxPen pen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT));
+ dc.SetPen(pen);
+ dc.SetBrush(* wxTRANSPARENT_BRUSH);
+
+ wxSize clientSize = GetClientSize();
+ wxRect itemRect;
+
+ if (drawHRules)
+ {
+ const long top = GetTopItem();
+ for ( int i = top; i < top + GetCountPerPage() + 1; i++ )
+ {
+ if (GetItemRect(i, itemRect))