Forráskód Böngészése

feat: 添加键盘输入事件的监听

nicetry12138 1 éve
szülő
commit
38d9f3bf9b

BIN
图形学/DirectX学习/Image/005.png


BIN
图形学/DirectX学习/Image/006.png


+ 34 - 2
图形学/DirectX学习/README.md

@@ -2,7 +2,7 @@
 
 [教程地址](https://www.bilibili.com/video/BV1KC4y1Y7tc)
 
-## 创建项目
+## 创建窗口项目
 
 直接使用 `visual studio` 创建空白项目,并创建 `WinMain.cpp` 作为程序入口
 
@@ -279,4 +279,36 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
 
 ![](Image/004.png)
 
-> 输出为 69 结果生效
+> 输出为 69 结果生效
+
+这里使用 `PostQuitMessage(69)` 没有任何含义,单纯就是为了测试输出结果是否生效
+
+
+消息循环的类型有很多
+
+[list of windows Message](https://wiki.winehq.org/List_Of_Windows_Messages)
+
+大概四百种类型,每种消息的触发条件可能需要自行测试
+
+当然官网上也有一些消息类型的解释
+
+除了官网和谷歌之外,还可以通过运行代码测试,何种情况触发何种宏来确定宏的触发条件
+
+项目中使用 `WIndowsMessageMap` 来测试宏的触发,[代码地址](https://github.com/planetchili/hw3d/blob/master/hw3d/WindowsMessageMap.cpp)
+
+以键盘按键为例
+
+![](Image/005.png)
+
+一次键盘的按下和松开会触发三个消息:`WM_KEYDOWN`、`WM_CHAR` 和 `WM_KEYUP`。当按下 `D` 键时,`WM_KEYDOWN` 的 `wParam` 输出为 **0x0000044** ;当按下 `F` 键时,`wParam` 输出为 **0x0000046**,所以 `wParam` 可能存储了按下按钮相关信息
+
+- 关于 `WM_CHAR` 具体内容可以查[官方文档](https://learn.microsoft.com/zh-cn/windows/win32/inputdev/wm-char)
+- 关于 `lParam` 表示的虚拟按键,可以通过[官方文档](https://learn.microsoft.com/zh-cn/windows/win32/inputdev/virtual-key-codes) 获取更多信息
+
+以鼠标点击为例
+
+![](Image/006.png)
+
+主要的消息触发就是:`WM_LBUTTONDOWN` 和 `WM_LBUTOTNUP` 来表示鼠标左键的点击和松开,对应的鼠标右键点击就是 `WM_RBUTTONDOWN` 和 `WM_RBUTTONUP`,鼠标移动有 `WM_MOUSEMOVE`
+
+ 

+ 232 - 0
图形学/DirectX学习/src/hd3d/hd3d/Test/WindowsMessageMap.cpp

@@ -0,0 +1,232 @@
+/******************************************************************************************
+*	Chili Direct3D Engine																  *
+*	Copyright 2018 PlanetChili <http://www.planetchili.net>								  *
+*																						  *
+*	This file is part of Chili Direct3D Engine.											  *
+*																						  *
+*	Chili Direct3D Engine is free software: you can redistribute it and/or modify		  *
+*	it under the terms of the GNU General Public License as published by				  *
+*	the Free Software Foundation, either version 3 of the License, or					  *
+*	(at your option) any later version.													  *
+*																						  *
+*	The Chili Direct3D Engine is distributed in the hope that it will be useful,		  *
+*	but WITHOUT ANY WARRANTY; without even the implied warranty of						  *
+*	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the						  *
+*	GNU General Public License for more details.										  *
+*																						  *
+*	You should have received a copy of the GNU General Public License					  *
+*	along with The Chili Direct3D Engine.  If not, see <http://www.gnu.org/licenses/>.    *
+******************************************************************************************/
+#include "WindowsMessageMap.h"
+#include <string>
+#include <sstream>
+#include <iomanip>
+
+// secret messages
+#define WM_UAHDESTROYWINDOW 0x0090
+#define WM_UAHDRAWMENU 0x0091
+#define WM_UAHDRAWMENUITEM 0x0092
+#define WM_UAHINITMENU 0x0093
+#define WM_UAHMEASUREMENUITEM 0x0094
+#define WM_UAHNCPAINTMENUPOPUP 0x0095
+
+#define REGISTER_MESSAGE(msg){msg,#msg}
+
+WindowsMessageMap::WindowsMessageMap() noexcept
+	:
+	map({
+		REGISTER_MESSAGE(WM_CREATE),
+		REGISTER_MESSAGE(WM_DESTROY),
+		REGISTER_MESSAGE(WM_MOVE),
+		REGISTER_MESSAGE(WM_SIZE),
+		REGISTER_MESSAGE(WM_ACTIVATE),
+		REGISTER_MESSAGE(WM_SETFOCUS),
+		REGISTER_MESSAGE(WM_KILLFOCUS),
+		REGISTER_MESSAGE(WM_ENABLE),
+		REGISTER_MESSAGE(WM_SETREDRAW),
+		REGISTER_MESSAGE(WM_SETTEXT),
+		REGISTER_MESSAGE(WM_GETTEXT),
+		REGISTER_MESSAGE(WM_GETTEXTLENGTH),
+		REGISTER_MESSAGE(WM_PAINT),
+		REGISTER_MESSAGE(WM_CLOSE),
+		REGISTER_MESSAGE(WM_QUERYENDSESSION),
+		REGISTER_MESSAGE(WM_QUIT),
+		REGISTER_MESSAGE(WM_QUERYOPEN),
+		REGISTER_MESSAGE(WM_ERASEBKGND),
+		REGISTER_MESSAGE(WM_SYSCOLORCHANGE),
+		REGISTER_MESSAGE(WM_ENDSESSION),
+		REGISTER_MESSAGE(WM_SHOWWINDOW),
+		REGISTER_MESSAGE(WM_CTLCOLORMSGBOX),
+		REGISTER_MESSAGE(WM_CTLCOLOREDIT),
+		REGISTER_MESSAGE(WM_CTLCOLORLISTBOX),
+		REGISTER_MESSAGE(WM_CTLCOLORBTN),
+		REGISTER_MESSAGE(WM_CTLCOLORDLG),
+		REGISTER_MESSAGE(WM_CTLCOLORSCROLLBAR),
+		REGISTER_MESSAGE(WM_CTLCOLORSTATIC),
+		REGISTER_MESSAGE(WM_WININICHANGE),
+		REGISTER_MESSAGE(WM_SETTINGCHANGE),
+		REGISTER_MESSAGE(WM_DEVMODECHANGE),
+		REGISTER_MESSAGE(WM_ACTIVATEAPP),
+		REGISTER_MESSAGE(WM_FONTCHANGE),
+		REGISTER_MESSAGE(WM_TIMECHANGE),
+		REGISTER_MESSAGE(WM_CANCELMODE),
+		REGISTER_MESSAGE(WM_SETCURSOR),
+		REGISTER_MESSAGE(WM_MOUSEACTIVATE),
+		REGISTER_MESSAGE(WM_CHILDACTIVATE),
+		REGISTER_MESSAGE(WM_QUEUESYNC),
+		REGISTER_MESSAGE(WM_GETMINMAXINFO),
+		REGISTER_MESSAGE(WM_ICONERASEBKGND),
+		REGISTER_MESSAGE(WM_NEXTDLGCTL),
+		REGISTER_MESSAGE(WM_SPOOLERSTATUS),
+		REGISTER_MESSAGE(WM_DRAWITEM),
+		REGISTER_MESSAGE(WM_MEASUREITEM),
+		REGISTER_MESSAGE(WM_DELETEITEM),
+		REGISTER_MESSAGE(WM_VKEYTOITEM),
+		REGISTER_MESSAGE(WM_CHARTOITEM),
+		REGISTER_MESSAGE(WM_SETFONT),
+		REGISTER_MESSAGE(WM_GETFONT),
+		REGISTER_MESSAGE(WM_QUERYDRAGICON),
+		REGISTER_MESSAGE(WM_COMPAREITEM),
+		REGISTER_MESSAGE(WM_COMPACTING),
+		REGISTER_MESSAGE(WM_NCCREATE),
+		REGISTER_MESSAGE(WM_NCDESTROY),
+		REGISTER_MESSAGE(WM_NCCALCSIZE),
+		REGISTER_MESSAGE(WM_NCHITTEST),
+		REGISTER_MESSAGE(WM_NCPAINT),
+		REGISTER_MESSAGE(WM_NCACTIVATE),
+		REGISTER_MESSAGE(WM_GETDLGCODE),
+		REGISTER_MESSAGE(WM_NCMOUSEMOVE),
+		REGISTER_MESSAGE(WM_NCLBUTTONDOWN),
+		REGISTER_MESSAGE(WM_NCLBUTTONUP),
+		REGISTER_MESSAGE(WM_NCLBUTTONDBLCLK),
+		REGISTER_MESSAGE(WM_NCRBUTTONDOWN),
+		REGISTER_MESSAGE(WM_NCRBUTTONUP),
+		REGISTER_MESSAGE(WM_NCRBUTTONDBLCLK),
+		REGISTER_MESSAGE(WM_NCMBUTTONDOWN),
+		REGISTER_MESSAGE(WM_NCMBUTTONUP),
+		REGISTER_MESSAGE(WM_NCMBUTTONDBLCLK),
+		REGISTER_MESSAGE(WM_KEYDOWN),
+		REGISTER_MESSAGE(WM_KEYUP),
+		REGISTER_MESSAGE(WM_CHAR),
+		REGISTER_MESSAGE(WM_DEADCHAR),
+		REGISTER_MESSAGE(WM_SYSKEYDOWN),
+		REGISTER_MESSAGE(WM_SYSKEYUP),
+		REGISTER_MESSAGE(WM_SYSCHAR),
+		REGISTER_MESSAGE(WM_SYSDEADCHAR),
+		REGISTER_MESSAGE(WM_KEYLAST),
+		REGISTER_MESSAGE(WM_INITDIALOG),
+		REGISTER_MESSAGE(WM_COMMAND),
+		REGISTER_MESSAGE(WM_SYSCOMMAND),
+		REGISTER_MESSAGE(WM_TIMER),
+		REGISTER_MESSAGE(WM_HSCROLL),
+		REGISTER_MESSAGE(WM_VSCROLL),
+		REGISTER_MESSAGE(WM_INITMENU),
+		REGISTER_MESSAGE(WM_INITMENUPOPUP),
+		REGISTER_MESSAGE(WM_MENUSELECT),
+		REGISTER_MESSAGE(WM_MENUCHAR),
+		REGISTER_MESSAGE(WM_ENTERIDLE),
+		REGISTER_MESSAGE(WM_MOUSEWHEEL),
+		REGISTER_MESSAGE(WM_MOUSEMOVE),
+		REGISTER_MESSAGE(WM_LBUTTONDOWN),
+		REGISTER_MESSAGE(WM_LBUTTONUP),
+		REGISTER_MESSAGE(WM_LBUTTONDBLCLK),
+		REGISTER_MESSAGE(WM_RBUTTONDOWN),
+		REGISTER_MESSAGE(WM_RBUTTONUP),
+		REGISTER_MESSAGE(WM_RBUTTONDBLCLK),
+		REGISTER_MESSAGE(WM_MBUTTONDOWN),
+		REGISTER_MESSAGE(WM_MBUTTONUP),
+		REGISTER_MESSAGE(WM_MBUTTONDBLCLK),
+		REGISTER_MESSAGE(WM_PARENTNOTIFY),
+		REGISTER_MESSAGE(WM_MDICREATE),
+		REGISTER_MESSAGE(WM_MDIDESTROY),
+		REGISTER_MESSAGE(WM_MDIACTIVATE),
+		REGISTER_MESSAGE(WM_MDIRESTORE),
+		REGISTER_MESSAGE(WM_MDINEXT),
+		REGISTER_MESSAGE(WM_MDIMAXIMIZE),
+		REGISTER_MESSAGE(WM_MDITILE),
+		REGISTER_MESSAGE(WM_MDICASCADE),
+		REGISTER_MESSAGE(WM_MDIICONARRANGE),
+		REGISTER_MESSAGE(WM_MDIGETACTIVE),
+		REGISTER_MESSAGE(WM_MDISETMENU),
+		REGISTER_MESSAGE(WM_CUT),
+		REGISTER_MESSAGE(WM_COPYDATA),
+		REGISTER_MESSAGE(WM_COPY),
+		REGISTER_MESSAGE(WM_PASTE),
+		REGISTER_MESSAGE(WM_CLEAR),
+		REGISTER_MESSAGE(WM_UNDO),
+		REGISTER_MESSAGE(WM_RENDERFORMAT),
+		REGISTER_MESSAGE(WM_RENDERALLFORMATS),
+		REGISTER_MESSAGE(WM_DESTROYCLIPBOARD),
+		REGISTER_MESSAGE(WM_DRAWCLIPBOARD),
+		REGISTER_MESSAGE(WM_PAINTCLIPBOARD),
+		REGISTER_MESSAGE(WM_VSCROLLCLIPBOARD),
+		REGISTER_MESSAGE(WM_SIZECLIPBOARD),
+		REGISTER_MESSAGE(WM_ASKCBFORMATNAME),
+		REGISTER_MESSAGE(WM_CHANGECBCHAIN),
+		REGISTER_MESSAGE(WM_HSCROLLCLIPBOARD),
+		REGISTER_MESSAGE(WM_QUERYNEWPALETTE),
+		REGISTER_MESSAGE(WM_PALETTEISCHANGING),
+		REGISTER_MESSAGE(WM_PALETTECHANGED),
+		REGISTER_MESSAGE(WM_DROPFILES),
+		REGISTER_MESSAGE(WM_POWER),
+		REGISTER_MESSAGE(WM_WINDOWPOSCHANGED),
+		REGISTER_MESSAGE(WM_WINDOWPOSCHANGING),
+		REGISTER_MESSAGE(WM_HELP),
+		REGISTER_MESSAGE(WM_NOTIFY),
+		REGISTER_MESSAGE(WM_CONTEXTMENU),
+		REGISTER_MESSAGE(WM_TCARD),
+		REGISTER_MESSAGE(WM_MDIREFRESHMENU),
+		REGISTER_MESSAGE(WM_MOVING),
+		REGISTER_MESSAGE(WM_STYLECHANGED),
+		REGISTER_MESSAGE(WM_STYLECHANGING),
+		REGISTER_MESSAGE(WM_SIZING),
+		REGISTER_MESSAGE(WM_SETHOTKEY),
+		REGISTER_MESSAGE(WM_PRINT),
+		REGISTER_MESSAGE(WM_PRINTCLIENT),
+		REGISTER_MESSAGE(WM_POWERBROADCAST),
+		REGISTER_MESSAGE(WM_HOTKEY),
+		REGISTER_MESSAGE(WM_GETICON),
+		REGISTER_MESSAGE(WM_EXITMENULOOP),
+		REGISTER_MESSAGE(WM_ENTERMENULOOP),
+		REGISTER_MESSAGE(WM_DISPLAYCHANGE),
+		REGISTER_MESSAGE(WM_STYLECHANGED),
+		REGISTER_MESSAGE(WM_STYLECHANGING),
+		REGISTER_MESSAGE(WM_GETICON),
+		REGISTER_MESSAGE(WM_SETICON),
+		REGISTER_MESSAGE(WM_SIZING),
+		REGISTER_MESSAGE(WM_MOVING),
+		REGISTER_MESSAGE(WM_CAPTURECHANGED),
+		REGISTER_MESSAGE(WM_DEVICECHANGE),
+		REGISTER_MESSAGE(WM_PRINT),
+		REGISTER_MESSAGE(WM_PRINTCLIENT),
+		REGISTER_MESSAGE(WM_IME_SETCONTEXT),
+		REGISTER_MESSAGE(WM_IME_NOTIFY),
+		REGISTER_MESSAGE(WM_NCMOUSELEAVE),
+		REGISTER_MESSAGE(WM_EXITSIZEMOVE),
+		REGISTER_MESSAGE(WM_UAHDESTROYWINDOW),
+		REGISTER_MESSAGE(WM_DWMNCRENDERINGCHANGED),
+		REGISTER_MESSAGE(WM_ENTERSIZEMOVE),
+		})
+{}
+
+std::string WindowsMessageMap::operator()(DWORD msg, LPARAM lp, WPARAM wp) const noexcept
+{
+	constexpr int firstColWidth = 25;
+	const auto i = map.find(msg);
+
+	std::ostringstream oss;
+	if (i != map.end())
+	{
+		oss << std::left << std::setw(firstColWidth) << i->second << std::right;
+	}
+	else
+	{
+		std::ostringstream padss;
+		padss << "Unknown message: 0x" << std::hex << msg;
+		oss << std::left << std::setw(firstColWidth) << padss.str() << std::right;
+	}
+	oss << "   LP: 0x" << std::hex << std::setfill('0') << std::setw(8) << lp;
+	oss << "   WP: 0x" << std::hex << std::setfill('0') << std::setw(8) << wp << std::endl;
+
+	return oss.str();
+}

+ 32 - 0
图形学/DirectX学习/src/hd3d/hd3d/Test/WindowsMessageMap.h

@@ -0,0 +1,32 @@
+/******************************************************************************************
+*	Chili Direct3D Engine																  *
+*	Copyright 2018 PlanetChili <http://www.planetchili.net>								  *
+*																						  *
+*	This file is part of Chili Direct3D Engine.											  *
+*																						  *
+*	Chili Direct3D Engine is free software: you can redistribute it and/or modify		  *
+*	it under the terms of the GNU General Public License as published by				  *
+*	the Free Software Foundation, either version 3 of the License, or					  *
+*	(at your option) any later version.													  *
+*																						  *
+*	The Chili Direct3D Engine is distributed in the hope that it will be useful,		  *
+*	but WITHOUT ANY WARRANTY; without even the implied warranty of						  *
+*	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the						  *
+*	GNU General Public License for more details.										  *
+*																						  *
+*	You should have received a copy of the GNU General Public License					  *
+*	along with The Chili Direct3D Engine.  If not, see <http://www.gnu.org/licenses/>.    *
+******************************************************************************************/
+#pragma once
+#include <unordered_map>
+#include <Windows.h>
+#include <string>
+
+class WindowsMessageMap
+{
+public:
+	WindowsMessageMap() noexcept;
+	std::string operator()(DWORD msg, LPARAM lp, WPARAM wp) const noexcept;
+private:
+	std::unordered_map<DWORD, std::string> map;
+};

+ 25 - 6
图形学/DirectX学习/src/hd3d/hd3d/WinMain.cpp

@@ -1,11 +1,30 @@
 #include <Windows.h>
+#include <cstdlib>
+#include "Test/WindowsMessageMap.h"
+
+inline std::wstring to_wide_string(const std::string& input) //string to wstring
+{
+	std::wstring wide(input.size(), L'\0');
+	mbstowcs(&wide[0], input.c_str(), input.size());
+	return wide;
+}
 
 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
+	static WindowsMessageMap mm;
+
+	OutputDebugString(to_wide_string(mm(msg, lParam, wParam)).c_str());
+
 	switch (msg)
 	{
 	case WM_CLOSE:
 		PostQuitMessage(69);
 		break;
+	case WM_KEYDOWN:
+		if (wParam == 'F') {
+			// 当 F 键按下,修改窗�的 Title
+			SetWindowText(hWnd, L"Reset Title");
+		}
+		break;
 	default:
 		break;
 	}
@@ -19,7 +38,7 @@ int WINAPI WinMain(HINSTANCE hInstance,
 
 	const wchar_t* pClassName = L"hw3dbutts";
 
-	// ×¢²áÀà
+	// 注册类
 	WNDCLASSEX wc = { 0 };
 	wc.cbSize = sizeof(wc);
 	wc.style = CS_OWNDC;
@@ -35,7 +54,7 @@ int WINAPI WinMain(HINSTANCE hInstance,
 	wc.hIconSm = nullptr;
 	RegisterClassEx(&wc);
 
-	// ´´½¨´°¿Ú
+	// 创建窗�
 	HWND hWnd = CreateWindowEx(
 		WS_EX_RIGHTSCROLLBAR,
 		pClassName,
@@ -45,10 +64,10 @@ int WINAPI WinMain(HINSTANCE hInstance,
 		nullptr, nullptr, hInstance, nullptr
 	);
 
-	// չʾ´°¿Ú
+	// 展示窗�
 	ShowWindow(hWnd, SW_SHOW);
 
-	// ÏûÏ¢´¦Àí
+	// 消�处�
 	MSG msg;
 	BOOL gResult;
 
@@ -59,7 +78,7 @@ int WINAPI WinMain(HINSTANCE hInstance,
 	}
 
 	if (gResult < 0) {
-		return -1;	// ±íʾ³ÌÐò´íÎó
+		return -1;	// 表示程�错误
 	}
-	return msg.wParam;	// ·ñÔòÊä³öÎÒÃÇÆÚÍûµÄÖµ Ò²¾ÍÊÇ PostQuitMessage ´«ÈëµÄ²ÎÊýÖµ
+	return msg.wParam;	// �则输出我们期望的值 也就是 PostQuitMessage 传入的�数值
 }

+ 5 - 1
图形学/DirectX学习/src/hd3d/hd3d/hd3d.vcxproj

@@ -102,7 +102,7 @@
     <ClCompile>
       <WarningLevel>Level3</WarningLevel>
       <SDLCheck>true</SDLCheck>
-      <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ConformanceMode>true</ConformanceMode>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
       <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
@@ -137,8 +137,12 @@
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClCompile Include="Test\WindowsMessageMap.cpp" />
     <ClCompile Include="WinMain.cpp" />
   </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="Test\WindowsMessageMap.h" />
+  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>

+ 8 - 0
图形学/DirectX学习/src/hd3d/hd3d/hd3d.vcxproj.filters

@@ -18,5 +18,13 @@
     <ClCompile Include="WinMain.cpp">
       <Filter>源文件</Filter>
     </ClCompile>
+    <ClCompile Include="Test\WindowsMessageMap.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="Test\WindowsMessageMap.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
   </ItemGroup>
 </Project>

+ 3 - 1
图形学/DirectX学习/src/hd3d/hd3d/hd3d.vcxproj.user

@@ -1,4 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup />
+  <PropertyGroup>
+    <ShowAllFiles>true</ShowAllFiles>
+  </PropertyGroup>
 </Project>