为鼠标移动事件添加新的功能-在状态栏显示鼠标坐标

来源:互联网 发布:指针怎么指向数组 编辑:程序博客网 时间:2024/04/30 16:53

这次将本来在客户区输出的鼠标位置改成在状态栏输出。

首先,在“资源符号”中添加三个常量符号,分别为: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;

完成后的程序如下图:

原创粉丝点击