如何在调用 AfxMessageBox 之前更新 StatusBar 中的 Indicator

How to update in Indicator in StatusBar before calling a AfxMessageBox

MDI 或 SDI 应用程序。我们如何才能在调用 MessageBox 之前立即更新 Statusbar 中的 Indicator?
MessageBox,停止,抑制处理程序需要的 CWinApp::OnIdle() ON_UPDATE_COMMAND_UI(ID_INDICATOR_STATUS_MACHINE, &CMainFrame::OnUpdateIndicatorStatusMachine).

刚才这个SendMessage也来不及了 AfxGetMainWnd()->PostMessage(WM_COMMAND, WM_IDLEUPDATECMDUI);

我想你可以试试这个:在你的 CMainFrame 中为你的状态栏映射一个自定义消息处理程序:

// header
afx_msg LRESULT OnMyUpdateSB(WPARAM wParam, LPARAM lParam);

和实施:

ON_MESSAGE(WMU_MYUPDATESB, &CMainFrame::OnMyUpdateSB)

LRESULT CMainFrame::OnMyUpdateSB(WPARAM wParam, LPARAM lParam)
{
    // call OnUpdateIndicatorStatusMachine code

    return 1;
}

在调用 (Afx)MessageBox 之前,将 PostMessage 发送到 CMainFrame:

::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), WMU_MYUPDATESB, 0, 0);

或者,xMRi 怎么说,您可以将 WM_SETMESSAGESTRING 作为 PostMessage 发送,或者更好(如果有效)SendMessage .

SendMessageWM_SETMESSAGESTRING 一起用于您的框架 window。

有关说明,请参阅 TN024

要更新所有其他指标或 UI 组件,您可以使用:

SendMessageToDescendants(WM_IDLEUPDATECMDUI, TRUE, 0, TRUE, TRUE);

在你身上 window。或者直接更新状态栏。

m_wndStatusBar.OnUpdateCmdUI(m_pMainFrame, TRUE);

我更喜欢SendMessageToDescendants.

如您所见,UI 更新机制仅在应用程序即将进入空闲状态时激活,而在显示消息框或模式对话框时不起作用。一种可能的解决方案是自己调用状态栏的 SetPaneText()SetPaneStyle() 成员。这不是“推荐”的方法(文档说使用 ON_UPDATE_COMMAND_UI 机制),但它在其他情况下不起作用,而且它仍然与之兼容,因为它会在消息出现后立即正常工作 -框或模态对话框已关闭。

所以,代码可以是这样的:

UINT nStyle = m_wndStatusBar.GetPaneStyle(ID_INDICATOR_STATUS_MACHINE);
m_wndStatusBar.SetPaneStyle(ID_INDICATOR_STATUS_MACHINE, bEnable? nStyle & ~SBPS_DISABLED : nStyle | SBPS_DISABLED);

如果您需要从 CMainFrame class 之外的部分代码调用这些,您可以将它们设为 CMainFrame class 的 public 函数,或者制作 m_wndStatusBar public,这样你就可以调用,例如:

((CMainFrame*)AfxGetMainWnd())->EnableStatusMachineIndicator(bEnable);

UINT nStyle = ((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar.GetPaneStyle(ID_INDICATOR_STATUS_MACHINE);
.