【发布时间】:2013-12-22 10:40:55
【问题描述】:
如何在 CFileDialog 上添加一个简单的复选框?
MFC好像有个函数CFileDialog::AddCheckButton,可惜WTL中没有实现..
这些缺失的功能(我认为这些功能很基础)越来越烦人。还是 WTL 不适合我?
【问题讨论】:
如何在 CFileDialog 上添加一个简单的复选框?
MFC好像有个函数CFileDialog::AddCheckButton,可惜WTL中没有实现..
这些缺失的功能(我认为这些功能很基础)越来越烦人。还是 WTL 不适合我?
【问题讨论】:
这不是那么简单。 CFileDialog 不完全是此功能的实现,而是对 OPENFILENAME 和朋友标准 API 的包装。可以更改布局和添加控件,但请记住,这是通过挂钩/子类化窗口并通过 Win32 API 添加控件和消息处理程序来实现的。
WTL 不为您提供自定义帮助方法,但它在内部启用挂钩(初始化 lpfnHook 并将其映射到 WTL 标准 StartDialogProc 对话过程)以帮助您快速启动。你应该从这个类派生,覆盖消息处理,你可以从那里开始你的定制。
另请注意,这是对已弃用 API 的封装。 WTL 还为您提供更新鲜的东西:CShellFileOpenDialog、CShellFileSaveDialog。
这是扩展类的方式:
#include <atlmisc.h>
class CMyFileDialog :
public CFileDialogImpl<CMyFileDialog>
{
public:
BEGIN_MSG_MAP(CMyFileDialog)
CHAIN_MSG_MAP(CFileDialogImpl<CMyFileDialog>)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_HANDLER(123, BN_CLICKED, OnTestClicked)
END_MSG_MAP()
private:
CButton m_Button;
public:
// CMyFileDialog
CMyFileDialog() :
CFileDialogImpl<CMyFileDialog>(TRUE)
{
}
// Window Message Handler
LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL& bHandled)
{
CRect Position;
ATLVERIFY(GetWindowRect(Position));
ATLVERIFY(SetWindowPos(NULL, 0, 0, Position.Width(), Position.Height() + 50, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE));
CRect ButtonPosition;
ButtonPosition.left = 10;
ButtonPosition.top = Position.Height() + 10;
ButtonPosition.right = 90;
ButtonPosition.bottom = ButtonPosition.top + 20;
m_Button.Create(m_hWnd, ButtonPosition, _T("Test"), CControlWinTraits::GetWndStyle(0), CControlWinTraits::GetWndExStyle(0), 123);
bHandled = FALSE;
return 0;
}
LRESULT OnTestClicked(UINT, INT, HWND, BOOL&)
{
AtlMessageBox(m_hWnd, _T("Test"), _T("Debug"), MB_ICONINFORMATION | MB_OK);
return 0;
}
};
然后你做:
CMyFileDialog Dialog;
Dialog.DoModal(m_hWnd);
您可以控制底部:
【讨论】:
CFileDialogImpl?)我也尝试了CShellFileOpenDialog,但出现“未声明的标识符”错误;包括 atldlgs.h (WTL 8.0)。另外,对于消息处理覆盖,我不知道该怎么做。你是在谈论OnInitDone、OnFolderChange等函数吗?