C++ 事件处理器和消息传递接口《C++多线程编程实战》

敲完代码的时候,显示了一些错误;
MSVCRTD.lib(exe_main.obj) : error LNK2019: 无法解析的外部符号 _main,该符号在函数 “int __cdecl invoke_main(void)” (?invoke_main@@YAHXZ) 中被引用

然后在项目->属性->链接器->系统->子系统:把/SUBSYSTEM:CONSOLE改为/SUBSYSTEM:WINDOWS就正常了
在这里插入图片描述


#include <Windows.h> //处理一些视觉特效,例如窗口,控件,枚举,样式

//在创建一个应用程序之前,必须先声明一个窗口过程的原型才能在窗口结构中使用它
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

//WINAPI或stdcall意味着栈的清理工作由被调用函数来完成
//hThis是应用程序当前实例的句柄;hPrev是应用程序上一个实例的句柄;
//szCmdLine是应用程序的命令行,包括该程序的名称;iCmdShow控制如何显示窗口
int WINAPI WinMain(HINSTANCE hThis, HINSTANCE hPrev, LPSTR szCmdLine, int iCmdShow)
{
	UNREFERENCED_PARAMETER(hPrev); //告诉编译器不能使用某些参数,方便编译器进行一些额外的优化
	UNREFERENCED_PARAMETER(szCmdLine);

	WNDCLASSEX wndEx = { 0 }; //实例化窗口结构
	wndEx.cbClsExtra = 0; //实例化窗口类后分配的额外字节数
	wndEx.cbSize = sizeof(wndEx); //窗口结构的大小(字节为单位)
	wndEx.cbWndExtra = 0; //实例化窗口实例后分配的额外字节数
	wndEx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); //窗口类背景画刷的句柄
	wndEx.hCursor = LoadCursor(NULL, IDC_ARROW); //窗口类光标的句柄
	wndEx.hIcon = LoadIcon(NULL, IDI_APPLICATION); //窗口类图标的句柄
	wndEx.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //窗口类图标的句柄
	wndEx.hInstance = hThis; //窗口过程的实例句柄
	wndEx.lpfnWndProc = WndProc; //指向窗口过程的指针
	wndEx.lpszClassName = TEXT("GUIProject"); //指向以空字符结尾的字符串或原子的指针
	wndEx.lpszMenuName = NULL; //指向以空字符结尾的字符串的指针,该字符串指定了窗口类菜单的资源名
	wndEx.style = CS_HREDRAW | CS_VREDRAW;

	if (!RegisterClassEx(&wndEx))
	{
		return -1;
	}

	HWND hWnd = CreateWindow( wndEx.lpszClassName, TEXT("GUI Project"), WS_OVERLAPPEDWINDOW,
		                      200, 200, 400, 300, HWND_DESKTOP, NULL, hThis, 0);
	if (!hWnd)
	{
		return -1;
	}

	UpdateWindow(hWnd);

	ShowWindow(hWnd, iCmdShow); //设置指定窗口的显示状态
	MSG msg = { 0 }; //显示窗口消息

	while (GetMessage(&msg, NULL, NULL, NULL))
	{
		TranslateMessage(&msg); //把虚拟键消息翻译成字符消息
		DispatchMessage(&msg); //分发一条消息给窗口过程
	}

	DestroyWindow(hWnd);
	UnregisterClass(wndEx.lpszClassName, hThis); //注销窗口类,释放该类占用的内存
	return (int)msg.wParam; //从应用程序消息队列中返回一个成功推出代码或最后一个消息代码
}

//hWnd表示窗口标识,uMsg窗口消息代码(无符号整数),wParam和lParam传递应用程序定义的数据(64位长整型数)
//函数返回64位有符号长整型
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_CLOSE:
	{
		PostQuitMessage(0); //释放系统资源,并安全关闭该应用程序
		break;
	}
	default:
	{
		//处理应用程序未处理的窗口信息,函数确保每个消息都被处理
		return DefWindowProc(hWnd, uMsg, wParam, lParam); //默认窗口过程
	}
	}
	return 0;
}

运行结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值