const wxListItem& item,
LV_COLUMN& lvCol);
+namespace
+{
+
+// replacement for ListView_GetSubItemRect() which provokes warnings like
+// "the address of 'rc' will always evaluate as 'true'" when used with mingw32
+// 4.3+
+//
+// this function does no error checking on item and subitem parameters, notice
+// that subitem is 0 for whole item or 1-based for the individual columns
+inline bool
+wxGetListCtrlSubItemRect(HWND hwnd, int item, int subitem, int flags, RECT& rect)
+{
+ rect.top = subitem;
+ rect.left = flags;
+ return ::SendMessage(hwnd, LVM_GETSUBITEMRECT, item, (LPARAM)&rect) != 0;
+}
+
+inline bool
+wxGetListCtrlItemRect(HWND hwnd, int item, int flags, RECT& rect)
+{
+ return wxGetListCtrlSubItemRect(hwnd, item, 0, flags, rect);
+}
+
+} // anonymous namespace
+
// ----------------------------------------------------------------------------
// private helper classes
// ----------------------------------------------------------------------------
*/
bool wxListCtrl::GetSubItemRect(long item, long subItem, wxRect& rect, int code) const
{
- RECT rectWin;
+ // ListView_GetSubItemRect() doesn't do subItem error checking and returns
+ // true even for the out of range values of it (even if the results are
+ // completely bogus in this case), so we check item validity ourselves
+ wxCHECK_MSG( subItem == wxLIST_GETSUBITEMRECT_WHOLEITEM ||
+ (subItem >= 0 && subItem < GetColumnCount()),
+ false, _T("invalid sub item index") );
int codeWin;
if ( code == wxLIST_RECT_BOUNDS )
codeWin = LVIR_BOUNDS;
}
- bool success;
- if( subItem == wxLIST_GETSUBITEMRECT_WHOLEITEM)
- {
- success = ListView_GetItemRect(GetHwnd(), (int) item, &rectWin, codeWin) != 0;
- }
- else if( subItem >= 0)
- {
- success = ListView_GetSubItemRect( GetHwnd(), (int) item, (int) subItem, codeWin, &rectWin) != 0;
- }
- else
+ RECT rectWin;
+ if ( !wxGetListCtrlSubItemRect
+ (
+ GetHwnd(),
+ item,
+ subItem == wxLIST_GETSUBITEMRECT_WHOLEITEM ? 0 : subItem,
+ codeWin,
+ rectWin
+ ) )
{
- wxFAIL_MSG( _T("incorrect subItem number in GetSubItemRect()") );
- return false;
+ return false;
}
- rect.x = rectWin.left;
- rect.y = rectWin.top;
- rect.width = rectWin.right - rectWin.left;
- rect.height = rectWin.bottom - rectWin.top;
+ wxCopyRECTToRect(rectWin, rect);
- return success;
+ // for the first sub item, i.e. the main item itself, the returned rect is
+ // the whole line one, we need to truncate it at first column ourselves
+ rect.width = GetColumnWidth(0);
+
+ return true;
}
static RECT GetCustomDrawnItemRect(const NMCUSTOMDRAW& nmcd)
{
RECT rc;
- ListView_GetItemRect(nmcd.hdr.hwndFrom, nmcd.dwItemSpec, &rc, LVIR_BOUNDS);
+ wxGetListCtrlItemRect(nmcd.hdr.hwndFrom, nmcd.dwItemSpec, LVIR_BOUNDS, rc);
RECT rcIcon;
- ListView_GetItemRect(nmcd.hdr.hwndFrom, nmcd.dwItemSpec, &rcIcon, LVIR_ICON);
+ wxGetListCtrlItemRect(nmcd.hdr.hwndFrom, nmcd.dwItemSpec, LVIR_ICON, rcIcon);
// exclude the icon part, neither the selection background nor focus rect
// should cover it
SelectInHDC selFont(hdc, hfont);
// get the rectangle to paint
+ int subitem = colCount ? col + 1 : col;
RECT rc;
- ListView_GetSubItemRect(hwndList, item, col, LVIR_BOUNDS, &rc);
- if ( !col && colCount > 1 )
- {
- // broken ListView_GetSubItemRect() returns the entire item rect for
- // 0th subitem while we really need just the part for this column
- RECT rc2;
- ListView_GetSubItemRect(hwndList, item, 1, LVIR_BOUNDS, &rc2);
-
- rc.right = rc2.left;
- rc.left += 4;
- }
- else // not first subitem
- {
- rc.left += 6;
- }
+ wxGetListCtrlSubItemRect(hwndList, item, subitem, LVIR_BOUNDS, rc);
+ rc.left += 6;
// get the image and text to draw
wxChar text[512];
// same thing for CDIS_FOCUS (except simpler as there is only one of them)
if ( ::GetFocus() == hwndList &&
- ListView_GetNextItem(hwndList, (WPARAM)-1, LVNI_FOCUSED) == item )
+ ListView_GetNextItem(hwndList, -1, LVNI_FOCUSED) == item )
{
nmcd.uItemState |= CDIS_FOCUS;
}
// Necessary for drawing hrules and vrules, if specified
void wxListCtrl::OnPaint(wxPaintEvent& event)
{
- bool drawHRules = HasFlag(wxLC_HRULES);
- bool drawVRules = HasFlag(wxLC_VRULES);
+ const bool drawHRules = HasFlag(wxLC_HRULES);
+ const bool drawVRules = HasFlag(wxLC_VRULES);
- if (!InReportView() || !drawHRules && !drawVRules)
+ if (!InReportView() || !(drawHRules || drawVRules))
{
event.Skip();
return;