Как указать цвет шрифта отдельного элемента списка в VC++ WTL

У меня есть список CListBox, в котором мне нужно указать цвет отдельного элемента списка в соответствии с некоторым условием. Как я могу достичь этого. Я использую VS2005. Приложение представляет собой приложение на основе диалога WTL.


person Rohit Vipin Mathews    schedule 09.10.2012    source источник
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
comment
Я получил идею. Но мне нужна реализация. Ничего не работает с 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