diff options
author | crupest <crupest@outlook.com> | 2020-01-03 00:31:34 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2020-01-03 00:31:34 +0800 |
commit | d5ff69096a3f56052b30d8ef827845473d4aa5ea (patch) | |
tree | 8faf7466ea173b66e81da83bdc4e0be1a159e263 /include/cru/win/native/window.hpp | |
parent | 26c3b5c7a509d0123719f2a6537399c332a48011 (diff) | |
download | cru-d5ff69096a3f56052b30d8ef827845473d4aa5ea.tar.gz cru-d5ff69096a3f56052b30d8ef827845473d4aa5ea.tar.bz2 cru-d5ff69096a3f56052b30d8ef827845473d4aa5ea.zip |
...
Diffstat (limited to 'include/cru/win/native/window.hpp')
-rw-r--r-- | include/cru/win/native/window.hpp | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/include/cru/win/native/window.hpp b/include/cru/win/native/window.hpp index 9752682f..3c883338 100644 --- a/include/cru/win/native/window.hpp +++ b/include/cru/win/native/window.hpp @@ -12,12 +12,12 @@ class WinCursor; class WindowClass; class WindowManager; class WindowRenderTarget; +class WinNativeWindowResolver; class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { public: - WinNativeWindow(WinUiApplication* application, - WindowClass* window_class, DWORD window_style, - WinNativeWindow* parent); + WinNativeWindow(WinUiApplication* application, WindowClass* window_class, + DWORD window_style, WinNativeWindow* parent); CRU_DELETE_COPY(WinNativeWindow) CRU_DELETE_MOVE(WinNativeWindow) @@ -25,8 +25,9 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { ~WinNativeWindow() override; public: - bool IsValid() override; - void SetDeleteThisOnDestroy(bool value) override; + std::shared_ptr<INativeWindowResolver> GetResolver() override { + return std::static_pointer_cast<INativeWindowResolver>(resolver_); + } void Close() override; @@ -118,7 +119,14 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { private: WinUiApplication* application_; - bool delete_this_on_destroy_ = true; + // when delete is called first, it set this to true to indicate + // destroy message handler not to double delete this instance; + // when destroy handler is called first (by user action or method + // Close), it set this to true to indicate delete not call Close + // again. + bool sync_flag_ = false; + + std::shared_ptr<WinNativeWindowResolver> resolver_; HWND hwnd_; WinNativeWindow* parent_window_; @@ -143,4 +151,26 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { Event<WindowNativeMessageEventArgs&> native_message_event_; }; + +class WinNativeWindowResolver : public WinNativeResource, + public virtual INativeWindowResolver { + friend WinNativeWindow::~WinNativeWindow(); + + public: + WinNativeWindowResolver(WinNativeWindow* window) : window_(window) {} + + CRU_DELETE_COPY(WinNativeWindowResolver) + CRU_DELETE_MOVE(WinNativeWindowResolver) + + ~WinNativeWindowResolver() override = default; + + public: + INativeWindow* Resolve() override { return window_; } + + private: + void Reset(); + + private: + WinNativeWindow* window_; +}; } // namespace cru::platform::native::win |