VC MFC列表框(CListBox)控件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
列表框控件简单应用
重复性的过程我就不详细讲明了,只给出类里面函数的解释。
int CListBox::AddString( LPCTSTR lpszItem );//添加一个项,lpszItem是项文本内容
int CListBox::InsertString( int nIndex, LPCTSTR lpszItem );//同上,只不过这个可以指定项位置(索引),由参数nIndex指定
int CListBox::GetCurSel( ) const;//获取当前选中项的索引,函数返回索引值
int CListBox::GetText( int nIndex,CString &rString ) const;//根据索引获得项文本
int CListBox::GetCount( ) const;//获取项数量
void CListBox::ResetContent( );//删除列表框所有的项
int CListBox::DeleteString( UINT nIndex );//根据项索引从列表框删除一个项
int CListBox::SetItemHeight( int nIndex, UINT cyItemHeight );//设置一个项的高度,注意:列表框具有
//LBS_OWNERDRAWVARIABLE风格才可以单独设置一个项的高度,否则是所有项的高度
自绘列表框
这里自绘要达到的效果,就是简单模仿一下QQ界面里类似列表框控件的那种效果,先往对话框里添加列表框控件.
然后再改一下列表框的属性,所有者绘制项选择固定,有字符串前面打上勾.
接着准备两张位图,一张用于列表框的背景,一张用于项选中时的背景,ID号分别为:IDB_BK、IDB_SELECTED
如下两张位图:
再导入五张位图(QQ头像),ID号保持默认不变。
从CListBox派生出子类CNewListBox,往CNewListBox添加一个函数,用于画位图,函数如下:
void CNewListBox::DrawBK(CDC *pDC, CRect rect, UINT uIDBK)
{
CDC memDC;
memDC.CreateCompatibleDC(pDC);//兼容DC
CBitmap bmp;
bmp.LoadBitmap(uIDBK);//加载位图
BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);//获取位图信息
memDC.SelectObject(&bmp);//选入位图
pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memDC,
0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);
bmp.DeleteObject();
memDC.DeleteDC();
}
然后给CNewListBox添加WM_ERASEBKGND消息处理函数,这个消息是系统擦除背景时产生。我们就在这个函数里画背景位图,函数代码如下:
BOOL CNewListBox::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CRect rect;
GetClientRect(rect);
DrawBK(pDC,rect,IDB_BK);
return TRUE;
//return CListBox::OnEraseBkgnd(pDC);
}
再处理控件左键单击消息,刷新窗口,重绘背景,函数代码如下:
void CNewListBox::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
this->Invalidate();
CListBox::OnLButtonDown(nFlags, point);
}
再添加一个函数,用于添加图标和文本内容,函数如下:
int CNewListBox::AddItem(DWORD bmpID, LPCTSTR lpszItem)
{
int Index=AddString(lpszItem);
SetItemData(Index,bmpID);
return Index;
}
添加DrawItem虚函数,代码如下:
void CNewListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);//dc
CRect rect=lpDrawItemStruct->rcItem;//项区域
if(lpDrawItemStruct->itemState&ODS_SELECTED)
DrawBK(&dc,rect,IDB_SELECTED);
CRect bmpRect(rect.left+2,rect.top+4,35,rect.bottom-4);//位图头像区域 DrawBK(&dc,bmpRect,lpDrawItemStruct->itemData);
rect.left+=40;
CString strText;
GetText(lpDrawItemStruct->itemID,strText);
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(RGB(0,255,0));//设置字体颜色
dc.DrawText(strText,rect,DT_VCENTER|DT_LEFT|DT_SINGLELINE);
dc.Detach();
}