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

    结果如下:

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

  • 相关阅读:
    # codeforces 1199 D. Welfare State(思维+dp)
    # codeforces 1245 A. A. Good ol' Numbers Coloring(数学)
    # codeforces 1272 F. Two Bracket Sequences(三维dp + bfs)
    关于MySQL无法启动 ERROR 2003 (HY000)
    PAT 甲级测试题目 -- 1002 A+B for Polynomials
    PAT 甲级测试题目 -- 1001 A+B Format
    Flask 中接收 web 端 JSON 的小例子
    一些工具
    MySql的一些常见问题(Windows 和 Ubuntu 下)
    Python学习笔记
  • 原文地址:https://www.cnblogs.com/huhu0013/p/4287662.html
Copyright © 2011-2022 走看看