+ return false;
+ }
+
+ // need to update the bg brush when the first page is added
+ // so the first panel gets the correct themed background
+ if ( m_pages.empty() )
+ {
+#if wxUSE_UXTHEME
+ UpdateBgBrush();
+#endif // wxUSE_UXTHEME
+ }
+
+ // succeeded: save the pointer to the page
+ m_pages.Insert(pPage, nPage);
+
+ // we may need to adjust the size again if the notebook size changed:
+ // normally this only happens for the first page we add (the tabs which
+ // hadn't been there before are now shown) but for a multiline notebook it
+ // can happen for any page at all as a new row could have been started
+ if ( m_pages.GetCount() == 1 || HasFlag(wxNB_MULTILINE) )
+ {
+ AdjustPageSize(pPage);
+ }
+
+ // now deal with the selection
+ // ---------------------------
+
+ // if the inserted page is before the selected one, we must update the
+ // index of the selected page
+ if ( int(nPage) <= m_selection )
+ {
+ // one extra page added
+ m_selection++;
+ }
+
+ DoSetSelectionAfterInsertion(nPage, bSelect);
+
+ InvalidateBestSize();
+
+ return true;
+}
+
+int wxNotebook::HitTest(const wxPoint& pt, long *flags) const
+{
+ TC_HITTESTINFO hitTestInfo;
+ hitTestInfo.pt.x = pt.x;
+ hitTestInfo.pt.y = pt.y;
+ int item = TabCtrl_HitTest(GetHwnd(), &hitTestInfo);
+
+ if ( flags )
+ {
+ *flags = 0;
+
+ if ((hitTestInfo.flags & TCHT_NOWHERE) == TCHT_NOWHERE)
+ *flags |= wxBK_HITTEST_NOWHERE;
+ if ((hitTestInfo.flags & TCHT_ONITEM) == TCHT_ONITEM)
+ *flags |= wxBK_HITTEST_ONITEM;
+ if ((hitTestInfo.flags & TCHT_ONITEMICON) == TCHT_ONITEMICON)
+ *flags |= wxBK_HITTEST_ONICON;
+ if ((hitTestInfo.flags & TCHT_ONITEMLABEL) == TCHT_ONITEMLABEL)
+ *flags |= wxBK_HITTEST_ONLABEL;
+ if ( item == wxNOT_FOUND && GetPageSize().Contains(pt) )
+ *flags |= wxBK_HITTEST_ONPAGE;
+ }
+
+ return item;
+}
+
+// ----------------------------------------------------------------------------
+// flicker-less notebook redraw
+// ----------------------------------------------------------------------------
+
+#if USE_NOTEBOOK_ANTIFLICKER
+
+// wnd proc for the spin button
+LRESULT APIENTRY _EXPORT wxNotebookSpinBtnWndProc(HWND hwnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ if ( message == WM_ERASEBKGND )
+ return 0;
+
+ return ::CallWindowProc(CASTWNDPROC gs_wndprocNotebookSpinBtn,
+ hwnd, message, wParam, lParam);
+}
+
+LRESULT APIENTRY _EXPORT wxNotebookWndProc(HWND hwnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ return ::CallWindowProc(CASTWNDPROC gs_wndprocNotebook,
+ hwnd, message, wParam, lParam);
+}
+
+void wxNotebook::OnEraseBackground(wxEraseEvent& WXUNUSED(event))
+{
+ // do nothing here
+}
+
+void wxNotebook::OnPaint(wxPaintEvent& WXUNUSED(event))
+{
+ wxPaintDC dc(this);
+ wxMemoryDC memdc;
+ RECT rc;
+ ::GetClientRect(GetHwnd(), &rc);
+ wxBitmap bmp(rc.right, rc.bottom);
+ memdc.SelectObject(bmp);
+
+ const wxLayoutDirection dir = dc.GetLayoutDirection();
+ memdc.SetLayoutDirection(dir);
+
+ // if there is no special brush just use the solid background colour
+#if wxUSE_UXTHEME
+ HBRUSH hbr = (HBRUSH)m_hbrBackground;
+#else
+ HBRUSH hbr = 0;
+#endif
+ wxBrush brush;
+ if ( !hbr )
+ {
+ brush = wxBrush(GetBackgroundColour());
+ hbr = GetHbrushOf(brush);
+ }
+
+ wxMSWDCImpl *impl = (wxMSWDCImpl*) memdc.GetImpl();