windows - 使用 CFileDialog::AddCheckButton 失败

标签 windows mfc common-dialog

好的,我正在尝试使用CFileDialog::AddCheckButton。函数调用成功,我可以看到新的复选框。我看不到任何事件,虽然我可以重写 OnInitDialog,但重写 OnOK 会被忽略。我不确定我做错了什么:

//标题

class CTPSaveDialog : public CFileDialog
{
    DECLARE_DYNAMIC(CTPSaveDialog)
    static const CString CTPSaveDialog::m_cstrFilter;
public:
    BOOL m_bForce;
    CTPSaveDialog(
        LPCTSTR lpszDefExt = NULL,
        LPCTSTR lpszFileName = NULL,
        DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
        CWnd* pParentWnd = NULL,
        DWORD dwSize = 0);
    ~CTPSaveDialog();
    virtual BOOL OnInitDialog();
    DECLARE_MESSAGE_MAP()
    afx_msg void OnBnClickedCheckForce();
    virtual void OnOK();
};

//实现

const CString CTPSaveDialog::m_cstrFilter = "JPEG images (*.jpg)|*.jpg|TIFF Format (*.tif)|*.tif|Windows Bitmap (*.bmp)|*.bmp|Portable Network Graphics (*.png)|*.png|GIF (*.gif)|*.gif||";

IMPLEMENT_DYNAMIC(CTPSaveDialog, CFileDialog)

CTPSaveDialog::CTPSaveDialog(LPCTSTR lpszDefExt, LPCTSTR lpszFileName, DWORD dwFlags, CWnd * pParentWnd, DWORD dwSize) :
    CFileDialog(FALSE, lpszDefExt, lpszFileName, dwFlags, m_cstrFilter, pParentWnd, dwSize, TRUE)
{
    AddCheckButton(IDC_CHK_FORCE, "Force", FALSE);
    m_bForce = FALSE;
    m_ofn.lpstrTitle = "Write Simulation To File";
}

CTPSaveDialog::~CTPSaveDialog()
{
}


BOOL CTPSaveDialog::OnInitDialog()
{
    CFileDialog::OnInitDialog();

    if (GetDlgItem(IDC_CHK_FORCE))
        SendDlgItemMessage(IDC_CHK_FORCE, BM_SETCHECK, m_bForce ? BST_CHECKED : BST_UNCHECKED);
    // TODO:  Add extra initialization here
    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}

BEGIN_MESSAGE_MAP(CTPSaveDialog, CFileDialog)
    ON_BN_CLICKED(IDC_CHK_FORCE, &CTPSaveDialog::OnBnClickedCheckForce)
END_MESSAGE_MAP()

void CTPSaveDialog::CTPSaveDialog()
{
    m_bForce = !m_bForce;
}

void CTPSaveDialog::OnOK()
{
    // TODO: Add your specialized code here and/or call the base class

    CFileDialog::OnOK();
}

最佳答案

在具有 Vista 风格的 CFileDialog 中,Windows 消息不在消息映射中处理。相反,CFileDialog 使用特定的虚拟函数。您只需要声明并定义这些函数即可。

使用OnCheckButtonToggled来检测是否单击了复选框。

使用OnFileNameOK来检测何时选择文件并单击打开/保存按钮。

使用SetCheckButtonState设置/取消设置复选按钮(不是SendDlgItemMessage)

参见CFileDialog对于所有可用的方法。

如文档中所述,也不支持 OnInitDialog:

Some CFileDialog methods are not supported under Windows Vista or later. Check the individual method topic for information about whether the method is supported. In addition, the following inherited functions are not supported under Windows Vista or later:

CDialog::OnInitDialog
...

只需在构造函数中或调用 DoModal() 之前进行初始化,并覆盖这些函数:

class CTPSaveDialog : public CFileDialog
{
    ...
    virtual void OnCheckButtonToggled(DWORD dwIDCtl, BOOL bChecked);
    virtual BOOL OnFileNameOK();
};

void CTPSaveDialog::OnCheckButtonToggled(DWORD dwIDCtl, BOOL bChecked)
{
    if (dwIDCtl == IDC_CHK_FORCE)
        TRACE("Is checked? %d\n", bChecked);
}

BOOL CTPSaveDialog::OnFileNameOK()
{
    TRACE("Clicked Open/Save button\n");

    //return FALSE to close the dialog
    return FALSE;
}

关于windows - 使用 CFileDialog::AddCheckButton 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55289561/

相关文章:

c++ - 如何在 Windows 公用文件对话框中显示 API 填充的虚拟文件夹

C 输出未显示(C 新手)

java - 为什么我每次尝试运行 android studio 应用程序时都会遇到相同的错误?

c++ - MFC C++ 在主线程上放置 1000 毫秒 sleep ?

c++ - 试图在大型机类 VS 6.0 中创建我自己的工具栏

shell - window 7 : Property Handler works in Explorer but Not FileOpenDialog?

delphi - frShowHelp 是否还适用于 Delphi 中的常见对话框?

C# 在操作系统windows中设置环境变量(不执行)

python - Windows 上的 ReviewBoard 在尝试创建评论时抛出错误 207

c++ - 像 C# 中的 MFC 通用控件插件?