【问题标题】:Close a dialog on clicking CANCEL button ignoring EN_KILLFOCUS在单击取消按钮时关闭对话框,忽略 EN_KILLFOCUS
【发布时间】:2015-02-25 17:24:05
【问题描述】:

我的对话框中有一个 CEdit 字段,我在其中实现了 EN_KILLFOCUS,因此当用户输入无效数据时,当焦点从该字段移开并且焦点返回到 CEdit 字段时,会显示一条警告消息,以便用户可以输入正确的数据。如果用户输入无效数据并单击取消按钮,则还会显示一条警告消息,这是不希望的,因为用户无论如何都试图取消他的操作。当用户单击 CANCEL 按钮时,我尝试实现 PostQuitMessage,但这会关闭整个应用程序。当用户单击 CANCEL 按钮时,我只希望我的对话框关闭。单击取消按钮后,有什么方法可以立即关闭对话框。这是我试过的代码。

void CMARPropWnd::OnParentNotify(UINT message, LPARAM lParam)   
{
    CCDialog::OnParentNotify(message, lParam); 
    // TODO: Add your message handler code here 
    CPoint ptButtonDown(LOWORD(lParam),HIWORD(lParam)); 
    if ((message == WM_LBUTTONDOWN)  && (ChildWindowFromPoint(ptButtonDown) == GetDlgItem(eMARPropWndCancelBtnId))) 
    { 
        PostQuitMessage(0);
    } 
}

【问题讨论】:

  • Vaidation 已在另一个项目中实施。我对此无能为力:) 如果有解决方案,我将不胜感激
  • 您尝试过发布 WM_CLOSE 消息吗?

标签: visual-c++ mfc message-map


【解决方案1】:

试试

OnCancel();

而不是 PostQuitMessage(0);

注意 OnCancel() 是 CDialog 的一个虚方法,所以这是“最正确的”,并且会执行任何可能覆盖默认 CDialog 行为的特殊代码。

【讨论】:

  • 实际上 OnCancel 尝试通过实现 EndDialog() 来关闭对话框。 EndDialog 将键盘焦点从 CEdit 字段移开,这再次使验证发生并显示此处不需要的警告消息。那么除了 EndDialog 之外还有什么可以在这里使用的吗?
  • 添加一个布尔成员m_bInsideOnCancel,在ctor中设置为false。覆盖OnCancel(),将m_bInsideOnCancel 设置为true,然后链接回调用BASE_CLASS::OnCancel();。在您的 EN_KILLFOCUS 通知方法中,在进行任何处理之前确保 !m_bInsideOnCancel。这行得通吗?
  • 感谢您的回复,但实际上 EN_KILLFOCUS 是在另一个项目中实现的,我无权修改它。如果不添加这个成员变量,我就没有办法处理它吗?
猜你喜欢
  • 1970-01-01
  • 2011-12-07
  • 2013-04-06
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
相关资源
最近更新 更多