97 lines
3.1 KiB
C
97 lines
3.1 KiB
C
|
#ifndef WIN32_WINDOW_H_
|
||
|
#define WIN32_WINDOW_H_
|
||
|
|
||
|
#include <Windows.h>
|
||
|
#include <Windowsx.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);
|
||
|
|
||
|
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.
|
||
|
virtual void 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 // WIN32_WINDOW_H_
|