54_手工建立MFC与MFC消息响应

手工建立最小MFC对话框

  • 新建CMyDialog类,继承CDialog,说明性文件直接类名,头文件在MSDN往下翻

通过MFC生成的项目知道,DoModal方法创建模态对话框。

选择Class Member,选择类成员函数。

  • 入口函数通过生成MFC项目对话框查看知道CDIalogApp继承CWinApp,重写InitInstance

出不来的原因,pThread没有获取到,AfxGetThread()时间很早

需要使用全局对象构造,用来初始化资源

  • ASSERT错误,点重试会断在错误的地方

这里为对话框的资源没有创建

通过MFC的工程对话框ID值去搜索知道把ID作为参数传给父类构造

至此最小MFC对话框创建完

  • InitInstance相当于MFC的Main函数,如果初始化失败return FALSE。最小的对话框只要CMyApp就行了。这里return FALSE会导致创建失败

  • MFC对话框实现原理
    • Domodal是非模态对话框,使用CreateDialogIndirect建立的,RunModaLoop里面有消息循环

MFC消息响应

MFC类向导三种方式

      • 类名右键

      • 资源右键

      • 项目菜单

添加消息:

第一种

    • 拖动控件进去,双击控件,生成函数直接写,最适用于按钮

 

    • mfc提供了AfxMessageBox提供了默认参数,不能修改标题

    • 在mfc里面使用SDK的api需要加上::,区分是全局api,而不是成员函数

第二种

    • 类向导,选择正确的类名
      • 点消息,选择合适的消息,搜索不到command消息。

    • 直接在命令搜索控件ID,添加处理程序,输入合适成员函数

MFC消息处理初步原理

    • MFC添加一个按钮消息:填了消息处理函数声明和实现,添加一个宏

  • BEGIN_MESSAGE_MAP和END_MESSAGE_MAP里面是数组定义
  • ON_BN_CLCICK:第一个参数资源ID,第二个参数处理函数。本质上是数组元素
  • 宏展开:消息的ID和消息的处理函数联系到一起,也叫消息映射表

添加自定义消息

  • ON_MESSAGE宏,第一个参数是消息ID,第二个参数是消息处理函数
  • 消息处理函数声明LRESULT CDdialogDlg: Onsgm_hWnd或者SetSafeWnd()获取窗口句柄(推荐)

  • 使用自定义消息
    • 如果该自定义消息所在的类是有CWnd派生出来的,且在本类中调用,那么调用CWnd::SendMessage()函数

    • 如果不在本类中响应自定义消息;那么只能用win32 的API函数;例如,当自定义消息在CMainFrame中,而触发消息的地方不在CMainFrame类中,那么用如下语句

::SendMessge(::AfxGetMainWnd()->m_hWnd,WM_MYMSG,0,0);

其他

  • ON_EN_CHANGE,MFC文本框修改了就来这个消息

  • AFX_DESINGLE_DATE宏是为了转到对话框,帮我们能从类快速定位到资源

作业

MFC对话框响应键盘消息,当’A’来的时候,弹个消息框

https://github.com/xkkhh/Cracking/tree/master/01MFCForKeyDown

0 条评论
发表一条评论