【MFC】01.MFC框架-笔记

基本概念

MFC Microsoft Fundation class 微软基础类库

框架 基于Win32 SDK进行的封装


属性:缓解库关闭

属性->C/C++/代码生成/运行库/MTD

属性->常规->MFC的使用:在静态库中使用MFC,默认是使用的共享DLL,运行时库

SDK版本:开发软件的套件

WSK:开发驱动的套件


MFC基于类的管理

预编译头:

Demo01.h

Demo01.cpp

Demo01Dlg.cpp

  • Demo01Dlg.h

    绑定在对话框上的类

    类的继承关系:

    Cobject:处理序列化以及反序列化

    CCmdTarget:处理WM_COMMAND消息

    CWnd:窗口类

    CDialog:对话框

    CDialogEx:对话框

    Demo01Dlg:自己创建的对话框

  • OnInitDialog:对话框MFC框架的入口

  • MFC里和窗口句柄有关的函数,均不需要填写窗口句柄函数

  • 如果需要,添加作用域强行退出MFC的命名空间

  • 模态对话框

  • 非模态对话框

MFC中依然支持SDK的做法


类绑定:

  1. 添加类
  2. 类名

MFC绑定变量:

值类型

控件类型

复习总结:

  • 创建MFC项目的时候,项目名称中不能出现中文。

  • 如果想要兼容让其他没有安装visual studio的计算机使用,那么就要使用在静态链接库中使用MFC

  • MFC是基于类的

  • Practice.h:

    该文件为我们创建了CPracticeApp类

    类的继承关系:

    (上面还有很多)

    CWinThread:应用程序线程,继承CCmdTarget

    CWWinApp:对话框,继承CWinThread

    CPraticeApp:是我们自己的应用程序类,继承CWinApp

  • PracticeDlg.h:

    这个头文件中是我们自己创建的对话框类

    类继承关系:

    CObject:基础类库中的主体基类,处理序列化与反序列化

    CCmdTarget:消息映射结构体系类,继承Cobject

    CWnd:窗口类,继承CCmdTarget

    CDialog:对话框类,继承CWnd

    CDialogEx:对话框类,继承CDialog

    CPraticeDlg:我们自己的对话框类,继承CDialogEx

相关操作:

  • 按钮操作:在对话框上双击按钮即可编辑相关操作

  • 添加对话框:比如说要在某个按钮上添加对话框,首先需要画出对话框,然后双击添加MFC类,在要显示的时候,先用这个类声明一个变量,然后使用DoModal方法,也可以先new出该对话框的类,然后使用Create方法,创建出对话框,但是这种方法需要ShowWindow方法,

    实例:

    第一种:

        CDialogOne obj;obj.DoModal();
    

    第二种:

      CDialogTwo *obj = NULL;obj = new CDialogTwo;obj->Create(IDD_DIALOG2, this);obj->ShowWindow(SW_SHOW);
    
  • 可以在按钮上添加变量,比如说在一个按钮上添加了一个文本框变量,将其添加为值的形式,字符串类型,那么我们在处理按钮的时候,可以直接:

    其中UpDateData方法的作用是同步

        UpdateData(TRUE);m_EDIT = L"欢迎来到MFC的世界!";UpdateData(FALSE);
    
  • 在MFC中,有很多消息是自己处理了,我们并不用关心,但是如果我们要自己处理消息

    • 处理SendMessage消息:

      在对话框中使用类向导,添加OnWndMsg方法,在OnOwnMsg方法中,我们可以像SDK那样处理消息。

      BOOL CPracitceDlg::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
      {// TODO: 在此添加专用代码和/或调用基类switch (message) {case WM_KEYDOWN: {switch (wParam) {case VK_F4: {MessageBox(L"F!", L"MSG", NULL);break;}}break;}case WM_LBUTTONDOWN: {MessageBox(L"WM_LBUTTONDOWN", L"MSG", NULL);break;}case 199: {MessageBox(L"SEND199", L"MSG", NULL);break;}case 200: {break;MessageBox(L"SEND200", L"MSG", NULL);}case 201: {MessageBox(L"SEND201", L"MSG", NULL);break;}case 202: {MessageBox(L"SEND202", L"MSG", NULL);break;}}return CDialogEx::OnWndMsg(message, wParam, lParam, pResult);
      }
      
    • 处理PostMessage消息:

      在对话框中使用类向导,添加PreTranslateMessage方法,在PreTranslateMessage方法中,我们可以像SDK那样处理消息。

      BOOL CPracitceDlg::PreTranslateMessage(MSG* pMsg)
      {// TODO: 在此添加专用代码和/或调用基类switch (pMsg->wParam) {case 199: {MessageBox(L"POST199", L"MSG", NULL);break;}case 200: {break;MessageBox(L"POST200", L"MSG", NULL);}case 201: {MessageBox(L"POST201", L"MSG", NULL);break;}case 202: {MessageBox(L"POST202", L"MSG", NULL);break;}}return CDialogEx::PreTranslateMessage(pMsg);
      }
      
  • SendMessage会等待消息响应,会阻塞,所以会按照顺序来,但是PostMessage不会等待消息返回,所以导致顺序倒置:

    void CPracitceDlg::OnBnClickedButton1()
    {//CDialogOne obj;//obj.DoModal();///*//HWND hEdit1Dlg = ::GetDlgItem(m_hWnd, IDC_EDIT1);//::SetWindowText(hEdit1Dlg, L"欢迎来到MFC的世界!");*///UpdateData(TRUE);//m_EDIT = L"欢迎来到MFC的世界!";//UpdateData(FALSE);//SendMessage(199, NULL, NULL);//SendMessage(200, NULL, NULL);//SendMessage(201, NULL, NULL);//SendMessage(202, NULL, NULL);PostMessage(199, NULL, NULL);PostMessage(200, NULL, NULL);PostMessage(201, NULL, NULL);PostMessage(202, NULL, NULL);
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/21998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python | threading

Python | threading 1. 简介 Python的threading模块是用于创建和管理线程的标准库。线程是在同一进程中执行的多个执行路径,使程序可以同时执行多个任务。 threading模块提供了Thread类,通过创建Thread对象,可以轻松地在Python中启动和管理…

Hum Brain Mapp:用于功能连接体指纹识别和认知状态解码的高精度机器学习技术

摘要 人脑是一个复杂的网络,由功能和解剖上相互连接的脑区组成。越来越多的研究表明,对脑网络的实证估计可能有助于发现疾病和认知状态的生物标志物。然而,实现这一目标的先决条件是脑网络还必须是个体的可靠标记。在这里,本研究…

Docker入门之运行Nginx案例

运行镜像 如果你直接安装会比较慢, 建议参照附录内容配置镜像之后再执行 # 执行命令过程一:下载容器镜像 docker run -d nginx:latest 命令解释 docker run 启动一个容器 -d 把容器镜像中需要执行的命令以daemon(守护进程)的方式运行 nginx…

性能优化-react路由懒加载和组件懒加载

背景 随着项目越来越大,打包后的包体积也越来越大,严重影响了首屏加载速度,需要对路由和组件做懒加载处理 主要用到了react中的lazy和Suspense。 废话不多说,直接上干货 路由懒加载 核心代码 import React, { lazy, Suspens…

GPS/北斗RTK差分定位系统的原理以及应用领域

导语:现代定位技术在国内外的发展与应用越来越广泛,其中GPS和北斗是两大被广泛使用的全球卫星定位系统。本文将介绍GPS/北斗RTK差分定位系统的原理以及其在各个领域的应用。 一、GPS/北斗RTK差分定位系统的原理 GPS/北斗RTK差分定位系统,即全…

【TypeScript】安装的坑!

TypeScript安装 安装TypeScript安装时候可能报错这样开头的数据(无法枚举容器中的对象)——原因:没权限先解决没权限的问题如果发现无法修改-高级-修改继续安装想使用tsc-发现,tsc不能用解决方法:配置环境变量最后的最…

便捷省心的手机直播影视工具,畅享轻松电视娱乐时光

便捷省心的手机直播影视工具,畅享轻松电视娱乐时光 在快节奏的现代生活中,我们常常渴望能够以简单、省心的方式消遣自己,享受高品质的电视娱乐。幸运的是,随着技术的进步,便捷省心的手机直播影视工具应运而生。这些工…

Adaptive autosar 都有哪些模块?各有什么功能?

Adaptive autosar是一种用于高性能计算ECU的软件平台,它支持自适应应用程序的开发和运行。它由两部分组成:基础(Foundation)和服务(Service)。基础包括了操作系统接口、执行管理、网络管理、识别访问管理、加密、更新和配置管理等功能。服务包括了通信管理、RESTful、时间…

【目标检测论文解读复现NO.33】改进YOLOv5的新能源电池集流盘缺陷检测方法

前言 此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

Kubernetes v1.20 二进制部署

架构 k8s集群master01:192.168.80.101 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群master02:192.168.80.102 k8s集群node01:192.168.80.103 kubelet kube-proxy docker k8s集群node02:192.168.80…

Vue3文字实现左右和上下滚动

可自定义设置以下属性&#xff1a; 滚动文字数组&#xff08;sliderText&#xff09;&#xff0c;类型&#xff1a;Array<{title: string, link?: string}>&#xff0c;必传&#xff0c;默认[] 滚动区域宽度&#xff08;width&#xff09;&#xff0c;类型&#xff1a…

git拉取代码时出现Filename too long错误Git处理长路径

背景 git拉取代码时出现Filename too long错误 现象 如下&#xff1a; $ git checkout . error: unable to create file boot-starters/permission-access-security-service-boot-starter/src/main/java/cn/gzs***/basic/system/platform/starter/permission/access/resourc…

后端整理(MySql)

1 事务 1.1 事务ACID原则 原子性&#xff08;Atomicity&#xff09; 事务的原子性指的是事务的操作&#xff0c;要么全部成功&#xff0c;要么全部失败回滚 一致性&#xff08;Consistency&#xff09; 事务的一致性是指事务必须使数据库从一个一致状态转变成另一个一致性…

机器学习05-数据准备(利用 scikit-learn基于Pima Indian数据集作数据预处理)

机器学习的数据准备是指在将数据用于机器学习算法之前&#xff0c;对原始数据进行预处理、清洗和转换的过程。数据准备是机器学习中非常重要的一步&#xff0c;它直接影响了模型的性能和预测结果的准确性 以下是机器学习数据准备的一些常见步骤&#xff1a; 数据收集&#xff…

使用kubeadm快速部署一个k8s集群

Kubernetes概述 使用kubeadm快速部署一个k8s集群 Kubernetes高可用集群二进制部署&#xff08;一&#xff09;主机准备和负载均衡器安装 Kubernetes高可用集群二进制部署&#xff08;二&#xff09;ETCD集群部署 Kubernetes高可用集群二进制部署&#xff08;三&#xff09;部署…

JVM之垃圾回收器

1.如何判断对象可以回收 1.1 引用计数法 什么是引用计数器法 在对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器值就加一&#xff1b;当引用失效时&#xff0c;计数器值就减一&#xff1b;任何时刻计数器为零的对象就是不可能再被使用的。 …

【C语言学习】整数范围、整数越界、无符号数

1.整数范围 对于一个字节&#xff08;8位&#xff09;&#xff0c;可以表达的范围是00000000 ~ 11111111 其中00000000 ——> 0 11111111 ~ 10000000 ——> -1 ~ -128&#xff08;从大到小&#xff09; 00000001 ~ 01111111 ——> 1~127&#xff08;从小到大&#xff…

Python需要学的基础有哪些

Python介绍 Python是一种广泛使用的高级编程语言&#xff0c;因其简洁易读的语法和强大的功能而备受欢迎。本文将介绍一些Python教学内容&#xff0c;帮助初学者快速入门编程世界 1. Python基础 Python的基础知识对于编程初学者至关重要。以下是一些重要的基础概念&#xff…

redis 持久化 与 键淘汰策略

redis运维核心&#xff1a; aof日志(全持久化 增量) 、 rdb(半持久化/全量备份) 、 键淘汰策略 、 高可用 1、Redis是基于内存的&#xff0c;一旦Redis重启/退出/故障&#xff0c;内存的数据将会全部丢失。故而有了持久化。 2、持久化&#xff1a;将内存中的数据存于磁盘中&am…

电脑第一次使用屏幕键盘

操作流程 1.在键盘上同时按WinR打开运行; 2.输入control 3.找到设置中心 4.点击屏幕键盘 效果 具体怎么使用 我不咋清除 简单 测试了一下 可以用鼠标点击屏幕键盘的按键 用键盘 按字母键和数字键 是和屏幕键盘不同步的 其他 tab、shift、后退、enter好像同步