visual-c++ - 有条件地阻止 CPropertySheet 从页面 OnOK 按钮处理程序关闭
问题描述
我刚刚遇到了一个问题CPropertyPage
。
我一直在尝试使用OnOK
处理程序进行一些验证:
void CCalendarSettingsGooglePage::OnOK()
{
bool bHandle = false;
UpdateData(TRUE);
// AJT v20.2.0 — We need to pass "true" so that the error message will display!
if (ValidSettings(true))
{
bHandle = true;
SaveSettings();
}
if (bHandle)
CMFCPropertyPage::OnOK();
}
问题是,工作表仍然关闭。我曾希望阻止它CMFCPropertyPage::OnOK
会停止关闭工作表。但事实并非如此。
我从这里了解到,工作表 OnOK
正在EndDialog(IDOK)
打电话。但我不想让我的工作表复杂化。测试在此页面中。所以我需要一个是让工作表知道当用户单击“确定”按钮时它是否应该关闭。
解决方案
您需要覆盖OnCommand
属性页的父属性表类的处理程序并拦截IDOK
命令的单击(将在wParam
参数中给出)。如果你不调用基类OnCommand
但仍然返回 TRUE
表明你已经处理了命令,那么属性表将不会关闭:
BOOL MyPropertySheet::OnCommand(WPARAM wParam, LPARAM lParam)
{
if (wParam == IDOK) { // OK button clicked...
if (!ValidSettings(true)) return TRUE; // NOT valid, prevent further processing.
}
// You can also intercept the "Apply" command by testing for ID_APPLY_NOW
// Everything is OK, so continue processing ...
return CMFCPropertySheet::OnCommand(wParam, lParam);
}
请注意,我假设您的父母来自CMFCPropertySheet
,但同样适用于 'older' CPropertySheet
。
推荐阅读
- javascript - 开玩笑:不允许覆盖模拟方法
- javascript - 替换或模拟导入另一个文件
- java - 如何对齐添加到拆分窗格的标签和文本字段?
- java - 在java中解析一段时间后,无法通过循环解析网页中的HTML元素
- javascript - 输入新项目时如何清除和刷新搜索结果?
- oracle-apex - 如果我将 LOV 选择列表值置于单击按钮事件的条件中,则不会触发动态操作
- javascript - 在用于 Web 抓取的 while 循环期间不断出现“JavaScript 堆内存不足”
- r - FDR 校正 - 从 lmer() 中提取 p 值并创建向量以用于 R 中的 p.adjust
- azure - 如何使用门户从 Azure AD B2C 中删除用户?
- vue.js - VueJS 内联模板和其中的 v-for