重新设置水平滚动条的长度CString str; CSize sz; int dx=0; CDC* pDC = pmyListBox->GetDC(); for (int i=0;i < pmyListBox->GetCount();i++) { pmyListBox->GetText( i, str ); sz = pDC->GetTextExtent(str); if (sz.cx > dx) dx = sz.cx; } // Set the horizontal extent only if the current extent is not large enough. if (pmyListBox->GetHorizontalExtent() < dx) { pmyListBox->SetHorizontalExtent(dx); ASSERT(pmyListBox->GetHorizontalExtent() == dx); } pmyListBox->ReleaseDC(pDC);
引用luhongyu2108回复: ListBox的属性中添加WS_HSCROLL,因为CListBox是从CWnd继承的, 所以可以设置这个属性。 然后使用SetHorizontalExtent设置水平滚动范围 下面的代码根据列表框中内容设置范围 // The pointer to my list box. extern CListBox* pmyListBox;// Find the longest string in the list box. CString str; CSize sz; int dx = 0; TEXTMETRIC tm; CDC* pDC = pmyListBox->GetDC(); CFont* pFont = pmyListBox->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 < pmyListBox->GetCount(); i++) { pmyListBox->GetText(i, str); sz = pDC->GetTextExtent(str); // 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); pmyListBox->ReleaseDC(pDC);// Set the horizontal extent so every character of all strings // can be scrolled to. pmyListBox->SetHorizontalExtent(dx);
我在MFC设计中也遇到过你的问题,尝试了他的代码,直接在你调用listbox进行显示的功能函数里(一般是一个按键的函数里,点此按键可让你指定的listbox里显示)添加此代码。 // The pointer to my list box. extern CListBox* pmyListBox; 是定义你所使用的listbox的类指针,你可以在工程类的头文件里加上这句话,功能函数里就不用加这句话了,其他代码可以直接copy下来,别忘把你定义的listbox替换这里的pmyListBox! (比如我的代码中 void CLUDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX,IDC_LIST1,listbox1);}定义的是listbox1,所以将listbox1替换这里的pmyListBox,就OK啦!!!)
CSize sz;
int dx=0;
CDC* pDC = pmyListBox->GetDC();
for (int i=0;i < pmyListBox->GetCount();i++)
{
pmyListBox->GetText( i, str );
sz = pDC->GetTextExtent(str); if (sz.cx > dx)
dx = sz.cx;
}
// Set the horizontal extent only if the current extent is not large enough.
if (pmyListBox->GetHorizontalExtent() < dx)
{
pmyListBox->SetHorizontalExtent(dx);
ASSERT(pmyListBox->GetHorizontalExtent() == dx);
}
pmyListBox->ReleaseDC(pDC);
ListBox的属性中添加WS_HSCROLL,因为CListBox是从CWnd继承的,
所以可以设置这个属性。
然后使用SetHorizontalExtent设置水平滚动范围
下面的代码根据列表框中内容设置范围
// The pointer to my list box.
extern CListBox* pmyListBox;// Find the longest string in the list box.
CString str;
CSize sz;
int dx = 0;
TEXTMETRIC tm;
CDC* pDC = pmyListBox->GetDC();
CFont* pFont = pmyListBox->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 < pmyListBox->GetCount(); i++)
{
pmyListBox->GetText(i, str);
sz = pDC->GetTextExtent(str); // 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);
pmyListBox->ReleaseDC(pDC);// Set the horizontal extent so every character of all strings
// can be scrolled to.
pmyListBox->SetHorizontalExtent(dx);
// The pointer to my list box.
extern CListBox* pmyListBox;
是定义你所使用的listbox的类指针,你可以在工程类的头文件里加上这句话,功能函数里就不用加这句话了,其他代码可以直接copy下来,别忘把你定义的listbox替换这里的pmyListBox!
(比如我的代码中
void CLUDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX,IDC_LIST1,listbox1);}定义的是listbox1,所以将listbox1替换这里的pmyListBox,就OK啦!!!)