更新状态栏窗格的文本

本文说明如何更改显示在 MFC 状态栏窗格中的文本。 状态栏(CStatusBar 类的窗口对象)包含多个“窗格”。每个窗格都是状态栏的矩形区域,可用于显示信息。 例如,很多应用程序在最右侧的窗格中显示了 CAPS LOCK、NUM LOCK 和其他键的状态。 应用程序通常还会在最左侧的窗格中显示信息性文本;该窗格是窗格 0,有时称为“消息窗格”。例如,默认 MFC 状态栏使用消息窗格显示一个字符串,说明当前选定的菜单项或工具栏按钮。 状态栏中的图形显示了应用程序向导创建的 MFC 应用程序中的状态栏。

默认情况下,在创建窗格时,MFC 不启用 CStatusBar 窗格。 若要激活窗格,必须为状态栏上的每个窗格使用 ON_UPDATE_COMMAND_UI 宏并更新窗格。 由于窗格不会发送 WM_COMMAND 信息(它们与工具栏按钮不同),必须手动键入代码。

例如,假设某个窗格将 ID_INDICATOR_PAGE 设为其命令标识符,并且在文档中包含当前页码。 以下过程说明如何在状态栏中创建新窗格。

制作新窗格

  1. 定义窗格的命令 ID。

    在“视图”菜单上,单击“资源视图”。 右键单击项目资源,然后单击“资源符号”。 在“资源符号”对话框中,单击 New。 键入命令 ID 名称:例如,ID_INDICATOR_PAGE。 为 ID 指定值或接受“资源符号”对话框建议的值。 例如,对于 ID_INDICATOR_PAGE,请接受默认值。 关闭“资源符号”对话框。

  2. 定义要显示在窗格中的默认字符串。

    在“资源视图”打开后,在列出应用程序资源类型的窗口中双击“字符串表”。 在“字符串表”编辑器打开后,从“插入”菜单中选择“新建字符串”。 选择窗格的命令 ID(例如 ID_INDICATOR_PAGE),然后键入一个默认字符串值,例如“Page”。 关闭字符串编辑器。 (您需要默认字符串来避免编译器错误。)

  3. 将窗格添加到 indicators 数组。

    在 MAINFRM.CPP 文件中,找到 indicators 数组。 此数组以从左到右的顺序列出了所有状态栏的指示符的命令 ID。 在数组中的合适的点上,输入窗格的命令 ID,如此处为 ID_INDICATOR_PAGE 所示的:

    static UINT indicators[] =
    {
       ID_SEPARATOR,           // status line indicator
       ID_INDICATOR_CAPS,
       ID_INDICATOR_NUM,
       ID_INDICATOR_SCRL,
       ID_INDICATOR_PAGE,
    };
    

要在窗格中显示文本,推荐的方法是在窗格的更新处理程序函数中调用 CCmdUI 类的 SetText 成员函数。 例如,你可能要设置包含当前页码的整数变量 m_nPage,并使用 SetText 将窗格的文本设置为该数字的字符串版本。

注意

建议使用 SetText 方法。 可以通过调用 CStatusBar 成员函数 SetPaneText 在稍微低一点的级别中执行此任务。 尽管如此,您仍需一个更新处理程序。 如果窗格没有此类处理程序,MFC 将自动禁用窗格,并清除其内容。

以下过程显示如何使用更新处理程序函数在窗格中显示文本。

制作窗格显示文本

  1. 为命令添加命令更新处理程序。

    为处理程序手动添加原型,如此处为 ID_INDICATOR_PAGE(在 MAINFRM.H 中)所示的:

    afx_msg void OnUpdatePage(CCmdUI* pCmdUI);
    
  2. 在合适的 .CPP 文件中,添加处理程序的定义,如此处为 ID_INDICATOR_PAGE(在 MAINFRM.CPP 中)所示的:

    void CMainFrame::OnUpdatePage(CCmdUI* pCmdUI)
    {
       pCmdUI->Enable();
       CString strPage;
       strPage.Format(_T("Page %d"), m_nPage);
       pCmdUI->SetText(strPage);
    }
    

    此处理程序的最后三行是显示文本的代码。

  3. 在合适的消息映射中,添加 ON_UPDATE_COMMAND_UI 宏,如此处为 ID_INDICATOR_PAGE 所示(在 MAINFRM.CPP 中):

    ON_UPDATE_COMMAND_UI(ID_INDICATOR_PAGE, &CMainFrame::OnUpdatePage)
    

定义 m_nPage 成员变量(属于 CMainFrame 类)的值后,此方法将使得在空闲处理期间在窗格中显示页码,这与应用程序更新其他指示符的方式相同。 如果 m_nPage 发生更改,则会在下一个空闲循环中显示更改。

你想进一步了解什么

另请参阅

MFC 中的状态栏实现
CStatusBar 类