From 24b3cc2c9632b7c6f0f0dd8f935688bd4d5e36f0 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 5 Jun 2002 23:30:00 +0000 Subject: [PATCH] reverted wxPopupWindow implementation to the original version using WS_CHILD and desktop as parent; this fixes the activation problem but reopens the other ones git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15758 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/popupwin.h | 14 ++-------- include/wx/msw/toplevel.h | 3 --- src/common/popupcmn.cpp | 4 +-- src/msw/popupwin.cpp | 57 +++++++++------------------------------ src/msw/toplevel.cpp | 41 ---------------------------- 5 files changed, 16 insertions(+), 103 deletions(-) diff --git a/include/wx/msw/popupwin.h b/include/wx/msw/popupwin.h index 9147f5bac1..ae220bc388 100644 --- a/include/wx/msw/popupwin.h +++ b/include/wx/msw/popupwin.h @@ -30,16 +30,6 @@ public: bool Create(wxWindow *parent, int flags = wxBORDER_NONE); - // implementation only from now on - // ------------------------------- - - // override Show() to prevent wxPopupWindow from being activated - virtual bool Show(bool show = TRUE); - - // find a shown popup window with the given window as parent, return NULL - // if none - static wxPopupWindow *FindPopupFor(wxWindow *win); - protected: // popups handle the position like wxTopLevelWindow, not wxWindow virtual void DoGetPosition(int *x, int *y) const; @@ -47,8 +37,8 @@ protected: // return the style to be used for the popup windows virtual WXDWORD MSWGetStyle(long flags, WXDWORD *exstyle) const; - // the list of all currently shown popup windows used by FindPopupFor() - static wxWindowList ms_shownPopups; + // get the HWND to be used as parent of this window with CreateWindow() + virtual WXHWND MSWGetParent() const; DECLARE_DYNAMIC_CLASS(wxPopupWindow) }; diff --git a/include/wx/msw/toplevel.h b/include/wx/msw/toplevel.h index fc21871ac3..6f14456c2e 100644 --- a/include/wx/msw/toplevel.h +++ b/include/wx/msw/toplevel.h @@ -99,9 +99,6 @@ protected: // choose the right parent to use with CreateWindow() virtual WXHWND MSWGetParent() const; - // we handle WM_NCACTIVATE specially here - virtual long MSWWindowProc(WXUINT msg, WXWPARAM wParam, WXLPARAM lParam); - // is the window currently iconized? bool m_iconized; diff --git a/src/common/popupcmn.cpp b/src/common/popupcmn.cpp index de30ac832c..0415aedfb5 100644 --- a/src/common/popupcmn.cpp +++ b/src/common/popupcmn.cpp @@ -43,9 +43,9 @@ #include "wx/univ/renderer.h" #endif // __WXUNIVERSAL__ -// there is no src/{msw,mgl}/popupwin.cpp to put this in, so we do it here - BTW we +// there is no src/mgl/popupwin.cpp to put this in, so we do it here - BTW we // probably could do it for all ports here just as well -#if defined(__WXMSW__) || defined(__WXMGL__) || defined(__WXPM__) +#if defined(__WXMGL__) || defined(__WXPM__) IMPLEMENT_DYNAMIC_CLASS(wxPopupWindow, wxWindow) #endif // __WXMSW__ diff --git a/src/msw/popupwin.cpp b/src/msw/popupwin.cpp index 87d82460ca..8469ea701d 100644 --- a/src/msw/popupwin.cpp +++ b/src/msw/popupwin.cpp @@ -33,9 +33,9 @@ #include "wx/popupwin.h" -#include "wx/msw/private.h" // for WS_CHILD and WS_POPUP +#include "wx/msw/private.h" // for GetDesktopWindow() -wxWindowList wxPopupWindow::ms_shownPopups; +IMPLEMENT_DYNAMIC_CLASS(wxPopupWindow, wxWindow) // ============================================================================ // implementation @@ -61,14 +61,9 @@ void wxPopupWindow::DoGetPosition(int *x, int *y) const WXDWORD wxPopupWindow::MSWGetStyle(long flags, WXDWORD *exstyle) const { - // we only hnour the border flags + // we only honour the border flags, the others don't make sense for us WXDWORD style = wxWindow::MSWGetStyle(flags & wxBORDER_MASK, exstyle); - // and we mustn't have WS_CHILD style or we would be limited to the parents - // client area - style &= ~WS_CHILD; - style |= WS_POPUP; - if ( exstyle ) { // a popup window floats on top of everything @@ -78,43 +73,15 @@ WXDWORD wxPopupWindow::MSWGetStyle(long flags, WXDWORD *exstyle) const return style; } -bool wxPopupWindow::Show(bool show) +WXHWND wxPopupWindow::MSWGetParent() const { - // skip wxWindow::Show() which calls wxBringWindowToTop(): this results in - // activating the popup window and stealing the atcivation from our parent - // which means that the parent frame becomes deactivated when opening a - // combobox, for example -- definitely not what we want - if ( !wxWindowBase::Show(show) ) - return FALSE; - - if ( show ) - { - ms_shownPopups.Append(this); - } - else // remove from the shown list - { - ms_shownPopups.DeleteObject(this); - } - - ::ShowWindow(GetHwnd(), show ? SW_SHOWNOACTIVATE : SW_HIDE); - - return TRUE; -} - -/* static */ -wxPopupWindow *wxPopupWindow::FindPopupFor(wxWindow *winParent) -{ - // find a popup with the given parent in the linked list of all shown - // popups - for ( wxWindowList::Node *node = ms_shownPopups.GetFirst(); - node; - node = node->GetNext() ) - { - wxWindow *win = node->GetData(); - if ( win->GetParent() == winParent ) - return (wxPopupWindow *)win; - } - - return NULL; + // we must be a child of the desktop to be able to extend beyond the parent + // window client area (like the comboboxes drop downs do) + // + // NB: alternative implementation would be to use WS_POPUP instead of + // WS_CHILD but then showing a popup would deactivate the parent which + // is ugly and working around this, although possible, is even more + // ugly + return (WXHWND)::GetDesktopWindow(); } diff --git a/src/msw/toplevel.cpp b/src/msw/toplevel.cpp index e65ef6c151..842a8a587b 100644 --- a/src/msw/toplevel.cpp +++ b/src/msw/toplevel.cpp @@ -740,44 +740,3 @@ bool wxTopLevelWindowMSW::EnableCloseButton(bool enable) return TRUE; } -// ---------------------------------------------------------------------------- -// wxTopLevelWindowMSW message processing -// ---------------------------------------------------------------------------- - -long wxTopLevelWindowMSW::HandleNcActivate(bool activate) -{ -#if wxUSE_POPUPWIN - /* - Normally, when another top level (whether it is overlapped or popup) - window is shown, it is activated and the parent window (i.e. we) loses - the activation. This, however, looks very ugly when the child window is - a [custom] combobox which we implement using a popup window as surely - opening a combobox shouldn't result in deactivating the parent window. - - So we don't redraw the title bar in this case, even if we still return - TRUE to let the change of activation to take place as otherwise the - controls inside the popup window wouldn't work properly. - */ - if ( !activate && wxPopupWindow::FindPopupFor(this) ) - { - return TRUE; - } -#endif // wxUSE_POPUPWIN - - return FALSE; -} - -long -wxTopLevelWindowMSW::MSWWindowProc(WXUINT msg, WXWPARAM wParam, WXLPARAM lParam) -{ - if ( msg == WM_NCACTIVATE ) - { - if ( HandleNcActivate(wParam != 0) ) - { - // we processed WM_NCACTIVATE ourselves - return TRUE; - } - } - - return wxTopLevelWindowBase::MSWWindowProc(msg, wParam, lParam); -} -- 2.45.2