MFC-Windows编程模型勿忘知识点
1.句柄(HANDLE) //系统在创建资源(窗口,光标…)的时候会为他们分配内存,并且返回标识这些资源的标识号,那就是句柄,和人的名字相差不大。
2.消息:
- 窗口消息被操作系统捕获
- 操作系统把消息放入消息队列(队列是先进先出)中
- 应用程序从消息队列获取消息
- 应用程序把消息分发给操作系统 E.操作系统调用回调函数(窗口过程)
3.WinMain函数 //Windows程序入口函数,和main函数作用一致,WinMain函数结束,Windows应用程序同样也结束。
4.Windwos编程的大致模型:
- 导入#include<windows.h>头文件
- WinMain函数的定义
- 创建一个windows窗口
- 进行消息循环
- 编写窗口过程函数
图像
代码
#include<windows.h>
//6.处理消息(窗口过程)
LRESULT CALLBACK returnwin(HWND hwnd, //消息产生的窗口句柄
UINT uMsg, //消息名称
WPARAM wParam, //键盘的附加消息
LPARAM lParam) //鼠标的附加消息
{
switch (uMsg)
{
case WM_CLOSE: DestroyWindow(hwnd); break; //DestroyWindow会发送WM_DESTROY消息
case WM_DESTROY: PostQuitMessage(0); break; //结束消息循环(break)了,程序结束退出
case WM_LBUTTONDOWN: //鼠标左键按下
{ int xPos = LOWORD(lParam);
int yPos = HIWORD(lParam);
char pos[99];
wsprintf(pos,TEXT("鼠标坐标是:x=%d,y=%d"), xPos, yPos); //拼接,对TEXT进行转义
MessageBox(hwnd, pos, TEXT("鼠标的左键被按下"), MB_OK); //hwnd窗口弹出消息,消息内容,消息标题,MB_OK按钮
break;
}
case WM_KEYDOWN: //键盘事件
MessageBox(hwnd, TEXT("键盘被按下"), TEXT("我是标题"), MB_OK); break;
case WM_PAINT: //绘图
{
PAINTSTRUCT ps; //定义一个绘图结构体
HDC hdc = BeginPaint(hwnd, &ps); //画图对象,在hwnd窗口画图
TextOut(hdc, 500, 200, TEXT("Hello World!"), strlen("Hello World!")); //开始画图
EndPaint(hdc, &ps); //结束画图
break;
}
}
return DefWindowProc(hwnd, uMsg, wParam, lParam); //默认返回值
}
int WINAPI WinMain( //WinMain程序入口函数,WINAPI是_stdcall参数的传递顺序:从右到左入栈且在函数返回前清空堆栈
HINSTANCE hInstance, //应用程序实例句柄,h代表句柄,instance是实例意思,以下类同
HINSTANCE hPrevInstance, //上一个应用程序的句柄,参数一般为NULL
LPSTR lpCmdLine, //相当于char * argv[]
int nShowCmd) //窗口显示指令(最大化...)
{
//流程:设计窗口,注册窗口,创建窗口,显示和更新,通过循环取消息,处理消息(操作系统回调的窗口过程)
//1.设计窗口
WNDCLASS w;
w.cbClsExtra = 0; //对类额外的内存
w.cbWndExtra = 0; //对窗口额外的内存
w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置背景,声明:HGDIOBJ GetStockObject(int fnObject);
w.hCursor = LoadCursor(NULL, IDC_HAND);//设置程序光标,第一个参数为空则使用系统提供一些的光标
w.hIcon = LoadIcon(NULL, IDI_WARNING);//同上,IDC_HAND和IDI_WARNING光标样式
w.hInstance = hInstance; //应用程序实例句柄,传入WinMain第一个参数做形参
w.lpfnWndProc = returnwin; //回调函数,操作系统➡窗口过程,returnwin自定义回调函数
w.lpszClassName = TEXT("Win32oop"); //窗口类名称
w.lpszMenuName = NULL; //菜单名称
w.style = 0; //窗口显示的风格,0为默认的风格
//2.注册窗口
RegisterClass(&w); //注册一个窗口类
//3.创建窗口
HWND hwnd= CreateWindow(w.lpszClassName,
TEXT("Windows窗口"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
/*
HWND CreateWindow(lpClassName,lpWindowName,dwStyle,x,,,..);
lpClassName 类名
lpWindowName 标题名称
dwStyle 窗口风格
x 坐标
y 同上
nWidth 宽
nHeight 高
hWndParent 父窗口,没有就NULL
hMenu 菜单,没有就NULL
hInstance 实例句柄
lpParam 附加值,没有就NULL
*/
//4.显示和更新
ShowWindow(hwnd,SW_SHOWNORMAL); // 声明:ShowWindow(HWND hwnd,int nCmdShow); SW_SHOWNORMAL是正常显示窗口,也有最小化...显示
UpdateWindow(hwnd); //声明:UpdateWindow(HWND hwnd);
//5.通过循环取消息
MSG msg;
while(1)
{
if (GetMessage(&msg, NULL, 0, 0)==FALSE)
{
break;
}
TranslateMessage(&msg); //翻译消息,eg:组合按键消息的翻译以便实现组合按键功能
DispatchMessage(&msg); //分发消息
}
/*
MSG msg;
HWND hwnd 主窗口的句柄
UINT message 具体消息的名称
WPARAM wParam 附加消息-键盘的消息
LPARAM lParam 附加消息-鼠标的消息
DWORD time 消息产生的时间
POINT pt 鼠标消息-鼠标的坐标x,y
*/
/*
GetMessage(...)
LPMSGlpMsg 消息
HWND hWnd 捕获窗口,NULL则表示捕获所有的窗口
UINT wMsgFilterMin 最小过滤的消息,0代表捕获所以的消息
UINT wMsgFilterMax 最大过滤的消息,同上
*/
system("pause");
return 0;
}
End
~
记录留存
来源:CSDN
作者:嗨~辰
链接:https://blog.csdn.net/weixin_44228006/article/details/104095644