在状态栏显示信息
状态栏中缺省会显示按键状态和我们当前选择的菜单、工具条的描述信息。我们也可以朝状态栏中显示自己的信息。本文介绍如何在状态栏中显示当前鼠标位置和鼠标所在位置的颜色。
为了显示一个定制消息,我们需要为程序创建一个可以关联更新消息的元素(字符串资源),然后再在状态栏中给它创建对应的pane,最后,通过WM_UPDATE_COMMAND_UI修改信息。具体步骤如下:
1. 创建两个字符串资源,分别给予IDS_LOCATION, IDS_COLOR作为其ID,两个字符串资源分别设置初始值0 x 0和(0,0,0)作为位置和颜色的初始值。
2. 在视图类中定义两个CString对象,用于记录位置和颜色信息
CString g_szLocation
=
_T(
"
0x0
"
);
CString g_szColor = _T( " (0,0,0 " );
CString g_szColor = _T( " (0,0,0 " );
3. 在视图类中增加WM_MOUSEMOVE消息的处理
void
CMyView::OnMouseMove(UINT nFlags, CPoint point)
... {
// TODO: Add your message handler code here and/or call default
g_szLocation.Format(_T("%3d x %3d "),point.x,point.y);
CDC * pDC = GetDC();
COLORREF color = pDC->GetPixel(point.x, point.y);
g_szColor.Format(_T("(%03d,%03d,%03d)"), GetRValue(color), GetGValue(color), GetBValue(color));
CView::OnMouseMove(nFlags, point);
}
... {
// TODO: Add your message handler code here and/or call default
g_szLocation.Format(_T("%3d x %3d "),point.x,point.y);
CDC * pDC = GetDC();
COLORREF color = pDC->GetPixel(point.x, point.y);
g_szColor.Format(_T("(%03d,%03d,%03d)"), GetRValue(color), GetGValue(color), GetBValue(color));
CView::OnMouseMove(nFlags, point);
}
4. 在CMainFrame窗口的cpp文件中添加对这两个变量的声明
extern
CString g_szLocation;
extern CString g_szColor ;
extern CString g_szColor ;
5. 在CMainFrame实现文件中修改indicators数组的定义,把IDS_LOCATION ,IDS_COLOR加入其中
static
UINT indicators[]
=
... {
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
IDS_LOCATION,
IDS_COLOR
} ;
... {
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
IDS_LOCATION,
IDS_COLOR
} ;
6. 在CFrameWnd::OnCreate函数中状态栏被创建后的代码处插入如下两行
m_wndStatusBar.SetPaneInfo (
4
, IDS_LOCATION, SBPS_NORMAL ,
120
);
m_wndStatusBar.SetPaneInfo ( 5 , IDS_COLOR, SBPS_NORMAL , 120 );
m_wndStatusBar.SetPaneInfo ( 5 , IDS_COLOR, SBPS_NORMAL , 120 );
其中4,5分别是IDS_LOCATION, IDS_COLOR在indicators数组中的下标。
7. 在CMainFrame类中添加两个WM_UPDATE_COMMAND_UI消息的处理函数
void
CMainFrame::OnUpdateLocation(CCmdUI
*
pCmd)
... {
pCmd->SetText (g_szLocation);
}
void CMainFrame::OnUpdateColor(CCmdUI * pCmd)
... {
pCmd->SetText (g_szColor);
}
... {
pCmd->SetText (g_szLocation);
}
void CMainFrame::OnUpdateColor(CCmdUI * pCmd)
... {
pCmd->SetText (g_szColor);
}
8.在CFrameWnd消息映射节插入对IDS_COLOR,IDS_LOCATION的更新消息映射
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
// {{AFX_MSG_MAP(CMainFrame)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code !
ON_WM_CREATE()
// }}AFX_MSG_MAP
ON_UPDATE_COMMAND_UI(IDS_LOCATION,OnUpdateLocation)
ON_UPDATE_COMMAND_UI(IDS_COLOR,OnUpdateColor)
END_MESSAGE_MAP()
// {{AFX_MSG_MAP(CMainFrame)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code !
ON_WM_CREATE()
// }}AFX_MSG_MAP
ON_UPDATE_COMMAND_UI(IDS_LOCATION,OnUpdateLocation)
ON_UPDATE_COMMAND_UI(IDS_COLOR,OnUpdateColor)
END_MESSAGE_MAP()