sculpto
windows_window.cpp
Go to the documentation of this file.
1/*!****************************************************************//*!*
2 * \file window.cpp
3 * \brief Window class realisation module.
4 *
5 * \author Sabitov Kirill
6 * \date 18 June 2022
7 *********************************************************************/
8
9#include "sclpch.h"
10
11#include <backends/imgui_impl_win32.h>
12
13#include "windows_window.h"
14
15void scl::windows_window::Create()
16{
17 // Create window class
18 WNDCLASS window_class {};
19
20 const std::string window_class_name = Data.Title + "Window Class Name.";
21 window_class.lpszClassName = window_class_name.c_str();
22 window_class.lpszMenuName = nullptr;
23 window_class.style = CS_VREDRAW | CS_HREDRAW;
24
25 window_class.hbrBackground = (HBRUSH)COLOR_WINDOW;
26 window_class.hCursor = LoadCursor(InstanceHandle, IDC_CROSS);
27 window_class.hIcon = LoadIcon(InstanceHandle, IDI_APPLICATION);
28 window_class.hInstance = InstanceHandle;
29
30 window_class.cbClsExtra = 0;
31 window_class.cbWndExtra = sizeof(windows_window *);
32 window_class.lpfnWndProc = WinProc;
33
34 // Register window class, check if succsess
35 SCL_CORE_ASSERT(RegisterClass(&window_class), "Window class creation failed.");
36
37 // Create window
38 Handle = CreateWindow(
39 window_class_name.c_str(), Data.Title.c_str(),
40 WS_OVERLAPPEDWINDOW | WM_SHOWWINDOW,
41 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
42 nullptr, nullptr, InstanceHandle, reinterpret_cast<void *>(this)
43 );
44 ShowWindow(Handle, 1);
45 SCL_CORE_SUCCES("Windows window created.");
46}
47
48scl::windows_window::windows_window(int Width, int Height, const std::string &Title) :
49 window(Width, Height, Title)
50{
51 this->Create();
52}
53
55{
56 MSG msg;
57 while (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
58 {
59 if (msg.message == WM_QUIT)
60 return;
61 TranslateMessage(&msg);
62 DispatchMessage(&msg);
63 }
64}
65
67{
68}
69
70void scl::windows_window::ChangeTitle(const std::string &NewTitle)
71{
72 SetWindowText(Handle, NewTitle.c_str());
73}
74
76{
77 PostMessage(Handle, WM_CLOSE, 0, 0);
78}
79
80// Forward declare message handler from imgui_impl_win32.cpp
81extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
82
83LRESULT WIN32 scl::windows_window::WinProc(window_handle hWnd, u32 Msg,
84 WPARAM wParam, LPARAM lParam)
85{
86 // Set window creation parametrs
87 if (Msg == WM_CREATE)
88 SetWindowLongPtr(
89 hWnd, 0,
90 (UINT_PTR)((CREATESTRUCT *)lParam)->lpCreateParams
91 );
92
93 if (ImGui_ImplWin32_WndProcHandler(hWnd, Msg, wParam, lParam))
94 return true;
95
96 // Get win class pointer, connected to Win32 window window_handle
97 windows_window *win = reinterpret_cast<windows_window *>(GetWindowLongPtr(hWnd, 0));
98
99 // Messages cracking
100 switch (Msg)
101 {
102 HANDLE_MSG(hWnd, WM_CREATE, win->OnCreate);
103 HANDLE_MSG(hWnd, WM_SIZE, win->OnSize);
104 HANDLE_MSG(hWnd, WM_DESTROY, win->OnDestroy);
105 HANDLE_MSG(hWnd, WM_CLOSE, win->OnClose);
106 HANDLE_MSG(hWnd, WM_TIMER, win->OnTimer);
107
108 HANDLE_MSG(hWnd, WM_ERASEBKGND, win->OnEraseBackground);
109 HANDLE_MSG(hWnd, WM_PAINT, win->OnPaint);
110 HANDLE_MSG(hWnd, WM_ACTIVATE, win->OnActivate);
111
112 HANDLE_MSG(hWnd, WM_MOUSEMOVE, win->OnMMove);
113 HANDLE_MSG(hWnd, WM_MOUSEWHEEL, win->OnMWheel);
114 HANDLE_MSG(hWnd, WM_LBUTTONDOWN, win->OnMButDown);
115 HANDLE_MSG(hWnd, WM_LBUTTONDBLCLK, win->OnMButDown);
116 HANDLE_MSG(hWnd, WM_LBUTTONUP, win->OnMButUp);
117 HANDLE_MSG(hWnd, WM_RBUTTONDOWN, win->OnMButDown);
118 HANDLE_MSG(hWnd, WM_RBUTTONDBLCLK, win->OnMButDown);
119 HANDLE_MSG(hWnd, WM_RBUTTONUP, win->OnMButUp);
120 HANDLE_MSG(hWnd, WM_MBUTTONDOWN, win->OnMButDown);
121 HANDLE_MSG(hWnd, WM_MBUTTONDBLCLK, win->OnMButDown);
122 HANDLE_MSG(hWnd, WM_MBUTTONUP, win->OnMButUp);
123
124 HANDLE_MSG(hWnd, WM_KEYDOWN, win->OnKey);
125 HANDLE_MSG(hWnd, WM_KEYUP, win->OnKey);
126 }
127
128 return DefWindowProc(hWnd, Msg, wParam, lParam);
129}
#define SCL_CORE_ASSERT(expr,...)
Definition: assert.h:69
window_handle Handle
Definition: window.h:41
data Data
Definition: window.h:44
void ShutDown() override
void FlipFullscreen() override
void ChangeTitle(const std::string &NewTitle) override
windows_window(int Width, int Height, const std::string &Title)
void Update() override
#define SCL_CORE_SUCCES(...)
Definition: log.h:42
uint32_t u32
Definition: math_common.h:21
int window_handle
Definition: base.h:55
Sculpto library prehompiled header. Defines common definitions, includes commonly used modules.
std::string Title
Definition: window.h:28
IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)