首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CFileDialog::AddCheckButton失败

使用CFileDialog::AddCheckButton失败
EN

Stack Overflow用户
提问于 2019-03-21 21:32:12
回答 1查看 204关注 0票数 2

好的,我正在尝试使用CFileDialog::AddCheckButton。函数调用成功,我能够看到新的复选框。我无法看到任何事件,虽然我可以重写OnInitDialog,但是忽略了覆盖OnOK。我不知道我做错了什么:

//标头

代码语言:javascript
复制
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();
};

//执行

代码语言:javascript
复制
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();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-22 06:12:53

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

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

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

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

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

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

Windows或更高版本不支持某些CFileDialog方法。检查单个方法主题,以了解是否支持该方法。此外,Windows Vista或更高版本不支持下列继承功能: CDialog::OnInitDialog .

只需在构造函数中或在调用DoModal()之前进行初始化,然后重写以下函数:

代码语言:javascript
复制
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;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55289561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档