Fiddled with wxFindWindowAtPoint to make it work with notebooks and static boxes

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8422 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2000-09-26 15:36:12 +00:00
parent cc1fcb9584
commit d1c8aaa3ee
2 changed files with 62 additions and 4 deletions

View File

@@ -119,6 +119,15 @@ bool wxContextHelp::BeginContextHelp(wxWindow* win)
{
wxPoint pt;
wxWindow* winAtPtr = wxFindWindowAtPointer(pt);
/*
if (winAtPtr)
{
wxString msg;
msg.Printf("Picked %s (%d)", (const char*) winAtPtr->GetName(), winAtPtr->GetId());
cout << msg << '\n';
}
*/
if (winAtPtr)
DispatchEvent(winAtPtr, pt);
}

View File

@@ -66,6 +66,10 @@
#if wxUSE_GUI
#include "wx/colordlg.h"
#include "wx/notebook.h"
#include "wx/frame.h"
#include "wx/statusbr.h"
#include "wx/toolbar.h"
#endif // wxUSE_GUI
#include <time.h>
@@ -667,17 +671,62 @@ wxFindMenuItemId (wxFrame * frame, const wxString& menuString, const wxString& i
return menuBar->FindMenuItem (menuString, itemString);
}
// Try to find the deepest child that contains 'pt'
// Try to find the deepest child that contains 'pt'.
// We go backwards, to try to allow for controls that are spacially
// within other controls, but are still siblings (e.g. buttons within
// static boxes). Static boxes are likely to be created _before_ controls
// that sit inside them.
wxWindow* wxFindWindowAtPoint(wxWindow* win, const wxPoint& pt)
{
wxNode* node = win->GetChildren().First();
if (!win->IsShown())
return NULL;
// Hack for wxNotebook case: at least in wxGTK, all pages
// claim to be shown, so we must only deal with the selected one.
if (win->IsKindOf(CLASSINFO(wxNotebook)))
{
wxNotebook* nb = (wxNotebook*) win;
int sel = nb->GetSelection();
if (sel >= 0)
{
wxWindow* child = nb->GetPage(sel);
wxWindow* foundWin = wxFindWindowAtPoint(child, pt);
if (foundWin)
return foundWin;
}
}
/* Doesn't work
// Frame case
else if (win->IsKindOf(CLASSINFO(wxFrame)))
{
// Pseudo-children that may not be mentioned in the child list
wxWindowList extraChildren;
wxFrame* frame = (wxFrame*) win;
if (frame->GetStatusBar())
extraChildren.Append(frame->GetStatusBar());
if (frame->GetToolBar())
extraChildren.Append(frame->GetToolBar());
wxNode* node = extraChildren.First();
while (node)
{
wxWindow* child = (wxWindow*) node->Data();
wxWindow* foundWin = wxFindWindowAtPoint(child, pt);
if (foundWin)
return foundWin;
node = node->Next();
}
}
*/
wxNode* node = win->GetChildren().Last();
while (node)
{
wxWindow* child = (wxWindow*) node->Data();
wxWindow* foundWin = wxFindWindowAtPoint(child, pt);
if (foundWin)
return foundWin;
node = node->Next();
return foundWin;
node = node->Previous();
}
wxPoint pos = win->GetPosition();