手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

在C Builder中实现拖放功能

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
Windows中的拖放功能大家一定很熟悉了,如文档的转移,拷贝等操作用鼠标轻轻一拖即可,在编写程式中有时也用到拖放,那么如何实现呢?现以C Builder5(简称CB5)为例,分析拖放功能的具体实现。
一.工具条的拖放
---- 要实现拖放功能,首先必须了解几个和拖放有关的属性和方法, 对于TControl控件,CB5提供了三个属性,DockSite,DragKind和DragMode。灵活运用这三个属性会得到意想不到的效果。这三个属性的意义是:
---- DockSite:指定当前控件是否接受Drag-and-Dock类型的操作
---- DragKind:拖放种类,分为dkDrag和dkDock两种
---- DragMode:拖放模式,分为自动和手动模式两种
---- 其中Dock操作是指某控件脱离他的Parent,转而成为另一个控件的Child,也就是两个控件合并。若某一控件的DockSite为True,表明他接受执行Dock操作的某控件,并成为他的Parent。
---- 著名的Office工具条能够随意拖放,其实实现起来很简单:在Form上放一CoolBar控件,再在CoolBar控件上随意放几个ToolBar控件,他们的属性配置代码如下:
CoolBar1.DockSite=true;
ToolBar1.DragKind=dkDock;
ToolBar1.DragMode= dmAutomatic;

---- 其他ToolBar的属性配置和ToolBar1的属性配置相同,编译运行程式,拖动工具条试试,Cool极了吧。
二、任何两上控件间的拖放
---- 和此操作有关的几个函数有:
---- BeginDrag:开始执行拖放操作,假如控件的DragMode为dmManual,则必须调用此函数,假如DragMode为dmAutomatic,则不用调用。
---- OnDragOver:当被拖放的对象经过此控件时触发此事件,其中的参数Accept表示是否接受拖放的对象。
---- OnDragDrop:当放下被拖放的对象时触发此事件。
---- 下面举例说明拖放的实现过程:
---- 在CB5中新建一工程,在Form1上放两个ListBox,分别命名为ListBox1,ListBox2,打开ListBox1的Items属性框,随便输入几行字符串。
---- 其属性配置如下:
ListBox1->MultiSelect=true; // MultiSelect属性设为true,表示能够多选
ListBox1->DragMode= dmAutomatic;
ListBox2->MultiSelect=true;
ListBox2->DragMode= dmAutomatic; //两个ListBox拖放事件相同,能够互相拖放
ListBox2->OnDragOver= ListBox1DragOver;
ListBox2->OnDragDrop= ListBox1DragDrop;
ListBox2->OnStartDrag= ListBox1StartDrag;
在头文档中配置两个int型变量CurIndex,NewIndex
程式代码如下:
//-----------------------------------------------------------
#include < vcl.h >
#pragma hdrstop
#include "unit1.h"
#include "FileCtrl.hpp"
//-----------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//----------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//----------------------------------------------------------
void __fastcall TForm1::ListBox1StartDrag(TObject *Sender, TDragObject *&DragObject)
{
//开始执行拖放事件时记录ListBox->ItemIndex;
CurIndex=((TListBox *)Sender)->ItemIndex;
}
//----------------------------------------------------------
void __fastcall TForm1::ListBox1DragDrop(TObject *Sender, TObject *Source, int X, int Y)
{
int index;
if(Sender==Source) //假如Sender等于Source,表明在同一控件内执行操作,本例用来交换ListBox中的任意两个Items
{
NewIndex=Y/(ListBox1->ItemHeight);//得到拖放后的ItemIndex
//假如ItemIndex大于ListBox中的Item数,表示拖到最后一个
NewIndex=NewIndex< ((TListBox *)Sender)- >Items->Count?
NewIndex:((TListBox *)Sender)->Items->Count-1;
//执行Move操作,移动Item
((TListBox *)Sender)->Items->Move(CurIndex,NewIndex);
}
//假如Sender不等于Source,表明在两个控件间执行操作
//此例是将数据从一ListBox拖到另一个ListBox
else
{ //若只选中一项
if(((TListBox *)Source)->SelCount==1)
{
((TListBox *)Sender)->Items->Add(((TListBox *)Source)-> Items->Strings[((TListBox *)Source)->ItemIndex]);
((TListBox *)Source)->Items->Delete(((TListBox *)Source)-> ItemIndex);
}
//多选操作
if(((TListBox *)Source)->SelCount>=1)
{
//循环操作,测试哪些项被选中
for(index=0;index< ((TListBox *)Source)- >Items->Count; index )
if(((TListBox *)Source)->Selected[index])
((TListBox *)Sender)->Items->Add(((TListBox *)Source)-> Items->Strings[index]);
//从后向前删除Source控件中数据
for(index=((TListBox *)Source)->Items->Count-1;index>=0;index--)
if(((TListBox *)Source)->Selected[index])
((TListBox *)Source)->Items->Delete(index);
}
}
}
//----------------------------------------------------------
void __fastcall TForm1::ListBox1DragOver(TObject *Sender, TObject *Source,int X, int Y, TDragState State, bool &Accept)
{
//本例中假如原控件各目标控件都为ListBox控件,则接受拖放
Accept = Source->ClassNameIs("TListBox")&& Sender->ClassNameIs("TListBox");
}



文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS