• MFC


    MFC开发

    1. VS创建MFC项目

         

         

      点击MyMFC.rc打开资源视图, 找到Dialogs, 右键插入Dialog可以创建新的Dialog界面, 右键Dialog可以创建与其关联的类, 实现逻辑; Dialog很重要, Win32程序就是通过Dialog实现页面的(同理Qt也如此)

         

    2. 结构
      1. CWinApp: 应用程序
      2. CFrameWnd: 窗口, 类似于画框
      3. CChildView: CFrameWnd中的子窗口, 类似于画布, 微软建议将内容都放在View
    3. 使用MFC实现一个有功能的应用程序
      1. 一开始显示登录对话框, 创建登录对话框要在CWinApp中的CWinApp::InitInstance()调用父类之前创建
        1. 可以重写对话框的OnInitDlg方法进行一些初始化
        2. 关闭释放资源需要使用Dialog::Ok()或者Dialog::Cancle()
        3. 控件和对应的变量对应数据同步问题
          1. UpdateData(TRUE)将控件中的数据同步到变量中
          2. UpdateData(FALSE)将变量中的数据同步到控件中
        4. 在对话框中如果选择Edit Control(文本输入框)时回车则调用对话框的OnOk方法, 按住esc则调用OnCancle()方法, 如果有需要可以重写这两个方法
        5. 当点击对话框右上角的叉号时, 会发出WM_CLOSE消息, 可以在对话框中添加该消息处理点击叉号时的逻辑(比如退出应用程序)
      2. 关闭应用程序直接调用exit(0)函数
      3. MFC中的事件特质菜单等发出的命令(Command), 我们现代框架中的事件是MFC中的消息

       

    1. MFC诞生的时候, C++也在发展, 但是那个时候C++并没有提供运行时(typeid), 但是当时MFC正需要, 所以MFC通过C++实现了(通过定义一些宏), 大致思路如下
      1. 在一个类中使用DECLARE_DYNAMIC, .cpp文件中使用IMPLEMENT_DYNAMIC
        1. 原理
          1. DECLARE_DYNAMIC为类添加了RuntimeClass *, 非常类似于Java中的Class, RuntimeClass类中包括当前类的名称(通过宏参数确定), 当前类的父类(只有一个父类, 所以实现了单继承), 当前的大小(sizeof(class CurrentClass)), 还定义了一个返回值为当前类类型的函数指针Create(目的就是让用户拿到了RuntimeClass也可以创建类的对象, 经典的反射); 除了声明了RuntimeClass类之外, 还定义了静态方法Create(), 因为RuntimeClass中有Create函数指针, 将指针指向该静态方法, 就能实现RuntimeClass.Create()创建对象
          2. IMPLEMENT_DYNAMIC实现上面定义的所有东西, 静态Create方法中返回new Class;
      2. Win32 API为了处理消息使用到了 switch, 但是很麻烦, MFC对其进行了封装, 也是通过定义宏的方式, 使用DECLARE_MESSAGE_MAP, .cpp文件中使用BEGIN_MESSAGE_MAPEND_MESSAGE_MAP宏包围起来, 里面写ON_xxx
        1. 原理
          1. DECLARE_MESSAGE_MAP定义了MessageMap变量, 该变量用于保存当前类要处理哪些消息, 就是Win32 APIswitch中的case, 还有一个 entry指针, 用于指向父类的MessageMap, 起到了传递窗口的作用, 否则MFC在实现消息的窗口传递的时候消息就断了
          2. BEGIN_MESSAGE_MAPEND_MESSAGE_MAP合在一起就是一个结构体数组的初始化, END_MESSAGE_MAP中就包含有结构体数组初始化表达式的}括号
          3. ON_xxx系列宏就是为结构体数据中的结构体初始化表达式, 里面还会指定回调函数(比如OnLButtonDown, 此函数是当前类的静态成员函数, 需要用户自己定义)
    2. 建议
      1. 别用MFC, 人生苦短, Qt
      2. MFC可以用来自己实现一个运行时
  • 相关阅读:
    使用frp工具实现内网穿透以及配置多个ssh和web服务
    axios下载pdf
    itextpdf freemarker渲染
    腾讯云函数免费搭建onedrive网盘
    Ajax请求携带Cookie
    GitHub通过access token来clone代码
    web网页动态分享facebook和twitter
    python smtplib在linux上发送邮件失败解决方式
    java如何关闭钩子(ShutdownHook)
    VS Code运行SpringBoot项目
  • 原文地址:https://www.cnblogs.com/megachen/p/12636355.html
Copyright © 2020-2023  润新知