Indicating an empty ListView






3.94/5 (9 votes)
Instead of presenting a blank screen if your list control is empty, why not try this?
When using a ListView it may be useful to inform the user that the control is empty, like Microsoft Outlook does. Doing this is pretty straightforward. Just derive your own ListView control from CListCtrl
and add a WM_PAINT
event handler to your derived class.
class CEmptyListCtrl : public CListCtrl { // Construction public: // Overrides protected: // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CEmptyListCtrl) //}}AFX_VIRTUAL // Implementation public: // Generated message map functions protected: //{{AFX_MSG(CEmptyListCtrl) afx_msg void OnPaint(); //}}AFX_MSG DECLARE_MESSAGE_MAP() };
Then, in OnPaint member function, implement the code necessary to handle the empty condition.
void CEmptyListCtrl::OnPaint() { Default(); if (GetItemCount() <= 0) { COLORREF clrText = ::GetSysColor(COLOR_WINDOWTEXT); COLORREF clrTextBk = ::GetSysColor(COLOR_WINDOW); CDC* pDC = GetDC(); // Save dc state int nSavedDC = pDC->SaveDC(); CRect rc; GetWindowRect(&rc); ScreenToClient(&rc); CHeaderCtrl* pHC; pHC = GetHeaderCtrl(); if (pHC != NULL) { CRect rcH; pHC->GetItemRect(0, &rcH); rc.top += rcH.bottom; } rc.top += 10; CString strText((LPCSTR)IDS_NOITEMS); // The message you want! pDC->SetTextColor(clrText); pDC->SetBkColor(clrTextBk); pDC->FillRect(rc, &CBrush(clrTextBk)); pDC->SelectStockObject(ANSI_VAR_FONT); pDC->DrawText(strText, -1, rc, DT_CENTER | DT_WORDBREAK | DT_NOPREFIX | DT_NOCLIP); // Restore dc pDC->RestoreDC(nSavedDC); ReleaseDC(pDC); } // Do not call CListCtrl::OnPaint() for painting messages }