リスターさん、答えを追加します。
最初に、これの前にボタン名「...」を追加して、ファイルダイアログを開くための編集ボックスの右側にファイルダイアログを起動します。これが最も簡単な解決策であり、ほとんどのWindowsユーザーが期待するものです。
ただし、別のオプションは、MFC制御を拡張することです。コントロールを拡張することを決定するときは、ほとんどが目的の動作を持ち、サブクラスになるのに役立つ仮想デストラクタを備えたコントロールを選択する必要があります。ボタンのような振る舞いが必要なCButton
ので、良い選択かもしれません。
クラスインターフェイスは次のようになります。
class CPathButton : public CButton
{
public:
enum { ID /*= IDC_BUTTON1*/ };
const CString GetPath() const;
const CString GetFileName() const;
const CString GetDirectory() const;
const CString GetExtension() const;
// other useful methods for setting file filters etc
protected:
// add ON_CONTROL(BN_CLICKED, ID, &OnClick) or ON_BN_CLICKED(ID, &OnClick)
DECLARE_MESSAGE_MAP()
// CFileDialog fdlg.DoModal(), m_path = fdlg.GetPathName(), SetWindowText(fdlg.GetFileTitle()), etc
afx_msg void OnClick();
// additional message handlers etc
private:
CString m_path; // save full path for after dialog is closed
};
コントロールが動的に作成されるか、リソースファイルを介して作成されるかなどに応じて、必要なだけカスタマイズを追加できます。基本的な考え方は、メンバーとして他の用途のためにフルパスを保存しながら、現在選択されているファイル名をボタンに表示することです。これにより、ユーザーはネストされたディレクトリを持つ長いパスの乱雑さを見る必要がなくなります。
デフォルトの外観が気に入らない場合は、メッセージを上書きOnPaint
して処理WM_PAINT
し、カスタムフォント、サイズを使用するか、長いファイルタイトルに省略記号を追加できます。また、テキストメトリックを使用してファイルタイトルに合わせてボタンのサイズを変更しGetTextExtent
、名前がぴったり合うようにするかCToolTipCtrl
、ボタンの上にマウスを置いたときにaを表示して、フルネームを表示することもできます。VS2008 +のCMFCButton
MFC機能パックからのツールチップ機能が組み込まれているため、ツールチップをCButton
表示する代わりにそれを継承すると、ツールチップを呼び出すのと同じくらい簡単になります。SetTooltip(m_path)
本当に凝ったものにしたい場合は、uxthemeAPIまたは新しいWindowsアニメーションAPIのいくつかを使用できます。