欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

VC ListBox列表框实现自动水平滚动功能

程序员文章站 2022-04-12 11:45:59
...

利用CListBox::SetHorizontalExtent()成员可实现该功能。网上可行的方法主要是添加一个CListBox的派生类,并重载其AddString, InsertString方法。虽然使用方便,但是额外添加一个类。本文在不添加派生类的情况下实现该功能。

1. 首先建立一个对话框CMyDlg的应用程序,添加一个列表框、三个按钮(添加、编辑、删除),列表框右键属性-》Horizontal Scroll设置为true。

VC ListBox列表框实现自动水平滚动功能

2. 为CMyDlg添加成员函数AdjustHScroll,代码如下:

void CMyDlg::AdjustHScroll(CListBox *pl)
{
	// Find the longest string in the list box.
	CString    strText;
	CSize      sz;
	int        dx = 0;
	TEXTMETRIC tm;
	CDC*       pDC = pl->GetDC();
	CFont*     pFont = pl->GetFont();

	// Select the listbox font, save the old font
	CFont* pOldFont = pDC->SelectObject(pFont);
	// Get the text metrics for avg char width
	pDC->GetTextMetrics(&tm);

	for (int i = 0; i < pl->GetCount(); i++)
	{
		pl->GetText(i, strText);
		sz = pDC->GetTextExtent(strText);

		// Add the avg width to prevent clipping
		sz.cx += tm.tmAveCharWidth;

		if (sz.cx > dx)
			dx = sz.cx;
	}
	// Select the old font back into the DC
	pDC->SelectObject(pOldFont);
	pl->ReleaseDC(pDC);

	// Set the horizontal extent so every character of all strings  
	// can be scrolled to.
	pl->SetHorizontalExtent(dx);
}

3. 为三个按钮添加消息响应,并添加如下测试代码:

void CMyDlg::OnBnClickedBtnAdd()
{
    CListBox* pl = (CListBox*)GetDlgItem(IDC_LIST1);
    pl->AddString(_T("这是测试。。。。"));
    AdjustHScroll(pl);
}

void CMyDlg::OnBnClickedBtnEdit()
{
    CListBox* pl = (CListBox*)GetDlgItem(IDC_LIST1);
    int nsel = pl->GetCurSel();
    pl->DeleteString(nsel);
    pl->InsertString(nsel, _T("这是测试22222222。。。。"));  // 改为更长的字符串试试?
    AdjustHScroll(pl);
}

void CMyDlg::OnBnClickedBtnDel()
{
}