【mfc】鼠标、键盘响应事件

对于mfc这东西,你真的必要跟我扯一大堆怎么类,什么派生,什么鬼东西

告诉我怎么做出一个个小功能,我记住它就可以了

这期为大家带来MFC的鼠标响应事件

这也是所谓的MFC中的“消息映射事件”


一、基本目标

1、有一个基本的MFC程序,点击“关闭”则“关闭”这个程序,这点没什么好讲的,把自带的“取消”按钮,右键->属性的Caption改成“关闭”二字就可以了


2、鼠标在对话框中移动,则显示其位置信息,这个坐标是窗口内部坐标


3、如果按着鼠标右键移动鼠标,则在这个工程的标题栏会显示“按着鼠标右键移动鼠标”,松开鼠标右键回复如初


4、如果按着键盘上的Ctrl键或者Shift键在对话框的窗口中移动鼠标,标题栏同样会有相应的提示,是否同时按下也会有提示


5、左击对话框,会弹出对话框,显示鼠标位置在哪里



二、制作过程

1、首先新建一个MFC工程,除了自带的“取消”按钮改名为“关闭”以外,统统删去,拖出一个静态文本放在窗口的中间,注意这个静态文本的尺寸就足够大,否则无法容纳“鼠标处于X=?,Y=?的位置”这样的字体,如下图所示,这个不再展开赘述,可以参考我之前的《【mfc】学生信息管理,实现List控件节点的增删改查》(点击打开链接)。



2、注意,要把静态文本的属性中的样式中的“排列文本”改成“居中”



3、拖完控件,开始添加鼠标响应、键盘响应的事件,下面只添加鼠标响应时间即可,键盘响应可以放在鼠标响应的函数内部的实现,添加响应事件的过程先选择“查看”->“新建类向导”



4、之后则弹出如下的对话框,在右下角的Messages框中,找到WM_LBUTTONDOWN与WM_MOUSEMOVE,双击,或者单击后,选择右方的“Add Function”,之后点击确认或者Edit Code,即可,这里的意思是:告诉MFC,在这个对话框中点击鼠标的左键,移动鼠标,有响应的处理函数。




5、点击Edit Code则自动跳到ClassView中的代码页,点击“确定”的则要自己手动切过去,此时,在ClassView中就多了刚才我们自己添加的”响应类“,或者我更加喜欢称其为“响应函数”,反正你懂是什么就行了,我知道又有理论帝喷我不专业,反正你喜欢。点击这两个响应函数,分别写代码,这两个响应事件函数,请分别在原有的// TODO: Add your message handler code here and/or call default与CDialog::OnLButtonDown(nFlags, point);之间写代码



6、对于void CMouseDlg::OnLButtonDown(UINT nFlags, CPoint point)要完成左击对话框就显示鼠标位置在哪里的使命,


见如下代码:

void CMouseDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CString str;
	//可以用point.x,point.y这两个成员变量之间取出鼠标的位置,注意到,此函数的头,系统已经自动带入了鼠标类CPoint point
	str.Format("点下左键时,鼠标处于x=%d,y=%d的位置",point.x,point.y);
	AfxMessageBox(str);
	CDialog::OnLButtonDown(nFlags, point);
}


7、对于void CMouseDlg::OnMouseMove(UINT nFlags, CPoint point)是鼠标移动时候的函数。

鼠标响应事件里面附带键盘响应时间就如下面所下,不为什么。

void CMouseDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	//同理,取出鼠标的位置,放到静态文本中
	CString str;
	str.Format("鼠标处于x=%d,y=%d的位置",point.x,point.y);
	SetDlgItemText(IDC_STATIC,str);	
	//如果按下Ctrl而没有按下Shift
	if((MK_CONTROL & nFlags) && !(MK_SHIFT & nFlags))
		//设置对话框的标题为“按下了Ctrl在移动鼠标”
		SetWindowText("按下了Ctrl在移动鼠标");
	//如果没有按下Ctrl而按下Shift
	else if (!(MK_CONTROL & nFlags) && (MK_SHIFT & nFlags))
		SetWindowText("按下了Shift在移动鼠标");
	//如果同时按下Ctrl与Shift
	else if ((MK_CONTROL & nFlags) && (MK_SHIFT & nFlags))
		SetWindowText("按下了Ctrl+Shift在移动鼠标");
	//如果按下鼠标的右键
	else if (MK_RBUTTON & nFlags)
		SetWindowText("按下了鼠标右键在移动鼠标");
	//如果什么都没有按下
	else
		SetWindowText("mouse");
	CDialog::OnMouseMove(nFlags, point);
}

到这里编译之后,就完成了整个工程了,必须注意的是:

对于void CMouseDlg::OnLButtonDown(UINT nFlags, CPoint point)与void CMouseDlg::OnMouseMove(UINT nFlags, CPoint point)都是鼠标左击对话框一次与鼠标在对话框内移动一次就执行一次。

CString str,是Win32程序读有的字符串,设置其值的方式,请用其自带的Format()方法,因为其本质是类,不是一个单独的变量,不能直接等于

  • 18
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值