| // Copyright 2014 The Flutter Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #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 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; | 
 | }; | 
 |  | 
 | #endif  // RUNNER_WIN32_WINDOW_H_ |