windows窗口底层实现(代码)

#include <windows.h>

// 窗口过程
// CALLBACK 等同于WINAPI
LRESULT CALLBACK WindowProc(
	HWND hwnd,  // 消息所属的窗口句柄
	UINT uMsg,    //具体消息名称  WM_XXXX
	WPARAM wParam,   // 键盘消息
	LPARAM lParpm)   // 鼠标消息
{

	switch (uMsg)
	{
	case WM_CLOSE:// 点击关闭按钮,会触发该消息
	{
		//DestroyWindow(hwnd);// 该消息处理程序不会关闭 窗口,而是发送另一个消息 WM_DESTROY
	}
		break;
	case WM_DESTROY:
		PostQuitMessage(0); // 该消息处理函数 会让 getMessage=false;

	case	WM_LBUTTONDOWN : //鼠标左键按下
	{
		int x = LOWORD(lParpm);
		int y = HIWORD(lParpm);
		char buf[1024];
		wsprintf(buf, TEXT("%d , %d"), x, y);
		MessageBox(hwnd, buf, TEXT("鼠标左键按下"), MB_OK); //最后一个参数为按钮
		break;
	}
	default:
		break;
	}

	return DefWindowProc(hwnd, uMsg, wParam, lParpm);  // 使用默认处理函数
}

//程序入口函数 
//WINAPI 代表 __stdcall 参数的传递顺序,从右到左依次入栈
int WINAPI WinMain(
	_In_ HINSTANCE hInstance,// 应用程序实例句柄
	_In_opt_ HINSTANCE hPrevInstance, //上一个应用程序句柄,在win32中一般为nULL,不起作用
	_In_ LPSTR lpCmdLine,  //传递给应用程序的命令行程序,相当于 char* argv[]
	_In_ int nShowCmd) // 显示命令 最大化,最小化,正常
{
	// 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_HAND);  //程序左上角图标,参数用法和光标一样
		wc.hInstance = hInstance;//应用程序的实例句柄,传入WinMain形参即可
		wc.lpfnWndProc = WindowProc; //窗口过程回调函数
		wc.lpszClassName = TEXT("txjClass"); //指定窗口类名称
		wc.lpszMenuName = NULL; //菜单名称,不需要菜单,直接nULL
		wc.style = 0;  // 显示风格,0代表默认风格

	//2. 注册窗口类
		RegisterClass(&wc);

		//3. 创建窗口
		HWND  hWnd = CreateWindow(
			wc.lpszClassName,  //窗口类名字
			TEXT("测试"),      //窗口标题
			WS_OVERLAPPEDWINDOW,  //窗口风格	
			CW_USEDEFAULT, CW_USEDEFAULT,  //窗口x,y坐标,使用默认值
			CW_USEDEFAULT, CW_USEDEFAULT,  //窗口宽度,高度,使用默认值
			NULL,  	//无父窗口
			NULL, 	//无菜单
			hInstance, 	//应用程序实例句柄,为WinMain第1个形参
			NULL);	//附件信息,通常设置为NULL

	//4. 显示和更新
		ShowWindow(hWnd, SW_SHOWNORMAL);  // 创建窗口时的句柄,以默认方式显示
		UpdateWindow(hWnd);

	//5.循环取消息
		/*
		* typedef struct MSG {
	HWND        hwnd; 主窗口的句柄
	UINT        message; 具体消息名称 
	WPARAM      wParam;  附加消息 键盘消息
	LPARAM      lParam; 附加消息 鼠标消息(左右键)
	DWORD       time;  消息产生时间
	POINT       pt;  //附加消息  鼠标消息 (点)
		*/
		MSG msg;

		while (1)
		{
			/*
			GetMessageW(
	_Out_ LPMSG lpMsg,  消息结构体
	_In_opt_ HWND hWnd,  捕获窗口,NULL代表捕获所有窗口
	_In_ UINT wMsgFilterMin, 最小最大消息,都填0表示捕获所有消息
	_In_ UINT wMsgFilterMax);*/
			if(GetMessage(&msg,NULL,0,0)==FALSE)
				break;

			// 翻译消息
			TranslateMessage(&msg);

			//分发消息
			DispatchMessage(&msg);
		}

	//5.处理消息(窗口过程)

		return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值