一、基本目标

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)要完成左击对话框就显示鼠标位置在哪里的使命,

见如下代码:

[cpp] view plain copy print?

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

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

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

[cpp] view plain copy print?

  1. void CMouseDlg::OnMouseMove(UINT nFlags, CPoint point)
  2. {
  3. // TODO: Add your message handler code here and/or call default
  4. //同理,取出鼠标的位置,放到静态文本中
  5. CString str;
  6. str.Format("鼠标处于x=%d,y=%d的位置",point.x,point.y);
  7. SetDlgItemText(IDC_STATIC,str);
  8. //如果按下Ctrl而没有按下Shift
  9. if((MK_CONTROL & nFlags) && !(MK_SHIFT & nFlags))
  10. //设置对话框的标题为“按下了Ctrl在移动鼠标”
  11. SetWindowText("按下了Ctrl在移动鼠标");
  12. //如果没有按下Ctrl而按下Shift
  13. else if (!(MK_CONTROL & nFlags) && (MK_SHIFT & nFlags))
  14. SetWindowText("按下了Shift在移动鼠标");
  15. //如果同时按下Ctrl与Shift
  16. else if ((MK_CONTROL & nFlags) && (MK_SHIFT & nFlags))
  17. SetWindowText("按下了Ctrl+Shift在移动鼠标");
  18. //如果按下鼠标的右键
  19. else if (MK_RBUTTON & nFlags)
  20. SetWindowText("按下了鼠标右键在移动鼠标");
  21. //如果什么都没有按下
  22. else
  23. SetWindowText("mouse");
  24. CDialog::OnMouseMove(nFlags, point);
  25. }

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

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

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

mfc 鼠标、键盘响应事件的更多相关文章

  1. C# 键盘响应事件及键值对照表

    键盘响应事件总结 键盘响应事件是在用户按下某个键后触发的事件,可以是任意操作,但不是任意键都可以被捕获的. 原型:public event KeyPressEventHandler KeyPress ...

  2. OpenGL 鼠标交互响应事件

    OpenGL 鼠标.键盘交互响应事件 先来一个样例: uses gl,glu,glut; procedure InitEnvironment;cdecl; begin glClearColor();/ ...

  3. Dojo初探之4:dojo的event(鼠标/键盘)事件绑定操作(基于dojo1.11.2版本)

    前言: 上一章详解了dojo的dom/query操作,本章基于dom/query基础上进行事件绑定操作 dojo的事件 dojo的事件绑定操作分为鼠标和键盘两种进行详解 1.鼠标事件 我们沿用上一章中 ...

  4. js(鼠标键盘拖动事件)

    拖动事件是h5(HTML5的) 1:draggable(true) 2:拖动源 ondragstart ,ondragend 3:目的地 ondraglenter,ondragover,ondragl ...

  5. jquery鼠标键盘悬停事件,形变动画和淡入淡出

    鼠标和键盘悬停 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  6. MFC鼠标键盘消息处理

    void CMainWindow::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags ){ )&&(GetKeyState(VK_LBUT ...

  7. JS 鼠标键盘HTML事件

  8. OpenGL(十六) 鼠标、键盘交互响应事件

    OpenGL中通过鼠标和键盘跟程序交互的实现需要实现注册鼠标和键盘响应事件,在一定条件下,该事件被触发,事件里的程序被执行,达到交互的目的. 通过glutMouseFunc(&OnMouse) ...

  9. 3D Slicer Modify Mouse Event 修改3D Slicer中的鼠标响应事件

    在3D Slicer中,我们如果想在自己写的插件中来修改默认的鼠标响应事件的话,就需要先将原有的响应事件链接删除,然后建立自定义的响应事件链接,然后将自己要实现的功能写在响应事件函数中. 比如Slic ...

随机推荐

  1. bzoj 1270: [BeijingWc2008]雷涛的小猫 简单dp+滚动数组

    1270: [BeijingWc2008]雷涛的小猫 Time Limit: 50 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Descrip ...

  2. 全文检索引擎Solr系列——整合中文分词组件mmseg4j

    默认Solr提供的分词组件对中文的支持是不友好的,比如:“VIM比作是编辑器之神”这个句子在索引的的时候,选择FieldType为”text_general”作为分词依据时,分词效果是: 它把每一个词 ...

  3. 如何高效的使用 Git

    -- 代码昨天还是运行好好的今天就不行了. 代码被删了. 突然出现了一个奇怪的 bug,但是没人知道怎么回事. 如果你出现过上面的任何一种情况,那本篇文章就是为你准备的. 除了知道 git add, ...

  4. Spring的引用内部Bean属性和给级联属性

    第一个是内部Bean的配置:               首先是要理解其中的原理,再去操作就很简单了,下面老表就给大家说一下自己的观点(有点简单,但是老表我第一次学习的时候看着视频上的代码确实有点懵逼 ...

  5. 1-12 RHEL7-find命令的使用

    1.文件查找findfind命令是在目录结构中,搜索文件,并执行特定的操作find命令提供了相当多的查找条件,功能很强大 2.格式usage:find pathname -options[-print ...

  6. 内网 LAN IPv6 环境配置 H3C S5500 Huawei S5700

    # 使能IPv6报文转发功能. <Sysname> system-view [Sysname] ipv6 # 使能DHCPv6服务器功能. <Sysname> system-v ...

  7. IOS UI-模态视图

    一.简单介绍 除了push之外,还有另外一种控制器的切换方式,那就是Modal 任何控制器都能通过Modal的形式展⽰出来 Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为⽌ ...

  8. Ansible 小手册系列 四(详解配置文件)

    [root@host-172-20-6-120 ansible]# ansible --version ansible 2.2.0.0 config file = /etc/ansible/ansib ...

  9. 暗网 tor溯源困难根因——用户的请求会在分布全球的主机随机跳转三次,最终才到达服务器,这就造成了溯源的极其困难

    Tor(The Onion Router)可以说是目前最为流行的网络匿名访问技术,用户的请求会在分布全球的主机随机跳转三次,最终才到达服务器,这就造成了溯源的极其困难,从而使得所有的访问者完全没有身份 ...

  10. 【hive】多表插入

    from or_table insert overwrite table1 name1 select … insert into table2 name2 select … 注意:select 后边不 ...