diff --git a/include/wx/msw/window.h b/include/wx/msw/window.h index f1f12f0b44..d3739f665a 100644 --- a/include/wx/msw/window.h +++ b/include/wx/msw/window.h @@ -148,16 +148,20 @@ public: virtual bool UnregisterHotKey(int hotkeyId); #endif // wxUSE_HOTKEY - // implementation from now on - // -------------------------- - - // simple accessors - // ---------------- + // window handle stuff + // ------------------- WXHWND GetHWND() const { return m_hWnd; } void SetHWND(WXHWND hWnd) { m_hWnd = hWnd; } virtual WXWidget GetHandle() const { return GetHWND(); } + void AssociateHandle(WXWidget handle); + void DissociateHandle(); + + + // implementation from now on + // ========================== + // event handlers // -------------- diff --git a/include/wx/window.h b/include/wx/window.h index 8252941296..fe7d74ea05 100644 --- a/include/wx/window.h +++ b/include/wx/window.h @@ -1018,6 +1018,10 @@ public: // is only used for wxWin itself or for user code which wants to call // platform-specific APIs virtual WXWidget GetHandle() const = 0; + // associate the window with a new native handle + virtual void AssociateHandle(WXWidget WXUNUSED(handle)) { } + // dissociate the current native handle from the window + virtual void DissociateHandle() { } #if wxUSE_PALETTE // Store the palette used by DCs in wxWindow so that the dcs can share diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 0549e8fa9b..2bc19adc48 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -1005,7 +1005,7 @@ void wxWindowMSW::UnsubclassWin() HWND hwnd = GetHwnd(); if ( hwnd ) { - m_hWnd = 0; + SetHWND(0); wxCHECK_RET( ::IsWindow(hwnd), wxT("invalid HWND in UnsubclassWin") ); @@ -1021,6 +1021,27 @@ void wxWindowMSW::UnsubclassWin() } } +void wxWindowMSW::AssociateHandle(WXWidget handle) +{ + if ( m_hWnd ) + { + if ( !::DestroyWindow(GetHwnd()) ) + wxLogLastError(wxT("DestroyWindow")); + } + + WXHWND wxhwnd = (WXHWND)handle; + + SetHWND(wxhwnd); + SubclassWin(wxhwnd); +} + +void wxWindowMSW::DissociateHandle() +{ + // this also calls SetHWND(0) for us + UnsubclassWin(); +} + + bool wxCheckWindowWndProc(WXHWND hWnd, WXFARPROC wndProc) { // Unicows note: the code below works, but only because WNDCLASS contains