Windows编程基础--第4节 MFC消息映射机制

标签: mfc windows
1955人阅读 评论(0) 收藏 举报
分类:

对于MFC程序最重要的响应机制就是消息映射机制,这节我们就来一起尝试一下MFC的消息映射机制。
(操作系统:win10 64位 IDE:vc++ 6.0)
1、新建一个MFC对话框项目,参见上节,
2、编译代码运行,效果图如下:
这里写图片描述
3、现在我们删除对话框上的《确定》和《取消》按钮,如图:
这里写图片描述
4、现在我们添加自己的“OK”和“CANCEL”按钮,接下来我们就来看看“OK”按钮的按下消息是怎么进行处理的?
这里写图片描述
4、执行View->Class Wizard,打开类向导;(或者直接用ctrl + W)

此时就能看到我们创建的对话框,OK按钮,CANCEL按钮对象,点击它们可以看见它们分别的拥有的消息,如图:

这里写图片描述
5、我们选择Cday03Dlg,MESSAGES选择WM_MOUSEMOVE消息,点击Add Function,下部Member function就会出现与WM_MOUSEMOVE对应的OnMouseMove函数,接下来点击Edit Code,编辑OnMouseMove函数的内容:
这里写图片描述
这里写图片描述
6、我们来修改OnMouseMove(UINT nFlags, CPoint point) 函数,参数中point为鼠标的坐标位置,我们可以通过point.x, point.y来获取鼠标的位置,nFlags主要是标志一些控制键是否按下,然后MK_LBUTTON、MK_RBUTTON、MK_CONTROL、MK_SHIFT、MK_MBUTTON 分别对应鼠标左键,右键,CTRL ,SHIFT ,鼠标中间(转轮):

void CDay03Dlg::OnMouseMove(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    CString strText;
    strText.Format("坐标 x = %d ,y = %d ",point.x, point.y);

    if (nFlags & MK_LBUTTON)
    {
        strText += " 鼠标左键DOWN";
    }
    if (nFlags & MK_RBUTTON)
    {
        strText += " 鼠标右键DOWN";
    }
    if (nFlags & MK_CONTROL)
    {
        strText += " CTRL DOWN";
    }
    if (nFlags & MK_SHIFT)
    {
        strText += " SHIFT DOWN";
    }
    if (nFlags & MK_MBUTTON)
    {
        strText += " MIDBUTTON DOWN";
    }
    SetWindowText(strText);  // 设置对话框标题文本

    CDialog::OnMouseMove(nFlags, point);
}

效果图:
这里写图片描述

7、同样,我们可以通过类向导分别设置“OK”,“CANCEL”按钮的消息触发函数;
这里写图片描述
这里写图片描述
这里写图片描述

8、这是我们其实可以看到在day03Dlg.cpp中MESSAGE_MAP总下方就有我们新增的三个MFC消息,并且可以直观的看出是属于哪个控件ID的;

BEGIN_MESSAGE_MAP(CDay03Dlg, CDialog)
    //{{AFX_MSG_MAP(CDay03Dlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_WM_MOUSEMOVE()
    ON_BN_CLICKED(IDC_BUTTON_OK, OnButtonOk)
    ON_BN_CLICKED(IDC_BUTTON_CACEL, OnButtonCacel)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

9、接下来我们切换到day03Dlg.h头文件中,所有afx_msg 开头的都是消息对应的处理函数:

    // Generated message map functions
    //{{AFX_MSG(CDay03Dlg)
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    afx_msg void OnButtonOk();
    afx_msg void OnDoubleclickedButtonCacel();
    afx_msg void OnButtonCacel();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()

10、由以上例子可以看出,MFC程序的消息映射机制是创建一个与窗口相关联的派生类,用于消息关联的成员函数来接收和处理窗口的消息。在类向导中选择对应的消息,添加与该消息关联的成员函数来处理该消息,这就是MFC的消息映射机制。具体控件或窗口支持哪些消息及消息对应的函数参数等,请参见MSDN;
11、最终效果图:
这里写图片描述

项目源码可以访问我的码云来fork

查看评论

MFC消息映射机制的理解

何谓消息、消息处理函数、消息映射? 消息简单的说就是指通过输入设备向程序发出指令要执行某个操作。具体的某个操作是你的一系列代码。称为消息处理函数。 在SDK中消息其实非常容易理解,当窗口建立后便会...
  • chenjie863
  • chenjie863
  • 2013年12月22日 11:43
  • 1336

MFC六大机制之三:消息映射机制

上篇我们通过重写WindowProc函数来处理消息,今天我们采用下面的方法实现同样的功能  1.建一个win32简单应用程序,不要认为这样就不能写出MFC程序,因为是不是MFC程序取决于调没调MFC...
  • meetings
  • meetings
  • 2015年06月28日 23:12
  • 3233

MFC之消息映射机制实现方法

本文分析了完成消息映射的的应有步骤以及消息映射机制的原理性分析。
  • xiao3404
  • xiao3404
  • 2016年09月04日 19:04
  • 852

Windows编程基础--第8节 MFC对话框控件访问的七种方法(上)

MFC对话框控件具有以下三种访问方式(当然还有很多别的访问方式,今天时间紧急,先学这三种),分别是: 第一种 GetDlgItem()->GetWindowText() GetDl...
  • qq_25549309
  • qq_25549309
  • 2017年10月24日 21:51
  • 2026

VC----MFC消息映射机制详解

Windows程序和MFC程序是靠消息驱动的,他们对于消息的处理本质上是相同的。只是Windows程序对于消息处理的过程十分清晰明了,MFC程序则掩盖了消息处理的过程,以消息映射的方式呈现在开发者面前...
  • yiziweiyang
  • yiziweiyang
  • 2016年09月08日 13:41
  • 557

MFC消息映射和处理机制整理

Windows应用程序是消息驱动的。在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作。比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数...
  • KingCat666
  • KingCat666
  • 2015年03月07日 16:53
  • 1518

C++中MFC的消息映射机制与C#的事件驱动机制对比

     C++中MFC的消息映射机制类似C#的事件驱动机制。对比如下:      C++:函数原型,函数实现,用来关联消息和消息响应函数的宏。      C#:  编写处理函数(相当于C++的前...
  • Linkor
  • Linkor
  • 2011年05月16日 12:28
  • 1432

MFC六大核心机制之五、六:消息映射和命令传递

作为C++程序员,我们总是希望自己程序的所有代码都是自己写出来的,如果使用了其他的一些库,也总是千方百计想弄清楚其中的类和函数的原理,否则就会感觉不踏实。所以,我们对于在进行MFC视窗程序设计时经常要...
  • u012581732
  • u012581732
  • 2014年12月06日 12:44
  • 541

[原创]MFC消息映射机制

MFC程序是靠消息映射驱动的,当用户执行鼠标/键盘、移动窗口等操作时,windows系统基于这些动作生成消息并存入系统消息队列。MFC程序执行消息循环,取出属于自己的消息并执行这些消息。MFC处理消息...
  • harithchen
  • harithchen
  • 2017年07月04日 10:14
  • 239
    个人资料
    持之以恒
    等级:
    访问量: 4万+
    积分: 711
    排名: 7万+
    文章存档