リソースでダイアログを作成する場合、ダイアログエディタで エディットボックスやらリストボックスを貼り付けることで簡単に作成できます。
例えばここで、ダイアログ全体へのファイルのドロップの処理をしようと思えば ダイアログのクラスにWM_DROPFILESのハンドラを追加すればできます。MyEdit.h:
class CMyEdit : public CEdit
{
〜
};
派生元は、少なくともCWndの派生クラスである必要があります。
MyEdit.h:
class CMyEdit : public CEdit
{
〜
// 生成されたメッセージ マップ関数
protected:
//{{AFX_MSG(CMyEdit)
afx_msg void OnDropFiles(HDROP hDropInfo);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
〜
};
MyEdit.cpp:
〜 BEGIN_MESSAGE_MAP(CMyEdit, CEdit) //{{AFX_MSG_MAP(CMyEdit) ON_WM_DROPFILES() //}}AFX_MSG_MAP END_MESSAGE_MAP() 〜 void CMyEdit::OnDropFiles(HDROP hDropInfo) { // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください CEdit::OnDropFiles(hDropInfo); }
DropDlg.h:
class CDropDlg : public CDialog { 〜 private: CMyEdit m_MyEdit; }DropDlg.cpp:
BOOL CDropDlg::OnInitDialog() { CDialog::OnInitDialog(); 〜 // TODO: 特別な初期化を行う時はこの場所に追加してください。 m_MyEdit.SubclassDlgItem(IDC_MY_EDIT,this); //この行を追加 return TRUE; // TRUE を返すとコントロールに設定したフォーカスは失われません。 }
これで、特定のエディットボックスのみへのファイルのドロップ処理が出来るはずです。
[2001-07-17]
ちなみに、ドロップされたファイル名をサブクラス化したエディットボックスに表示するには、
次のようにします。
〜 void CMyEdit::OnDropFiles(HDROP hDropInfo) { //ファイル名の長さを取得 UINT uiLen=DragQueryFile(hDropInfo,0,NULL,0); //ファイル名を取得 CString str; DragQueryFile(hDropInfo,0,str.GetBuffer(uiLen+1),uiLen+1); str.ReleaseBuffer(); //エディットボックスに表示 SetWindowText(str); }