53_认识MFC

认识MFC

  • Microsoft function classes,微软基础类库,加了es指很多类
    • 工具类 – 链表,数组,哈希表,二叉树。操作很简单,但是放到不同利用场景可以做很多事情
      • CString,CList, CArray, CMap
    • 操作类对象都是同名,把类对象封装起来,HWND成为私有类成员。CWnd wndMainWindow.SendMessage()。某系列的API操作某一类的对象。CDC、CDialog
      • SendMessage(HWND hWnd)
      • Postmessage(HWND hWnd)
      • ShowWIndow(HWND hWnd)
      • UpdateWindow(HWND hWnd)
      • DrawText(HDC hDc)
      • DrawIcon(HDC hDc)
      • Rectangle(HDC hDc)
      • Linto(HDC hDc)
    • 框架相关
      • 创建Window窗口需要六个要素,每次参数都差不多,主要操作是在消息里面。每次都要创建窗口,加case很麻烦,MFC给它们做好了。菜单右键添加消息处理
      • MFC一般用_T,因为MFC团队和C语言类库的团队都是一个

创建MFC工程

  • 选择MFC应用程序

  • 三种基本模板:单文档(里面只有一个窗口)、多文档(里面有很多的小窗口)、对话框
  • 项目类型:MFC标准

  • MFC的使用
    • 在共享DLL中使用MFC,调试不能进MFC源码
    • 在静态库中使用,可以调式源码,里面有很多注释,一般选择这个
    • 可以在创建的时候设置与编译前设置

  • 其他根据需求来

MFC类

  • 找出父类以及继承关系图
    • 单文档

class AFX_NOVTABLE CCmdTarget : public CObject

class CWnd : public CCmdTarget

class CFrameWnd : public CWnd

class CMainFrame : public CFrameWnd

class CWinThread : public CCmdTarget

class CWinApp : public CWinThread

class CWinAppEx : public CWinApp

class CTestApp : public CWinAppEx

class AFX_NOVTABLE CDocument : public CCmdTarget

class CTestDoc : public CDocument

class AFX_NOVTABLE CView : public CWnd

class CTestView : public CView

  • 多文档

class CFrameWnd : public CWnd

class CMDIChildWnd : public CFrameWnd

class CChildFrame : public CMDIChildWnd

class CMDIFrameWnd : public CFrameWnd

class CMainFrame : public CMDIFrameWnd

class CTest2App : public CWinApp

class CTest2Doc : public CDocument

class CTest2View : public CView

  • 对话框

class CTest3App : public CWinApp

class CDialog : public CWnd

class CDialogEx : public CDialog

class CTest3Dlg : public CDialogEx

class CAboutDlg : public CDialogEx

  • 类的作用概括
    • CObject:RTTI,序列化
    • CCmdTarget:WM_COMMAND消息的派发,可以处理WM_COMMAND消息
    • CWinThread:线程相关
    • CDocument:数据源
    • CWnd:窗口,标准消息的处理
    • CDialog:对话框
    • CFrameWnd:框架相关
    • CView:客户区
    • MSDN当前类找不到函数时,沿着父类去查找需要的功能。可以在Hierarchy Chart

  • MFC源码中寻找
    • 入口点
      • VS右键打开文件所在的文件夹,并进去vc文件夹

      • 方法一:搜索文件内容包含WinMain的文件,找到文件

      • 方法二:VS调式F10就是入口点文件

    • 创建窗口六要素
      • VS中F10跟太慢,太多
      • 搜索函数API
      • 栈回溯:A-C,目标是定位A,容易定位C,调用堆栈往上查找。
        • 先通过SDK查看栈的回调函数什么时候来,再通过消息循环往上查找,就是回调函数

首先跟踪SDKWin32程序

当标准的win32程序退出WM_COMMAND消息时最上面的非系统内核代码为回调函数

因此在MFC程序中添加菜单,并添加消息

通过F10跟踪得到MFC的回调函数

      • 先通过SDK WM_CREATE看栈什么时候来,WM_CREATE返回的-1的栈下面就是创建窗口消息

      • MFC里面添加消息有粗色是已经处理过

增加WM_DESTROY消息,并在WM_CREATE消息里直接返回-1

并断到WM_DESTORY消息,设置最底下的栈的函数为新断点

取消之前的两个断点,重新段下来,向下第二个就为创建窗口消息

  • 注册窗口类无法通过栈回溯来查找,因为没有窗口,不会产生消息。
    • 使用变形栈回溯:API调用有顺序,通过某个关键点定位其它的
  • 参数追踪(寄存器找数据)
    • 跟踪创建窗口的类名参数,找到注册窗口类

CreateWindow之前就应该调用了RegisterClass回溯栈

由这个函数返回,跟进

注册类名肯定不为空,继续跟踪函数

看到注册了,跟进去

  • 显示窗口和更新窗口没办法只能一直跟

F11进去最下面

 

0 条评论
发表一条评论