VC ListBox列表框实现自动水平滚动功能
程序员文章站
2022-04-12 11:45:59
...
利用CListBox::SetHorizontalExtent()成员可实现该功能。网上可行的方法主要是添加一个CListBox的派生类,并重载其AddString, InsertString方法。虽然使用方便,但是额外添加一个类。本文在不添加派生类的情况下实现该功能。
1. 首先建立一个对话框CMyDlg的应用程序,添加一个列表框、三个按钮(添加、编辑、删除),列表框右键属性-》Horizontal Scroll设置为true。
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()
{
}
下一篇: python tkinter--简单入门