发掘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字典树(中文词典)(二)(插入、查找、导入、导出)
萌新做词典第二篇,做得不好,还请指正,谢谢大佬! 做好了插入与遍历功能之后,我发现最基本的查找功能没有实现,同时还希望能够把内存的数据存入文件保存下来,并可以从文件中导入词典.此外,数据的路径是存在配 ...
随机推荐
- 基于FPGA的DW8051移植(三)
总结一下问题: 1) http://www.cnblogs.com/sepeng/p/4137405.html 基于FPGA的DW8051移植(一)里面用modelsim观测波形发现程序进入了ida ...
- java困惑(二)函数以及引用改变
具体的Visio 文档在资源
- 浅析Linux的软中断的实现
參考: http://bbs.chinaunix.net/thread-2333484-1-1.html http://liu1227787871.blog.163.com/blog/static/2 ...
- SQL SERVER 2008R2sp1配置Database Mail –用SQL 数据库发邮件
步骤1)创建配置文件和帐户 看图片吧,挺简单的: 中间略过的一些步骤,就点下一步即可. 下面我们测试一下: Step 2)配置邮件: 在完成账户和配置文件创建之后,我们需要配置Database Mai ...
- C语言顺序栈实现
/*数序栈*/ #include<stdio.h> #include<stdlib.h> #include<math.h> #define SElemType ch ...
- Qt调用DLL
声明: 事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的.并且用我前两篇有关DLL文章里面的方法,从dll中导出了导入库(.lib)文件,dll中有两个函数,原型如下: ...
- Jquery学习笔记: attr和 prop的区别,以及为html标签自定义属性
一.自定义html标签属性 对于html文件中的html标签,可以自定义属性,如: <a href="#" id="link1" action=" ...
- keepalived 结合mysql 自动切换
启动keepalived:/usr/local/sbin/keepalived -D -d -S 0 master ip:192.168.32.6 master:/root/sbin# cat /et ...
- C++ vs.net设置UTF8字符
1.将main.cpp改成utf-8编码,方法是点击main.cpp,然后选择菜单文件->高级保存选项.[所有源码都要转换成uft-8] 2.在你的main函数里,设置如下代码,完美解决qt5的 ...
- Activity跳转时传递Bitmap对象的实现
前言 相信大家可能都了解Activity跳转时我们是能够传递參数的,比方使用Intent传递或者Bundle来传递,把当前Activity的一些信息传递给将要跳转到的新的Activity.可是不知道大 ...