为CListBox加上智能水平滚动条

2016-01-29 12:03 27 1 收藏

为CListBox加上智能水平滚动条,为CListBox加上智能水平滚动条

【 tulaoshi.com - C语言心得技巧 】

为CListBox加上智能水平滚动条
作者:俞良军

提交者:eastvc 发布日期:2004-1-2 20:05:51
原文出处:http://www.ccw.com.cn


在MFC中,用列表框(CListBox)来显示多个字符串是一种很方便的方法。但缺省的列表框水平滚动条不够智能——这里智能的含义是:在应该出现的时候出现,不应该出现的时候消失,而且应能自动调节自己的大小。本文通过实例说明了存在的问题和解决办法。

一、问题演示

首先用Visual Studio应用向导创建工程CustomCListBox。这是一个基于对话框的应用,向导提供的所有可选参数均采用其缺省值。

在资源编辑器中将对主话框字体设为宋体12,插入一个CListBox控制,设其ID为IDC_LLISTTEST,大小为125 X 84。 请确认列表框的垂直滚动条、水平滚动条有效,取消其排序风格。

启动Class Wizard,选择Member Variables选项卡,为列表框加入对应的成员变量m_lListTest,在Category中选择Control。

接下来在Workspace窗格中选择ClassView,扩展CCustomCListBoxDlg类并双击OnInitDialog(),在编辑窗格中找到注释行“TODO: Add extra initialization here”,在该行下面加入以下内容:

m_lListTest.AddString(_T("One"));
m_lListTest.AddString(_T("Two"));
m_lListTest.AddString(_T("Three"));
m_lListTest.AddString(_T("Four"));
m_lListTest.AddString(_T("Five"));
m_lListTest.AddString(_T("Six"));
m_lListTest.AddString(_T("北国风光,千里冰封,万里雪飘。"));
m_lListTest.AddString(_T("Eight"));
m_lListTest.AddString(_T("Nine"));
m_lListTest.AddString(_T("Ten"));

编译并运行这个工程,可以发现列表框能够正确显示全部内容。

如果在上述m_lListText.AddString(_T"Ten"))后面加入一行:

m_lListTest.AddString(_T("Eleven"));

重新编译并运行该工程,可以发现出现了一个垂直滚动条。垂直滚动条的出现使得列表框水平方向有效显示宽度变小,第七行的内容被切割而不能完整显示。但此时水平滚动条并没有自动出现,第七行被切割部分就无法看到了。

如果我们删除最后加入的语句,把第七行汉字加长到超出列表框显示宽度为止,也可以发现水平滚动条不会自动出现。被切割部分仍旧无法看到。

由此可知,CListBox的水平滚动条并不象垂直滚动条那样“聪明”:垂直滚动条总是能够在需要它的时候自动出现,并能够自动调节自身大小,而水平滚动条不能。

二、解决问题

为提高代码的可重用性,可以创建CListBox的派生类,在派生类中实现“智能”水平滚动条。需要考虑的主要问题包括:跟踪最大字符串宽度(应能适应不同场合下的字体变化),必要时计算垂直滚动条宽度,自动显示和调节水平滚动条的大小。

选菜单 Insert/New Class,设新创建类的名字为CDJListBox,其基类为CListBox,其它选项采用缺省值。单击OK,Visual Studio自动生成DJListBox.cpp和DJListBox.h两个文件。

接下来将主对话框的列表框改为CDJListBox类型,即在CLassView扩展CCustomListBoxDlg类并双击m_lListTest成员,在编辑窗格,修改

CListBox m_lListTest;

为:

CDJListBox m_lListTest;

然后,在类声明代码之前,插入

#include "DJListBox.h"

此时如果重新编译并运行,是无法看到任何实质性的改变的,因为我们并没有修改CDJListBox。所有对于CDJListBox的调用都直接传递给基类CListBox了。

跟踪字符串最大宽度可以通过覆盖CListBox::AddString()实现。打开DJListBox.h,紧接类的析构函数加入如下声明:

int AddString( LPCTSTR lpszItem );

并在实现文件DJListBox.cpp加入该函数框架:

int CDJListBox::AddString(LPCTSTR lpszItem)
{
//此处加入字符串宽度跟踪、水平滚动条显示等代码
}

字符串宽度跟踪可以用整形成员变量m_nMaxWidth实现。在DjListBox.h的protected声明区内,加入以下一行:

int m_nMaxWidth;

在DJListBox.cpp文件,找到CDJListBox的建构函数,为这个最大宽度作初始化:

m_nMaxWidth = 0;

现在可以改动新加入的AddString()了。先应该调用基类AddString(),并用nRet记录其返回值:

int nRet = CListBox::AddString(lpszItem);

接下来调用GetScrollInfo()以获得垂直滚动条的相关信息。这些信息是通过一个SCROLLINFO结构传递的,下面是对该结构初始化并调用GetScrollInfo()的代码:

SCROLLINFO scrollInfo;
memset(&scrollInfo, 0, sizeof(SCROLLINFO));
scrollInfo.cbSize = sizeof(SCROLLINFO);
scroll

来源:https://www.tulaoshi.com/n/20160129/1484398.html

延伸阅读
标签: Web开发
SCROLLBAR-FACE-COLOR:#f5f5f5; SCROLLBAR-HIGHLIGHT-COLOR:#f5f5f5; SCROLLBAR-SHADOW-COLOR:#b2b2b2; SCROLLBAR-3DLIGHT-COLOR:#b2b2b2; SCROLLBAR-ARROW-COLOR:#3e3e3e; SCROLLBAR-TRACK-COLOR:#fff; SCROLLBAR-DARKSHADOW-COLOR:#fff; SCROLLBAR-BASE-COLOR:#f5f5f5;
标签: flash教程
第一步:场景中的元素 因为这一步主要是在场景中加入文字和图片,大家可以下载源文件后用FLASH打开自己研究,这里就不详细介绍各元素的画法了。 点击下载FLA源文件 关于场景中的元素,这里要说清楚的是各个MovieClip(影片剪辑,以下简称mc)的命名,如下图所示(注:这里说的命名,是指把mc放到场景中后在Properties<属性面板中的命名,而不是...
标签: Web开发
记录滚动条位置 dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd...
标签: Web开发
网页滚动条本身就是浏览器的一部分,使用它可以方便浏览较大的网页,但是千篇一律的它经常会给整体页面效果拖了不少后腿,我们能不能改变它灰灰的样子呢?能!俗话说:“只有你想不到的,没有做不到的。” 给滚动条换色 FRA 几乎所有网页的滚动条都是默认的灰色,如果把它的颜色换换,来点另类的,相信一定会使网页更加靓丽。我们只...
很多开发者在做Android UI时不知道如何设置ScrollView滚动条控件的滑块颜色,其实通过ScrollView的xml布局属性android:scrollbarThumbVertical可以关联一个drawable对象,比如说在ScrollView中我们有 android:scrollbars="vertical" //滚动条是垂直的 android:scrollbarThumbVertical="@drawable/red" //垂直滚动条颜色为red,red可以是一个png...

经验教程

78

收藏

93
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部