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

结果如下:

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

时间: 2024-11-04 18:27:07

为MFC中的ListBox添加水平滚动条的相关文章

为TListBox添加水平滚动条

为TListBox添加水平滚动条 实例说明 TListBox组件是一个较为常用的列表组件,在默认情况下该组件是没有水平滚动条的,所以文字过长会显示不完全,在文字较短的情况下还可以,但是如果一行的文字很长的话也不行.本例为TListBox添加了一个水平的滚动条,运行本程序单击[添加滚动条]按钮在TListBox组件中就会增加一个水平滚动条,运行效果如图1所示. 图1  为TListBox添加水平滚动条 思路与技术 在Windows中大部分窗口都具有滚动条,如果窗口被建立时没有让它具有滚动条特性的话

VB ListBox 添加横向滚动条

Private Declare Function SendMessage Lib "user32 " Alias "SendMessageA" (ByVal hwnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ lParam As Any) As Long Private Const LB_SETHORIZONTALEXTENT = &H194-----------------------

MFC 控件编程之水平滚动条跟垂直滚动条

MFC 控件编程之水平滚动条跟垂直滚动条 一点水平滚动条的操作 首先在操作滚动条的时候.我们要知道滚动条的一些属性. 比如我们要设置 最大值 最小值. 以及每次递增的值是多少.都要设置. 所有就有一个结构.专门存储了滚动条信息. 而我们在对话框一启动就要进行控件初始化.下方看下结构. typedef struct tagSCROLLINFO { UINT cbSize; 自身大小 UINT fMask; 滚动条的范围.左边->右边方式. int nMin; 滚动条最小值 int nMax; 滚动

MFC中状态栏的添加步骤

首先我们创建一个简单的MFC对话框程序,这个创建过程就省略了.假设我的工程名为:CStatusBar1Dlg 测试环境:vc6.0环境下 下面介绍一下如何在对话框上添加状态栏: 第一步: 在CStatusBar1Dlg.h头文件中添加一个状态栏的变量:CStatusBar   m_wndStatusBar; //状态栏对象 第二步: 在字符串表中添加自己需要在状态栏中显示的ID值,详见截图: 第三步: 在CStatusBar1Dlg.h的class外面定义一个结构体: //添加状态栏变量 sta

java中JScrollPane不显示水平滚动条的解决办法

在JPanel中添加了表格,表格中对东西太多,需要水平滚动条滑动才能够完全找到所有数据,如果没有水平滚动条的话,数据堆积在一起,无法分开 做法是: 第一步:先将表格自动调整的状态给关闭掉:table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 第二步:设置JScrollPane的水平滚动条的方式,有三种,设js是一个JScrollPane的对象 js.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_

table添加水平滚动条

<html> <head> <title>table新增水平滚动条</title> <style type="text/css"> .tableWrap { overflow: auto; } table{ width: 100% } table th{ white-space: nowrap; } table td{ white-space: nowrap; } </style> </head> &l

怎么给easyui中的datagrid加水平滚动条

注意如下几个点就行: 1.数据网格(DataGrid)所在的table属性上级div无需设置width: 2..datagrid属性:fitColumns为false 或者不填 3.在style中给.datagrid-body设置 overflow:auto; <style> .datagrid-body{ overflow:auto; } .datagrid-header-row > td { border-bottom: 1px solid #DFDFDF !important; }

MFC中listbox控件中各种属性的详解

 ListBox控件是Windows 窗体的一个空间,ListBox 控件显示一个项列表,用户可从中选择一项或多项.      如果项总数超出可以显示的项数,则自动向 ListBox 控件添加滚动条.当 MultiColumn 属性设置为 true 时,列表框以多列形式显示项,并且会出现一个水平滚动条.当 MultiColumn 属性设置为 false 时,列表框以单列形式显示项,并且会出现一个垂直滚动条.当 ScrollAlwaysVisible 设置为 true 时,无论项数多少都将显示滚动

MFC中Listbox控件的简单使用

MFC中listbox控件是为了显示一系列的文本,每个文本占一行.   Listbox控件可以设置属性为: LBS_CHILD   :(默认)子窗口 LBS_Visible :(默认)可视 LBS_Multiplesel :可选择多行 LBS_Extendedsel :可以使用shift或ctrl选择多行 LBS_SORT:所有行按字母顺序进行排序   对Listbox进行操作: Int listbox.AddString (  LPCTSTR     Str)   :对listbox的首行添加