|  | // 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 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); | 
|  |  | 
|  | // 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; | 
|  |  | 
|  | 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_ |