MFC入门(1.win32底层窗口实现方式)
目录
- 部分概念
- 项目创建流程(图片形式)
- 代码实现(Visual studio 2022)
- 学习网址:https://www.bilibili.com/video/BV1JW41147NX/?p=2&spm_id_from=pageDriver&vd_source=932c86755bc43e9131a671b1314f804d
一、部分概念
-
SDK:软件开发工具包(Software DevelopmentKit),一般都是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。
-
API函数:Windows操作系统提供给应用程序编程的接口(Application Programming Interface).Windows应用程序API函数是通过C语言实现的,所有主要的Windows函数都在Windows.h头文件中进行了声明。Windows操作系统提供了1000多种API函数。
-
句柄(HANDLE)是Windows程序中一个重要的概念,使用也非常T频繁。在Windows程序中,有各种各样的资源(窗口、图标、光标,画刷等),系统在创建这些资源时会为它们分配内存,并返回标识这些资源的标识号,即句柄。在后面的内容中我们还会看到图标句柄(HICON)、光标句柄(HCURSOR)和画刷句柄(HBRUSH)。
-
WinMain函数,当Windows操作系统启动一个程序时,它调用的就是该程序的WinMain函数(实际是由插入到可执行文件中的启动代码调用的)。WinMain是Windows程序的入口点函数,与D0S程序的入口点函数main的作用相同,当WinMain函数结束或返回时,Windows应用程序结束。
-
消息处理机制:
-
Windows编程模型
一个完整的Win32程序(#include<windows.h>),该程序实现的功能是创建一个窗口,并在该窗口中响应键盘及鼠标消息,程序的实现步骤为:
1)WinMain函数的定义
2)创建一个窗口
3)进行消息循环
4)编写窗口过程函数
二、项目创建流程(图片形式)
三、代码实现(Visual studio 2022)
#include<Windows.h>//底层实现窗口的头文件
//6、窗口过程/窗口处理
//用于处理发送到窗口的消息的回调函数
LRESULT CALLBACK WindowProc(
HWND hwnd,//消息的所属窗口句柄,"hwnd"是局部变量,每个函数里的HWND声明的变量不一样
UINT uMsg,//消息名称,以WM_XXX为例
WPARAM wParam,//键盘附加消息
LPARAM lParam//鼠标附加消息
)
{
switch (uMsg)
{
case WM_CLOSE:
{
DestroyWindow(hwnd); //同时会发送一个WM_DESTROY消息
break;
}
case WM_DESTROY: //真正结束应用程序进程的分支
{
PostQuitMessage(0);
break;
}
//case WM_LBUTTONDOWN: //鼠标左键按下,窗口打印文本
//{
// int xPos = LOWORD(lParam);
// int yPos = HIWORD(lParam);
// MessageBoxW(hwnd, TEXT("叽里呱啦"), TEXT("窗口2"), MB_OKCANCEL);//"MB_OK,默认,用户交互按钮类型","MB_OKCANCEL"
// break;
//}
case WM_LBUTTONDOWN: //鼠标左键按下,窗口打印鼠标坐标
{
int xPos = LOWORD(lParam);
int yPos = HIWORD(lParam);
char pos[100];
wsprintf(pos, TEXT("x = %d, y = %d"), xPos, yPos);
MessageBoxW(hwnd, pos, TEXT("窗口2"), MB_OKCANCEL);//"MB_OK,默认,用户交互按钮类型","MB_OKCANCEL"
break;
}
case WM_KEYDOWN: //键盘响应
{
MessageBox(hwnd, TEXT("键盘按下"), TEXT("窗口3"), MB_OKCANCEL);
break;
}
case WM_PAINT: //绘图事件
{
PAINTSTRUCT pt;
HDC hdc = BeginPaint(hwnd, &pt);
TextOut(hdc, 100, 100, TEXT("hello nihao"), strlen("hello nihao"));
EndPaint(hwnd, &pt);
break;
}
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
//程序入口函数
int WINAPI WinMain(
HINSTANCE hIt,//应用程序实例句柄
HINSTANCE hPrevInstance,//上一个应用程序句柄,在win32环境下,参数一般为MULL,不起作用了
LPSTR lpCmdLine,//char * argv[]
int nShowCmd)//显示命令最大化、最小化正常
{
//1、设计窗口
//2、注册窗口
//3、创建窗口
//4、显示和更新
//5、通过循环取消息
//6、处理消息(窗口过程)
//1、设计窗口
WNDCLASS wc;
wc.cbClsExtra = 0; //类的额外内存
wc.cbWndExtra = 0; //窗口的额外内存
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置白色窗口背景,(HBRUSH用于强制转换输出类型)
wc.hCursor = LoadCursor(NULL, IDC_HAND); //设置光标,NUll表示系统默认光标,IDC_HAND查询MSDN文档可知,是抓手光标
wc.hIcon = LoadIcon(NULL,IDI_ERROR); //窗口左上角的图标
wc.hInstance = hIt; //应用程序的实例句柄,就是上面winmain主函数创建的实例
wc.lpfnWndProc = WindowProc; //消息回调函数,自己创建函数
wc.lpszClassName = TEXT("win");//指定窗口类名称
wc.lpszMenuName = NULL;//菜单名称
wc.style = 0;//显示风格 0代表默认风格,最大化最小化关闭
//2、注册窗口
RegisterClass(&wc);
//3、创建窗口
/*CreateWindow的参数:
lpClassName,类名
lpWindowName,标题名
dwStyle,WS_OVERLAPPEDWINDOW混合风格,
x,显示坐标,CW_USEDEFAULT默认值
y,
nWidth,宽高
nHeight,
rWndParent,父窗口NULL
hMenu,菜单NULL
hInstance,实例句柄hInstance
lpParam附加值NULL
*/
HWND mwnd = CreateWindow(wc.lpszClassName, TEXT("我的窗口"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hIt, NULL);
//4、显示和更新窗口
ShowWindow(mwnd, SW_NORMAL);
UpdateWindow(mwnd);
//5、通过循环取消息
/*MSG结构体的参数:
HWND hwnd; 主窗口句柄
UINT message; 具体消息名称
WPARAM wParam; 键盘附加消息
LPARAM lParam; 鼠标按键反应的附加消息,左键还是右键
DWORD time; 消息产生的时间,触发到反应,自动的
POINT pt; 鼠标坐标位置的附加消息
DWORD lPrivate;
*/
MSG msg;
while (1)
{
/*GetMessageA()的参数:
LPMSG lpMsg, 上面创建的消息"msg",但是"LP"通常表示指针的意思,所以具体写参数要写"&msg"
HWND hWnd, 不是填主窗口句柄,填NULL,默认表示捕获所有窗口的消息
UINT wMsgFilterMin, 都填0,表示捕获所有消息
UINT wMsgFilterMax,都填0,表示捕获所有消息
*/
if (GetMessage(&msg, NULL, 0, 0) == FALSE)
{
break;
}
//翻译消息,例如组合键ctrl+c这种
TranslateMessage(&msg);
//分发消息
DispatchMessage(&msg);
//6、窗口过程/窗口处理
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)