VC MFC列表框(CListBox)控件

列表框控件简单应用

重复性的过程我就不详细讲明了,只给出类里面函数的解释。

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();
}

给列表框关联变量m_ListBox,类型为CNewListBox,对话框初始化函数添加代码如下:

  m_ListBox.AddItem(IDB_BITMAP1,"人生几何(如果...)");
  m_ListBox.AddItem(IDB_BITMAP2,"天下H(记得那时候...)");
  m_ListBox.AddItem(IDB_BITMAP3,"聆听(小鸟在唱歌...)");
  m_ListBox.AddItem(IDB_BITMAP4,"岁月无声(千杯酒...)");
  m_ListBox.AddItem(IDB_BITMAP5,"大地(在那些....)");
 m_ListBox.SetItemHeight(0,40);//设置高度

运行效果:

这里有一个问题,那就单击选项时窗口闪烁的很明显,如果不绘制背景和使用内存DC的话,窗口闪烁可能会小一点

关于列表框背景位图的问题,可以响应对话框的WM_CTLCOLOR消息,在这个消息处理函数中,判断是否为列表框,如果是那就返回一个位图画刷,如在对话框类添加一个CBrush变量 brush;之后在对话框初始函数里创建位图画刷:

  CBitmap bmp;
 bmp.LoadBitmap(IDB_BK);
  brush.CreatePatternBrush(&bmp);

WM_CTLCOLOR消息处理函数代码:

HBRUSH CThirdDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
  HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
 // TODO: Change any attributes of the DC here
 if(nCtlColor==CTLCOLOR_LISTBOX)
 {

 return (HBRUSH)brush.GetSafeHandle();
 }
 else return hbr;
 // TODO: Return a different brush if the default is not desired 
}

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bczheng1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值