S-JIS[1999-10-23/2001-07-17]

ダイアログ上のアイテムをサブクラス化する方法

リソースでダイアログを作成する場合、ダイアログエディタで エディットボックスやらリストボックスを貼り付けることで簡単に作成できます。

例えばここで、ダイアログ全体へのファイルのドロップの処理をしようと思えば ダイアログのクラスにWM_DROPFILESのハンドラを追加すればできます。
しかしダイアログ上の、例えばエディットボックスのみへのドロップ処理を行うには エディットボックスをサブクラス化してやる必要があります。

  1. サブクラス化するエディットボックスの為のクラスを新設します。
    ClassWizardから「クラスの追加」ボタンで「新規」を選べば簡単に作れます。

    MyEdit.h:

    class CMyEdit : public CEdit
    {
    〜
    };
    

    派生元は、少なくともCWndの派生クラスである必要があります。


  2. ここでの例ではファイルのドロップ処理を行うので、WM_DROPFILESをインプリメントします。

    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);
    }
    

  3. 次に、サブクラス化を行います。これは、ダイアログのクラスにコーディングします。
    この例ではサブクラス化するエディットボックスのIDはIDC_MY_EDITとしています。

    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 を返すとコントロールに設定したフォーカスは失われません。
    }
    

  4. この例ではエディットボックスへのファイルのドロップなので、 リソースエディタからこのエディットボックスのプロパティを開き、 「ドラッグドロップを許可」にチェックを付けます。

これで、特定のエディットボックスのみへのファイルのドロップ処理が出来るはずです。

[2001-07-17]
ちなみに、ドロップされたファイル名をサブクラス化したエディットボックスに表示するには、 次のようにします。

MyEdit.cpp:
〜
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);
}

VC++ページへ戻る / 技術メモへ戻る
メールの送信先:ひしだま