diff --git a/src/engine/platform/platform.h b/src/engine/platform/platform.h index ad3ba19..cbc7f93 100644 --- a/src/engine/platform/platform.h +++ b/src/engine/platform/platform.h @@ -36,7 +36,7 @@ class Platform { #elif defined(__linux__) Platform(); #elif defined(_WIN32) - Platform(HINSTANCE hInstance, int nCmdShow); + Platform(HINSTANCE instance, int cmd_show); #endif ~Platform(); @@ -127,11 +127,10 @@ class Platform { #elif defined(_WIN32) - // Global Variables: - HINSTANCE hInst; // current instance - HWND hWnd; + HINSTANCE instance_; + HWND wnd_; + int cmd_show_; - // Forward declarations of functions included in this code module: static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); #endif diff --git a/src/engine/platform/platform_win.cc b/src/engine/platform/platform_win.cc index 00914b0..c299161 100644 --- a/src/engine/platform/platform_win.cc +++ b/src/engine/platform/platform_win.cc @@ -8,7 +8,7 @@ #include "base/log.h" // #include "base/vecmath.h" // #include "engine/input_event.h" -// #include "engine/platform/platform_observer.h" +#include "engine/platform/platform_observer.h" using namespace base; @@ -16,7 +16,8 @@ namespace eng { void KaliberMain(Platform* platform); -Platform::Platform(HINSTANCE hInstance, int nCmdShow) : hInst(hInstance) { +Platform::Platform(HINSTANCE instance, int cmd_show) + : instance_(instance), cmd_show_(cmd_show) { LOG(0) << "Initializing platform."; root_path_ = "./"; @@ -33,31 +34,44 @@ Platform::Platform(HINSTANCE hInstance, int nCmdShow) : hInst(hInstance) { wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; - wcex.hInstance = hInstance; - wcex.hIcon = - nullptr; // LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT1)); + wcex.hInstance = instance_; + wcex.hIcon = nullptr; wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); - wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); - wcex.lpszMenuName = nullptr; // MAKEINTRESOURCEW(IDC_WINDOWSPROJECT1); - wcex.lpszClassName = L"szWindowClass"; - wcex.hIconSm = - nullptr; // LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); - RegisterClassExW(&wcex); + wcex.hbrBackground = nullptr; + wcex.lpszMenuName = nullptr; + wcex.lpszClassName = L"KaliberWndClass"; + wcex.hIconSm = nullptr; + RegisterClassEx(&wcex); +} - hWnd = CreateWindowW(L"szWindowClass", L"kaliber", WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, - hInstance, nullptr); - CHECK(hWnd); +void Platform::CreateMainWindow() { + wnd_ = CreateWindow(L"KaliberWndClass", L"Kaliber", WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, 0, 800, 1205, nullptr, nullptr, instance_, + this); + CHECK(wnd_); - ShowWindow(hWnd, nCmdShow); - UpdateWindow(hWnd); + ShowWindow(wnd_, cmd_show_); + UpdateWindow(wnd_); } Platform::~Platform() { LOG(0) << "Shutting down platform."; + DestroyWindow(wnd_); } -void Platform::Update() {} +void Platform::Update() { + DCHECK(!should_exit_); + + MSG msg; + while (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) { + if (msg.message == WM_QUIT) { + should_exit_ = true; + break; + } + TranslateMessage(&msg); + DispatchMessage(&msg); + } +} void Platform::Exit() { should_exit_ = true; @@ -72,60 +86,45 @@ void Platform::ShareFile(const std::string& file_name) {} void Platform::SetKeepScreenOn(bool keep_screen_on) {} HINSTANCE Platform::GetInstance() { - return hInst; + return instance_; } HWND Platform::GetWindow() { - return hWnd; + return wnd_; } -LRESULT CALLBACK Platform::WndProc(HWND hWnd, +LRESULT CALLBACK Platform::WndProc(HWND wnd, UINT message, - WPARAM wParam, - LPARAM lParam) { - // switch (message) - // { - // case WM_COMMAND: - // { - // int wmId = LOWORD(wParam); - // // Parse the menu selections: - // switch (wmId) - // { - // case IDM_ABOUT: - // DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); - // break; - // case IDM_EXIT: - // DestroyWindow(hWnd); - // break; - // default: - // return DefWindowProc(hWnd, message, wParam, lParam); - // } - // } - // break; - // case WM_PAINT: - // { - // PAINTSTRUCT ps; - // HDC hdc = BeginPaint(hWnd, &ps); - // // TODO: Add any drawing code that uses hdc here... - // EndPaint(hWnd, &ps); - // } - // break; - // case WM_DESTROY: - // PostQuitMessage(0); - // break; - // default: - return DefWindowProc(hWnd, message, wParam, lParam); - // } - // return 0; + WPARAM wparam, + LPARAM lparam) { + auto* platform = + reinterpret_cast(GetWindowLongPtr(wnd, GWL_USERDATA)); + + switch (message) { + case WM_CREATE: + SetWindowLongPtr(wnd, GWL_USERDATA, + (LONG_PTR)(((LPCREATESTRUCT)lparam)->lpCreateParams)); + break; + case WM_SIZE: + platform->observer_->OnWindowResized(LOWORD(lparam), HIWORD(lparam)); + break; + case WM_DESTROY: + platform->observer_->OnWindowDestroyed(); + PostQuitMessage(0); + break; + default: + return DefWindowProc(wnd, message, wparam, lparam); + } + return 0; } } // namespace eng -int APIENTRY wWinMain(_In_ HINSTANCE hInstance, - _In_opt_ HINSTANCE hPrevInstance, - _In_ LPWSTR lpCmdLine, - _In_ int nCmdShow) { - eng::Platform platform(hInstance, nCmdShow); +int WINAPI WinMain(HINSTANCE instance, + HINSTANCE prev_instance, + PSTR cmd_line, + int cmd_show) { + eng::Platform platform(instance, cmd_show); eng::KaliberMain(&platform); return 0; }