【问题标题】:How to handle closing MessageBox如何处理关闭 MessageBox
【发布时间】:2012-08-27 20:04:08
【问题描述】:

我的环境是 C++、MFC、WM 6.0+ 设备的紧凑框架。

在许多地方,我使用“MessageBox()”显示弹出消息,以提供简单的警告或从用户那里获得是/否响应。我想做的是,每当关闭任何消息时,在执行特定代码之前调用一些常用函数。

我在父窗口中尝试了 WM_SHOWWINDOW,但似乎没有发生。

任何建议将不胜感激。

[已添加] 我的屏幕有很多按钮,我必须确保始终只有一个按钮处于聚焦状态。当我显示消息框时,按钮似乎失去了焦点,所以我想在消息关闭时将其重新聚焦。当然,我可以在所有使用消息的地方都这样做,但要寻找更好的方法来处理这种情况。

【问题讨论】:

    标签: c++ mfc compact-framework


    【解决方案1】:

    您可以尝试在父窗口中拦截WM_ACTIVATE 消息。

    【讨论】:

    • 感谢您的评论。由于某种原因,这在我的环境(mfc、windows mobile)中不可用。
    【解决方案2】:

    MessageBox函数在关闭时会返回特定的返回码,你可以将MessageBox函数包装起来,检查返回值,然后运行一些代码。

    这是来自 MSDN 的返回码:

    IDABORT    3    The Abort button was selected.
    IDCANCEL    2    The Cancel button was selected.
    IDCONTINUE    11    The Continue button was selected.
    IDIGNORE    5    The Ignore button was selected.
    IDNO    7    The No button was selected.
    IDOK    1    The OK button was selected.
    IDRETRY    4    The Retry button was selected.
    IDTRYAGAIN    10    The Try Again button was selected.
    IDYES    6    The Yes button was selected.
    

    所以下面的代码可以根据返回码来运行不同的函数。

    void MyMessageBox(wstring title,wstring message)
    {
      int msgboxID = MessageBox(
           NULL,
           (LPCWSTR)message.c_str(),
           (LPCWSTR)title.c_str(),
           MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2
       );
    
     switch (msgboxID)
     {
        case IDCANCEL:
            // TODO: add code
            break;
        case IDTRYAGAIN:
            // TODO: add code
            break;
        case IDCONTINUE:
            // TODO: add code
            break;
        //so on
     }
    }
    

    更多信息在这里: http://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx

    【讨论】:

    • 感谢您的评论。也许我可以扩展 MessageBox 并向父级发送用户定义的消息,以便父​​级聚焦其按钮之一?
    • 是的,使用 WM_USER 消息和 wparam 应该是可行的,lparam 以为我自己没有尝试过。
    • 为什么不直接打电话给SetFocus呢?我也相信焦点应该自动恢复;事实上,它并没有暗示窗口处理消息的方式可能有问题......
    • @tenfour,是的,我想知道为什么我的屏幕在弹出消息时会失去焦点。
    猜你喜欢
    • 2018-10-28
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多