系统相关
首页 > 系统相关> > 《WINDOWS游戏编程之从零开始》第三章学习笔记

《WINDOWS游戏编程之从零开始》第三章学习笔记

作者:互联网

个人整理的笔记,比较杂乱,可能并不是很适合阅读:)


  1. MessageBox 函数

    其四个参数分别为:

    HWND 类型的 hWnd, 表示窗口句柄

    HWND 是什么类型?简单说就是给窗口分配的句柄。(废话啊啊啊)总之就用其代指一个窗口

    LPCTSTR 类型的 lpText,表示消息内容

    LPCTSTR 类型的 lpCaption,表示消息框标题内容

    UINT 类型的 uType,表示消息窗口的样式

  2. PlaySound 函数

    其三个参数分别为:

    LPCTSTR 类型的 pszSound,指定声音源

    HMODULE 类型的 hmod,资源可执行文件的句柄(暂时不清楚是个什么句柄)

    DOWRD 类型的 fdwSound,控制声音播放. 一些常用的标识:

在这里插入图片描述

模仿示例程序时的坑

注意 Visual Studio 中要改项目属性,保证链接器子系统设置为 Windows 不要设置为 Console,这样才是一个 Windows 文件。否则 WinMain 不会正确运行

在这里插入图片描述

(使用 Console 当然可以通过控制台加载出一样的效果,但是调试和运行都会多一个控制台,当然是客户端不能需要的东西)

例如,MessageBox 的 uType 设为 0,就会加载默认的窗口样式:

在这里插入图片描述

3.6

  1. MSG结构体

    消息用MSG表示.

  2. 消息队列.

3.7

窗口创建四部曲:

3.11

照着写的代码,贴出的与书中不同,有一些修改和自己的理解,注释中给出了.

//-------------------【程序说明】-------------------
// 程序名称:GameCore
// Learn from 浅墨 orz
// 2022 年 2 月 Created by Eke
// 描述:跟着浅墨一起学做一个最简单的Windows窗口程序!
//--------------------------------------------------

//-----------------【头文件部分】---------------------
// 描述:程序依赖的头文件
//--------------------------------------------------
#include <Windows.h>

//-----------------【宏定义部分】--------------------
// 描述:定义辅助宏
//--------------------------------------------------
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
constexpr auto WINDOW_TITLE = L"准备好,我来帮你了朋友!"; // 新版本中使用constexpr比define更安全.

//----------------【全局函数声明部分】----------------
// 描述:全局函数声明.
// 上为窗口过程函数
//--------------------------------------------------
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);


//----------------【WinMain( )函数】-----------------
// 描述:程序主入口
//--------------------------------------------------
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow) // 需要将 _In_, _In_opt_ 依照函数原型加上,否则会报警告. 为啥呢?
{
	// 四部曲
	// 1. Design (Oh 11 paras!)
	WNDCLASSEX wndClass = { 0 }; // 定义一个窗口类
	wndClass.cbSize = sizeof(WNDCLASSEX);
	wndClass.style = CS_HREDRAW | CS_VREDRAW;
	wndClass.lpfnWndProc = WndProc;
	wndClass.cbClsExtra = 0;
	wndClass.cbWndExtra = 0;
	wndClass.hInstance = hInstance;
	wndClass.hIcon = (HICON)::LoadImage(NULL, L"favicon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);
	wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
	wndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // 试了下没有RED\BLUE 的brush,qwq
	wndClass.lpszMenuName = NULL;
	wndClass.lpszClassName = L"ForTheDreamOfGameDevelop";
	
	// 2. Register
	if (!RegisterClassEx(&wndClass)) return -1;

	// 3. Create
	HWND hwnd = CreateWindow(L"ForTheDreamOfGameDevelop", WINDOW_TITLE,
		WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL);

	// 4. Move, show and update
	MoveWindow(hwnd, 250, 80, WINDOW_WIDTH, WINDOW_HEIGHT, true);
	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);

	// 5. msg loop
	MSG msg = { 0 };
	while (msg.message != WM_QUIT);
	{
		if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
	// 6. unregister
	UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance);
	return 0;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_PAINT:
		ValidateRect(hwnd, NULL);
		break;
	case WM_KEYDOWN:
		if (wParam == VK_ESCAPE) DestroyWindow(hwnd);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hwnd, message, wParam, lParam);
	}
	return 0;
}

运行效果:

在这里插入图片描述
总之就是一个很简单的窗体啦!

总结

第一次以笔记的形式把学习的东西记录下来。之前学过一些东西,总因为后来很久没接触逐渐忘了,重新学又需要整理很多资料重新看,不妨将学习过程写成笔记,方便将很久没用的知识捡回来,也能更好地综合我的学习内容。

标签:从零开始,窗口,函数,WINDOWS,hwnd,编程,wndClass,msg,NULL
来源: https://blog.csdn.net/qq_39561693/article/details/122780154