win32_window.h 3.4 KB

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