关于listbox中添加水平滚动条

时间:2022-02-13 19:46:23
我的listbox不是通过create生成的,而是通过直接添加构件生成的,它的属性里我勾了水平滚动,但没用,还是显示不出,
网上查了一下,好像要加代码,但我不知道加到哪里?怎么加?请高手赐教!望给出具体方法!谢过!

6 个解决方案

#1



void CSerialCommuncitionDlg::SetHScroll()
{
CDC* dc = GetDC();
SIZE s;
int index;
CString str;
long temp;
for(index= 0; index< m_lstCommunicationInfo.GetCount(); index++)
{
m_lstCommunicationInfo.GetText(index,str);
s = dc->GetTextExtent(str,str.GetLength()+1);   // 获取字符串的像素大小
// 如果新的字符串宽度大于先前的水平滚动条宽度,则重新设置滚动条宽度
// IDC_LISTBOX为m_List的资源ID
temp = (long)SendDlgItemMessage(IDC_LIST_COMMUNICATIONINFO, LB_GETHORIZONTALEXTENT, 0, 0); //temp得到滚动条的宽度
if (s.cx > temp)  
{
SendDlgItemMessage(IDC_LIST_COMMUNICATIONINFO, LB_SETHORIZONTALEXTENT, (WPARAM)s.cx, 0);
}
}
ReleaseDC(dc);
}

#2


我的是IDC_LIST1,类是CSend,所以我把IDC_LIST_COMMUNICATIONINFO改成IDC_LIST1,void CSerialCommuncitionDlg::SetHScroll()
改成void CSend::SetHScroll(),编译是通过了,但效果没有,没有出现传说中的滚动条。
顺便说一下,我的listbox是用来存放添加附件的地址的,当我附件的路径字符串长超过listbox一行的长度时,一部分字符就读不进来了,所以
我要加滚动条。

#3


我的是IDC_LIST1,类是CSend,所以我把IDC_LIST_COMMUNICATIONINFO改成IDC_LIST1,void CSerialCommuncitionDlg::SetHScroll()
改成void CSend::SetHScroll(),编译是通过了,但效果没有,没有出现传说中的滚动条。
顺便说一下,我的listbox是用来存放添加附件的地址的,当我附件的路径字符串长超过listbox一行的长度时,一部分字符就读不进来了,所以
我要加滚动条。

#4


你每次向ListCtrl添加新的字符串的时候,都要调用这个函数一次。添加一次,然后调用一次。

#5


一直没注意过,学习了

#6


本人也是遇到同样问题,经过很长时间搜索才找到1楼所发的方法,并修改通过了,在此谢谢1楼,为免大家再次受此问题的困扰,发表出来,大家共同学习。
4楼所说的:你每次向ListCtrl添加新的字符串的时候,都要调用这个函数一次。添加一次,然后调用一次。这个也是要的
下面代码中出现的:IDC_LIST1为控件中ListBox的ID,
CMultiThreadandsectionDlg为我自己定义的对话框类,这两个自己更换成你自己定义的对话框类
void CMultiThreadandsectionDlg::SetHScroll()
{
HWND hwndDataBox = ::GetDlgItem(g_hwnd,IDC_LIST1);

    CDC* dc = GetDC();
    SIZE s;
    int index;
    CString str;
    long temp;
    for(index= 0; index< ListBox_GetCount(hwndDataBox); index++)
    {
ListBox_GetText(hwndDataBox,index,str);
        s = dc->GetTextExtent(str,strlen(str)/2+30);   // 获取字符串的像素大小,这个你可以自己取长度,不过一定要用strlen()这个函数
        // 如果新的字符串宽度大于先前的水平滚动条宽度,则重新设置滚动条宽度
        // IDC_LISTBOX为m_List的资源ID
        temp = (long)SendDlgItemMessage(IDC_LIST1, LB_GETHORIZONTALEXTENT, 0, 0); //temp得到滚动条的宽度
        if (s.cx > temp)  
        {
            SendDlgItemMessage(IDC_LIST1, LB_SETHORIZONTALEXTENT, (WPARAM)s.cx, 0);
        }
    }
    ReleaseDC(dc);
}

#1



void CSerialCommuncitionDlg::SetHScroll()
{
CDC* dc = GetDC();
SIZE s;
int index;
CString str;
long temp;
for(index= 0; index< m_lstCommunicationInfo.GetCount(); index++)
{
m_lstCommunicationInfo.GetText(index,str);
s = dc->GetTextExtent(str,str.GetLength()+1);   // 获取字符串的像素大小
// 如果新的字符串宽度大于先前的水平滚动条宽度,则重新设置滚动条宽度
// IDC_LISTBOX为m_List的资源ID
temp = (long)SendDlgItemMessage(IDC_LIST_COMMUNICATIONINFO, LB_GETHORIZONTALEXTENT, 0, 0); //temp得到滚动条的宽度
if (s.cx > temp)  
{
SendDlgItemMessage(IDC_LIST_COMMUNICATIONINFO, LB_SETHORIZONTALEXTENT, (WPARAM)s.cx, 0);
}
}
ReleaseDC(dc);
}

#2


我的是IDC_LIST1,类是CSend,所以我把IDC_LIST_COMMUNICATIONINFO改成IDC_LIST1,void CSerialCommuncitionDlg::SetHScroll()
改成void CSend::SetHScroll(),编译是通过了,但效果没有,没有出现传说中的滚动条。
顺便说一下,我的listbox是用来存放添加附件的地址的,当我附件的路径字符串长超过listbox一行的长度时,一部分字符就读不进来了,所以
我要加滚动条。

#3


我的是IDC_LIST1,类是CSend,所以我把IDC_LIST_COMMUNICATIONINFO改成IDC_LIST1,void CSerialCommuncitionDlg::SetHScroll()
改成void CSend::SetHScroll(),编译是通过了,但效果没有,没有出现传说中的滚动条。
顺便说一下,我的listbox是用来存放添加附件的地址的,当我附件的路径字符串长超过listbox一行的长度时,一部分字符就读不进来了,所以
我要加滚动条。

#4


你每次向ListCtrl添加新的字符串的时候,都要调用这个函数一次。添加一次,然后调用一次。

#5


一直没注意过,学习了

#6


本人也是遇到同样问题,经过很长时间搜索才找到1楼所发的方法,并修改通过了,在此谢谢1楼,为免大家再次受此问题的困扰,发表出来,大家共同学习。
4楼所说的:你每次向ListCtrl添加新的字符串的时候,都要调用这个函数一次。添加一次,然后调用一次。这个也是要的
下面代码中出现的:IDC_LIST1为控件中ListBox的ID,
CMultiThreadandsectionDlg为我自己定义的对话框类,这两个自己更换成你自己定义的对话框类
void CMultiThreadandsectionDlg::SetHScroll()
{
HWND hwndDataBox = ::GetDlgItem(g_hwnd,IDC_LIST1);

    CDC* dc = GetDC();
    SIZE s;
    int index;
    CString str;
    long temp;
    for(index= 0; index< ListBox_GetCount(hwndDataBox); index++)
    {
ListBox_GetText(hwndDataBox,index,str);
        s = dc->GetTextExtent(str,strlen(str)/2+30);   // 获取字符串的像素大小,这个你可以自己取长度,不过一定要用strlen()这个函数
        // 如果新的字符串宽度大于先前的水平滚动条宽度,则重新设置滚动条宽度
        // IDC_LISTBOX为m_List的资源ID
        temp = (long)SendDlgItemMessage(IDC_LIST1, LB_GETHORIZONTALEXTENT, 0, 0); //temp得到滚动条的宽度
        if (s.cx > temp)  
        {
            SendDlgItemMessage(IDC_LIST1, LB_SETHORIZONTALEXTENT, (WPARAM)s.cx, 0);
        }
    }
    ReleaseDC(dc);
}