MFC基础知识

本文介绍了Windows应用程序中的窗口概念,包括窗口的基本组成元素如标题栏、菜单栏等。同时,详细讲解了句柄的概念,它是标识Windows资源的唯一标识。文章以WinMain函数作为程序入口,阐述了创建窗口、消息循环和窗口过程函数的步骤,展示了如何响应键盘和鼠标消息。通过示例代码,解释了创建和管理窗口的基本流程。
摘要由CSDN通过智能技术生成

窗口和句柄

窗口是Windows应用程序中一个非常重要的元素,一个Windows应用程序至少要有一个窗口,称为主窗口。窗口是屏幕上的一块矩形区域,是Windows应用程序与用户进行交互的接口。利用窗口可以接收用户的输入、以及显示输出。

一个应用程序窗口通常都包含标题栏、菜单栏、系统菜单、最小化框、最大化框、可调边框,有的还有滚动条。如下图:

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

WinMain函数

当Windows操作系统启动一个程序时,它调用的就是该程序的WinMain函数(实际是由插入到可执行文件中的启动代码调用的)。

WinMain是 Windows程序的入口点函数,与DOS程序的入口点函数main的作用相同,当WinMain函数结束或返回时,Windows应用程序结束

windows编程模型

一个完整的Win32程序(#include<windows.h>),该程序实现的功能是创建一个窗口,并在该窗口中响应键盘及鼠标消息,程序的实现步骤为:

1)WinMain函数的定义

2)创建一个窗口。

3)进行消息循环。

4)编写窗口过程函数。

#include <windows.h>  //底层实现窗口头文件

//6
LRESULT CALLBACK WindowProc(
	HWND hwnd,
	UINT uMsg,
	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;
		int yPos;*/

		MessageBoxW(hwnd,TEXT("HEELO"),TEXT("鼠标按下"),MB_OK);
		break;
	default:
		break;
	}

	//默认方式处理
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

//函数入口
//WINAPI 代表_stdcall 参数传递顺序从右往左依次入栈,并且在函数返回前自动清空堆栈内容
//WinMain 函数入口
//HINSTANCE hInstance  应用程序的实例句柄
//HINSTANCE hPrevInstance  前一个应用程序的实例句柄,在win32环境下,基本值NULL,不起作用
//LPSTR lpCmdLine 命令行参数
//int nShowCmd 窗口显示命令 最大化最小化
int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nShowCmd)
{
	//实现底层窗口,6个步骤

	//1、设计窗口类
	//2、注册窗口类
	//3、创建窗口类
	//4、更新窗口
	//5、通过循环取消息
	//6、处理消息(窗口过程)

	//1
	WNDCLASS wc;
	wc.cbClsExtra = 0;//类额外的内存,通常为0
	wc.cbWndExtra = 0;//窗口额外的内存,通常为0
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);  //设置背景
	wc.hCursor = LoadCursor(NULL, IDC_HAND);//设置光标,如果第一个参数为null,代表使用系统提供的默认光标
	wc.hIcon = LoadIcon(NULL, IDI_WARNING);//设置图标
	wc.hInstance = hInstance; //当前实例句柄,winmain函数中形参即可
	wc.lpfnWndProc = WindowProc;//窗口过程函数,回调函数
	wc.lpszClassName = TEXT("WINDOW");//指定窗口类名
	wc.lpszMenuName = NULL;//菜单名
	wc.style = 0;//默认窗口风格

	//2
	RegisterClass(&wc);

	//3
	HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("TEXT WINDOW"), WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

	//4
	ShowWindow(hwnd, SW_SHOWNORMAL);
	UpdateWindow(hwnd);

	//5
	MSG msg;
	while (1)
	{
		if (GetMessage(&msg, NULL, 0, 0) == FALSE)	break;
		//翻译消息
		TranslateMessage(&msg);
		//分发消息
		DispatchMessage(&msg);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coder_Alger

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值