MFC(微软基础类库Microsoft Foundation Classes)。把Windows底层C语言写的几千个函数,MFC把那些函数封装成了几百个类和对应方法。(不支持跨平台)
学MFC重点是一个学习能力和其思想。
SDK:软件开发工具包(Software Development Kit),一般都是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具集合。
API函数 Application Programming Interface 。编程的接口。
句柄:创建资源时系统提供的资源标识号。HICON HCURSOR HANDLE
消息和消息队列:
最先是操作系统捕捉到消息,然后放入消息队列,消息队列根据先进先出的原则将消息传递给应用程序,然后应用程序其实并不做什么处理而是将消息分发给操作系统(DispathchMessage),操作系统根据回调函数(窗口过程)对相应的消息做出相应的动作。
底层实现程序入口是WinMain函数。。。。。
1),WinMain函数的定义。
2),创建一个窗口。
3),进行消息循环。(GetMessage)
4),编写窗口函数过程。(回调函数)
#include <windows.h>
//6,处理窗口过程
LRESULT CALLBACK WindowProc( //WINAPI _stdcall 参数传递顺序:从右到左,以此入栈,并且在函数返回前清空堆栈
HWND hWnd,//消息所属得窗口句柄
UINT uMsg,//具体消息名称 WM_XXXXXX消息名
WPARAM wParam,//键盘附加消息
LPARAM lParam//鼠标附加消息
)
{
switch (uMsg)
{
case WM_CLOSE:
//所有xxxWindow为结尾的不会进入消息队列,直接就执行了。
DestroyWindow(hWnd);//发送另外一个消息 WM_Destory
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(NULL,buf,"鼠标左键摁下",MB_OK);
break;
case WM_KEYDOWN:
int tmp = LOWORD(wParam);
char ch = tmp;
char buf1[1024];
wsprintf(buf1, "%s", ch);
MessageBox(NULL, buf, "键盘按下摁下", MB_OK);
break;
case WM_PAINT:
PAINTSTRUCT ps;//绘图结构体
HDC hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 200, 200, "HelloWorld", 10);
EndPaint(hWnd,&ps);
break;
}
//返回默认处理方式
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
//入口函数 WINAPI _stdcall 参数传递顺序:从右到左,以此入栈,并且在函数返回前清空堆栈
int WINAPI WinMain(HINSTANCE hInstance,//应用程序实例句柄
HINSTANCE hPrevInstance, //上一个应用程序句柄 ,在win32一般为NULL 不起作用。
LPSTR lpCmdLine, //char *argv[]
int nShowCmd)//显示命令 1,最大化 2,最小化 3,正常
{
//1,设计窗口
//2,注册窗口
//3,创建窗口
//4,显示更新
//5,通过循环取消息
//6,处理消息(窗口过程)
//1,设计窗口
WNDCLASS wc;
wc.cbClsExtra = 0;//类额外内存
wc.cbWndExtra = 0;//窗口额外内存
wc.hbrBackground = /*类型转化*/(HBRUSH)GetStockObject(WHITE_BRUSH); //设置背景
wc.hCursor = LoadCursor(NULL, IDC_HAND);//设置光标,如果第一个参数为NULL代表使用系统提供的光标
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);//同上
wc.hInstance = hInstance;//应用程序的实例句柄,传入winmain中实参
wc.lpfnWndProc = WindowProc;//回调函数,窗口过程。
wc.lpszClassName = TEXT("Window");//指定窗口类名称。
wc.lpszMenuName = NULL;//指定菜单
wc.style = 0;//风格显示 0代表默认风格
//2,注册窗口
RegisterClass(&wc);
//3创建窗口
/*
lpClassName, 类名 ClassName 一样就行了
lpWindowName, 窗口标题名称
dwStyle, 风格 帮助文档//WS_OVERLAPPEDWINDOW混合风格(包含很多)。
x, 坐标 CW_USEDEFAULT//默认值
y, CW_USEDEFAULT//默认值
nWidth, 宽CW_USEDEFAULT//默认值
nHeight, 高CW_USEDEFAULT//默认值
hWndParent, 父窗口 NULL
hMenu, 菜单 NULL
hInstance, 实例 hInstance
lpParam//附加值 鼠标附加值
*/
//没有重载方式
HANDLE handle;
handle = CreateWindow(wc.lpszClassName, TEXT("WindoWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
//4,显示和更新
ShowWindow(handle, SW_SHOWNORMAL);
UpdateWindow(handle);
//5,通过循环取消息
/*
HWND hwnd;//主窗口句柄
UINT message;//具体消息名称
WPARAM wParam;//附加消息 键盘消息
LPARAM lParam;//附加消息 鼠标消息(左右点击)
DWORD time;//消息产生时间
POINT pt;//附加消息 鼠标消息(x,y)
*/
MSG msg;
while (1)
{
/*
_Out_ LPMSG lpMsg,消息
_In_opt_ HWND hWnd,捕获窗口,添NULL代表捕获所有窗口(Therefore if hWnd is NULL, both window messages and thread messages are processed.
)
_In_ UINT wMsgFilterMin,最小 0 一般添0(捕获所有消息)
_In_ UINT wMsgFilterMax);最大 0 一般添0(捕获所有消息)
//If wMsgFilterMin and wMsgFilterMax are both zero, GetMessage returns all available messages (that is, no range filtering is performed).
*/
if (GetMessage(&msg, NULL, 0, 0) == FALSE)//获取的消息是FALSE值
{
break;
}
//翻译消息(a , w ====== 但是 ctrl + c 组合键就得翻译)
TranslateMessage(&msg);
//不为FALSE分发消息
//分发消息
DispatchMessage(&msg);
}
//6,处理窗口过程
}
#include <afxwin.h>引入这个头文件就都可以用了MFC函数。