VC MFC列表框(CListBox)控件

  • 格式:docx
  • 大小:170.14 KB
  • 文档页数:5

下载文档原格式

  / 5
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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();

}

相关主题