好的,Lister 先生,我想我会添加一个答案。
首先,我可能会简单地添加一个按钮名称“...”以在编辑框右侧启动文件对话框以打开文件对话框,因为这是最简单的解决方案,也是大多数 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)
如果你想变得非常花哨,你可以使用一些uxtheme API或新的windows 动画 API。