MFC入门

news2024/9/23 21:20:00

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

解决方案:

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

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

相关文章

AcWing语法基础课笔记 第六章 C++中的函数

第六章 C中的函数 函数让代码变得更加简洁。 ——闫学灿 目录 1.函数基础 1.1编写函数 1.2调用函数 1.3形参和实参 1.4函数的形参列表 1.5函数返回类型 1.6局部变量、全局变量与静态变量 2.参数传递 传值参数​编辑 2.2传引用参数 2.3数组形参…

从事1年软件测试,只会功能测试,想进一步学习,有没有好的建议呢?

作为一个在软件测试领域奋斗10年的老人&#xff0c;我前8年先后在不同的互联网公司担任高级软件测试工程师&#xff0c;测试主管等职&#xff0c;所以这么多年下来&#xff0c;也算是身经百战&#xff0c;阅人无数了。 根据粉丝的提问&#xff0c;得到你当前的状态是1&#xf…

中国天气——低纬度和高纬度环流复习笔记

低纬度和高纬度环流 低纬度大气运动基本特征 中低纬度大气运动的差别 低纬度的地转参数f很小&#xff0c;天气尺度系统具有非地转特性&#xff0c;但吃到以外的行星尺度还是有准地转近似特性因此中纬度有效的气压场和温度场分析系统运动和变化的方法在低纬度不再适用&#x…

虚拟现实三维数字沙盘电子沙盘可视化交互开发教程第5课

虚拟现实三维数字沙盘电子沙盘可视化交互开发教程第5课 设置system.ini 如下内容 Server122.112.229.220 userGisTest Passwordchinamtouch.com 该数据库中只提供 成都市火车南站附近的数据请注意&#xff0c;104.0648,30.61658 在鼠标指定的位置增加自己的UI对象&#xff1…

实现8086虚拟机(一)——基本框架

文章目录基本框架几点说明&#xff1a;在 实现8086汇编编译器&#xff08;四&#xff09;——生成可执行程序 一文中&#xff0c;我已经实现了一个编译器&#xff0c;可以将汇编语言汇编成二进制程序。这几篇文章来讲述如何实现虚拟机&#xff0c;也就是执行这个程序的“机器”…

LabVIEW错误-2147220623:最大内存块属性不存在

LabVIEW错误-2147220623&#xff1a;最大内存块属性不存在在使用NI Linux实时操作系统目标中&#xff0c;使用系统属性节点和分布式系统管理器&#xff08;DSM&#xff09;&#xff0c;但遇到一些问题&#xff1a;它未正确报告系统上的可用物理内存量。在NI Linux实时系统上出现…

深入浅出带你学习无列名注入

前言 大家对于SQL注入一定不陌生&#xff0c;我们常用的SQL注入方法是通过information_schema这个默认数据库来实现&#xff0c;可是你有没有想过&#xff0c;如果过滤了该数据库那么我们如何进行SQL语句的查询呢&#xff0c;本文就带给大家如何通过不使用information_schema来…

MyBatis详解2——增删改查操作

一、SpringBoot单元测试 1.1什么是单元测试 单元测试是指对软件中的最小测试单元进行检查和验证的过程。 执行单元测试就是为了证明某段代码的执行结果是否符合我们的预期。如果测试通过则是符合预期&#xff0c;否则测试失败。 1.2单元测试的好处 1.单元测试不用启动Tomca…

全球十大资质正规外汇期货平台排行榜(最新版汇总)

外汇期货简称为FxFut&#xff0c;是“Forex Futures”的缩写&#xff0c;是在集中形式的期货交易所内&#xff0c;交易双方通过公开叫价&#xff0c;以某种非本国货币买进或卖出另一种非本国货币&#xff0c;并签订一个在未来的某一日期根据协议价格交割标准数量外汇的合约。 …

Pycharm开发工具的安装和基础使用

数据来源 01 Python开发环境 Pycharm集成开发工具(DE)&#xff0c;是当下全球Pthn开发者&#xff0c;使用最频繁的工具软件。 绝大多数的 Python程序&#xff0c;都是在 Pycharm工具内完成的开发。 Pycharm工具下载 首先&#xff0c;我们先下载并安装它&#xff1a;打开网站…

罗列几个提升WPF应用程序冷启动性能的方法!(Part 2)

在上文中&#xff08;点击这里回顾>>&#xff09;&#xff0c;我们主要介绍了针对三个技术的WPF应用程序性能提升&#xff0c;本文将着重介绍针对DevExpress WPF界面控件研发的应用程序如何提升性能&#xff01;有用控件推荐~DevExpress WPF拥有120个控件和库&#xff0c…

PostgreSQL的学习心得和知识总结(一百二十三)|深入理解PostgreSQL数据库开源扩展pg_dirtyread的使用场景和实现原理

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

大彩 串口屏

资料下载 视频 屏幕程序创建 创建 主界面设置 实现按钮和文本的添加&#xff0c;实现画面的切换 下面注释4有点问题&#xff0c;切换画面还是会下传指令集&#xff0c;只是无法在软件中进行指令集的设置了 按钮界面 首先第一步同上添加背景图片&#xff0c;然后添加…

性能VS功能,同为测试又有哪些不一样?

我们在求职的时候&#xff0c;发现有的是招聘的功能测试&#xff0c;有的招聘的是性能测试&#xff0c;那么功能测试和性能测试的区别是什么呢&#xff1f; 侧重点不同 功能测试的侧重点是功能是否满足客户需求。 比如说我们拿到一个节假日搞活动的需求&#xff0c;这个需求…

【订阅】订阅MySql集简云连接器同步报销审批数据至MySql数据库

方案场景 企业在实现数字化转型的道路上&#xff0c;因企业多个系统孤立数据割断&#xff0c;数据互通成为企业率先解决的最大问题&#xff0c;依靠钉钉OA审批&#xff0c;企业通过审批后手动录入到企业的自建系统&#xff0c;然后再同步到MySQL数据库&#xff0c;这种方式不仅…

WPF MVVM系统入门-下

WPF MVVM系统入门-下 CommandManager 接上文WPF MVVM系统入门-上&#xff0c;我们想把Command放在ViewModel中&#xff0c;而不是Model中&#xff0c;可以将CommandBase类改为 public class CommandBase : ICommand {public event EventHandler? CanExecuteChanged{add { C…

[Verilog硬件描述语言]程序设计语句

目录一、数据流建模二、行为级建模2.1 应用场景2.2 initial过程语句2.3 always过程语句2.3.1 电平敏感信号&#xff1a;2.3.2 边沿敏感信号&#xff1a;2.3.3 initial和always语句使用注意2.4 例题&#xff1a;用always过程语句描述4选1数据选择器2.5 例题&#xff1a; 用alway…

2023-02-16:干活小计

数学公式表示学习&#xff1a; 大约耗时&#xff1a;2 hours 在做了一些工作后重读论文&#xff1a;MathBERT: A Pre-Trained Model for Mathematical Formula Understanding 这是本篇论文最重要的idea&#xff1a;Current pre-trained models neglect the structural featu…

魔百和M401A刷入Armbian系统EMMC开启wifi

文章目录一、Armbian系统写入U盘二、U盘内uEnv.txt文件修改三、盒子从U盘进行启动四、设置用户名和密码五、Armbian系统写入EMMC六、 重启系统reboot(不可以拔U盘)七、盒子关机拔出U盘八、插入USB无线网卡&#xff0c;连接wifi上次盒子刷了5.15版本的armbian系统&#xff0c;可…

C++ map和set

目录 1. 关联式容器 2. 键值对 3. 树形结构的关联式容器 3.1 set 3.1.1 set的介绍 3.1.2 set的使用 3.2 map 3.2.1 map的介绍 3.2.2 map的使用 3.3 multiset 3.3.1 multiset的介绍 3.3.2 multiset的使用 3.4 multimap 3.4.1 multimap的介绍 3.5 在OJ中的使用 4.…