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:
@@ -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);
|
||||
}
|
||||
|
@@ -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();
|
||||
|
Reference in New Issue
Block a user