当前位置: 首页 > news >正文

MFC程序设计(一)MFC入门

本MFC教程使用VS2022实现

MFC基本概念

微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。

MFC把Windows SDK API函数包装成了几百个类,MFC给Windows操作系统提供了面向对象的接口,支持可重用性、自包含性以及其他OPP原则。MFC通过编写类来封装窗口、对话框以及其他对象,引入某些关键的虚函数(覆盖这些虚函数可以改变派生类的功能)来完成,并且MFC设计者使类库带来的总开销降到了最低。

在MFC中,当我们需要使用Windows SDK的函数时,只需要在函数前加入::进入全局命名空间便可使用了

HWND hStatic = ::GetDlgItem(m_hWnd, IDC_STATIC);
::SetWindowText(hStatic, L”MSG”);

编写MFC应用程序

我们将从一个空项目一步步的编写一个MFC应用程序

项目的创建

程序编写流程

MFC是由C++编写的用于创建和管理窗口相关功能的应用程序,因此创建MFC应用程序需要创建应用程序类和窗口类,并使应用程序对象关联窗口对象。

1.包含mfc头文件afxwin.h,仅需该头文件

2.自定义一个继承于CWinApp应用程序类的MyApp应用程序类,并实例化该应用程序类对象MyApp app(有且只有一个)

3.自定义一个继承于CFrameWnd窗口类(框架类)的MyFrame窗口类,并定义该窗口类的构造函数利用Create创建一个窗口

4.定义MyApp类虚函数:程序的入口函数InitInstance()。该函数用于创建窗口类MyFrame对象,并利用ShowWindow显示窗口,UpdateWindow更新窗口,m_pMainWnd保存窗口类对象指针,以此使得窗口可以正常运行

注意:ShowWindow和UpdateWindow属于CWnd类函数,m_pMainWnd为CWinThread类成员变量

代码的编写

框架类对象就是窗口对象

m_pMainWnd是CWinApp的父类CWinThread的一个数据成员,其保存了指向应用程序的主窗口的指针。此时m_pMainWnd = frame,使得该MFC应用程序能够管理我们创建的窗口frame

代码分析

CFrameWnd 框架窗口类

CFrameWnd是 从CWnd(窗口基类)派生出来的,用于模仿框架窗口行为。我们可以把框架窗口作为顶层窗口看待,它是应用程序与外部世界的主要接口。

如果想要创建一个窗口,可以在此类中调用CWnd::Create或CWnd::CreateEX函数:

virtual BOOL Create
(LPCTSTR lpszClassName,LPCTSTR lpszWindowName,DWORD dwStyle,const RECT& rect,CWnd* pParentWnd,UINT nID,CCreateContext* pContext = NULL
);

1.Create接收的8个参数后6个有默认值定义,因此我们在上文使用的Create只写了两个参数

2.lpszClassName指定了窗口基于WNDCLASS类的名称,上文代码将其设定为NULL将创建一个基于已注册的WNDCLASS类的默认框架窗口。

3.lpszWindowName参数指定将在窗口的标题栏出现的文字。

CWinApp应用程序类

MFC应用程序的核心就是基于CWinApp类的应用程序对象。CWinApp提供了消息循环来检索消息并将消息调度给应用程序窗口。它还包括可被覆盖的、用来自定义应用程序行为的主要虚函数。

一个MFC程序可以有且仅有一个应用程序对象,此对象必须声明为在全局范围内有效,以便它在程序开始时即在内存中被实例化。

InitInstance函数

CWinApp::InitInstance函数是一个虚函数,其默认操作仅有一条语句:

BOOL MyApp::InitInstance()//程序入口地址
{return TRUE;
}

InitInstance的目的是给应用程序提供一个自身初始化的机会,其返回值决定了框架接下来要执行的内容,如果返回FALSE将关闭应用程序,如果初始化正常返回TRUE以便允许程序继续进行。此函数是MFC应用程序的入口。

m_pMainWnd 成员变量

在CWinApp中有一个名为CWinThread::m_pMainWnd的成员变量。 该变量是一个CWnd类型的指针,它保存了应用程序框架窗口对象的指针。也就是指向CFramWnd对象(框架窗口类对象)的指针。

消息映射

消息映射是一个将消息和成员函数相互关联的表。比如,框架窗口接收到一个鼠标左击消息:WM_LBUTTONDOWN,MFC将搜索该窗口的消息映射,如果存在一个处理WM_LBUTTONDOWN的处理程序,然后就调用其对应的函数OnLButtonDown。

下面是是将消息映射添加到一个类中所做的全部工作:

1.在.h文件中的框架类,声明消息映射宏DECLARE_MESSAGE_MAP,作为将 Windows 消息与类的成员函数相关联的表。

2.在.cpp文件中利用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP表消息映射的范围,即分界宏。在分界宏中写入要定义的消息宏,该宏用于找到消息对应的处理函数。

3.在.h文件中写入消息处理函数的原型声明

4.在.cpp文件中实现该函数

每个消息映射入口都对应一个唯一的消息处理函数,从msdn帮助手册查询

简单的理解:DECLARE_MESSAGE_MAP就是一个函数表,BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间的范围表示函数表的范围,表中的每一项都是函数的入口,每个入口都对应特定的函数

上图中ON_WM_LBUTTONDOWN表鼠标左键按下的消息

3.消息处理函数 在.h文件类中声明,.cpp文件定义:

该OnLButtonDown函数可在我们在窗  口中点击函数时,弹出显示鼠标左键

我们也可以把OnLButtonDown重新定义

void MyFrame :: OnLButtonDown(UINT, CPoint point)
{//TCHAR buf[1024];//wsprintf(buf, TEXT("x = %d, y = %d"), point.x, point.y);//MessageBox(buf);CString str;str.Format(TEXT("x = %d, y = %d", point.x, point.y));MessageBox(str);
}

该代码两种方式都可以在点击窗口时弹窗显示坐标

我们同样也可以添加一个键盘的消息映射,此处不再演示

此时,我们便完成了一个简单的mfc程序,该程序也具有一个功能

帮助文档的使用

MSDN的使用

VC++之MFC类库中文手册

通过此手册查找,必须加上成员所属的类作用域(类名::),否则,无法查找到匹配的关键字。

实际上,我们在使用VS进行编程遇到不熟悉的函数时,直接按F1查看帮助即可

向导生成基于单文档MFC应用程序

在我们实际编程中,我们并不需要从0创建一个mfc应用程序,VS为我们提供好了现成的模板使用,这也叫做工程文件。接下来我们将演示如何利用VS向导创建一个单文档MFC标准类型应用程序。

MFC为我们生成了如上四个类:App,MainFrame,View,Doc

APP继承于CWinApp:应用程序类

MainFrame继承于CFrameWnd:框架类,类比相框。在此类中写代码显示东西是显示不出来的,被覆盖掉了。这与我们前文学习的在框架类中弹窗显示坐标产生了区别

View继承于CView:视图类,用于显示内容,类比相片。在此类中写代码显示东西才能显示出来

Doc继承于CDocument:文档类,用于存储和管理数据

点击完成以后,我们便创建成功了,运行结果如下:

类视图

 

在mfc开发中,我们通常不再使用解决方案资源管理器,而是使用类视图。在类视图中可以找到MFC中的类

CAboutDlg:对话框类,由MFC向导自行生成,用于显示应用程序的 “关于” 信息,如下图所示,没啥用

双击相应的类名便可跳转到类声明所在的.h文件

下方框为类中成员函数,双击即可跳转到相应定义部分

文档/视图结构体系

MFC应用程序框架结构的基石是文档/视图体系结构,它定义了一种程序结构,这种结构依靠文档对象保存应用程序的数据,并依靠视图对象控制视图中显示的数据,把数据本身与它的显示分离开。

数据的存储和加载由文档类来完成,数据的显示和修改则由视类来完成。 MFC在类CDocument和CView中为稳定视图提供了基础结构。CWinApp、CFrameWnd和其他类与CDocument和CView合作,把所有的片段连在了一起。

CView类也派生于CWnd类,框架窗口是视图窗口的一个父窗口。主框架窗口(CFrameWnd)是整个应用程序外框所包括的部分,即图中粗框以内的内容,而视类窗口只是主框架中空白的地方。

消息处理的添加

在主框架类中添加WM_LBUTTONDOWN消息的响应函数,具体操作如下:

从类视图中找到CMainFrame(继承自CFrameWnd),选择此类然后从属性面板中找到消息按钮

在消息列表中找到WM_LBUTTONDOWN消息,添加。

 

我们同样也可以轻松删除,但删除的形式是注释而非代码删除

工程文件增加几处改变:

第一处:在框架类头文件中添加了鼠标左键消息函数的函数声明

第二处:在框架类cpp文件中添加了消息映射宏

第三处:在框架列cpp文件中添加了处理鼠标左键消息的函数定义

接下来我们在此OnLButtonDown函数中添加一个MessageBox消息,鼠标左键按下弹出一个提示框

执行程序,我们会惊奇的发现程序并未如我们所愿弹出消息框。

因为,框架窗口是视窗口的父窗口,那么视类窗口就应该始终覆盖在框架类窗口之上。就好比框架窗口是一面墙,视类窗口就是墙纸,它始终挡在这面墙前边。也就是说,所有操作,包括鼠标单击、鼠标移动等操作都只能有视类窗口捕获。因此当我们把上述的操作全部删除以后,在View类中重现,就会发现,此时点击鼠标左键会弹窗

MFC框架中一些重要的函数

InitInstance函数

应用程序类的一个虚函数,MFC应用程序的入口。

PreCreateWindow函数

当框架调用CreateEx函数创建窗口时,会首先调用PreCreateWindow函数。

通过修改传递给PreCreateWindow的结构体类型参数CREATESTRUCT,应用程序可以更改用于创建窗口的属性。在产生窗口之前让程序员有机会修改窗口的外观。

最后再调用CreateWindowEx函数完成窗口的创建。

OnCreate和Create

OnCreate是一个消息响应函数,是响应WM_CREATE消息的一个函数,而WM_CREATE消息是由Create函数调用的。一个窗口创建(Create)之后,会向操作系统发送WM_CREATE消息,OnCreate()函数主要是用来响应此消息的。

OnCreate与Create的区别:

1.Create()负责注册并产生窗口,像动态创建控件中的Create()一样,窗口创建成功之后会向操作系统发送WM_CREATE消息。

2.OnCreate()不产生窗口,只是在窗口显示前设置窗口的属性如风格、位置等。

3.OnCreate()是消息WM_CREATE的消息响应函数。

OnDraw和OnPaint

OnPaint()是CWnd的类成员,负责响应WM_PAINT消息。

OnDraw()是CView的成员函数,没有响应消息的功能。

OnPaint是WM_PAINT消息的消息处理函数,OnDraw是OnPaint中调用的一部分。一般来说,用户自己的绘图代码应放在OnDraw中。

当视图变得无效时(包括大小的改变,移动,被遮盖等等),Windows发送WM_PAINT消息。该视图的OnPaint 处理函数通过创建CPaintDC类的DC对象与当前窗口关联并做一些准备工作。然后OnPaint 调用视图的OnDraw成员函数,将DC对象传递给OnDraw成员函数,让该函数使用DC进行具体绘画操作。

通常我们不必编写OnPaint处理函数,这是因为在View类里添加了消息处理OnPaint()时,OnPaint()就会覆盖掉OnDraw()。

我们在这两个函数中,分别在同一个位置显示不同的文案,观察程序运行的结果

拓展知识点

MFC中后缀名为Ex的函数都是扩展函数。

在MFC中,以Afx为前缀的函数都是全局函数,可以在程序的任何地方调用它们

注意:消息处理函数中的afx_msg只是一个标识符

相关文章:

MFC程序设计(一)MFC入门

本MFC教程使用VS2022实现 MFC基本概念 微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C类的形式封装了Windows API,并且…...

swift Actor并发处理

preconcurrency 使用 /*在 Swift 5.5 引入并发模型后,编译器会对潜在的数据竞争和不安全的并发代码发出警告或错误。然而,某些旧代码或第三方库可能尚未完全适配这些新规则。preconcurrency 提供了一种临时解决方案,允许你在不修改代码的情况…...

网络编程 | UDP套接字通信及编程实现经验教程

1、UDP基础 传输层主要应用的协议模型有两种,一种是TCP协议,另外一种则是UDP协议。在上一篇博客文章中,已经对TCP协议及如何编程实现进行了详细的梳理讲解,在本文中,主要讲解与TCP一样广泛使用了另一种协议&#xff1a…...

Hadoop•搭建完全分布式集群

听说这里是目录哦 一、安装Hadoop🥕二、配置Hadoop系统环境变量🥮三、验证Hadoop系统环境变量是否配置成功🧁四、修改Hadoop配置文件🍭五、分发Hadoop安装目录🧋六、分发系统环境变量文件🍨七、格式化HDFS文…...

代码中使用 Iterable<T> 作为方法参数的解释

/*** 根据课程 id 集合查询课程简单信息* param ids id 集合* return 课程简单信息的列表*/ GetMapping("/courses/simpleInfo/list") List<CourseSimpleInfoDTO> getSimpleInfoList(RequestParam("ids") Iterable<Long> ids); 一、代码解释&…...

web前端1--基础

&#xff08;时隔数月我又来写笔记啦~&#xff09; 1、下载vscode 1、官网下载&#xff1a;Visual Studio Code - Code Editing. Redefined 2、步骤&#xff1a; 1、点击同意 一直下一步 勾一个创建桌面快捷方式 在一直下一步 2、在桌面新建文件夹 拖到vscode图标上 打开v…...

关于opensips的帮助命令的解释

opensips -help以下是 opensips 命令及其选项的中文解释&#xff08;基于 3.6.0-dev 版本&#xff09;&#xff1a; 命令用法 opensips -l 地址 [-l 地址 ...] [选项]选项说明 选项功能-f 文件指定配置文件&#xff08;默认为 /usr/local//etc/opensips/opensips.cfg&#x…...

你还在用idea吗

从VIM、Emacs&#xff0c;到eclipse、Jetbrains, 再到VSCode&#xff0c;过去的三十年时间&#xff0c;出现了这三代IDE产品。现在属于AI的时代来了&#xff0c;最新一代的产品像Cursor、Windsurf&#xff0c;就在昨天&#xff0c;字节跳动发布了最新的IDE&#xff0c;就叫Trae…...

安装wxFormBuilder

1. 网址&#xff1a;GitHub - wxFormBuilder/wxFormBuilder: A wxWidgets GUI Builder 2. 安装MSYS2 MSYS2可以在GitHub的内容中找到&#xff0c;这个版本是32位64位的 3. 在程序中打开MINGW64 shell 4. 在MSYS2 MINGW64 shell中输入 pacman -Syu pacman -S ${MINGW_PACKAGE…...

【大数据2025】Hadoop 万字讲解

文章目录 一、大数据通识大数据诞生背景与基本概念大数据技术定义与特征大数据生态架构概述数据存储数据计算与易用性框架分布式协调服务和任务调度组件数仓架构流处理架构 二、HDFSHDFS 原理总结一、系统架构二、存储机制三、数据写入流程四、心跳机制与集群管理 安全模式&…...

HTML语言的计算机基础

HTML语言的计算机基础 引言 在当今信息技术迅猛发展的时代&#xff0c;网页设计和开发已成为计算机科学中不可或缺的一部分。而HTML&#xff08;超文本标记语言&#xff09;作为构建网页的基础语言&#xff0c;承载着网页上所有内容的结构&#xff0c;帮助开发者创建和展示信…...

Cannot resolve symbol ‘XXX‘ Maven 依赖问题的解决过程

一、问题描述 在使用 Maven 管理项目依赖时&#xff0c;遇到了一个棘手的问题。具体表现为&#xff1a;在 pom.xml 文件中导入了所需的依赖&#xff0c;并且在 IDE 中导入语句没有显示为红色&#xff08;表示 IDE 没有提示依赖缺失&#xff09;&#xff0c;但是在实际使用这些依…...

Swift语言的函数实现

Swift语言函数实现详解 引言 Swift是一种强类型、泛型编程的现代编程语言&#xff0c;广泛应用于iOS和macOS开发。函数是Swift编程中的基本构建块之一&#xff0c;通过函数可以将代码进行模块化&#xff0c;实现重用性和可读性。本篇文章将系统地介绍Swift中的函数&#xff0…...

除了基本的事件绑定,鸿蒙的ArkUI

鸿蒙操作系统&#xff08;HarmonyOS&#xff09;是由华为技术有限公司开发的分布式操作系统&#xff0c;旨在为多种智能设备提供一个统一的操作平台。它不仅适用于智能手机&#xff0c;还适用于平板电脑、智能手表、智能电视等物联网设备。为了使开发者能够更加便捷地创建跨设备…...

数据分析及应用:经营分析中的综合指标解析与应用

目录 1. 市场份额(Market Share) 2. 客户获取成本(Customer Acquisition Cost, CAC) 3. 客户生命周期价值(Customer Lifetime Value, CLV) 4. 客户留存率(Customer Retention Rate, CRR) 5. 净推荐值(Net Promoter Score, NPS) 6. 转化率(Conversion Rate) …...

Mac开启任何来源安装配置环境变量

目录 开启任何来源配置环境变量退出保存时如果没有权限修改文件权限拓展——.bash_profile和.zshrc 开启任何来源 sudo spctl --master-disable#打开软件时提示文件损坏 sudo xattr -r -d com.apple.quarantine 进入访达应用程序拖拽应用到终端配置环境变量 cd ~ vi ~/.bash…...

UI自动化设计模式--POM

在自动化测试中&#xff0c;Page Object Model&#xff08;POM&#xff09;设计方式是一种常用的设计模式&#xff0c;它将页面元素和操作封装成独立的类&#xff0c;提高了测试代码的可读性、可维护性和可复用性。以下是关于POM设计方式的详细介绍&#xff1a; 基本概念 POM…...

(三)线性代数之二阶和三阶行列式详解

在前端开发中&#xff0c;尤其是在WebGL、图形渲染、或是与地图、模型计算相关的应用场景里&#xff0c;行列式的概念常常在计算变换矩阵、进行坐标变换或进行图形学算法时被使用。理解二阶和三阶行列式对于理解矩阵运算、旋转、平移等操作至关重要。下面&#xff0c;我将结合具…...

postman接口测试工具详解

一、前言 Postman是一款广泛使用的API测试工具&#xff0c;适用于开发人员和测试人员。它提供了直观的用户界面&#xff0c;能够方便地进行API请求、响应验证、自动化测试等操作。本文将详细介绍Postman的功能和用法&#xff0c;帮助用户高效地进行API测试。 二、Postman的主…...

Golang 中强大的重试机制,解决瞬态错误

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…...

【C语言系列】深入理解指针(2)

一、数组名的理解 上一篇文章中我们写过一个这样的代码&#xff1a; int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0];这里使用&arr[0] 的方式拿到了数组第⼀个元素的地址&#xff0c;但是其实数组名本来就是地址&#xff0c;而且是数组首元素的地址&#xff…...

【网络原理】万字详解 HTTP 协议

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. HTTP 前置知识1.1 HTTP 是什么1.2 HTPP 协议应用场景1.3 HTTP 协议工作过程 2. HTTP 协议格式2.1 fiddler…...

WIFI连接与通信

ESP32-S3 支持 2.4 GHz 的 Wi-Fi 4&#xff08;802.11n&#xff09;标准&#xff0c;提供高达 150 Mbps 的数据传输速率。它支持 STA&#xff08;Station&#xff09;模式、AP&#xff08;Access Point&#xff09;模式和 Wi-Fi 直连&#xff08;Wi-Fi Direct&#xff09;模式&…...

Elixir语言的数据库编程

Elixir语言的数据库编程 介绍 Elixir是一种基于Erlang虚拟机&#xff08;BEAM&#xff09;的函数式编程语言&#xff0c;特别适用于构建可扩展和可维护的系统。它结合了Erlang的卓越并发特性和Ruby的易用性&#xff0c;因此在Web开发和实时应用中越来越受到欢迎。伴随着Elixi…...

python中Mako用法

Mako 是一个轻量级的 Python 模板库&#xff0c;它以其高效的代码生成和灵活的表达能力著称&#xff0c;常用于 Web 开发和静态文件生成。以下是对 Mako 的核心 API介绍。 1. 安装 Mako 首先安装 Mako&#xff1a; pip install mako2. 基本用法 Mako 的核心在于 Template 类…...

SMS4J - 一个聚合各种短信API商的工具

众所周知&#xff0c;在我们日常的项目开发中&#xff0c;短信验证码发送是一个必不可少的环节。 特别是如今手机互联网时代&#xff0c;基本所有东西都跟手机强绑定&#xff0c;所有的安全验证都离不开验证码这一环节。 所以对于一个系统来说&#xff0c;发送短信验证码成为…...

BEVFusion论文阅读

1. 简介 融合激光雷达和相机的信息已经变成了3D目标检测的一个标准&#xff0c;当前的方法依赖于激光雷达传感器的点云作为查询&#xff0c;以利用图像空间的特征。然而&#xff0c;人们发现&#xff0c;这种基本假设使得当前的融合框架无法在发生 LiDAR 故障时做出任何预测&a…...

【总结盘点类】2024,一场关于海量数据治理以及合理建模的系列写作

目录 1.今年的创作路线 2.先说第一条线 2.1.由日志引出的海量文本数据存储和分析问题 2.2.监控以及监控的可视化 2.3.数据量级再往上走牵扯出了大数据 2.4.由大数据牵扯出的JAVA线程高级内容 3.第二条线&#xff0c;也是2025要继续的主线 1.今年的创作路线 今年的写作内…...

【25考研】考清华的软件工程专业的研究生需要准备什么?

清华软件复试竞争一样很激烈&#xff01;建议同学认真复习&#xff01; 关于项目的注意事项先来一些总结&#xff1a; 千万别照抄开源项目 开源项目是一个很好的参考&#xff0c;但直接搬过来就没啥意义啦。我们可以根据开源项目学习它的技术架构和关键点&#xff0c;然后结…...

网络编程-UDP套接字

文章目录 UDP/TCP协议简介两种协议的联系与区别Socket是什么 UDP的SocketAPIDatagramSocketDatagramPacket 使用UDP模拟通信服务器端客户端测试 完整测试代码 UDP/TCP协议简介 两种协议的联系与区别 TCP和UDP其实是传输层的两个协议的内容, 差别非常大, 对于我们的Java来说, …...

EXCEL的一些用法记录

按某个分隔符进行拆分多列 【数据】- 【分列】 多列调整成多行 复制 - 粘贴 - 选择【转置】 部分内容替换 SUBSTITUTE()函数 &#xff0c;固定内容 加“”...

不使用 JS 纯 CSS 获取屏幕宽高

前言 在现代前端开发中&#xff0c;获取屏幕的宽度和高度通常依赖于 JavaScript。然而现代 CSS 也可以获取到屏幕的宽高&#xff0c;通过自定义属性&#xff08;CSS Variables&#xff09;和一些数学函数来实现这一目标。本文将详细解析如何使用 CSS 的 property 规则和一些数…...

Node.js 完全教程:从入门到精通

Node.js 完全教程&#xff1a;从入门到精通 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;允许开发者在服务器端使用 JavaScript。它的非阻塞 I/O 和事件驱动架构使得 Node.js 非常适合于构建高性能的网络应用。本文将详细介绍 Node.js 的安装、基本语…...

可替代CentOS 7的Linux操作系统选型

可替代CentOS 7的其他Linux操作系统选型 一、背景介绍二、主流操作系统调研2.1 企业级产品:Red Hat Enterprise Linux/CentOS Stream2.1.1 Red Hat Enterprise Linux2.1.2 CentOS Stream2.2 其他发行版:Debian/Ubuntu2.3 开源产品:AlmaLinux / RockyLinux2.3.1 AlmaLinux2.3…...

【ESP32】ESP32连接JY61P并通过WIFI发送给电脑

前言 手头上有个ESP32&#xff0c;发现有wifi功能&#xff0c;希望连接JY61P并通过WIFI把姿态数据发送给电脑 1.采用Arduino IDE编译器&#xff1b;需要安装ESP32的开发板管理器&#xff1b; 2.电脑接受数据是基于python的&#xff1b; 1. ESP32 连接手机WIFI #include <…...

【JSqlParser】Java使用JSqlParser解析SQL语句总结

简述 Java解析SQL语句有很多工具都可以做到&#xff0c;比如Mybatis、Druid、目前用来用去最全面的仍然是Jsqlparser&#xff0c;它是一个Github上的开源项目&#xff0c;JSqlParser是一个用于解析SQL语句的Java库&#xff0c;它可以帮助开发者分析和操作SQL语句的结构。无论是…...

TCP断开通信前的四次挥手(为啥不是三次?)

1.四次握手的过程 客户端A发送 FIN&#xff08;终止连接请求&#xff09; A&#xff1a;我要断开连接了&#xff08;FIN&#xff09;。A进入FIN_WAIT_1状态&#xff0c;表示请求断开&#xff0c;等待对方确认。 服务器B回复 ACK&#xff08;确认断开请求&#xff0c;但还未准备…...

解决用 rm 报bash: /usr/bin/rm: Argument list too long错

但目录里面文件过多用 rm 报bash: /usr/bin/rm: Argument list too long错时怎么办&#xff1a; 看看以下操作记录 rootmcu:/# cd /tmp rootmcu:/tmp# rm -f /tmp/chunk* bash: /usr/bin/rm: Argument list too long rootmcu:/tmp# rm -rf /tmp/chunk* bash: /usr/bin/rm: Arg…...

AI News(1/21/2025):OpenAI 安全疏忽:ChatGPT漏洞引发DDoS风险/OpenAI 代理工具即将发布

1、OpenAI 的安全疏忽&#xff1a;ChatGPT API 漏洞引发DDoS风险 德国安全研究员 Benjamin Flesch 发现了一个严重的安全漏洞&#xff1a;攻击者可以通过向 ChatGPT API 发送一个 HTTP 请求&#xff0c;利用 ChatGPT 的爬虫对目标网站发起 DDoS 攻击。该漏洞源于 OpenAI 在处理…...

从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CICD)

从零到上线&#xff1a;Node.js 项目的完整部署流程&#xff08;包含 Docker 和 CI/CD&#xff09; 目录 项目初始化&#xff1a;构建一个简单的 Node.js 应用设置 Docker 环境&#xff1a;容器化你的应用配置 CI/CD&#xff1a;自动化构建与部署上线前的最后检查&#xff1a;…...

哈希桶(开散列)

文章目录 前言实现插入put方法实现get方法实现泛型类哈希桶 前言 哈希桶用来解决哈希冲突&#xff0c;牺牲空间换取时间。 通过数组和链表来实现哈希桶 public class Node{public int key;public int value;public Node next;public Node(int key,int value){this.keykey;this…...

DEBERTA:具有解耦注意力机制的解码增强型BERT

摘要 近年来&#xff0c;预训练神经语言模型的进展显著提升了许多自然语言处理&#xff08;NLP&#xff09;任务的性能。本文提出了一种新的模型架构DeBERTa&#xff08;具有解耦注意力机制的解码增强型BERT&#xff09;&#xff0c;通过两种新技术改进了BERT和RoBERTa模型。第…...

WWW2025 多模态对话系统意图识别挑战赛方案总结

WWW2025 多模态对话系统意图识别挑战赛方案 代码实现&#xff1a;https://github.com/klayc-gzl/incent_internvl_2.5_8b 最终成绩&#xff1a; 大赛背景 互联网已成为提供客户服务的主要沟通渠道。网络客户服务面临的一个关键挑战是服务对话中多模态意图的高效识别。通过利…...

渗透测试--攻击常见的Web应用

本文章咱主要讨论&#xff0c;常见Web应用的攻击手法&#xff0c;其中并不完全&#xff0c;因为Web应用是在太多无法囊括全部&#xff0c;但其中的手法思想却值得我们借鉴&#xff0c;所以俺在此做了记录&#xff0c;希望对大家有帮助&#xff01;主要有以下内容&#xff1a; 1…...

w173疫苗发布和接种预约系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…...

常用的跨域方案有哪些?

在前端开发中&#xff0c;跨域&#xff08;Cross-Origin&#xff09;是一个常见问题&#xff0c;通常是由于浏览器的同源策略&#xff08;Same-Origin Policy&#xff09;限制导致的。为了解决跨域问题&#xff0c;前端开发者可以采用多种方案。 1. CORS&#xff08;跨域资源共…...

JS通过ASCII码值实现随机字符串的生成(可指定长度以及解决首位不出现数值)

在之前写过一篇“JS实现随机生成字符串&#xff08;可指定长度&#xff09;”&#xff0c;当时写的过于简单和传统&#xff0c;比较粗放。此次针对此问题&#xff0c;对随机生成字符串的功能进行优化处理&#xff0c;对随机取到的字符都通过程序自动来完成。 在写之前&#xff…...

IoTDB 1.2 升级 1.3 后 Pipe 插件失效

问题现象 客户使用 Pipe 功能将数据从 IoTDB 系统传输至 Kafka 集群&#xff0c;以便进行后续的数据处理与分析。在从企业版 1.2.5 升级至企业版 1.3.3.6 后&#xff0c;客户反馈 Kafka 的 consumer 无法接收到数据。经检查日志&#xff0c;发现存在以下报错&#xff1a; 问题…...

基于STM32的智能门锁安防系统(开源)

目录 项目演示 项目概述 硬件组成&#xff1a; 功能实现 1. 开锁模式 1.1 按键密码开锁 1.2 门禁卡开锁 1.3 指纹开锁 2. 功能备注 3. 硬件模块工作流程 3.1 步进电机控制 3.2 蜂鸣器提示 3.3 OLED显示 3.4 指纹与卡片管理 项目源代码分析 1. 主程序流程 (main…...

浅谈云端编辑器,分析其亮点与不足

浅谈云端编辑器&#xff0c;分析其亮点与不足 这个云端编辑器界面可以分为左侧题目筛选栏、中间题目描述与代码编辑区域、右侧AI提示功能三部分。以下是详细的分析&#xff1a; 1. 左侧题目筛选栏 层次结构清晰&#xff1a;左侧栏展示了一个层级结构&#xff0c;题目按主题分…...