这次将本来在客户区输出的鼠标位置改成在状态栏输出。
首先,在“资源符号”中添加三个常量符号,分别为:ID_MOUSE_X,ID_MOUSE_Y,ID_SCROLL_TEXT。
然后在字符串资源中添加三个字符串:
ID_MOUSE_X X = ****
ID_MOUSE_Y Y = ****
ID_SCROLL Welcome to Visual C++.NET
这里的“ * ”表示输入空格,不可以为空,以保证窗口宽度。
将MainFrm.cpp中的indicators数组修改成如下形式:
static UINT indicators[] =
{
ID_SEPARATOR, // 状态行指示器
ID_SCROLL_TEXT,
ID_MOUSE_X,
ID_MOUSE_Y,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
这时,要修改view类中的OnMouseMove函数了:
void CMouseMoveView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
/*m_MousePos = point; //将鼠标当前的位置赋给成员变量
Invalidate(true); //刷新客户区窗口*/
CString str;
CMainFrame *pFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd;
CStatusBar *pStatus = &pFrame->m_wndStatusBar;
int nIndex;
if (pStatus)
{
str.Format("X = %d", point.x);
nIndex = pStatus->CommandToIndex(ID_MOUSE_X);
pStatus->SetPaneText(nIndex, str, TRUE);
str.Format("Y = %d", point.y);
nIndex = pStatus->CommandToIndex(ID_MOUSE_Y);
pStatus->SetPaneText(nIndex, str, TRUE);
}
CView::OnMouseMove(nFlags, point);
}
在MouseMoveView.cpp文件的开头,将MainFrm.h包含进去,还将CMainFrame类的保护成员m_wndStatusBar 改成公有的,清除掉View类的OnDraw代码。
在CMainFrame类中,手工映射ID_MOUSE_X和ID_MOUSE_Y的命令更新消息:
void CMainFrame::OnUpdateMouseX(CCmdUI *pCmdUI)
{
CMouseMoveView *pView = (CMouseMoveView *)GetActiveView();
pCmdUI->Enable(pView->m_bDisplay);
}
void CMainFrame::OnUpdateMouseY(CCmdUI *pCmdUI)
{
CMouseMoveView *pView = (CMouseMoveView *)GetActiveView();
pCmdUI->Enable(pView->m_bDisplay);
}
还要在MainFrm.cpp文件中包含MouseMoveView.h文件,并且在MouseMoveView.h文件的开头声明
class CMouseMoveDoc;
完成后的程序如下图: