发掘ListBox的潜力(一):自动调整横向滚动条宽度
《自绘ListBox的两种效果》一文帖出之后,从反馈信息来看,大家对这种小技巧还是很认同。接下来我将继续围绕ListBox写一系列的文章,进一步发掘ListBox的潜力,其中包括:自动调整横向滚动条宽度、即时提示(Tips)、拖放插入点提示等,并在最后制作一个在滚动区内的ListBox组。
自动调整横向滚动条宽度
网上可以找到很多让Listbox产生横向滚动条的文章,其中的方法基本一样,就是定义一个函数,遍历Items取得最大的TextWidth值,然后发Listbox发消息LB_SETHORIZONTALEXTENT产生横向滚动条。典型例子如下:
| procedure SetWidth(Sender: TObject); var i, w: Integer; begin w := 0; with ListBox1 do begin for i:=0 to Items.Count -1 do begin if Canvas.TextWidth(Items[i]) > w then w := Canvas.TextWidth(Items[i]); end; SendMessage(Handle, LB_SETHORIZONTALEXTENT, w+4, 0); end; end; |
以上代码的确可用而且被广泛使用,但它有一个很大的缺点:效率大低。因为每次在Listbox中追加、插入或删除一个条目时,都要调用此函数重新计算横向滚动条宽度,而遍历所有项目和调用TextWidth都是很是很耗时的操作。如果用户将条目从当前Listbox拖往另一个Listbox,那么用户一个操作将有两个Listbox必须重新计算横向滚动条宽度,当Listbox内容有上百条的时候,你将明显感觉反应迟缓。
OK,现在换个思路。
当追加或插入新条目时,只要判断新内容的TextWidth是否大于滚动条宽度,如果是调整滚动条宽度即可。那么删除呢?是的,遍历是不可避免的,但并不是每次删除都需要。可以定义一个变量记录Listbox中TextWidth值最大的条目Index,只有删除这个条目时才需要遍历,其它时候完全可以不管它。
还有一种情况必须考虑,用户可能会改变屏幕字体,这时也必须重新计算横向滚动条宽度。跟删除操作一样计算原最大条目的新TextWidth值即可。
如果窗体上有多个Listbox,记录每个Listbox的最大条目也是一件很麻烦的事,所以我把它封装起来,下面给出完整代码:
|
unit kktListBox; {======================================================================== 文章为作者原创,转载前请先与本人联系,转载请注明文章出处、保留作者信息,谢谢支持! uses type protected public end; procedure Register; implementation { TkktListBox } constructor TkktListBox.Create(AOwner: TComponent); procedure TkktListBox.CreateWnd; procedure TkktListBox.LBAddString(var Message: TMessage); procedure TkktListBox.LBInsertString(var Message: TMessage); procedure TkktListBox.LBDeleteString(var Message: TMessage); procedure TkktListBox.CMFontChanged(var Message: TMessage); procedure TkktListBox.AdjuctScrollWidth(Message: TMessage); procedure TkktListBox.ResetScrollWidth; procedure Register; end. |
发掘ListBox的潜力(一):自动调整横向滚动条宽度的更多相关文章
- 发掘ListBox的潜力(三):显示即时提示(Tips)
ListBox显示即时提示(Tips) Listbox内容太长时超出Listbox宽度的部分将无法显示,一种解决方法是让Listbox产生横向滚动条,滚动显示内容(见前面的<发掘ListBox的 ...
- 发掘ListBox的潜力(二):鼠标拖放插入点提示
鼠标拖放插入点提示 鼠标拖放是Windows常见的操作,比如拷贝文件就可用拖放方式进行.在我们编写的应用程序中,有时为了方便用户操作需要支持鼠标拖放.对于大部分的VCL控件只要鼠标将DragMode设 ...
- WPF,解决Listbox,按住ListboxItem向下拖出Listbox,横向滚动条跑到最后。
类似这种样式的控件,.,在横向滚动条隐藏的情况下有这样的问题.(横向滚动条显示的时候也会,,目前不知道怎么解决.) 因为这个控件偏移是利用ListBox的ItemsPanelTemplate模版里的S ...
- VB ListBox 添加横向滚动条
Private Declare Function SendMessage Lib "user32 " Alias "SendMessageA" (ByVal h ...
- android 横向滚动条
/*** * 横向滚动条,修改版,从左向右滚动,支持html代码和html里面的网络图片 */public class MarqueeView extends LinearLayout { priva ...
- jquery横向滚动条
此代码献给wendy 由于工作太忙,下次再整理成插件调用,先记录下来,欢迎同学们提意见. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...
- 逆天的IE7中,诡异的横向滚动条
今天老邹我又要吐槽IE7了,这个奇葩浏览器总是不让省心.这回遇到的问题,灰常难发现是怎么回事,不过还是让我发现原因,哈哈,只要原因去干掉这个问题比躲避问题用别的办法绕开要爽的多啊. 首先我还是介绍下, ...
- DataGrid横向滚动条无法拖动的问题
项目中经常遇到一些问题,这些问题可能很简单,但是之前从未遇到,可能经过了一番谷歌,也可能是查阅了MSDN,或是借鉴了大牛博客,逐渐有了些眉目,为了将这些东西落地,也为了将来之不易的东西记录下来,以备今 ...
- sub,dl,dt,排版,横向滚动条,浮动元素居中,box-sizing
1.sub标签 下标 2.dl,dt,dd用的地方通常是具有标题,而标题下对应有若干列表简单的(栏目标题+对应标题列表)和标题对应下面有内容.在使用时候我们能简洁html代码情况下,学会灵活使用dl ...
随机推荐
- PyconChina2015丁来强Pydata Ecosystem
pydata ecosystem基于python的数据分析生态系统 0. Agenda Data Science ecosystem Data Wrangling Data Analysis Data ...
- 由基于qml,c++的串口调试工具浅谈qml与c++混合编程
最近在做一个基于sim900 的串口通信工具,基于qml和c++来实现. 首先,对于串口,qt有自带的QSerialPort,可以实现同步,和异步通信,qt creator也有自带的例子,本例子是从其 ...
- 基于Sql Server 2008的分布式数据库的实践(三)
原文 基于Sql Server 2008的分布式数据库的实践(三) 配置PHP 1.打开PHP配置文件,找到extension=php_mssql.dll,将前面的注释符号去掉 2.找到mssql.s ...
- jquery ajax json 数据的遍历
需求:进行ajax请求后,后台传递回来以下json数据 { "data":[ {","name":"选择A","valu ...
- Flask web开发 简单介绍
Flask是一个基于python的轻量级web框架.当安装好后Flask后 (pip install flask),就可以开始使用了. 一.最简单的例子 1.新建目录,作为web应用的目录,如: mk ...
- Solr4.7从数据库导数据
实际工程应用中,从数据库导出数据创建索引再常见不过了,现在实验一下从数据库导入数据创建索引. 一.版本说明 Solr版本:4.7.0 数据库:sqlserver2005 二.配置步骤 1. 准备的j ...
- Computer Transformation(规律,大数打表)
Computer Transformation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...
- Codeforces 435B. Pasha Maximizes
简单贪心.... B. Pasha Maximizes time limit per test 1 second memory limit per test 256 megabytes input s ...
- C++第13周(春)项目1 - 点、圆的关系
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759.内有完整教学方案及资源链接 [项目1 - 点.圆的关系](1)先建立一个P ...
- C++11 thread::detach(2)
原文地址:http://www.cplusplus.com/reference/thread/thread/detach/ public member function <thread> ...