如何在CFileDialog上添加一个简单的复选框?

MFC似乎有一个函数CFileDialog::AddCheckButton,不幸的是,它没有在WTL中实现。

这些缺少的功能(我觉得很基本)变得烦人。还是WTL不适合我?

最佳答案

这不是那么基本。 CFileDialog并不完全是此功能的实现,而是OPENFILENAME和friends标准API的包装。可以更改布局并添加控件,但是请记住,这是通过对窗口进行挂钩/子类化以及通过Win32 API添加控件和消息处理程序来实现的。

WTL不为您提供用于自定义的辅助方法,但是它在内部启用了挂钩(初始化lpfnHook并将其映射到WTL标准StartDialogProc对话框proc),以帮助您快速入门。您应该从此类派生,重写消息处理,然后可以从此处开始自定义。

另请注意,这是不推荐使用的API的包装。 WTL还为您提供了新鲜的东西:CShellFileOpenDialogCShellFileSaveDialog

程式码片段

这是扩展类的方式:

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

然后,您将控制权置于最下面:

10-08 11:57