使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)