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。
解决方案: