Help,在ListBox中如何实现水平滚动,而不要垂直滚动?
在ClistBox中,默认的是垂直滚动。那么怎么样才能实现水平滚动?以达到像打开文件对话框一样的效果? 请讲一下解决思路?或提供一个类似的源代码?谢谢 问题点数:20、回复次数:6Top
1 楼njg_jh(糨糊)回复于 2002-01-07 12:34:55 得分 10
自己建一个基于ClistBox的类CMyListBox:
int CMyListBox::AddString(LPCTSTR lpszItem)
{
int ret=CListBox::AddString(lpszItem);
m_nMaxWidth=0;
SCROLLINFO fo;
memset(&fo,0,sizeof(fo));
GetScrollInfo(SB_VERT,&fo);
if(GetCount()>1&&fo.nMax>fo.nPage)
m_nMaxWidth=GetSystemMetrics(SM_CXVSCROLL);
CFont *font=GetFont();
CClientDC dc(this);
CFont *old=dc.SelectObject(font);
CSize size;
GetTextExtentPoint32(dc.m_hDC,lpszItem,strlen(lpszItem),&size);
SetHorizontalExtent(size.cx+m_nMaxWidth+3);
dc.SelectObject(old);
return ret;
}
int CMyListBox::DeleteString(UINT nIndex)
{
RECT lRect;
GetWindowRect(&lRect);
int nRet = CListBox::DeleteString(nIndex);
int nBoxWidth = lRect.right - lRect.left;
m_nMaxWidth = nBoxWidth;
SIZE sSize;
CClientDC myDC(this);
int i;
char szEntry[257];
for (i = 0; i <GetCount(); i++)
{
GetText(i, szEntry);
GetTextExtentPoint32(myDC.m_hDC, szEntry, strlen(szEntry), &sSize);
m_nMaxWidth=max(m_nMaxWidth, (int)sSize.cx);
}
if (m_nMaxWidth> nBoxWidth) // 显示水平滚动条
{
ShowScrollBar(SB_HORZ, TRUE);
SetHorizontalExtent(m_nMaxWidth);
}
else
{
ShowScrollBar(SB_HORZ, FALSE);
}
return nRet;
}
void CMyListBox::ResetContent()
{
CListBox::ResetContent();
m_nMaxWidth = 0;
SetHorizontalExtent(0);
}Top
2 楼tony1978(突击召唤师)回复于 2002-01-07 12:45:14 得分 10
listbox有水平滚动、竖直滚动、多列风格,选择水平滚动和多列,不要竖直滚动就好了。
Top
3 楼tony1978(突击召唤师)回复于 2002-01-07 12:45:47 得分 0
还有,文件对话框不是listbox而是listctrlTop
4 楼ricesoft(分吹鸡蛋壳,财去人安乐!)回复于 2002-01-07 12:51:36 得分 0
谢谢回答。
Sorry,刚才没讲清楚。我要达到的效果是:不是将所有的ListBox中Item垂直排列下来,而是在一个窗口中显示好几列的项,然后可以通过水平滚动条来到达更多的列。
这里水平滚动条的作用不是显示某一项由于太长而显示不出来的部分。
Top
5 楼ricesoft(分吹鸡蛋壳,财去人安乐!)回复于 2002-01-07 13:22:08 得分 0
我的CMyListBox是Owner Draw,改写了Drawitam()函数,所以当选择了水平滚动和多列后,还是不能显示水平滚动!!!
HelpTop
6 楼ricesoft(分吹鸡蛋壳,财去人安乐!)回复于 2002-01-07 13:25:46 得分 0
知道这么做了Top




