这个问题弄了我两天的时间,晕死~~~网上查资料的时候众说纷纭,绝大多数模棱两可的说了思路什么的,这叫初学者怎么活?
现在这里一步一步说怎么实现这个功能,这里我用的是一个对话框作为主窗口来实现的,实现当鼠标移动到Static text控件IDC_S1上时,在Static text控件IDC_S2上显示鼠标当前的坐标。
首先是添加对话框的头文件XXDlg.h,添加变量以及事件:
public: /****添加成员变量*******/ CRect m_Rect; /*************/ protected: HICON m_hIcon; // 生成的消息映射函数 virtual BOOL OnInitDialog(); // afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); //添加鼠标的鼠标移动事件 afx_msg void OnMouseMove(UINT nFlags, CPoint point); DECLARE_MESSAGE_MAP()然后是XXDlg.cpp文件里面,在你的BOOL XXXDlg::OnInitDialog()函数中添加:
// TODO: 在此添加额外的初始化代码 //鼠标移动事件m_static1是控件IDC_S1的变量,下面有截图,可以自己看 m_static1.GetWindowRect(&m_Rect); //CWnd::GetWindowRect得到的是相当屏幕的矩形坐标不是相对客户区的,要转换一下 ScreenToClient(&m_Rect);
最后是实现OnMouseMove函数,同样是在cpp文件中:
//添加WM_MOUSEMOVE消息 void CMFC4Dlg::OnMouseMove(UINT nFlags, CPoint point) { if(m_Rect.PtInRect(point)) { ::GetClientRect(GetDlgItem(IDC_S1)->GetSafeHwnd(), &m_Rect); //然后把当前鼠标坐标转为相对于rect的坐标 ::ScreenToClient(GetDlgItem(IDC_S1)->GetSafeHwnd(), &point); CString strPos; strPos.Format(L"%d:%d", point.x, point.y); //m_static2是控件IDC_S2的CString类型Value变量 m_static2 = strPos; UpdateData(false); } CDialog::OnMouseMove(nFlags, point); }
好了~就是怎么简单,如果你要实现你自己的其他功能,就在OnMouseMove()的if语句里面添加,最好不要用MessageBox来提示,它会无限提示的~关都关不掉,呵呵~~~
下面是截图~有了截图大家就知道里面的一些变量是什么~~~
献给和我一样的初学者~~~