C++底层窗口实现

代码如下:
可实现功能:
1、创建一个白色背景的窗口
2、按下任意键可以弹出一个窗口
3、点击窗口任意位置可以弹出窗口记录该点坐标
4、在(100,100)的位置上打印了个“Hello”

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

// CALLBACK 表示__stdcall,从左到右依次入栈,并且在函数返回前,清空堆栈
LRESULT CALLBACK WindowProc(
	 HWND hwnd,
	 UINT uMsg,
	 WPARAM wParam,
	 LPARAM lParam
	)
{

	switch (uMsg)
	{
	case WM_CLOSE:
		DestroyWindow(hwnd);//DestroyWindow发送另一个消息 WM_Destory
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;

	case WM_LBUTTONDOWN://鼠标左键按下
		{
			int xPos = LOWORD(lParam);
			int yPos = HIWORD(lParam);
			char buf[1024];
			wsprintf(buf, TEXT("x = %d,y = %d"), xPos, yPos);
			MessageBox(hwnd,buf, TEXT("鼠标左键按下"), MB_OK);//弹出消息框

			break;
		}
	case WM_KEYDOWN:
		{
			MessageBox(hwnd,TEXT("键盘按下"), TEXT("键盘按下"), MB_OK);//弹出消息框
			break;
		}
	case WM_PAINT://绘图
		{
			PAINTSTRUCT ps;//绘图结构体
			HDC hdc = BeginPaint(hwnd, &ps);
			TextOut(hdc, 100, 100, TEXT("Hello"), strlen("Hello"));
			EndPaint(hwnd, &ps);
			break;
		}
		
	}
	//返回值用默认的处理方式
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
//程序入口函数
int WINAPI WinMain(
	HINSTANCE hInstance, //应用程序句柄 
	HINSTANCE hPrevInstance, //上一个应用程序句柄,在win32环境下,参数一般为NULL,不起作用了
	LPSTR lpCmdLine, //char *agrv[]
	int nShowCmd)//显示命令,最大化,最小化 正常
{

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

	//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_ERROR);//设置图标,如果第一个参数为NULL,那么使用默认图标
	wc.hInstance = hInstance;//应用程序句柄,传入WinMain中的形参即可
	wc.lpfnWndProc = WindowProc;//回调函数 窗口过程
	wc.lpszClassName = TEXT("WINDOWS");//指定窗口类名称
	wc.lpszMenuName = NULL;//菜单名称
	wc.style = 0;//显示风格,如最大化最小化,0代表默认


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

	/*3、创建一个窗口
	lpClassName, 类名
	lpWindowName, 标题名
	dwStyle, WS_OVERLAPPEDWINDOW
	x, 显示坐标
	y, 
	nWidth, 宽高,CW_USEDEFAULT默认值
	nHeight, 
	hWndParent, 父窗口,NULL
	hMenu, 菜单,NULL
	hInstance, 实例句柄
	lpParam,附加值null
	*/

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

	//4、显示和更新
	ShowWindow(hwnd, SW_SHOWNORMAL);
	UpdateWindow(hwnd);

	//5、通过循环取消息
	/*
	HWND        hwnd;主窗口句柄
	UINT        message;具体的消息名称
	WPARAM      wParam;附加消息,键盘消息
	LPARAM      lParam;附加消息,鼠标消息
	DWORD       time;消息产生时间
	POINT       pt;附加消息,鼠标消息
	*/
	MSG msg;

	while (1)
	{
		/*
		_Out_ LPMSG lpMsg,消息
		_In_opt_ HWND hWnd,捕获窗口,填NULL代表捕获所有窗口
		_In_ UINT wMsgFilterMin,最小和最大的过滤消息,一般填0
		_In_ UINT wMsgFilterMax);填0代表捕获所有消息
		*/
		if (GetMessage(&msg, NULL, 0, 0) == FALSE)//代表点了x
		{
			break;
		}

		//翻译消息

		TranslateMessage(&msg);

		//不为false
		//分发消息
		DispatchMessage(&msg);


	}

	//6、处理窗口过程


	return 0;
}

注意,这里教一下,要创建CPP项目,然后一定要选择空项目去创建。然后将此代码粘贴上去。

PS:现在应该压根没有人会去使用这类纯手敲的底层窗口了。博主学习这个也是为了更好的理解窗口创建MFC,QT这类。暑假都快结束了,7月去电商公司实习了一下,8月开头玩了一周,现在要抓把劲了。和真正的大佬之间差距还是很大的。

《关于隔壁杭电的某位同年级大佬说着我已经听不懂的名词而感到特别焦虑这件事》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值