zoukankan      html  css  js  c++  java
  • 为MFC中的ListBox添加水平滚动条

    我们知道,MFC中的水平滚动条并不像垂直滚动条那样的智能。当文字超出ListBox的宽度时,水平滚动条并不会自己出现,我们需要手动的调用CListBox中的函数SetHorizontalExtent设置宽度,单位为像素。

    我们可以自己添加智能水平滚动条,现在我们首先随便创建一个ListBox控件,并将它的HorizontalScrollbar属性设置为True,如下:

    这样,控件的创建就完成了,然后就需要添加代码来实现智能水平滚动条了。

    首先,我们创建一个类,这里,我命名为CIHListBox,该类需要继承CListBox类,以便添加水平滚动条。

    然后我们需要覆盖CListBox类的AddString和InsertString接口以便添加水平滚动条。

    最后自然就是我们主要的计算智能水平滚动条的方法了,这里命名为RefushHorizontalScrollBar。

    整个类的声明如下:

    #ifndef _IHLISTBOX_H_
    #define _IHLISTBOX_H_

    class CIHListBox: public CListBox
    {
    public:
    CIHListBox(void);
    ~CIHListBox(void);

    // 覆盖该方法以便添加水平滚动条
    int AddString( LPCTSTR lpszItem );
    int InsertString( int nIndex, LPCTSTR lpszItem );

    // 计算水平滚动条宽度
    void RefushHorizontalScrollBar( void );
    };

    #endif

    首先,AddString和InsertString没有什么悬念,就是调用基类的方法后重新计算下水平滚动条的宽度,代码如下:

    int CIHListBox::AddString( LPCTSTR lpszItem )
    {
    int nResult = CListBox::AddString( lpszItem );

    RefushHorizontalScrollBar();

    return nResult;
    }

    int CIHListBox::InsertString( int nIndex, LPCTSTR lpszItem )
    {
    int nResult = CListBox::InsertString( nIndex, lpszItem );

    RefushHorizontalScrollBar();

    return nResult;
    }

    然后就是RefushHorizontalScrollBar方法了,该方法的实质是计算ListBox中每项的宽度,然后将最大宽度设置为水平宽度。实现代码如下:

    void CIHListBox::RefushHorizontalScrollBar( void )
    {
    CDC *pDC = this->GetDC();
    if ( NULL == pDC )
    {
       return;
    }

    int nCount = this->GetCount();
    if ( nCount < 1 )
    {
       this->SetHorizontalExtent( 0 );
       return;
    }

    int nMaxExtent = 0;
    CString szText;
    for ( int i = 0; i < nCount; ++i )
    {
       this->GetText( i, szText );
       CSize &cs = pDC->GetTextExtent( szText );
       if ( cs.cx > nMaxExtent )
       {
        nMaxExtent = cs.cx;
       }
    }

    this->SetHorizontalExtent( nMaxExtent );
    }

    然后,我们在获取ListBox控件的时候,只需要使用子类的方法就可以实现智能水平滚动条了。

    我的尝试代码如下:

    #define DLG_LIST_TEST ((CIHListBox*)(GetDlgItem(IDC_LISTTEST)))

    DLG_LIST_TEST->AddString( TEXT("This is lenth tes") );
    DLG_LIST_TEST->AddString( TEXT("This is lenth test test test") );
    DLG_LIST_TEST->AddString( TEXT("This is lenth test test test test test11111") );

    结果如下:

    以上仅供大家参考,谢谢大家^-^!~

  • 相关阅读:
    图论算法(三) 最短路SPFA算法
    图论算法(二)最短路算法:Floyd算法!
    图论算法(一)存图与STL第六弹——vector容器
    C++指针变量的基本写法
    杂记——深度优先搜索(dfs)与出题感想
    分治算法(二分查找)、STL函数库的应用第五弹——二分函数
    网站开发小技巧总结
    网站开发动态效果插件
    jquery获得ul下li的个数
    jquery的循环函数和点击事件绑定
  • 原文地址:https://www.cnblogs.com/huhu0013/p/4287662.html
Copyright © 2011-2022 走看看