テキストボックスへのDrag&Drop対応
class TForm1 : public TForm
{
__published:
/** テキストボックス */
TEdit *TextBox1;
void __fastcall FormDestroy(TObject *Sender);
private:
/** オリジナルのウィンドウプロシージャ */
TWndMethod _wndProc;
/** Dropメッセージ受け取り */
void __fastcall OnDropFile(TMessage& msg);
public:
/** フックするウィンドウプロシージャ */
void __fastcall SubWndProc(TMessage& msg);
};
/**
* フォームの生成
*/
void __fastcall TForm1::FormCreate(TObject *Sender)
{
// ウィンドウプロシージャ入れ替え
_wndProc = TextBox1->WindowProc;
TextBox1->WindowProc = SubWndProc;
// Dragを有効にする
DragAcceptFiles(TextBox1->Handle, true);
}
/**
* フォームの破棄
*/
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
// ハンドラを解除
DragAcceptFiles(TextBox1->Handle, false);
}
/**
* メッセージの振り分け
*/
void __fastcall TForm1::SubWndProc(TMessage& msg)
{
switch(msg.Msg)
{
case WM_DROPFILES:
OnDropFile(msg);
break;
default:
_wndProc(msg);
break;
}
}
/**
* テキストボックスへのDrag&Drop
*/
void __fastcall TForm1::OnDropFile(TMessage& msg)
{
HDROP hDrop = HDROP(msg.WParam);
// D&Dしたファイルの数を取得
int num = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
char pBuf[256];
for(int i = 0; i < num; i++)
{
// ファイルパスの取得
DragQueryFile(hDrop, i, pBuf, sizeof(pBuf));
TextBox1->Text = pBuf;
}
// ハンドラの開放
DragFinish(hDrop);
}