组合框:
自绘组合框(显示图标)
要了解的概念:组合框是由一个编辑框和列表框组合而成的.
CComboBox类里要了解的函数:
SetItemHeight//设置列表框项,或编辑框高度,第一个参数为-1表示设置编辑框高度,0表示列表框项,第二个参数是要设置的高度
SetItemData//为列表框里的项关联一个DWORD值,第一个参数表示列表框项索引,第二个参数指明具体值
GetItemData//只有一个参数,列表框项索引,返回该索引关联的值。
首先像自绘按钮类一样,从控件类中派生出一个子类(组合框类名:CComboBox),派生的类名为:CNewComboBox然后向工程导入五个图标,ID号分别为:
IDI_NORMAL1、IDI_NORMAL2。。。IDI_NORMAL5
往CNewComBox类添加一个函数,用于设置图标ID和文本内容,如下:
int CNewComboBox::SetItemIcon(UINT nID,LPCTSTR lpszString)//第一个参数是图标ID号,第二个是文本内容
{
int index=AddString(lpszString);
SetItemData(index,nID);
return index;
}
然后添加CNewComBox类的虚函数DrawItem,DrawItem函数的代码如下:
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);//组合框DC
CRect itemRect(lpDrawItemStruct->rcItem);//项区域
int nSate=lpDrawItemStruct->itemState;//项状态
int nIndex=lpDrawItemStruct->itemID;//项索引
if(nIndex!=-1)
{
if(nSate&ODS_SELECTED)//如果选中该项
dc.FillSolidRect(&itemRect,RGB(124,231,169));
else
dc.FillSolidRect(&itemRect,RGB(2,94,193));
UINT uID=GetItemData(nIndex);
POINT pt;
pt.x=itemRect.left;
pt.y=itemRect.top;
dc.DrawIcon(pt,LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(uID)));//画图标
itemRect.left+=35;
dc.SetBkMode(TRANSPARENT);
CString str;
GetLBText(nIndex,str);
dc.DrawText(str,itemRect,DT_LEFT|DT_VCENTER|DT_SINGLELINE);//显示文本
}
dc.Detach();
接着在对话框编辑区给对话框添加一个组合框控件,组合框的样式:类型:下拉列表、所有者绘制:固定、有字串:勾
并为控件关联一个控件变量m_NewCom,类型为CNewComboBox
然后在对话框初始化函数OnInitDialog里添加如下代码:
m_NewCom.SetItemIcon(IDI_NORMAL1,"Kdjfkd");
m_NewCom.SetItemIcon(IDI_NORMAL2,"kjdkfj");
m_NewCom.SetItemIcon(IDI_NORMAL3,"dkjfdj");
m_NewCom.SetItemIcon(IDI_NORMAL4,"kdjfkd");
m_NewCom.SetItemIcon(IDI_NORMAL5,"kdjfkd");
m_NewCom.SetItemHeight(-1,35);
m_NewCom.SetItemHeight(0,35);
最后,记得要包含类头文件 "NewComboBox.h"
编译、运行,效果如下: