当前位置: 首页 > 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

解决方案:

http://www.lryc.cn/news/9367.html

相关文章:

  • 1、H5+CSS面试题
  • 亚马逊云科技重磅发布《亚马逊云科技汽车行业解决方案》
  • Springboot扩展点之FactoryBean
  • 新库上线 | CnOpenDataA股上市公司交易所监管措施数据
  • 同步辐射XAFS表征方法的应用场景分析
  • 06 antdesign react Anchor 不同页面之间实现锚点
  • mysql调优-内存缓冲池
  • 【LeetCode】每日一题(5)
  • 输入任意多个整数, 把这些数据保存到文件data.txt中.(按ctrl + z)
  • Mysql数据库的时间(3)一如何用函数插入时间
  • 关于eval函数(将JSON格式的字符串转换成JSON格式对象)
  • 2023最强软件测试面试题,精选100 道,内附答案版,冲刺金3银4
  • 一文搞懂Docker容器里进程的 pid 是如何申请出来的?
  • 若依框架如何新增自定义主题风格
  • C语言格式化输入和输出; Format格式化
  • Revit教程:怎么关掉工具栏的实时提示?
  • javascript 简介
  • 医学图象分割常用损失函数(附Pytorch和Keras代码)
  • 【新2023】华为OD机试 - 病菌感染(Python)
  • QGIS中进行批量坡向计算
  • Redis持久化机制
  • 2、VUE面试题
  • DeepSort:论文翻译
  • Debezium系列之:重置Sqlserver数据库的LSN拉取历史数据
  • 一起Talk Android吧(第四百九十四回:在Android中使用MQTT通信四)
  • 【vcpkg】cpprestsdk之64位编译链接及踩坑
  • 初始QML
  • SpringAOP切面实例实现对数据过滤返回,SpringAOP切面实现对用户权限控制,通过@Around注解过滤修改方法返回值
  • 【Kubernetes】【九】Label,Deployment,Service
  • RuoYi-Vue部署(Nginx+Tomcat)