列表控件设置- -
列表功能是最常用的控制功能之一,所以实现它的定制技巧也具有很大的现实意义。其实现步骤如下:
1、首先利用资源编辑器建立一个包含列表控件的对话框,并利用类向导ClassWizard为对话框生成新类CColorListBox,其头文件为custlist.cpp,实现文件不设置;
2、在实现文件custlist.cpp中完善其类代码:
class CColorListBox:public CListBox
{//完善列表控制类代码
public://类成员函数
void AddColorItem(COLORREF color);
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMIS);
virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
};
3、在实现文件custlist.cpp中完善各成员函数;
void CColorListBox::AddColorItem(COLORREF color)
{ //增加表项,其为一个颜色值
AddString((LPCTSTR) color);
}
#define COLOR_ITEM_HEIGHT 20 //表的高度
void CColorListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
{//设置自绘表项的高度
lpMIS->itemHeight = COLOR_ITEM_HEIGHT;
}
void CColorListBox::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{ //绘制列表的表项函数
CDC* pDC=CDC::FromHandle(lpDIS->hDC);
COLORREF cr=(COLORREF)lpDIS->itemData;
if (lpDIS->itemAction&ODA_DRAWENTIRE){
CBrush br(cr);//绘制正常色彩条
pDC->FillRect(&lpDIS->rcItem,&br);
}
if ((lpDIS->itemState&ODS_SELECTED) &&
(lpDIS->itemAction&(ODA_SELECT|ODA_DRAWENTIRE)))
{ //绘制选中项色彩条
COLORREF crHilite=RGB(255-GetRValue(cr),
255-GetGValue(cr),255-GetBValue(cr));
CBrush br(crHilite);
pDC->FrameRect(&lpDIS->rcItem,&br);
}
if (!(lpDIS->itemState&ODS_SELECTED)&&
(lpDIS->itemAction&ODA_SELECT))
{
file://清除前次选中项的框
CBrush br(cr);
pDC->FrameRect(&lpDIS->rcItem, &br);
}
}
4、在实现文件custlist.cpp中可以像使用其它类一样使用新生成的定制列表类,其方法是首先设置类的控制成员变量m_colors,并设置相应的消息映射,最后完善其初始化函数:
BOOL CCustListDlg::OnInitDialog()
{//完善初始化函数,与子类控制连接
VERIFY(m_colors.SubclassDlgItem(IDC_LISTBOX1,this));
for(int red=0;red<=255;red+=255)//增加彩色条8项
for(int green=0;green<=255;green+=255)
for(int blue=0;blue<=255;blue+=255)
m_colors.AddColorItem(RGB(red,green,blue));
return TRUE;
}