来自:http://msdn.microsoft.com/zh-cn/library/cc468187
本文解释如何更改出现在 MFC 状态栏窗格中的文本。状态栏(CStatusBar 类的一个窗口对象)包含几个“窗格”。每个窗格都是状态栏中可用来显示信息的矩形区域。例如,很多应用程序在最右边的窗格显示 CAPS LOCK、NUM LOCK 和其他键的状态。应用程序还经常在最左边的窗格(窗格 0)显示信息文本,此窗格有时称为“消息窗格”。例如,默认 MFC 状态栏使用消息窗格显示一个字符串,来解释当前选定的菜单项或工具栏按钮。状态栏中的图显示了由“应用程序向导”创建的 MFC 应用程序中的状态栏。
默认情况下,MFC 在创建窗格时不启用 CStatusBar 窗格。若要激活一个窗格,必须对状态栏上的每一个窗格使用 ON_UPDATE_COMMAND_UI 宏并更新窗格。因为窗格不发送 WM_COMMAND 消息(与工具栏按钮不同),所以必须手动键入代码。
例如,一个窗格以 ID_INDICATOR_PAGE
作为其命令标识符,并且包含文档的当前页码。以下过程描述如何在状态栏中新建一个窗格。
新建窗格
- 定义窗格的命令 ID。
在“视图”菜单上单击“资源视图”。右击项目资源并单击“资源符号”。在“资源符号”对话框中,单击“新建”。键入一个命令 ID 名称:例如,
ID_INDICATOR_PAGE
。为 ID 指定值,或接受“资源符号”对话框建议的值。例如,对于ID_INDICATOR_PAGE
,接受默认值。关闭“资源符号”对话框。 - 定义窗格中要显示的默认字符串。
打开“资源视图”后,在为应用程序列出资源类型的窗口中双击“String Table”。打开“字符串表”编辑器后,从“插入”菜单中选择“新建字符串”。在“字符串属性”窗口中,选择窗格的命令 ID(例如:
ID_INDICATOR_PAGE
)并键入默认字符串值,如“Page ”。关闭字符串编辑器。(需要一个默认字符串以避免编译器错误。) - 将该窗格添加到 indicators 数组。
在文件 MAINFRM.CPP 中定位 indicators 数组。该数组按从左向右的顺序为状态栏的所有指示器列出了命令 ID。在数组中的适当位置,输入窗格的命令 ID,如以下为
ID_INDICATOR_PAGE
所显示的:static UINT BASED_CODE 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 会自动禁用该窗格并清除它的内容。
以下过程显示如何使用更新处理函数在窗格中显示文本。
创建窗格显示文本
- 为命令添加命令更新处理函数。
手动添加处理函数的原型,如在此为
ID_INDICATOR_PAGE
所显示的(在 MAINFRM.H 中):afx_msg void OnUpdatePage(CCmdUI *pCmdUI);
在适当的 .CPP 文件中,添加处理函数的定义,如在此为
ID_INDICATOR_PAGE
所显示的(在 MAINFRM.CPP 中):void CMainFrame::OnUpdatePage(CCmdUI *pCmdUI) { pCmdUI->Enable(); }
在适当的消息映射中,添加 ON_UPDATE_COMMAND_UI 宏,如在此为
ID_INDICATOR_PAGE
所显示的(在 MAINFRM.CPP 中):ON_UPDATE_COMMAND_UI(ID_INDICATOR_PAGE, OnUpdatePage)
- 在处理函数中添加代码以显示文本。
对于
ID_INDICATOR_PAGE
,从上述步骤 1 中展开OnUpdatePage
处理函数,添加最后三行:void CMainFrame::OnUpdatePage(CCmdUI *pCmdUI) { pCmdUI->Enable(); CString strPage; strPage.Format( "Page %d", m_nPage ); pCmdUI->SetText( strPage ); }
定义了成员变量 m_nPage
(属于 CMainFrame
类)的值后,该技术使页码在空闲处理过程中按应用程序更新其他指示器的相同方式出现在窗格中。如果 m_nPage
更改,则显示在下一个空闲循环过程中更改。
实际使用时,可采用如下代码,直接设置默认状态栏条目的文字:
((CMFCStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR))->SetPaneText(0,str);