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;
|
wxPoint pt;
|
||||||
wxWindow* winAtPtr = wxFindWindowAtPointer(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)
|
if (winAtPtr)
|
||||||
DispatchEvent(winAtPtr, pt);
|
DispatchEvent(winAtPtr, pt);
|
||||||
}
|
}
|
||||||
|
@@ -66,6 +66,10 @@
|
|||||||
|
|
||||||
#if wxUSE_GUI
|
#if wxUSE_GUI
|
||||||
#include "wx/colordlg.h"
|
#include "wx/colordlg.h"
|
||||||
|
#include "wx/notebook.h"
|
||||||
|
#include "wx/frame.h"
|
||||||
|
#include "wx/statusbr.h"
|
||||||
|
#include "wx/toolbar.h"
|
||||||
#endif // wxUSE_GUI
|
#endif // wxUSE_GUI
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
@@ -667,17 +671,62 @@ wxFindMenuItemId (wxFrame * frame, const wxString& menuString, const wxString& i
|
|||||||
return menuBar->FindMenuItem (menuString, itemString);
|
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)
|
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)
|
while (node)
|
||||||
{
|
{
|
||||||
wxWindow* child = (wxWindow*) node->Data();
|
wxWindow* child = (wxWindow*) node->Data();
|
||||||
wxWindow* foundWin = wxFindWindowAtPoint(child, pt);
|
wxWindow* foundWin = wxFindWindowAtPoint(child, pt);
|
||||||
if (foundWin)
|
if (foundWin)
|
||||||
return foundWin;
|
return foundWin;
|
||||||
node = node->Next();
|
node = node->Previous();
|
||||||
}
|
}
|
||||||
|
|
||||||
wxPoint pos = win->GetPosition();
|
wxPoint pos = win->GetPosition();
|
||||||
|
Reference in New Issue
Block a user