● 引数 と ドラッグ&ドロップ |
//===========================================================================
// 引数 と ドラッグ&ドロップ
// 引数や、ドラッグ&ドロップで渡されたファイル名を、リストに保存する例。
//===========================================================================
// ヘッダーファイル
// mainH
//---------------------------------------------------------------------------
#ifndef mainH
#define mainH
//---------------------------------------------------------------------------
// Windows API を呼び出すためのヘッダーファイルをインクルードする
// ドラッグ&ドロップを実装するのに必要なヘッダーファイル
#include <shellapi.h>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE 管理のコンポーネント
void __fastcall FormCreate(TObject
*Sender);
void __fastcall FormClose(TObject
*Sender,
TCloseAction &Action);
private: // ユーザー宣言
// WMDropFiles(TWMDropFiles &message)の宣言
virtual void __fastcall
WMDropFiles(TWMDropFiles
&message);
// ショートファイル名をロングファイル名にする宣言
AnsiString __fastcall
SFileToLFile(AnsiString
s);
// ファイルリスト OPEN/CLOSE 宣言
void __fastcall file_list_open(void);
void __fastcall file_list_close(void);
// 引数ファイル名とドラッグ&ドロップファイル名、両方で使用
// するためにここで宣言しています。
AnsiString In_File;
// ファイルリスト(ファイル名を保存するリスト)
TStringList* FileList;
// ファイルリストが OPEN されているか、いないか
bool file_list_on;
public: // ユーザー宣言
// メッセージマップ
BEGIN_MESSAGE_MAP
// MESSAGE_HANDLERマクロ定義
// 引数(メッセージ番号、メッセージ構造体の型、メッセージハンドラ)
// WM_DROPFILESメッセージを受信した時、TWMDropFilesをパラメータとして
// WMDropFilesメソッドを呼び出します。
MESSAGE_HANDLER(WM_DROPFILES,
TWMDropFiles,
WMDropFiles)
END_MESSAGE_MAP(TForm);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
//===========================================================================
//===========================================================================
// メインファイル
// MainForm.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent*
Owner)
: TForm(Owner)
{
// ファイルリストOPEN
file_list_open();
}
//---------------------------------------------------------------------------
// Form1Create
void __fastcall TForm1::FormCreate(TObject
*Sender)
{
// ドラッグ & ドロップ
// WM_DROPFILESメッセージを処理することができるようにする。
// フォーム生成時にドロップの受け入れを開始するのでOnCreateに記述します。
DragAcceptFiles(Handle,
true);
// 引数があるとき
if (ParamCount() >
0)
{
for (int i=0; i<ParamCount();
i++)
{
// ショートファイル名をロングファイル名にする
// この処理は、ショートカットなどにファイルをドロップしたときに
// 省略形でファイル名が表示されないようにしています。
In_File=SFileToLFile(ParamStr(i
+
1));
// ParamStr(i + 1)としているのは、ParamStr(0)
は実行プログラム(自身)
// のパスとファイル名なので、ParamStr(0)
をとらないようにしています。
// ファイルリストへファイル名を書き込む
FileList->Add(In_File);
}
}
}
//---------------------------------------------------------------------------
// ドラッグ & ドロップ
WMDropFiles メンバ関数コード
void __fastcall TForm1::WMDropFiles(TWMDropFiles
&message)
{
// ドロップされるファイルの数を得る
// ファイルインデックスに
0xFFFFFFFF
を渡すと
// 以下2つの引数は意味をもたず、ファイルの総数を返します。
UINT filecount = DragQueryFile((HDROP)message.Drop,
0xFFFFFFFF, NULL, 0);
for (UINT i = 0; i
< filecount; i++)
{
// 1つのファイルのパスを得る
In_File.SetLength
(MAX_PATH);
int length = DragQueryFile((HDROP)
message.Drop,
i, In_File.c_str(),
In_File.Length());
In_File.SetLength(length);
// ファイルリストへファイル名を書き込む
FileList->Add(In_File);
}
// ドラッグ & ドロップ
//Windowsが割り当てたメモリを開放します。
DragFinish((HDROP)message.Drop);
}
//---------------------------------------------------------------------------
// FormClose
void __fastcall TForm1::FormClose(TObject
*Sender, TCloseAction &Action)
{
// ファイルリストCLOSE
file_list_close();
}
//---------------------------------------------------------------------------
// ショートファイル名をロングファイル名にする
AnsiString __fastcall TForm1::SFileToLFile(AnsiString
s)
{ // この部分は、K.Nakazawaさんの C++Builder
Mini-technic から
// 流用させていただきました。
AnsiString L;
WIN32_FIND_DATA fd;
HANDLE h;
//パスも全てロングにする
while((h=FindFirstFile(s.c_str(),&fd))!=INVALID_HANDLE_VALUE)
{
FindClose(h);
L.Insert(AnsiString('\\')+fd.cFileName,1);
s = s.SubString(1,s.LastDelimiter('\\')-1);
}
L.Insert(s,1);
return L;
}
//---------------------------------------------------------------------------
// FileList オープン
void __fastcall TForm1::file_list_open(void)
{
if(!file_list_on)
{
FileList = new TStringList();
file_list_on = true;
}
}
//---------------------------------------------------------------------------
// FileList クローズ
void __fastcall TForm1::file_list_close(void)
{
if(file_list_on)
{
delete FileList;
file_list_on = false;
}
}
//===========================================================================
|
|