| #ifndef RUNNER_WIN32_WINDOW_H_ |
| #define RUNNER_WIN32_WINDOW_H_ |
| |
| #include <windows.h> |
| |
| #include <functional> |
| #include <memory> |
| #include <string> |
| |
| // A class abstraction for a high DPI-aware Win32 Window. Intended to be |
| // inherited from by classes that wish to specialize with custom |
| // rendering and input handling |
| class Win32Window { |
| public: |
| struct Point { |
| unsigned int x; |
| unsigned int y; |
| Point(unsigned int x, unsigned int y) : x(x), y(y) {} |
| }; |
| |
| struct Size { |
| unsigned int width; |
| unsigned int height; |
| Size(unsigned int width, unsigned int height) |
| : width(width), height(height) {} |
| }; |
| |
| Win32Window(); |
| virtual ~Win32Window(); |
| |
| // Creates and shows a win32 window with |title| and position and size using |
| // |origin| and |size|. New windows are created on the default monitor. Window |
| // sizes are specified to the OS in physical pixels, hence to ensure a |
| // consistent size to will treat the width height passed in to this function |
| // as logical pixels and scale to appropriate for the default monitor. Returns |
| // true if the window was created successfully. |
| bool CreateAndShow(const std::wstring& title, |
| const Point& origin, |
| const Size& size); |
| |
| // Release OS resources associated with window. |
| void Destroy(); |
| |
| // Inserts |content| into the window tree. |
| void SetChildContent(HWND content); |
| |
| // Returns the backing Window handle to enable clients to set icon and other |
| // window properties. Returns nullptr if the window has been destroyed. |
| HWND GetHandle(); |
| |
| // If true, closing this window will quit the application. |
| void SetQuitOnClose(bool quit_on_close); |
| |
| // Return a RECT representing the bounds of the current client area. |
| RECT GetClientArea(); |
| |
| protected: |
| // Processes and route salient window messages for mouse handling, |
| // size change and DPI. Delegates handling of these to member overloads that |
| // inheriting classes can handle. |
| virtual LRESULT MessageHandler(HWND window, |
| UINT const message, |
| WPARAM const wparam, |
| LPARAM const lparam) noexcept; |
| |
| // Called when CreateAndShow is called, allowing subclass window-related |
| // setup. Subclasses should return false if setup fails. |
| virtual bool OnCreate(); |
| |
| // Called when Destroy is called. |
| virtual void OnDestroy(); |
| |
| private: |
| friend class WindowClassRegistrar; |
| |
| // OS callback called by message pump. Handles the WM_NCCREATE message which |
| // is passed when the non-client area is being created and enables automatic |
| // non-client DPI scaling so that the non-client area automatically |
| // responsponds to changes in DPI. All other messages are handled by |
| // MessageHandler. |
| static LRESULT CALLBACK WndProc(HWND const window, |
| UINT const message, |
| WPARAM const wparam, |
| LPARAM const lparam) noexcept; |
| |
| // Retrieves a class instance pointer for |window| |
| static Win32Window* GetThisFromHandle(HWND const window) noexcept; |
| |
| bool quit_on_close_ = false; |
| |
| // window handle for top level window. |
| HWND window_handle_ = nullptr; |
| |
| // window handle for hosted content. |
| HWND child_content_ = nullptr; |
| }; |
| |
| #endif // RUNNER_WIN32_WINDOW_H_ |