windows窗口底层实现(代码)

Posted 敲代码的Messi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

以上是关于windows窗口底层实现(代码)的主要内容,如果未能解决你的问题,请参考以下文章

MFC底层窗口实现

winform 程序 直接打开时 窗口大小正好 可最大化后就停靠在左上角了 能不能最大化后还是居中呢

sublime Text3在mac下设置窗口实现多标签

jsp点击右上角的X关闭子窗口刷新父窗口该如何实现呢?

怎样获取窗口左上角坐标

Tkinter小技巧:如何为窗口右上角的‘x’添加一个自定义的响应函数