Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
// 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 a win32 window with |title| that is positioned and sized 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 this function will scale the inputted width and height as | |
// as appropriate for the default monitor. The window is invisible until | |
// |Show| is called. Returns true if the window was created successfully. | |
bool Create(const std::wstring& title, const Point& origin, const Size& size); | |
// Show the current window. Returns true if the window was successfully shown. | |
bool Show(); | |
// 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 | |
// responds 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; | |
// Update the window frame's theme to match the system theme. | |
static void UpdateTheme(HWND const window); | |
bool quit_on_close_ = false; | |
// window handle for top level window. | |
HWND window_handle_ = nullptr; | |
// window handle for hosted content. | |
HWND child_content_ = nullptr; | |
}; | |