Windows APIã§ãŠã£ã³ããŠãåºã
æåã¯ãŠã£ã³ããŠãåºããŠã¿ãŸãããããŠã£ã³ããŠããªããšã²ãŒã ã§äœãèµ·ãã£ãŠãã®ãå šç¶ããããŸããããããVisual Studioã§C++ã®ç©ºã®ãããžã§ã¯ããäœã£ãŠãã ãããããããSource.cppãšãããã¡ã€ã«ãäœã£ãŠãã ãããå¥ã«Source.cppãšããååãããªããŠãããã§ããã©ãã
// Source.cpp int main() { return 0; }
ãããC++ã«ãããæå°ã®ã³ãŒãã§ãããããã®main颿°ããšã³ããªãŒãã€ã³ããšèšã£ãŠããã°ã©ã ã®ã¹ã¿ãŒãå°ç¹ã§ããç¥ããªã人ã®çºã«å šéšèª¬æããŠãããŸããïŒå®è¡ãããã³ã³ãœãŒã«ãŠã£ã³ããŠãåºãŸãã
ããŠãWindows APIã§ã¯CreateWindowã§ãŠã£ã³ããŠãäœã£ãŠShowWindowã§ãŠã£ã³ããŠã衚瀺ãããšãŠã£ã³ããŠãåºããŸãããã£ãããããšã
// Source.cpp #define OEMRESOURCE #include <windows.h> int main() { HINSTANCE instance = GetModuleHandleW(nullptr); WNDCLASSW windowClass = {}; windowClass.lpfnWndProc = DefWindowProcW; windowClass.hInstance = instance; windowClass.hCursor = (HCURSOR)LoadImageW(nullptr, MAKEINTRESOURCEW(OCR_NORMAL), IMAGE_CURSOR, 0, 0, LR_SHARED); windowClass.lpszClassName = L"GameLib"; RegisterClassW(&windowClass); HWND handle = CreateWindowW(L"GameLib", L"GameLib", WS_OVERLAPPEDWINDOW, 0, 0, 640, 480, nullptr, nullptr, instance, nullptr); ShowWindow(handle, SW_SHOWNORMAL); return 0; }
å ·äœçã«ã¯ãããªæãã®ã³ãŒããæžããŸãããžãããæžãã®ãããããã«æã£ãšãã°å€§äžå€«ã§ããã¶ã£ã¡ããç§ãå®åæãããã«ããèããŠãŸããããå šéšèŠããŠãªãã®ã§æžããšãã¯èªåã®éå»ã®ã³ãŒããšãèŠãŠæžããŸããWindows APIã䜿ãã®ã§Windows.hãã€ã³ã¯ã«ãŒãããŸãã#define OEMRESOURCEãšããã®ã¯ã12è¡ç®ã®OCR_NORMALã䜿ããããã«ããããã®ãã®ã§ãã
ãããŠã¡ã€ã³ã«ãŒããšãããã®ãæžããŸããã²ãŒã ã«ãŒããšèšã£ãããããŸããã¡ã€ã³ã«ãŒãããªããšãŠã£ã³ããŠãåºããšåæã«ã¢ããªã±ãŒã·ã§ã³ãçµãã£ãŠãŠã£ã³ããŠãæ¶ããŠããŸããŸãã
⊠ShowWindow(handle, SW_SHOWNORMAL); while (true) { MSG message = {}; if (PeekMessageW(&message, nullptr, 0, 0, PM_REMOVE)) { if (message.message == WM_QUIT) break; TranslateMessage(&message); DispatchMessageW(&message); } else { // ããã«ã²ãŒã ã®åŠçãæžããŠãã } } return 0; }
ShowWindowã®äžã«ã¡ã€ã³ã«ãŒãã®äžã«ã¡ã€ã³ã«ãŒããæžããŸãããreturn 0;ã¯äžçªæåŸã®è¡ã«ãªããšãã¡ã§ããã¡ã€ã³ã«ãŒãã®åã«return 0;ããããšã¡ã€ã³ã«ãŒãã®åã«ã¢ããªã±ãŒã·ã§ã³ãçµããã®ã§æå³ãç¡ãã§ããPeekMessageWãšãTranslateMessageãšãDispatchMessageWã¯ãŠã£ã³ããŠã¡ãã»ãŒãžã®åŠçã§ãããããããªããšãŠã£ã³ããŠãåããããã倧ãããå€ãããåºæ¥ãŸãããå®è¡ããŠã¿ãŸãããïŒãŠã£ã³ããŠåºãŸãããïŒ
ã³ã³ãœãŒã«ãŠã£ã³ããŠãæ¶ãæ¹æ³ããããŸããå®ã¯Windowsã®ã¢ããªã±ãŒã·ã§ã³å°çšã®ãšã³ããªãŒãã€ã³ããšãããã®ããã£ãŠãint main()ãint APIENTRY wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int)ã«å€ããŠå®è¡ãããšæ®éã®ãŠã£ã³ããŠã ãåºããŸãããã®WinMainãšããã®ãWindowså°çšã®ãšã³ããªãŒãã€ã³ãã§ãã
ããŠããŠã£ã³ããŠã®ãµã€ãºãå¹ 640ãã¯ã»ã«ãé«ã480ãã¯ã»ã«ã«ããŠããã§ãããå®ã¯åºæ¥ãŠãªããã§ãã640x480ãšãã颚ã«ããŠããŸããšããŠã£ã³ããŠã®ã¿ã€ãã«ããŒãšããŠã£ã³ããŠã®æ ãšããå«ããŠã640x480ã«ãªã£ãŠããŸããã§ããããã«ããŠã£ã³ããŠã®äœçœ®ãå·Šäžã«ãªã£ãŠããŸã£ãŠãŸããããäžå€®ã«ããã»ããè¯ãã§ããSetWindowPosã䜿ãã°ãŠã£ã³ããŠã®äœçœ®ãšå€§ãããå€ããããŸãã
⊠HWND handle = CreateWindowW(L"GameLib", L"GameLib", WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, nullptr, nullptr, instance, nullptr); RECT windowRect = {}; RECT clientRect = {}; GetWindowRect(handle, &windowRect); GetClientRect(handle, &clientRect); int w = (windowRect.right - windowRect.left) - (clientRect.right - clientRect.left) + 640; int h = (windowRect.bottom - windowRect.top) - (clientRect.bottom - clientRect.top) + 480; int x = (GetSystemMetrics(SM_CXSCREEN) - w) / 2; int y = (GetSystemMetrics(SM_CYSCREEN) - h) / 2; SetWindowPos(handle, nullptr, x, y, w, h, SWP_FRAMECHANGED); ShowWindow(handle, SW_SHOWNORMAL); âŠ
ãããªæãã§CreateWindowWã®äžã«æžããŸãããäœçœ®ãšå€§ããã®èšç®ãã¡ãã£ãšãããããã§ãããCreateWindowWã«æž¡ããŠãã0, 0, 640, 480ã¯0, 0, 0, 0ã«å€ããŠãŸãã
ããšã¯ãŠã£ã³ããŠããã·ãŒãžã£ãŒãæžããŠãããŸããããä»ã¯ãŠã£ã³ããŠã®å³äžã®ïŒžãã¿ã³ãæŒããŠãã¢ããªã±ãŒã·ã§ã³ãçµãããŸããããŠã£ã³ããŠããã·ãŒãžã£ãæžãã°ãããæ²»ããŸãã
LRESULT CALLBACK ProceedMessage(HWND window, UINT message, WPARAM wParam, LPARAM lParam) { if (message == WM_DESTROY) PostQuitMessage(0); return DefWindowProcW(window, message, wParam, lParam); }
ãããã颿°ãæžããŠwindowClass.lpfnWndProc = DefWindowProcW;ãwindowClass.lpfnWndProc = ProceedMessage;ã«ããã°åºæ¥ãŸããDefWindowProcWã¯ããã©ã«ãã§çšæããŠãããŠã£ã³ããŠããã·ãŒãžã£ã§ãããããšã¯å¥ã«èªåã§ãŠã£ã³ããŠããã·ãŒãžã£ãçšæã§ããŸãããããäžã®é¢æ°ã§ããèªåã§ãŠã£ã³ããŠããã·ãŒãžã£ãæžããšäŸãã°ãŠã£ã³ããŠã®å€§ãããå€ãã£ãããããããšããŠã£ã³ããŠãæ¶ãããã©ããããšãèªåã§åŠçã远å åºæ¥ãŸãã
ã§ã¯ãä»ãŸã§ã®ã³ãŒããã¯ã©ã¹ã«ããŠã¿ãŸããããWindow.hppãšWindow.cppãšãããã¡ã€ã«ãäœã£ãŠãã ããã
// Window.hpp #pragma once #define OEMRESOURCE #include <windows.h> #include <directxmath.h> class Window { public: static void Initialize(); static HWND GetHandle(); static DirectX::XMINT2 GetSize(); static void SetSize(int width, int height); static bool Update(); private: static const wchar_t* name; static HWND handle; static LRESULT CALLBACK ProceedMessage(HWND window, UINT message, WPARAM wParam, LPARAM lParam); };
// Window.cpp #include "Window.hpp" const wchar_t* Window::name = L"GameLib"; HWND Window::handle; void Window::Initialize() { HINSTANCE instance = GetModuleHandleW(nullptr); WNDCLASSW windowClass = {}; windowClass.lpfnWndProc = ProceedMessage; windowClass.hInstance = instance; windowClass.hCursor = (HCURSOR)LoadImageW(nullptr, MAKEINTRESOURCEW(OCR_NORMAL), IMAGE_CURSOR, 0, 0, LR_SHARED); windowClass.lpszClassName = name; RegisterClassW(&windowClass); handle = CreateWindowW(name, name, WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, nullptr, nullptr, instance, nullptr); SetSize(640, 480); ShowWindow(handle, SW_SHOWNORMAL); } HWND Window::GetHandle() { return handle; } DirectX::XMINT2 Window::GetSize() { RECT clientRect = {}; GetClientRect(handle, &clientRect); return DirectX::XMINT2(clientRect.right - clientRect.left, clientRect.bottom - clientRect.top); } void Window::SetSize(int width, int height) { RECT windowRect = {}; RECT clientRect = {}; GetWindowRect(handle, &windowRect); GetClientRect(handle, &clientRect); int w = (windowRect.right - windowRect.left) - (clientRect.right - clientRect.left) + width; int h = (windowRect.bottom - windowRect.top) - (clientRect.bottom - clientRect.top) + height; int x = (GetSystemMetrics(SM_CXSCREEN) - w) / 2; int y = (GetSystemMetrics(SM_CYSCREEN) - h) / 2; SetWindowPos(handle, nullptr, x, y, w, h, SWP_FRAMECHANGED); } bool Window::Update() { MSG message = {}; while (PeekMessageW(&message, nullptr, 0, 0, PM_REMOVE)) { if (message.message == WM_QUIT) return false; TranslateMessage(&message); DispatchMessageW(&message); } return true; } LRESULT CALLBACK Window::ProceedMessage(HWND window, UINT message, WPARAM wParam, LPARAM lParam) { if (message == WM_DESTROY) PostQuitMessage(0); return DefWindowProcW(window, message, wParam, lParam); }
// Source.cpp #include "Window.hpp" int APIENTRY wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int) { Window::Initialize(); while (Window::Update()) { // ããã«ã²ãŒã ã®åŠçãæžããŠãã } return 0; }
ãããªæãã§ã¯ã©ã¹åããŠã¿ãŸãããInitialize颿°ã§ãŠã£ã³ããŠåºããŠãUpdate颿°ãã¡ã€ã³ã«ãŒããåããŠãŸããGetHandleãšãGetSizeã¯ä»ã®ãšããã§äœ¿ããããªã®ã§æžããŠãããŸããã ããŠã³ããŒãããã人ã¯GitHubã«ãµã³ãã«ãªããžããªãããã®ã§ããã²ããŠã³ããŒãããŠãã ããã </directxmath.h></windows.h></windows.h>










