更新状态栏格文本的 正确方法 是 为状态栏的 每格 书写UPDATE_COMMAND_UI消息处理函数,MFC允许----甚至是鼓励----以与处理 菜单项 和 工具栏按钮 相同的方法处理 状态栏的 每个格,因此,要更新状态栏内某一格的文本,仅仅书写一个与该格ID相关的UPDATE_COMMAND_UI句柄就可以了,与处理 菜单 和 工具栏按钮 一样,应该在与 状态栏格在逻辑上相关的类内书写该句柄,因为 管理 该格内显示的文本 可能是文档、视图、框架窗口或别的类。然后,MFC消息传送体系确保在空闲进程处理中、在正确的上下文内按照需要调用句柄。
比如:指示器ID_INDICATOR_X和ID_INDICATOR_Y显示当前的光标坐标,而该坐标由视图对象接收到的WM_MOUSEMOVE消息决定,因此这些指示器的UPDATE_COMMAND_UI消息句柄就属于视图类,而ID_INDICATOR_SHAPE格显示当前选择的图形,该格由文档对象管理,因此,该指示器的UPDATE_COMMAND_UI句柄处理函数就应该定义为文档类的一个成员函数。
步骤如下:
1a:
afx_msg void OnUpdateIndicatorX(CCmdUI* pCmdUI);
afx_msg void OnUpdateIndicatorY(CCmdUI* pCmdUI);
1b:
ON_UPDATE_COMMAND_UI(ID_INDICATOR_X,OnUpdateIndicatorX )
ON_UPDATE_COMMAND_UI(ID_INDICATOR_Y,OnUpdateIndicatorY )
1C:
void CDrawView::OnUpdateIndicatorX(CCmdUI* pCmdUI)
{
CString s;
s.Format("x=%d",m_ptLast.x);//m_ptLast为在WM_MOUSEMOVE消息处理函数中得到的鼠标坐标
pCmdUI->SetText(s);
pCmdUI->SetCheck(m_ptLast.x > 200);
pCmdUI->Enable(true);
}
void CDrawView::OnUpdateIndicatorY(CCmdUI* pCmdUI)
{
CString s;
s.Format("y=%d",m_ptLast.y);
pCmdUI->SetText(s);
pCmdUI->SetCheck(m_ptLast.y > 200);
pCmdUI->Enable(true);
}
说明:
这里是能应用于 与 状态栏格 联合的CCmdUI对象的操作:
Enable(),激活状态栏格 或 使该格失效。
SetText(LPCTSTR lpszText),设置在状态栏格内显示的文本,这是更新状态栏格文本推荐的方法。
SetCheck(int nCheck=1),可导致给状态栏格凸起或凹陷。