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

MFC入门

1.什么是MFC?

全称是Microsoft Foundation Class Library,我们称微软基础类库。它封装了windows应用程序的各种API以及相关机制的C++类库

MFC是一个大的类库

MFC是一个应用程序框架

MFC类库常用的头文件

afx.h-----将各种MFC头文件包含在内

afxwin.h-------包含了各种MFC窗口类。包含了afx.h和windows.h。

afxext.h-------提供了扩展窗口类的支持,例如工具栏,状态栏等。

2.底层实现窗口

1.1 sdk apl句柄

1.2 消息处理机制

1.3 头文件windows.h

1.4 程序入口 winMain

具体6个步骤:

1.设计窗口 WNDCLASS wc;

2. 注册窗口 RegisterClass(&wc);

3.创建窗口 CreateWindow

4.显示和更新 ShowWindow(hwnd, SW_SHOWNORMAL); UpdateWindow(hwnd);

5.通过循环取消息 MSG msg;

5.1 写循环 while

5.2 GetMessage==false退出循环

5.3 翻译消息

5.4分发消息

6.窗口过程

6.1 LRESULT CALLBACK WindowPro

6.2 返回值用默认处理方式

6.3 return DefWindowProc(hwnd,uMsg,wParam,lParam);

6.4 点击叉子 WM_CLOSE destroy

6.5 WM_DESTROY PostQuitMessage(0)

#include <Windows.h>//底层实现窗口的头文件

//程序入口

//6.处理窗口的过程

LRESULT CALLBACK WindowPro

(

HWND hwnd, // 消息所属的商句柄

UINT uMsg,//具体消息.名称―BOX 消息名

WPARAM wParam, //键盘附加消息

LPARAM lParam //鼠标附加消息

){

switch (uMsg) {

case WM_CLOSE:

//所有xxxWindow为结尾的方法﹐都不会进入到消息队列中,而是直接执行

DestroyWindow(hwnd); // Destroyindown 发送另一个消息 WM__DESTROY

break;

case WM_DESTROY:

PostQuitMessage(0);//真正的关闭窗口

break;

case WM_LBUTTONDOWN:

{

int xPos = LOWORD(lParam);

int yPos = HIWORD(lParam);

char buf[1024];

wsprintf(buf, TEXT("x=%d,y=%d"), xPos, yPos);//拼接字符串

MessageBox(hwnd, buf, TEXT("鼠标左键按下"), MB_OK);

break;

}

case WM_KEYDOWN: //键盘

MessageBox(hwnd, TEXT("键盘按下"), TEXT("键盘键按下0000"), MB_OK);

break;

case WM_PAINT: //绘图

{

PAINTSTRUCT ps; //绘图结构体

HDC hdc = BeginPaint(hwnd, &ps); //开始画图

//画文字

TextOut(hdc, 100, 100, TEXT("hello"), strlen("HELLO"));

//结束画图

EndPaint(hwnd,&ps);

}

break;

}

//返回值用默认处理方式

return DefWindowProc(hwnd,uMsg,wParam,lParam);

}

//WINAPI代表 _stdcall参数的传递顺序。从右到左 以此入栈,并且在函数返回前 清空堆栈

int WINAPI WinMain(

HINSTANCE hInstance, // 应用程序实例句柄

HINSTANCE hPrevInstance, // 上一个应用程序句柄, 在win32环境下,参数一般为NUL,不起作用了

LPSTR lpCmdLine,//char * argv[]

int nShowCmd //显示命令最大化、最小 、正常

){

//1、设计窗口

//2、注册窗口

//3、创建窗口

//4、显示和更新

//5、通过循环取清息

//6、处理消息(窗口过程)

//设计窗口

WNDCLASS wc;

wc.cbClsExtra = 0;//额外的内存

wc.cbWndExtra = 0;//窗口额外的内存

wc.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);//设置背景

wc.hCursor = LoadCursor(NULL, IDC_HAND);//设置光标如果第一个参数为MLL,代表使用系统提供的光标

wc.hIcon = LoadIcon(NULL, IDI_ERROR);//图标――如果第一个参数为NLL,代表使用系统提供的光标

wc.hInstance = hInstance;//应用程序实例句柄传入inMlain中的形参即可

wc.lpfnWndProc = WindowPro; //回调函数,窗口过程

wc.lpszClassName = TEXT("WIN"); //指定窗口类名称

wc.lpszMenuName = NULL;//菜单名称

wc.style = 0; //显示风格,0代表默认风格

//2.注册窗口

RegisterClass(&wc);

//3.创建窗口

/*

lpClassName, 类名

lpWindowName, 标题名

dwStyle, WS_OVERLAPPEDWINDOW 风格

x, 显示坐标 CW_USEDEFAULT 默认值

y,\

nWidth,宽高

nHeight,

hWndParent,父窗口

hMenu, 菜单 NULL

hInstance, 实例句柄 hInstance

lpParam)\ 附加值 NULL

*/

HWND hwnd= CreateWindow(wc.lpszClassName,TEXT("WINDOWS"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,NULL,NULL,hInstance,NULL);

//4.显示和更新

ShowWindow(hwnd, SW_SHOWNORMAL);

UpdateWindow(hwnd);

//5.通过循环取消息

/*

HWND hwnd; 主窗口句柄

UINT message; 具体消息名称

WPARAM wParam; 附加消息,键盘消息

LPARAM lParam; 附加消息,鼠标

DWORD time; 消息产生时间

POINT pt; 附加消息, 鼠标消息 x y

*/

MSG msg;

while (GetMessage(&msg, NULL, 0, 0) == FALSE) {

/*

_Out_ LPMSG lpMsg,消息

_In_opt_ HWND hWnd, 捕获窗口,填NULL代表捕获所有的窗口

_In_ UINT wMsgFilterMin,最小最大的过滤的消息 一般填入0

_In_ UINT wMsgFilterMax

*/

//关闭了,退出循环

/*if(GetMessage(&msg, NULL, 0, 0)==FALSE)

{

break;

}*/

//翻译消息

TranslateMessage(&msg);

//不是false,分发消息

DispatchMessage(&msg);

}

return 0;

}

3.利用mfc创建窗口

3.1 mfc头文件 afxwin.h

3.2 自定义类 继承于CWinApp 应用程序类 MyApp app应用程序对象﹐有且仅

有一个

3.3 程序入口 InitInstance()

3.4 入口里 创建窗口

3.5 窗口类MyFrame 继承于 CFrameWnd

3.6 MyFrame构造中create(NULL,标题名称)

3.7 创建窗口对象√

3.8 显示和更新

3.9 m_pMainWnd = frame; //保存指向应用程序的主窗口的指针

3.10 return TRUE

3.11 对项目进行配置 在共享DLL中使用MFRC

3.12遇到 LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用 MSVCRTD.lib test

解决方案:

相关文章:

MFC入门

1.什么是MFC?全称是Microsoft Foundation Class Library&#xff0c;我们称微软基础类库。它封装了windows应用程序的各种API以及相关机制的C类库MFC是一个大的类库MFC是一个应用程序框架MFC类库常用的头文件afx.h-----将各种MFC头文件包含在内afxwin.h-------包含了各种MFC窗…...

1、H5+CSS面试题

1, HTML5中新增了哪些内容&#xff1f;广义上的html5指的是最新一代前端开发技术的总称&#xff0c;包括html5&#xff0c;CSS3&#xff0c;新增的webAPI。Html中新增了header,footer,main,nav等语义化标签&#xff0c;新增了video,audio媒体标签&#xff0c;新增了canvas画布。…...

亚马逊云科技重磅发布《亚马逊云科技汽车行业解决方案》

当今&#xff0c;随着万物智联、云计算等领域的高速发展&#xff0c;创新智能网联汽车和车路协同技术正在成为车企加速发展的关键途径&#xff0c;推动着汽车产品从出行代步工具向着“超级智能移动终端”快速转变。挑战无处不在&#xff0c;如何抢先预判&#xff1f;随着近年来…...

Springboot扩展点之FactoryBean

前言FactoryBean是一个有意思&#xff0c;且非常重要的扩展点&#xff0c;之所以说是有意思&#xff0c;是因为它老是被拿来与另一个名字比较类似的BeanFactory来比较&#xff0c;特别是在面试当中&#xff0c;动不动就问你&#xff1a;你了解Beanfactory和FactoryBean的区别吗…...

新库上线 | CnOpenDataA股上市公司交易所监管措施数据

A股上市公司交易所监管措施数据 一、数据简介 证券市场监管是指证券管理机关运用法律的、经济的以及必要的行政手段&#xff0c;对证券的募集、发行、交易等行为以及证券投资中介机构的行为进行监督与管理。 我国《证券交易所管理办法》第十二条规定&#xff0c;证券交易所应当…...

同步辐射XAFS表征方法的应用场景分析

X射线吸收精细结构XAFS表征方法是一种用于研究物质结构和化学环境的分析技术。XAFS 使用 X 射线照射到物质表面&#xff0c;并观察由此产生的 X 光吸收谱。 ​XAFS 技术通常应用于研究高分子物质、生物分子、纳米结构和其他类型的物质。例如&#xff0c;XAFS 可以用来研究高分子…...

06 antdesign react Anchor 不同页面之间实现锚点

react Anchor 不同页面之间实现锚点一、定义二、使用步骤三、开发流程(一)、组件(二)、页面布局(三)、点击事件(四)、总结说明一、react单页面应用&#xff0c;当前页面的锚点二、react单页面应用&#xff0c;不同页面的锚点思路&#xff1a;锚点只能在当前页面使用&#xff0c…...

mysql调优-内存缓冲池

因本地查询和服务器查询相比服务器慢了很多&#xff0c;同样的数据&#xff0c;同样的sql查询&#xff0c;考虑了是不是链接太多了&#xff0c;自行查询了下&#xff0c;我使用的c3p0的链接池&#xff0c;配置一个小时超时&#xff0c;正常情况下是20多个链接&#xff0c;而mys…...

【LeetCode】每日一题(5)

目录 题目&#xff1a;2341. 数组能形成多少数对 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;2341. 数组能形成多少数对 -…...

输入任意多个整数, 把这些数据保存到文件data.txt中.(按ctrl + z)

#pragma once #include <iostream> #include <fstream> using namespace std; /* 输入任意多个整数, 把这些数据保存到文件data.txt中. 如果在输入的过程中, 输入错误, 则提示用户重新输入. 指导用户输入结束(按ctrl z) [每行最多保存10个整数] */ int main() { …...

Mysql数据库的时间(3)一如何用函数插入时间

暂时用下面四个日期函数插入时间 如:insert into Stu(time) values (now()); Mysql的时间函数描述对应的Mysql的时间类型now()/sysdate()NOW()函数以YYYY-MM-DD HH:MM:SS返回当前的日期时间date/time/dateTime/timeStamp/yearcurDate()/current_date()返回当前的日期YYYY-M…...

关于eval函数(将JSON格式的字符串转换成JSON格式对象)

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>关于eval函数</title> </head> <body> <!--JSON是一种行业内的数据交换格式标准。在JS当中以对象的形式存在…...

2023最强软件测试面试题,精选100 道,内附答案版,冲刺金3银4

精挑细选&#xff0c;整理了100道软件测试面试题&#xff0c;都是非常常见的面试题&#xff0c;篇幅较长&#xff0c;所以只放出了题目&#xff0c;答案在评论区&#xff01; 测试技术面试题 1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 2、我现在有…...

一文搞懂Docker容器里进程的 pid 是如何申请出来的?

如果大家有过在容器中执行 ps 命令的经验&#xff0c;都会知道在容器中的进程的 pid 一般是比较小的。例如下面我的这个例子。 # ps -ef PID USER TIME COMMAND1 root 0:00 ./demo-ie13 root 0:00 /bin/bash21 root 0:00 ps -ef 不知道大家是否和我一样…...

若依框架如何新增自定义主题风格

若依框架新增主题风格1.实现结果2.实现步骤2.1Settings目录下2.2 variables.scss2.3 sidebar.scss2.4 Logo.vue2.5 Siderbar目录下的index.vue1.实现结果 2.实现步骤 需要改动的文件目录&#xff1a; 2.1Settings目录下 <div class"setting-drawer-block-checbox-it…...

C语言格式化输入和输出; Format格式化

Format格式化 %1s或者%2s,%3s:取字符串的前1,2或者3位。%*c:屏蔽一个字符。%[A-Z]:取一个A到Z的值。 %[^a-z]:不取a到z的值。 %[^\n]&#xff1a;取非换行之前的值。printf("%5d", a):左边补 格式化&#xff1a;有正则在其中。 int main() {printf("%5d\n&quo…...

Revit教程:怎么关掉工具栏的实时提示?

一、Revit中如何关闭工具栏的实时帮助提示 如图1所示&#xff0c;Revit会对每一个命令有一个简单的图文说明&#xff0c;方便不熟悉软件的用户使用。对于已经熟悉软件的用户&#xff0c;会觉得鼠标在菜单上悬停时弹出的实时帮助页面很干扰使用&#xff0c;而且很占内存资源&…...

javascript 简介

JavaScript 是互联网上最流行的脚本语言&#xff0c;这门语言可用于 HTML 和 web&#xff0c;更可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。JavaScript 是脚本语言JavaScript 是一种轻量级的编程语言。JavaScript 是可插入 HTML 页面的编程代码。JavaScript…...

医学图象分割常用损失函数(附Pytorch和Keras代码)

对损失函数没有太大的了解&#xff0c;就是知道它很重要&#xff0c;搜集了一些常用的医学图象分割损失函数&#xff0c;学习一下&#xff01; 医学图象分割常见损失函数前言1 Dice Loss2 BCE-Dice Loss3 Jaccard/Intersection over Union (IoU) Loss4 Focal Loss5 Tvesky Loss…...

【新2023】华为OD机试 - 病菌感染(Python)

华为 OD 清单查看地址:blog.csdn.net/hihell/category_12199275.html 病菌感染 题目 在一个地图中(地图有N*N个区域组成) 有部分区域被感染病菌 感染区域每天都会把周围上下左右的四个区域感染 请根据给定的地图计算多少天以后全部区域都会被感染 如果初始地图上所有区域都…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...