如何在CFileDialog上添加一个简单的复选框?
MFC似乎有一个函数CFileDialog::AddCheckButton
,遗憾的是它没有在WTL中实现。
这些缺失的功能(我发现基本功能)变得烦人。或者WTL不适合我?
答案 0 :(得分:2)
这不是那么基本。 CFileDialog
并不完全是此功能的实现,而是OPENFILENAME
和朋友标准API的包装器。可以更改布局并添加控件,但请记住,这是通过挂钩/子类化窗口以及通过Win32 API添加控件和消息处理程序来实现的。
WTL没有为您提供自定义辅助方法,但它在内部启用挂钩(初始化lpfnHook
并将其映射到WTL标准StartDialogProc
对话框proc)以帮助您快速启动。您应该从此类派生,覆盖消息处理,您可以从那里开始自定义。
另请注意,这是不推荐使用的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);
你可以控制在底部: