使用 CFileDialog::AddCheckButton 失败

Posted

技术标签:

【中文标题】使用 CFileDialog::AddCheckButton 失败【英文标题】:using CFileDialog::AddCheckButton fails 【发布时间】:2019-03-21 21:32:12 【问题描述】:

好的,我正在尝试使用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();

【问题讨论】:

【参考方案1】:

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

使用OnCheckButtonToggled 检测复选框是否被点击。

使用OnFileNameOK 检测何时选择了文件并单击了Open/Save 按钮。

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

有关所有可用方法,请参阅 CFileDialog

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

某些CFileDialog 方法在 Windows Vista 下不受支持或 之后。检查单个方法主题以获取有关是否 支持该方法。此外,以下继承 Windows Vista 或更高版本不支持函数:

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;

【讨论】:

非常感谢您做出如此出色且解释清楚的回复 :-)

以上是关于使用 CFileDialog::AddCheckButton 失败的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)