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:
@@ -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; }
|
||||||
|
@@ -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:
|
||||||
|
@@ -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 );
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user