wxListCtrl custom drawing seems to work

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4824 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1999-12-05 00:20:58 +00:00
parent aaa37c0d23
commit d62228a645
4 changed files with 86 additions and 53 deletions

View File

@@ -124,6 +124,10 @@ public:
void SetFont(const wxFont& font) { m_font = font; } void SetFont(const wxFont& font) { m_font = font; }
// accessors // accessors
bool HasTextColour() const { return m_colText.Ok(); }
bool HasBackgroundColour() const { return m_colBack.Ok(); }
bool HasFont() const { return m_font.Ok(); }
const wxColour& GetTextColour() const { return m_colText; } const wxColour& GetTextColour() const { return m_colText; }
const wxColour& GetBackgroundColour() const { return m_colBack; } const wxColour& GetBackgroundColour() const { return m_colBack; }
const wxFont& GetFont() const { return m_font; } const wxFont& GetFont() const { return m_font; }
@@ -142,6 +146,7 @@ class WXDLLEXPORT wxListItem : public wxObject
{ {
public: public:
wxListItem(); wxListItem();
~wxListItem() { delete m_attr; }
// setters // setters
void SetMask(long mask) { m_mask = mask; } void SetMask(long mask) { m_mask = mask; }

View File

@@ -19,6 +19,7 @@
#include "wx/control.h" #include "wx/control.h"
#include "wx/event.h" #include "wx/event.h"
#include "wx/imaglist.h" #include "wx/imaglist.h"
#include "wx/hash.h"
/* /*
The wxListCtrl can show lists of items in four different modes: The wxListCtrl can show lists of items in four different modes:
@@ -340,7 +341,10 @@ protected:
int m_colCount; // Windows doesn't have GetColumnCount so must int m_colCount; // Windows doesn't have GetColumnCount so must
// keep track of inserted/deleted columns // keep track of inserted/deleted columns
// TRUE fi we have any items with custom attributes // the hash table we use for storing pointers to the items attributes
wxHashTable m_attrs;
// TRUE if we have any items with custom attributes
bool m_hasAnyAttr; bool m_hasAnyAttr;
private: private:

View File

@@ -279,7 +279,7 @@ void MyFrame::OnReportView(wxCommandEvent& WXUNUSED(event))
wxChar buf[50]; wxChar buf[50];
wxSprintf(buf, _T("This is item %d"), i); wxSprintf(buf, _T("This is item %d"), i);
long tmp = m_listCtrl->InsertItem(i, buf, 0); long tmp = m_listCtrl->InsertItem(i, buf, 0);
//m_listCtrl->SetItemData(tmp, i); m_listCtrl->SetItemData(tmp, i);
wxSprintf(buf, _T("Col 1, item %d"), i); wxSprintf(buf, _T("Col 1, item %d"), i);
tmp = m_listCtrl->SetItem(i, 1, buf); tmp = m_listCtrl->SetItem(i, 1, buf);
@@ -295,12 +295,17 @@ void MyFrame::OnReportView(wxCommandEvent& WXUNUSED(event))
m_listCtrl->SetItem( item ); m_listCtrl->SetItem( item );
item.m_itemId = 2; item.m_itemId = 2;
item.SetTextColour(*wxLIGHT_GREY); item.SetTextColour(*wxGREEN);
m_listCtrl->SetItem( item ); m_listCtrl->SetItem( item );
item.m_itemId = 3; item.m_itemId = 4;
item.SetTextColour(*wxLIGHT_GREY); item.SetTextColour(*wxLIGHT_GREY);
item.SetFont(*wxITALIC_FONT);
item.SetBackgroundColour(*wxRED);
m_listCtrl->SetItem( item ); m_listCtrl->SetItem( item );
m_listCtrl->SetTextColour(*wxBLUE);
m_listCtrl->SetBackgroundColour(*wxLIGHT_GREY);
m_listCtrl->SetColumnWidth( 0, wxLIST_AUTOSIZE ); m_listCtrl->SetColumnWidth( 0, wxLIST_AUTOSIZE );
m_listCtrl->SetColumnWidth( 1, wxLIST_AUTOSIZE ); m_listCtrl->SetColumnWidth( 1, wxLIST_AUTOSIZE );
m_listCtrl->SetColumnWidth( 2, wxLIST_AUTOSIZE ); m_listCtrl->SetColumnWidth( 2, wxLIST_AUTOSIZE );

View File

@@ -204,7 +204,15 @@ void wxListCtrl::UpdateStyle()
wxListCtrl::~wxListCtrl() wxListCtrl::~wxListCtrl()
{ {
if (m_textCtrl) if ( m_hasAnyAttr )
{
for ( wxNode *node = m_attrs.Next(); node; node = m_attrs.Next() )
{
delete (wxListItemAttr *)node->Data();
}
}
if ( m_textCtrl )
{ {
m_textCtrl->UnsubclassWin(); m_textCtrl->UnsubclassWin();
m_textCtrl->SetHWND(0); m_textCtrl->SetHWND(0);
@@ -549,20 +557,10 @@ bool wxListCtrl::SetItem(wxListItem& info)
// check whether it has any custom attributes // check whether it has any custom attributes
if ( info.HasAttributes() ) if ( info.HasAttributes() )
{ {
// FIXME it should be... m_attrs.Put(item.iItem, (wxObject *)new wxListItemAttr(*info.GetAttributes()));
wxASSERT_MSG( !info.GetData(),
_T("can't have custom attributes and client data") );
item.mask |= LVIF_PARAM;
item.lParam = (long)info.GetAttributes();
m_hasAnyAttr = TRUE; m_hasAnyAttr = TRUE;
} }
else if ( m_hasAnyAttr )
{
item.mask |= LVIF_PARAM;
item.lParam = 0;
}
item.cchTextMax = 0; item.cchTextMax = 0;
bool ok = ListView_SetItem(GetHwnd(), &item) != 0; bool ok = ListView_SetItem(GetHwnd(), &item) != 0;
@@ -1048,20 +1046,10 @@ long wxListCtrl::InsertItem(wxListItem& info)
// check whether it has any custom attributes // check whether it has any custom attributes
if ( info.HasAttributes() ) if ( info.HasAttributes() )
{ {
// FIXME it should be... m_attrs.Put(item.iItem, (wxObject *)new wxListItemAttr(*info.GetAttributes()));
wxASSERT_MSG( !info.GetData(),
_T("can't have custom attributes and client data") );
item.mask |= LVIF_PARAM;
item.lParam = (long)info.GetAttributes();
m_hasAnyAttr = TRUE; m_hasAnyAttr = TRUE;
} }
else if ( m_hasAnyAttr )
{
item.mask |= LVIF_PARAM;
item.lParam = 0;
}
return (long) ListView_InsertItem(GetHwnd(), & item); return (long) ListView_InsertItem(GetHwnd(), & item);
} }
@@ -1279,16 +1267,10 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
// return TRUE to suppress all additional LVN_DELETEITEM // return TRUE to suppress all additional LVN_DELETEITEM
// notifications - this makes deleting all items from a list ctrl // notifications - this makes deleting all items from a list ctrl
// much faster (but we can't do it if we have any custom drawn // much faster
// items because we need to delete their attributes in *result = TRUE;
// LVN_DELETEITEM below)
if ( !m_hasAnyAttr )
{
*result = TRUE;
return TRUE; return TRUE;
}
break;
case LVN_DELETEITEM: case LVN_DELETEITEM:
{ {
@@ -1298,8 +1280,7 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
if ( m_hasAnyAttr ) if ( m_hasAnyAttr )
{ {
wxListItemAttr *attr = (wxListItemAttr *)hdr->lParam; delete m_attrs.Delete(hdr->iItem);
delete attr;
} }
} }
break; break;
@@ -1464,7 +1445,7 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
NMCUSTOMDRAW& nmcd = lplvcd->nmcd; NMCUSTOMDRAW& nmcd = lplvcd->nmcd;
switch( nmcd.dwDrawStage ) switch( nmcd.dwDrawStage )
{ {
case CDDS_PREPAINT : case CDDS_PREPAINT:
// if we've got any items with non standard attributes, // if we've got any items with non standard attributes,
// notify us before painting each item // notify us before painting each item
*result = m_hasAnyAttr ? CDRF_NOTIFYITEMDRAW *result = m_hasAnyAttr ? CDRF_NOTIFYITEMDRAW
@@ -1473,30 +1454,68 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
case CDDS_ITEMPREPAINT: case CDDS_ITEMPREPAINT:
{ {
if ( !nmcd.lItemlParam ) wxListItemAttr *attr =
(wxListItemAttr *)m_attrs.Get(nmcd.dwItemSpec);
if ( !attr )
{ {
// nothing to do for this item // nothing to do for this item
return CDRF_DODEFAULT; return CDRF_DODEFAULT;
} }
wxListItemAttr *attr = HFONT hFont;
(wxListItemAttr *)nmcd.lItemlParam; wxColour colText, colBack;
if ( attr->HasFont() )
{
wxFont font = attr->GetFont();
hFont = (HFONT)font.GetResourceHandle();
}
else
{
hFont = 0;
}
::SelectObject(nmcd.hdc, if ( attr->HasTextColour() )
(HFONT)((wxFont &)attr->GetFont()). {
GetResourceHandle()); colText = attr->GetTextColour();
lplvcd->clrText = }
wxColourToRGB(attr->GetTextColour()); else
lplvcd->clrTextBk = {
wxColourToRGB(attr->GetBackgroundColour()); colText = GetTextColour();
}
// if we wanted to set colours for individual if ( attr->HasBackgroundColour() )
// columns (subitems), we would have returned {
// CDRF_NOTIFYSUBITEMREDRAW from here colBack = attr->GetBackgroundColour();
*result = CDRF_NEWFONT; }
else
{
colBack = GetBackgroundColour();
}
// note that if we wanted to set colours for
// individual columns (subitems), we would have
// returned CDRF_NOTIFYSUBITEMREDRAW from here
if ( hFont )
{
::SelectObject(nmcd.hdc, hFont);
*result = CDRF_NEWFONT;
}
else
{
*result = CDRF_DODEFAULT;
}
lplvcd->clrText = wxColourToRGB(colText);
lplvcd->clrTextBk = wxColourToRGB(colBack);
return TRUE; return TRUE;
} }
default:
*result = CDRF_DODEFAULT;
return TRUE;
} }
} }
break; break;