发掘ListBox的潜力(二):鼠标拖放插入点提示
鼠标拖放插入点提示
鼠标拖放是Windows常见的操作,比如拷贝文件就可用拖放方式进行。在我们编写的应用程序中,有时为了方便用户操作需要支持鼠标拖放。对于大部分的VCL控件只要鼠标将DragMode设为dmAutomatic,就可以在OnDragDrop、OnDragOver和OnEndDrag中处理拖放事件。与Drag类似的还有一个Dock方式用于支持控件悬浮,控件在悬浮时会显示一个虚线框来表示悬浮位置,而Drag方式却没有这功能。现在让我们尝试在Listbox中显示拖放插入点。
上面提及的三个事件中OnDragOver是用来拖放鼠标经过控件上面时产生的,要显示插入点提示当然是在这里进行处理了。事件中先用Listbox.ItemAtPos(Point(X, Y) , true)取鼠标所有在的打目Index,再用Listbox.ItemRect(Index)取得作图区域,最后在区域中画出提示线框。下面给出代码:
| Unit1.pas内容 |
| unit Unit1;
interface uses type var implementation {$R *.dfm} {======================================================================== 文章为作者原创,转载前请先与本人联系,转载请注明文章出处、保留作者信息,谢谢支持! procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer); procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer; procedure TForm1.DrawInsertLine; end. |
| Unit1.dfm内容 [内容较长,请点击此处找开/折叠] |
| object Form1: TForm1 Left = 192 Top = 107 Width = 540 Height = 376 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object ListBox1: TListBox Left = 24 Top = 24 Width = 201 Height = 265 Style = lbOwnerDrawFixed DragMode = dmAutomatic ItemHeight = 20 Items.Strings = ( ' Accept := (Source is TkktLabelListBox) and (TkktLabelListBox(S' + 'ource).ItemIndex>-1);') TabOrder = 0 OnDragDrop = ListBox1DragDrop OnDragOver = ListBox1DragOver end object ListBox2: TListBox Left = 264 Top = 24 Width = 233 Height = 265 Style = lbOwnerDrawFixed DragMode = dmAutomatic ItemHeight = 20 Items.Strings = ( '上代码的确可用而且被广泛使用,但它有一个很大的缺点:' '效率大低。因为每次在Listbox中追加、插入或删除一个' '条目时,都要调用此函数重新计算横向滚动条宽度' ',而遍历所有项目和调用TextWidth都是很是很' '耗时的操作。如果用户将条目从当前Listbox拖往另一' '个Listbox,那么用户一个操作将有两' '个Listbox必须重新计算横向滚动条宽度,当Listbox' '内容有上百条的时候,你将明显感觉反应迟缓。' ' OK,现在换个思路。' ' 当追加或插入新条目时,只要判断新内容的Text' 'Width是否大于滚动条宽度,如果是调整滚动条宽度' '即可。那么删除呢?是的,遍历是不可避免的,但并不' '是每次删除都需要。可以定义一个变量记录Listbox中' 'TextWidth值最大的条目Index,只有删除这个条目时' '才需要遍历,其它时候完全可以不管它。' ' 还有一种情况必须考虑,用户可能会改变' '屏幕字体,这时也必须重新计算横向滚动条宽度。' '跟删除操作一样计算原最大条目的新TextWidth值即可。' ' 如果窗体上有多个Listbox,记录每个Listbox的' '最大条目也是一件很麻烦的事,所以我把它封装起来,' '下面给出完整代码:') TabOrder = 1 OnDragDrop = ListBox1DragDrop OnDragOver = ListBox1DragOver end end |
(完)
http://blog.csdn.net/nhconch/article/details/228018
发掘ListBox的潜力(二):鼠标拖放插入点提示的更多相关文章
- 发掘ListBox的潜力(一):自动调整横向滚动条宽度
<自绘ListBox的两种效果>一文帖出之后,从反馈信息来看,大家对这种小技巧还是很认同.接下来我将继续围绕ListBox写一系列的文章,进一步发掘ListBox的潜力,其中包括:自动调整 ...
- 发掘ListBox的潜力(三):显示即时提示(Tips)
ListBox显示即时提示(Tips) Listbox内容太长时超出Listbox宽度的部分将无法显示,一种解决方法是让Listbox产生横向滚动条,滚动显示内容(见前面的<发掘ListBox的 ...
- PyQt(Python+Qt)学习随笔:Qt Designer中部件的是否接受鼠标拖放事件的acceptDrops属性及含义
acceptDrops属性表示当前部件是否接受鼠标拖放事件,鼠标拖放应该是与鼠标拖拽结合在一起的,在Qt Designer中可以通过属性acceptDrops设置部件是否接受鼠标拖放事件.如果部件接受 ...
- ASP.NET TextBox 当鼠标点击后清空默认提示文字
ASP.NET TextBox 当鼠标点击后清空默认提示文字 [ 方法一] 前台代码: <div> <asp:TextBox ID="txtName" ru ...
- Qt应用程序主窗口之二:拖放操作与打印文档
一.拖放操作 对于一个实用的应用程序,不仅希望能从文件菜单中打开一个文件,更希望可以通过拖动直接将桌面上的文件拖入程序界面上来打开,就像可以将.pro文件拖入Creator中来打开整个项目一样.Qt中 ...
- 鼠标拖放div 实现
Javascript的mousemove事件类型是一个实时响应的事件,当鼠标指针的位置发生变化时(至少移动1个像素),就会触发mousemove事件.该事件响应的灵敏度主要参考鼠标指针移动速度的快慢, ...
- 【算法】【python实现】二叉搜索树插入、删除、查找
二叉搜索树 定义:如果一颗二叉树的每个节点对应一个关键码值,且关键码值的组织是有顺序的,例如左子节点值小于父节点值,父节点值小于右子节点值,则这棵二叉树是一棵二叉搜索树. 类(TreeNode):定义 ...
- 轻快的vim(二):插入
上一节我们讲到了VIM中的移动,既然已经能够在屏幕和光标间游刃有余了 那么,现在就来谈谈插入命令 不知道有多少VIM新手和我当年(去年)一样,信誓旦旦的以为只有i可以插入 唉,现在想想都觉得可笑,都是 ...
- 萌新笔记——C++里创建 Trie字典树(中文词典)(二)(插入、查找、导入、导出)
萌新做词典第二篇,做得不好,还请指正,谢谢大佬! 做好了插入与遍历功能之后,我发现最基本的查找功能没有实现,同时还希望能够把内存的数据存入文件保存下来,并可以从文件中导入词典.此外,数据的路径是存在配 ...
随机推荐
- excel unixtime与北京时间互转
unixtime转北京时间,在单元格内输入:=INT((B2-70*365-19)*86400-8*3600) *.要设置一下单元格格式为y-m-d h:m:s才会正确显示 北京时间转unixti ...
- Kruscal 、 Prime Template
Kruscal Template : 很裸的Kruscal Template(求最小生成树中最长路,即最短路中最长路) //#pragma comment(linker, "/STACK: ...
- 关于PsCreateSystemThread函数
研究了1天这个...MSDN说的不是很清楚NTSTATUS PsCreateSystemThread( _Out_ PHANDLE ThreadHandle, _In_ UL ...
- QML在XP等显卡明显不好的情况下 可以参考
http://doc.qt.io/qt-5/windows-requirements.html
- 组件接口(API)设计指南-文件夹
组件接口(API)设计指南-文件夹 组件接口(API)设计指南[1]-要考虑的问题 组件接口(API)设计指南[2]-类接口(class interface) 组件接口(API)设计指南[3]-托付( ...
- debian支持ll命令
debian支持ll命令 $ ll -bash: ll: command not found 没有ll这个命令.尽管也知道ll事实上 是ls -l 这个命令的别名,可是总感觉不是非常习惯.由于之前一直 ...
- Axis2(10):使用soapmonitor模块监视soap请求与响应消息
在Axis2中提供了一个Axis2模块(soapmonitor),该模块实现了与<WebService大讲堂之Axis2(9):编写Axis2模块(Module)>中实现的logging模 ...
- Linux之shell编程基础
一.变量 变量在shell中分为:本地变量.环境变量.位置参数: 本地变量:仅可在用户当前shell生命期的脚本中使用的变量,本地变量随着shell进程的消亡而无效,本地变量在新启动的shell中依旧 ...
- SQL 局域网远程备份
局域网远程备份,还真有点问题 我用的是2003,发现sql和windows兼容不太好 . 如果我在windows下面映射远程目录,sql发现不了,找不到路径,备份不了,在sql下映射远程目录,win ...
- .net嵌入c#代码(投票练习)
.net嵌入c#代码(投票练习) <%@ Page Language="C#" AutoEventWireup="true" CodeFile=" ...