MFC入门(1.win32底层窗口实现方式)

目录

一、部分概念

  1. SDK:软件开发工具包(Software DevelopmentKit),一般都是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。

  2. API函数:Windows操作系统提供给应用程序编程的接口(Application Programming Interface).Windows应用程序API函数是通过C语言实现的,所有主要的Windows函数都在Windows.h头文件中进行了声明。Windows操作系统提供了1000多种API函数。

  3. 句柄(HANDLE)是Windows程序中一个重要的概念,使用也非常T频繁。在Windows程序中,有各种各样的资源(窗口、图标、光标,画刷等),系统在创建这些资源时会为它们分配内存,并返回标识这些资源的标识号,即句柄。在后面的内容中我们还会看到图标句柄(HICON)、光标句柄(HCURSOR)和画刷句柄(HBRUSH)。

  4. WinMain函数,当Windows操作系统启动一个程序时,它调用的就是该程序的WinMain函数(实际是由插入到可执行文件中的启动代码调用的)。WinMain是Windows程序的入口点函数,与D0S程序的入口点函数main的作用相同,当WinMain函数结束或返回时,Windows应用程序结束。

  5. 消息处理机制:

  6. 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;
}
posted @   满月择兽而明  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示