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
This commit is contained in:
Vadim Zeitlin 2002-06-05 23:30:00 +00:00
parent 36633c5c00
commit 24b3cc2c96
5 changed files with 16 additions and 103 deletions

View File

@ -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)
};

View File

@ -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;

View File

@ -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__

View File

@ -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();
}

View File

@ -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);
}