У меня есть список CListBox
, в котором мне нужно указать цвет отдельного элемента списка в соответствии с некоторым условием. Как я могу достичь этого. Я использую VS2005. Приложение представляет собой приложение на основе диалога WTL.
Как указать цвет шрифта отдельного элемента списка в VC++ WTL
comment
Я думаю, вам нужно сделать его владельцем.
- person Mark Ransom   schedule 09.10.2012
comment
Не могли бы вы объяснить с примером или ссылкой? Я новичок в WTL.
- person Rohit Vipin Mathews   schedule 09.10.2012
Ответы (2)
Вы можете создать свой собственный список (например, CColorListBox).
ColorListBox.h
class CColorListBox : public CListBox
{
// Construction
public:
CColorListBox();
// Attributes
public:
// Operations
public:
int AddString( LPCTSTR lpszItem, COLORREF rgb);
int InsertString( int nIndex, LPCTSTR lpszItem, COLORREF rgb);
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CColorListBox)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CColorListBox();
// Generated message map functions
protected:
//{{AFX_MSG(CColorListBox)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
ColorListBox.cpp
Вот идея, а не точный код ............
int CColorListBox::AddString( LPCTSTR lpszItem,COLORREF rgb )
{
int item = AddString(lpszItem);
if(item >=0)
SetItemData(item,rgb);
return item;
}
int CColorListBox::InsertString( int nIndex, LPCTSTR lpszItem, COLORREF rgb)
{
int item = ((CListBox*)this)->InsertString(nIndex,lpszItem);
if(item >=0)
SetItemData(item,rgb);
return item;
}
void CColorListBox::DrawItem(LPDRAWITEMSTRUCT lpdis)
{
}
person
vikky
schedule
09.10.2012
Я получил идею. Но мне нужна реализация. Ничего не работает с WTL. Поэтому мне нужен точный код для установки цвета элемента списка в ListBox в WTL.
- person Rohit Vipin Mathews; 10.10.2012
Это то, что я сделал, чтобы реализовать ту же функциональность в ListViewCtrl
.
Я написал класс для расширения CListViewCtrl
.
class CListViewCtrlEx: public CWindowImpl<CListViewCtrlEx, CListViewCtrl>, public CCustomDraw<CListViewCtrlEx>
{
public:
BEGIN_MSG_MAP(CListViewCtrlEx)
MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
CHAIN_MSG_MAP_ALT(CCustomDraw<CListViewCtrlEx>, 1)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL bHandled);
DWORD OnPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw);
DWORD OnItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw);
void ForceMeasureItemMessage();
void DeleteItem(LPDELETEITEMSTRUCT /*lpDeleteItemStruct*/);
BOOL DeleteItem(int nItem);
void GetCellRect(int header_column, const CRect& item_rect, CRect& cell_rect);
};
Полный код находится ЗДЕСЬ .
person
Rohit Vipin Mathews
schedule
02.11.2012