C++Builderメモ

テキストボックスへの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);
}