Main coves client
1#ifndef RUNNER_WIN32_WINDOW_H_
2#define RUNNER_WIN32_WINDOW_H_
3
4#include <windows.h>
5
6#include <functional>
7#include <memory>
8#include <string>
9
10// A class abstraction for a high DPI-aware Win32 Window. Intended to be
11// inherited from by classes that wish to specialize with custom
12// rendering and input handling
13class Win32Window {
14 public:
15 struct Point {
16 unsigned int x;
17 unsigned int y;
18 Point(unsigned int x, unsigned int y) : x(x), y(y) {}
19 };
20
21 struct Size {
22 unsigned int width;
23 unsigned int height;
24 Size(unsigned int width, unsigned int height)
25 : width(width), height(height) {}
26 };
27
28 Win32Window();
29 virtual ~Win32Window();
30
31 // Creates a win32 window with |title| that is positioned and sized using
32 // |origin| and |size|. New windows are created on the default monitor. Window
33 // sizes are specified to the OS in physical pixels, hence to ensure a
34 // consistent size this function will scale the inputted width and height as
35 // as appropriate for the default monitor. The window is invisible until
36 // |Show| is called. Returns true if the window was created successfully.
37 bool Create(const std::wstring& title, const Point& origin, const Size& size);
38
39 // Show the current window. Returns true if the window was successfully shown.
40 bool Show();
41
42 // Release OS resources associated with window.
43 void Destroy();
44
45 // Inserts |content| into the window tree.
46 void SetChildContent(HWND content);
47
48 // Returns the backing Window handle to enable clients to set icon and other
49 // window properties. Returns nullptr if the window has been destroyed.
50 HWND GetHandle();
51
52 // If true, closing this window will quit the application.
53 void SetQuitOnClose(bool quit_on_close);
54
55 // Return a RECT representing the bounds of the current client area.
56 RECT GetClientArea();
57
58 protected:
59 // Processes and route salient window messages for mouse handling,
60 // size change and DPI. Delegates handling of these to member overloads that
61 // inheriting classes can handle.
62 virtual LRESULT MessageHandler(HWND window,
63 UINT const message,
64 WPARAM const wparam,
65 LPARAM const lparam) noexcept;
66
67 // Called when CreateAndShow is called, allowing subclass window-related
68 // setup. Subclasses should return false if setup fails.
69 virtual bool OnCreate();
70
71 // Called when Destroy is called.
72 virtual void OnDestroy();
73
74 private:
75 friend class WindowClassRegistrar;
76
77 // OS callback called by message pump. Handles the WM_NCCREATE message which
78 // is passed when the non-client area is being created and enables automatic
79 // non-client DPI scaling so that the non-client area automatically
80 // responds to changes in DPI. All other messages are handled by
81 // MessageHandler.
82 static LRESULT CALLBACK WndProc(HWND const window,
83 UINT const message,
84 WPARAM const wparam,
85 LPARAM const lparam) noexcept;
86
87 // Retrieves a class instance pointer for |window|
88 static Win32Window* GetThisFromHandle(HWND const window) noexcept;
89
90 // Update the window frame's theme to match the system theme.
91 static void UpdateTheme(HWND const window);
92
93 bool quit_on_close_ = false;
94
95 // window handle for top level window.
96 HWND window_handle_ = nullptr;
97
98 // window handle for hosted content.
99 HWND child_content_ = nullptr;
100};
101
102#endif // RUNNER_WIN32_WINDOW_H_