Как да укажете цвета на шрифта на отделния елемент от списъка във VC++ WTL

Имам списъчно поле CListBox, в което трябва да посоча цвета на отделния елемент от списъка според някакво условие. Как мога да постигна това. Работя с VS2005. Приложението е базирано на WTL Dialog.


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