languages

A collection of programs made with different programming languages.
git clone git://evanalba.com/languages
Log | Files | Refs

win32_window.h (3522B)


      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
     13 class 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_