如何在调用 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
.
将 SendMessage
与 WM_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);
.
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
.
将 SendMessage
与 WM_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);
.