vc++中如何给listbox添加水平滚动条

时间:2022-02-13 19:46:29
    我在资源视图里将listbox的属性horizon 设为TRUE,可是还是不能显示水平滚动条,这是为什么啊,哪位大侠知道,告诉小弟一声。!!!!

4 个解决方案

#1


当列出超出时自动显示水平滚动条。

#2


重新设置水平滚动条的长度

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

#3


引用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);

#4


我在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啦!!!)

#1


当列出超出时自动显示水平滚动条。

#2


重新设置水平滚动条的长度

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

#3


引用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);

#4


我在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啦!!!)