使用CColorListBox 实现文本改变颜色

MFC提供的CListBox类只支持黑色文本,如果想在列表框中显示彩色文本,如何实现?从CListBox类派生而得的CColorListBox类具有此功能。通过调用该类的AddString()和InsertString()函数可以向列表框中添加彩色文本选项。

过程:

1)使用别人已经写好的类,CColorListBox 完成。其实过程很简单,需要注意一些细节:

   首先,在新建的项目中加入这两个类;

   然后,  在vs对话框中添加CListBox m_list变量,然后将CListBox改为CColorListBox,这样就可以在点击BUTTON响应事件中,添加代码

   m_list.AddString(_T("nihao"),RGB(255,0,0));

  只是这样,结果并不会想想象的出现文本颜色的变化。

  需要做的是:修改m_list的属性:

           *)Owner Draw  为Variable 

           *)Selction 为Single

           *)use TabStops 为False

           *)Has Strings 为True 这个是我在运行是,一直没有找到的出问题的地方

开始的时候设置的为False 但是怎么都不行,就单步调试,跟进去看代码,存入的是这个值,怎么都不行,再看它的重绘,取出的值就是不对,就像可能是list的属性设置不正确,由于属性不正确,它不去取你设置的值,所以就看vc6.0的代码,选中了又字符串,默认的是False 所以要选中!!!!

但是一定要注意:在DoDataExchange()函数中加入 DDX_Control(pDX,IDC_LIST1,m_lbColor);即与哪个控件相关连。如果这句不加,运行时会中断

 void CColorBTTestDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CColorBTTestDlg)
 DDX_Control(pDX,IDC_LIST1,m_lbColor);
  // NOTE: the ClassWizard will add DDX and DDV calls here
 //}}AFX_DATA_MAP
}

注意:重绘控件中内容时,listbox控件一定要调用这两个函数:

DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
 MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);

下面给出LISTBOX的两个函数供选用

int   AddString(   LPCTSTR   lpszItem   );
该函数用来往列表框中加入字符串,其中参数lpszItem指定了要添加的字符串.函数的返回值是加入的字符串在列表框中的位置,如果发生错误,会返回LB_ERR或LB_ERRSPACE(内存不够).如果列表框未设置LBS_SORT风格,那么字符串将被添加到列表的末尾,如果设置了LBS_SORT风格,字符串会按排序规律插入到列表中.


int   InsertString(   int   nIndex,   LPCTSTR   lpszItem   );
该函数用来在列表框中的指定位置插入字符串.参数nIndex给出了插入位置(索引),如果值为-1,则字符串将被添加到列表的末尾.参数lpszItem指定了要插入的字符串.函数返回实际的插入位置,若发生错误,会返回LB_ERR或LB_ERRSPACE.与AddString函数不同,InsertString函数不会导致LBS_SORT风格的列表框重新排序.不要在具有LBS_SORT风格的列表框中使用InsertString函数,以免破坏列表项的次序.

你可能感兴趣的:(list,mfc,button)