X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8b9518ee4a9cb8f6d4934afaed07aea011ec5ab1..83626bfa72bd7f0147392818846242a846d12063:/src/msw/notebook.cpp?ds=sidebyside diff --git a/src/msw/notebook.cpp b/src/msw/notebook.cpp index 882cd41f45..98aa1ad74f 100644 --- a/src/msw/notebook.cpp +++ b/src/msw/notebook.cpp @@ -9,12 +9,6 @@ // Licence: wxWindows license /////////////////////////////////////////////////////////////////////////////// -// TODO: -// 1) keyboard interface for changing pages ([Shift]+Ctrl-Tab) -// 2) using OnSize() for showing pages for the first time works, but it surely -// us ugly -// 3) I'm not sure that setting fonts works - // ============================================================================ // declarations // ============================================================================ @@ -49,6 +43,8 @@ #error "wxNotebook is not supported under Windows 3.1" #endif //Win95 +#include // for SetWindowFont + #ifdef __GNUWIN32__ #include "wx/msw/gnuwin32/extra.h" #else //!GnuWin32 @@ -165,6 +161,10 @@ bool wxNotebook::Create(wxWindow *parent, return FALSE; } + // @@@ this crashes the application with "Invalid instruction" exception + // deep inside Windows -- why??? + SetWindowFont((HWND)m_hwnd, ::GetStockObject(DEFAULT_GUI_FONT), FALSE); + if ( parent != NULL ) parent->AddChild(this); @@ -351,24 +351,28 @@ bool wxNotebook::InsertPage(int nPage, // wxNotebook callbacks // ---------------------------------------------------------------------------- -// @@@ OnSize() is used for setting the font when it's called for the first -// time because doing it in ::Create() doesn't work (for unknown reasons) void wxNotebook::OnSize(wxSizeEvent& event) { - static bool s_bFirstTime = TRUE; - if ( s_bFirstTime ) { - SendMessage((HWND)m_hwnd, WM_SETFONT, - (WPARAM)GetStockObject(DEFAULT_GUI_FONT), - MAKELPARAM(TRUE, 0)); - s_bFirstTime = FALSE; - } - // emulate page change (it's esp. important to do it first time because // otherwise our page would stay invisible) int nSel = m_nSelection; m_nSelection = -1; SetSelection(nSel); + // fit the notebook page to the tab control's display area + RECT rc; + rc.left = rc.top = 0; + GetSize((int *)&rc.right, (int *)&rc.bottom); + + TabCtrl_AdjustRect(m_hwnd, FALSE, &rc); + uint nCount = m_aPages.Count(); + for ( uint nPage = 0; nPage < nCount; nPage++ ) { + wxNotebookPage *pPage = m_aPages[nPage]; + pPage->SetSize(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top); + if ( pPage->GetAutoLayout() ) + pPage->Layout(); + } + event.Skip(); } @@ -409,6 +413,20 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) // ---------------------------------------------------------------------------- // wxNotebook base class virtuals // ---------------------------------------------------------------------------- + +// override these 2 functions to do nothing: everything is done in OnSize + +void wxNotebook::SetConstraintSizes(bool /* recurse */) +{ + // don't set the sizes of the pages - their correct size is not yet known + wxControl::SetConstraintSizes(FALSE); +} + +bool wxNotebook::DoPhase(int /* nPhase */) +{ + return TRUE; +} + void wxNotebook::Command(wxCommandEvent& event) { wxFAIL_MSG("wxNotebook::Command not implemented"); @@ -429,6 +447,12 @@ bool wxNotebook::MSWNotify(WXWPARAM wParam, WXLPARAM lParam) event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING); break; + // if we don't intercept it here this message is passed to our parent (if + // we have one) and then lost in it's DefWindowProc + case UDN_DELTAPOS: + MSWDefWindowProc(WM_NOTIFY, wParam, lParam); + return TRUE; + default : return wxControl::MSWNotify(wParam, lParam); } @@ -446,35 +470,17 @@ bool wxNotebook::MSWNotify(WXWPARAM wParam, WXLPARAM lParam) // hide the currently active panel and show the new one void wxNotebook::ChangePage(int nOldSel, int nSel) { - wxASSERT( nOldSel != nSel ); // impossible + // it's not an error (the message may be generated by the tab control itself) + // and it may happen - just do nothing + if ( nSel == nOldSel ) + return; - if ( nOldSel != -1 ) { + if ( nOldSel != -1 ) m_aPages[nOldSel]->Show(FALSE); - } wxNotebookPage *pPage = m_aPages[nSel]; - FitPage(pPage); pPage->Show(TRUE); - - // set focus to the currently selected page - wxWindow *win = m_aPages[nSel]; - if ( win->IsKindOf(CLASSINFO(wxPanel)) ) { - wxList *children = win->GetChildren(); - if ( children->First() != NULL ); - win = (wxWindow *)children->First()->Data(); - } - win->SetFocus(); + pPage->SetFocus(); m_nSelection = nSel; } - -// fit the notebook page to the tab control's display area -void wxNotebook::FitPage(wxNotebookPage *pPage) -{ - RECT rc; - rc.left = rc.top = 0; - GetSize((int *)&rc.right, (int *)&rc.bottom); - - TabCtrl_AdjustRect(m_hwnd, FALSE, &rc); - pPage->SetSize(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top); -} \ No newline at end of file