94 lines
2.4 KiB
C++
94 lines
2.4 KiB
C++
#include "Window.h"
|
|
|
|
INT Window::init(HINSTANCE hInstance, UINT width, UINT height)
|
|
{
|
|
// 1. describe window class
|
|
WNDCLASS wc = {};
|
|
wc.hInstance = hInstance;
|
|
wc.lpszClassName = TEXT("D3D9"); // class name for identify
|
|
wc.lpfnWndProc = WindowProc; // function for windows to send messages to our application
|
|
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // technical window properties, here update window if window change horizontally or vertically and window should have its own device context
|
|
wc.hbrBackground = CreateSolidBrush(RGB(0, 255, 0));
|
|
wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
|
|
wc.hIcon = LoadIcon(nullptr, IDI_APPLICATION);
|
|
|
|
// 2. register window class
|
|
if (!RegisterClass(&wc)) return 100;
|
|
|
|
// 3. adjust window size (optional)
|
|
DWORD style;
|
|
style = WS_OVERLAPPEDWINDOW; // window with border & title
|
|
//style = WS_POPUP; // borderless window
|
|
|
|
RECT rect = { 100, 100, width + 100, height + 100 }; // left, top, right, bottom
|
|
AdjustWindowRect(&rect, style, FALSE);
|
|
|
|
// 4. create window instance
|
|
_hWnd = CreateWindow(
|
|
wc.lpszClassName, // class name for window instance
|
|
wc.lpszClassName, // window title
|
|
style, // visual window style
|
|
rect.left, rect.top, // window position (left-top corner)
|
|
rect.right - rect.left, rect.bottom - rect.top, // window size
|
|
nullptr, // handle to parent window
|
|
nullptr, // handle to menu instance
|
|
hInstance,
|
|
nullptr // pointer to optional parameter
|
|
);
|
|
if (_hWnd == nullptr) return 110;
|
|
|
|
// 5. show window
|
|
ShowWindow(_hWnd, SW_SHOW);
|
|
SetFocus(_hWnd);
|
|
|
|
return 0;
|
|
}
|
|
|
|
BOOL Window::run()
|
|
{
|
|
// 6. run window
|
|
// message queue
|
|
// https://learn.microsoft.com/en-us/windows/win32/winmsg/about-messages-and-message-queues
|
|
// GetMessage - wait for a message send by windows (syncronous)
|
|
// PeekMessage - get last message from queue or nothing
|
|
// TranslateMessage - translates keyboard input (scan (hardware) vs. virtual key code)
|
|
// DispatchMessage - send message to window proc
|
|
|
|
MSG msg;
|
|
if (PeekMessage(&msg, nullptr, 0, UINT_MAX, PM_REMOVE))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
|
|
Sleep(10);
|
|
|
|
return msg.message != WM_QUIT;
|
|
}
|
|
|
|
void Window::deInit()
|
|
{
|
|
}
|
|
|
|
LRESULT WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (msg)
|
|
{
|
|
case WM_CLOSE:
|
|
DestroyWindow(hWnd);
|
|
return 0;
|
|
case WM_DESTROY:
|
|
PostQuitMessage(0);
|
|
return 0;
|
|
case WM_KEYDOWN:
|
|
if (wParam == VK_ESCAPE)
|
|
{
|
|
DestroyWindow(hWnd);
|
|
return 0;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return DefWindowProc(hWnd, msg, wParam, lParam);
|
|
}
|