TZQDragFilesListBox组件的实现
这里主要是TZQDragFilesListBox组件的源码介绍,如果你有兴趣的话可以看一下我是如何实现该组件的。TZQDragFilesListBox组件为了支持文件的拖动提供了DragEnable属性和OnDragFiles事件,程序员可以通过设置DragEnable属性来控制是否允许文件的拖动,如果DragEnable属性为真,程序员就可以在OnDragFiles事件中对拖动的文件进行处理。如:
//以下语句就是简单的将拖动过来的文件名加入ZQDragFilesListBox1列表中。
void __fastcall TForm1::ZQDragFilesListBox1DragFiles(TObject *Sender,
TStringList *FileNames)
{
ZQDragFilesListBox1->Items->AddStrings(FileNames);
}
好了下面就是该组件的源程序,我对其中比较重要的语句做了注释,主要是为了让读者更容易看懂这些代码!
//头文件ZQDragFilesListBox.h
//---------------------------------------------------------------------------
#ifndef ZQDragFilesListBoxH
#define ZQDragFilesListBoxH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
//该语句定义了OnDragFiles 事件的函数原型TDragFilesNotifyEvent
typedef void __fastcall (__closure*TDragFilesNotifyEvent)(System::TObject* Sender,TStringList *FileNames);
//---------------------------------------------------------------------------
class PACKAGE TZQDragFilesListBox : public TListBox
{
private:
//定义了控制是否允许文件拖动的属性
bool FDragEnabled;
TDragFilesNotifyEvent FDragFiles;
void __fastcall SetDragEnabled(bool value);
bool __fastcall GetDragEnabled();
void __fastcall SetDragFiles(TDragFilesNotifyEvent value);
TDragFilesNotifyEvent __fastcall GetDragFiles();
void __fastcall DragFiles(TWMDropFiles & msg);
protected:
//用来处理与文件拖动相关的消息
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, DragFiles)
END_MESSAGE_MAP(TListBox)
public:
__fastcall TZQDragFilesListBox(TComponent* Owner);
__published:
//定义DragEnabled属性和OnDragFiles事件
__property bool DragEnabled = { read=GetDragEnabled, write=SetDragEnabled };
__property TDragFilesNotifyEvent OnDragFiles = { read=GetDragFiles, write=SetDragFiles };
};
//---------------------------------------------------------------------------
#endif
//ZQDragFilesListBox组件的实现文件ZQDragFilesListBox.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "ZQDragFilesListBox.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//
static inline void ValidCtrCheck(TZQDragFilesListBox *)
{
new TZQDragFilesListBox(NULL);
}
//---------------------------------------------------------------------------
__fastcall TZQDragFilesListBox::TZQDragFilesListBox(TComponent* Owner)
: TListBox(Owner)
{
}
//---------------------------------------------------------------------------
namespace Zqdragfileslistbox
{
//注册该组件
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TZQDragFilesListBox)};
RegisterComponents("zqComponents", classes, 0);
}
}
//---------------------------------------------------------------------------
void __fastcall TZQDragFilesListBox::SetDragEnabled(bool value)
{
if(FDragEnabled != value) {
FDragEnabled = value;
DragAcceptFiles(Handle,FDragEnabled); //进入接受文件拖拉的状态
}
}
bool __fastcall TZQDragFilesListBox::GetDragEnabled()
{
return FDragEnabled;
}
void __fastcall TZQDragFilesListBox::SetDragFiles(TDragFilesNotifyEvent value)
{
if(FDragFiles != value) {
FDragFiles = value;
}
}
TDragFilesNotifyEvent __fastcall TZQDragFilesListBox::GetDragFiles()
{
return FDragFiles;
}
void __fastcall TZQDragFilesListBox::DragFiles(TWMDropFiles & msg)
{
//TODO: Add your source code here
//取得拖动文件数
int num = DragQueryFile((HDROP)msg.Drop, 0xFFFFFFFF, NULL, 0);
TStringList *FileNames=new TStringList;
for (int i = 0; i < num; i++) {
char buffer[256];
DragQueryFile((HDROP)msg.Drop, i, buffer, sizeof(buffer));
FileNames->Add(AnsiString(buffer));
}
//结束文件的拖动操作
DragFinish((HDROP)msg.Drop);
//调用用户事件代码
if (FDragFiles)
{
FDragFiles(this,FileNames);
}
delete FileNames;
}
以上的代码就实现了文件的拖动,用户只要安装该组件,就可以直接使用该组件了!同时和该组件一起的还有另外的两个组件,TZQDragFilesCheckListBox和TZQDragFilePanel组件,因为它们的实现与该组件相同,我就不一一介绍了,如果这些组件感兴趣的话可以到http://www.zccfamily.com/zqget/ 网站下载这些组件的的源代码!
本文地址:http://com.8s8s.com/it/it24904.htm