Имам списъчно поле CListBox
, в което трябва да посоча цвета на отделния елемент от списъка според някакво условие. Как мога да постигна това. Работя с VS2005. Приложението е базирано на WTL Dialog.
Как да укажете цвета на шрифта на отделния елемент от списъка във 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