MFC:为STATIC控件添加鼠标移动事件(VS2010)

这个问题弄了我两天的时间,晕死~~~网上查资料的时候众说纷纭,绝大多数模棱两可的说了思路什么的,这叫初学者怎么活?

现在这里一步一步说怎么实现这个功能,这里我用的是一个对话框作为主窗口来实现的,实现当鼠标移动到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来提示,它会无限提示的~关都关不掉,呵呵~~~

下面是截图~有了截图大家就知道里面的一些变量是什么~~~

献给和我一样的初学者~~~



猜你喜欢

转载自blog.csdn.net/q8547957/article/details/20902163