最近在学习音视频处理,过程中有用到DirectX接口创建视频播放器,因此便找了相关的项目进行学习,前部分主要是关于win32api的介绍,代码学习源参考下面链接。
https://github.com/planetchili/hw3d

本部分是介绍关于界面的基础知识,首先是创建一个简单的win32界面,并接受界面上的消息。
工具是是visual2019
在这里插入图片描述

这里首先创建主函数,将其命名位directx_test.cpp
在这里插入图片描述
头文件#include <Windows.h>包含着所需要的基础定义
在创建窗口时首先要对相关的WNDCLASSEX结构体进行初始化,设定窗口相关的各种参数

const auto pclassname = "hw3dbutts";
	WNDCLASSEX wc = { 0 };
	wc.cbSize = sizeof(wc);
	wc.style = CS_OWNDC;
	wc.lpfnWndProc = DefWindowProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hinstance;
	wc.hIcon = nullptr;
	wc.hCursor = nullptr;
	wc.hbrBackground = (HBRUSH)COLOR_APPWORKSPACE;
	wc.lpszMenuName = nullptr;
	wc.lpszClassName = pclassname;
	wc.hIconSm = nullptr;

	RegisterClassEx(&wc);

这里可以查看参考手册对各个内容进行设定,下面简单的对主要部分进行介绍

wc.lpfnWndProc = DefWindowProc;这里添加的是消息处理函数,可以自定义函数,如果没有自定义函数则调用默认消息处理函数
wc.hInstance = hinstance;这里代表是的整个运行程序的实例,通过这个来区分不同的任务,因为在多线程中会存在多个任务,因此需要此句柄进行区别,它的本质就是一串数字。
wc.lpszClassName = lpclassname;这个是用来标识窗口,每个窗口有着不同的名称
其它的参数是窗口的基本属性,可以根据自己的爱好设置

设置好之后便可以通过RegisterClassEx(&wc);对窗口进行注册了

HWND hd;
	hd = CreateWindowExA(0,pclassname,"windows test",WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU,200,200,640,480,nullptr,nullptr
	,hinstance,nullptr);
	ShowWindow(hd, SW_SHOW);

接下来就是定义一个窗口句柄,并接收创建好的窗口
CreateWindowExA是创建窗口的函数

CreateWindowExA(
    _In_ DWORD dwExStyle,
    _In_opt_ LPCSTR lpClassName,
    _In_opt_ LPCSTR lpWindowName,
    _In_ DWORD dwStyle,
    _In_ int X,
    _In_ int Y,
    _In_ int nWidth,
    _In_ int nHeight,
    _In_opt_ HWND hWndParent,
    _In_opt_ HMENU hMenu,
    _In_opt_ HINSTANCE hInstance,
    _In_opt_ LPVOID lpParam);

dwExStyle是代表窗口的类型,下图为从谷歌可以查到不同参数代表的意义,输入0便是代表默认的格式,建议大家使用函数时多去手册中阅读,更加清晰他的完整用法。
在这里插入图片描述
lpWindowName是显示在窗口的标题
dwStyle代表窗口样式的设置
其余的可以逐步填写

通过函数ShowWindow(hd, SW_SHOW);可以显示创建的窗口

MSG msg;
	while (GetMessage(&msg, nullptr, 0, 0) > 0)
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);

	}

上述代码为消息的采集,窗口每次发生变化都会产生消息MSG,其为一个结构体,里面包含着消息的各种内容

typedef struct tagMSG {
  HWND   hwnd;
  UINT   message;
  WPARAM wParam;
  LPARAM lParam;
  DWORD  time;
  POINT  pt;
  DWORD  lPrivate;
} MSG, *PMSG, *NPMSG, *LPMSG;

其中wparam和lparam是最常用的,他们根据消息的不同代表着不同内容,例如在鼠标左键按下时lparam高位和低位分别储存着鼠标y和x的坐标。
TranslateMessage(&msg);
DispatchMessage(&msg);
这两个函数实现对消息的翻译和转发
整体代码如下,int CALLBACK WinMain为窗口输出的主函数

#include <Windows.h>
#include "WindowsMessageMap.h"

int CALLBACK WinMain( HINSTANCE hinstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
	
	const auto pclassname = "hw3dbutts";
	WNDCLASSEX wc = { 0 };
	wc.cbSize = sizeof(wc);
	wc.style = CS_OWNDC;
	wc.lpfnWndProc = DefWindowProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hinstance;
	wc.hIcon = nullptr;
	wc.hCursor = nullptr;
	wc.hbrBackground = (HBRUSH)COLOR_APPWORKSPACE;
	wc.lpszMenuName = nullptr;
	wc.lpszClassName = pclassname;
	wc.hIconSm = nullptr;
	RegisterClassEx(&wc);

	HWND hd;
	hd = CreateWindowExA(WS_EX_CLIENTEDGE,pclassname,"windows test",WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU,200,200,640,480,nullptr,nullptr
	,hinstance,nullptr);
	ShowWindow(hd, SW_SHOW);
	MSG msg;
	while (GetMessage(&msg, nullptr, 0, 0) > 0)
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);

	}
	return 0;
}

运行时应当设置输出,点击属性设置成窗口输出
在这里插入图片描述
如出现lpcstr报错应当设置多字节显示
在这里插入图片描述
之后便可以运行成功,下一篇将会介绍怎么实现自定消息处理和消息相关类的创建
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐