0

如何在自定义弹出(WS_POPUP)窗口中模仿 ::MessageBox() 行为,弹出窗口等待用户单击其中一个按钮并返回单击结果?就像在 ::MessageBox() 中一样,当您在 uType 中有 MB_YESNO 并提供了所有者窗口的句柄时,它会根据单击的按钮返回 ID_YES 或 ID_NO。

在纯 win32 api 和 c++ 中。

4

2 回答 2

3

DialogBox() 是核心的 winapi 函数。

如果你想完全自旋,那么你必须:

  1. 使用 EnumThreadWindows() 迭代线程上的所有顶级窗口并使用 EnableWindow 禁用它们
  2. 使用 GetMessage + DispatchMessage 运行消息循环
  3. 使用表示对话框返回值的变量向该循环添加退出条件
  4. 为按钮编写消息处理程序,它们必须设置该变量
  5. 重复步骤 1,重新启用窗口
  6. 销毁对话窗口
  7. 返回变量值
于 2013-07-20T09:36:25.983 回答
2

当您处理按钮的通知时,通过消息BN_CLICKED传递到所有者窗口,结束对话框的调用并向 API 提供值 ( ) 以返回给更高级别的调用者。WM_COMMANDEndDialog(m_hWnd, IDYES)IDYES

非模态弹出窗口没有返回代码(MessageBox特别是与模态对话框和模态对话框相反),您可以关闭它们WM_CLOSE,如果需要,您必须详细说明从窗口获取结果代码/值的方法。

于 2013-07-20T09:10:38.317 回答