CListBox支持水平滚动条

原创 2006年06月08日 16:00:00

class CListBoxEx : public CListBox
{
// Attributes
public:
 int  m_nMaxWidth;

// Operations
public:
 int  AddString(LPCTSTR lpszItem);
 int  DeleteString(int nIndex);
 int  InsertString(int nIndex,LPCTSTR lpszItem);
 void ResetContent();
 void UpdateWidth(LPCTSTR lpszItem);

...

};

// ListBoxEx.cpp : implementation file
CListBoxEx::CListBoxEx()
{
 m_nMaxWidth = 0;
}

...
// CListBoxEx message handlers
int CListBoxEx::AddString(LPCTSTR lpszItem)
{
 int nResult = CListBox::AddString(lpszItem);
 if (nResult<0)
 {
  return nResult;
 }
 UpdateWidth(lpszItem);

 return nResult;
}

int CListBoxEx::InsertString(int nIndex,LPCTSTR lpszItem)
{
 int nResult = CListBox::InsertString(nIndex,lpszItem);
 if (nResult<0)
 {
  return nResult;
 }

 UpdateWidth(lpszItem);

 return nResult;
}

void CListBoxEx::ResetContent()
{
 CListBox::ResetContent();
 m_nMaxWidth = 0;
}

int CListBoxEx::DeleteString(int nIndex)
{
 int nResult = CListBox::DeleteString(nIndex);
 if (nResult<0)
 {
  return nResult;
 }
 
 CFont *pFont = CListBox::GetFont();  //考虑不同字体时的情况
 CClientDC dc(this);
 dc.SelectObject(pFont);
 m_nMaxWidth = 0;
 for (int i=0;i<CListBox::GetCount();i++)
 {
  CString str;
  CListBox::GetText(i,str);
  CSize sz = dc.GetTextExtent(str);
  sz.cx += (3 * ::GetSystemMetrics(SM_CXBORDER)); //考虑有垂直滚动条时加上滚动条宽度
  if (sz.cx>m_nMaxWidth)
  {
   m_nMaxWidth = sz.cx+2;
  }
 }
 CListBox::SetHorizontalExtent(m_nMaxWidth);

 return nResult;
}

void CListBoxEx::UpdateWidth(LPCTSTR lpszItem)
{
 CFont *pFont = CListBox::GetFont();
 CClientDC dc(this);
 dc.SelectObject(pFont);
 CSize sz = dc.GetTextExtent(lpszItem,_tcslen(lpszItem));
 sz.cx += (3*::GetSystemMetrics(SM_CXBORDER));
 if (sz.cx>m_nMaxWidth)
 {
  m_nMaxWidth = sz.cx+2;
  CListBox::SetHorizontalExtent(m_nMaxWidth);
 }
}

相关文章推荐

MFC自动水平滚动条CListBox

  • 2016年07月26日 16:30
  • 150KB
  • 下载

为CListBox加上智能水平滚动条

转自:为CListBox加上智能水平滚动条-stug1980-ChinaUnix博客

为CListBox加上智能水平滚动条

作者:俞良军 发布日期:2004-1-2 20:05:51 在MFC中,用列表框(CListBox)来显示多个字符串是一种很方便的方法。但缺省的列表框水平滚动条不够智能——这里智能的含义是:在...
  • dragoo1
  • dragoo1
  • 2017年05月26日 22:22
  • 169

为CListBox加上智能水平滚动条

在用MFC开发软件过程中,经常会遇到MFC基本控件满足不了我们的需要的时候,这时候就需要根据实际需求派生或重写MFC基本控件。这种情况我不只一次碰到了。以下是为CListBox加上智能水平滚动条,其思...

CListBox CEdit 自绘滚动条小试

如果直接需要代码,请直接移步http://www.codeproject.com/KB/dialog/skinscrollbar.aspx (注:本人非此代码作者) 用Spy++检查后可知,...
  • loongee
  • loongee
  • 2012年01月02日 17:25
  • 3185

为CListBox垂直滚动条,自动滚动,文字显示不全问题!

这个题目,其实和我用的项目没什么关系,不过顶一下吧,我主要是用的垂直滚动条。就是滚动条是根据信息自动滚动了,但是文字会显示不全所以还是使用SetCurSel这个接口来直接实现了,毕竟现在要求还不是很严...

解决CListCtrl闪烁及水平滚动条不能跟踪拖动的问题(MFC)

项目中用到一个界面如下图所示,在View上有个CPropertySheet,其上有几个CPropertyPage,每个属性页上有个CListCtrl,供用户查看信息。由于CListCtrl中的信息每隔...
  • zwgdft
  • zwgdft
  • 2012年03月26日 19:51
  • 9190
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CListBox支持水平滚动条
举报原因:
原因补充:

(最多只允许输入30个字)