+ if ( event.IsWindowChange() ) {
+ // change pages
+ AdvanceSelection(event.GetDirection());
+ }
+ else {
+ // we get this event in 3 cases
+ //
+ // a) one of our pages might have generated it because the user TABbed
+ // out from it in which case we should propagate the event upwards and
+ // our parent will take care of setting the focus to prev/next sibling
+ //
+ // or
+ //
+ // b) the parent panel wants to give the focus to us so that we
+ // forward it to our selected page. We can't deal with this in
+ // OnSetFocus() because we don't know which direction the focus came
+ // from in this case and so can't choose between setting the focus to
+ // first or last panel child
+ //
+ // or
+ //
+ // c) we ourselves (see MSWTranslateMessage) generated the event
+ //
+ wxWindow * const parent = GetParent();
+
+ const bool isFromParent = event.GetEventObject() == parent;
+ const bool isFromSelf = event.GetEventObject() == this;
+
+ if ( isFromParent || isFromSelf )
+ {
+ // no, it doesn't come from child, case (b) or (c): forward to a
+ // page but only if direction is backwards (TAB) or from ourselves,
+ if ( m_nSelection != -1 &&
+ (!event.GetDirection() || isFromSelf) )
+ {
+ // so that the page knows that the event comes from it's parent
+ // and is being propagated downwards
+ event.SetEventObject(this);
+
+ wxWindow *page = m_pages[m_nSelection];
+ if ( !page->GetEventHandler()->ProcessEvent(event) )
+ {
+ page->SetFocus();
+ }
+ //else: page manages focus inside it itself
+ }
+ else // otherwise set the focus to the notebook itself
+ {
+ SetFocus();
+ }
+ }
+ else
+ {
+ // it comes from our child, case (a), pass to the parent, but only
+ // if the direction is forwards. Otherwise set the focus to the
+ // notebook itself. The notebook is always the 'first' control of a
+ // page.
+ if ( !event.GetDirection() )
+ {
+ SetFocus();
+ }
+ else if ( parent )
+ {
+ event.SetCurrentFocus(this);
+ parent->GetEventHandler()->ProcessEvent(event);
+ }
+ }
+ }
+}
+
+#if wxUSE_UXTHEME
+
+WXHANDLE wxNotebook::QueryBgBitmap(wxWindow *win)
+{
+ RECT rc;
+ GetWindowRect(GetHwnd(), &rc);
+
+ WindowHDC hDC(GetHwnd());
+ MemoryHDC hDCMem(hDC);
+ CompatibleBitmap hBmp(hDC, rc.right - rc.left, rc.bottom - rc.top);
+
+ SelectInHDC selectBmp(hDCMem, hBmp);
+
+ ::SendMessage(GetHwnd(), WM_PRINTCLIENT,
+ (WPARAM)(HDC)hDCMem,
+ PRF_ERASEBKGND | PRF_CLIENT | PRF_NONCLIENT);
+
+ if ( win )
+ {
+ RECT rc2;
+ ::GetWindowRect(GetHwndOf(win), &rc2);
+
+ COLORREF c = ::GetPixel(hDCMem, rc2.left - rc.left, rc2.top - rc.top);
+
+ return (WXHANDLE)c;
+ }
+ else // we are asked to create the brush
+ {
+ return (WXHANDLE)::CreatePatternBrush(hBmp);