Can suppress themed notebook page with wxNB_NOPAGETHEME or
setting system option msw.notebook.themed-background to 0 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@31807 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
		@@ -6,11 +6,11 @@
 | 
				
			|||||||
\section{\class{wxArtProvider}}\label{wxartprovider}
 | 
					\section{\class{wxArtProvider}}\label{wxartprovider}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
wxArtProvider class is used to customize the look of wxWidgets application.
 | 
					wxArtProvider class is used to customize the look of wxWidgets application.
 | 
				
			||||||
When wxWidgets need to display an icon or a bitmap (e.g. in the standard file
 | 
					When wxWidgets needs to display an icon or a bitmap (e.g. in the standard file
 | 
				
			||||||
dialog), it does not use hard-coded resource but asks wxArtProvider for it
 | 
					dialog), it does not use a hard-coded resource but asks wxArtProvider for it
 | 
				
			||||||
instead. This way the users can plug in own wxArtProvider class and easily
 | 
					instead. This way users can plug in their own wxArtProvider class and easily
 | 
				
			||||||
replace standard art with his/her own version. It is easy thing to do: all
 | 
					replace standard art with their own version. All
 | 
				
			||||||
that is needed is to derive a class from wxArtProvider, override it's
 | 
					that is needed is to derive a class from wxArtProvider, override its
 | 
				
			||||||
\helpref{CreateBitmap}{wxartprovidercreatebitmap} method and register the
 | 
					\helpref{CreateBitmap}{wxartprovidercreatebitmap} method and register the
 | 
				
			||||||
provider with
 | 
					provider with
 | 
				
			||||||
\helpref{wxArtProvider::PushProvider}{wxartproviderpushprovider}:
 | 
					\helpref{wxArtProvider::PushProvider}{wxartproviderpushprovider}:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,8 +30,8 @@ group is formed by a contiguous range of radio items, i.e. it starts at the
 | 
				
			|||||||
first item of this kind and ends with the first item of a different kind (or
 | 
					first item of this kind and ends with the first item of a different kind (or
 | 
				
			||||||
the end of the menu). Notice that because the radio groups are defined in terms
 | 
					the end of the menu). Notice that because the radio groups are defined in terms
 | 
				
			||||||
of the item positions inserting or removing the items in the menu containing
 | 
					of the item positions inserting or removing the items in the menu containing
 | 
				
			||||||
the radio items risks to not work correctly. Finally note that the radio items
 | 
					the radio items risks to not work correctly. Finally note that radio items
 | 
				
			||||||
are only supported under Windows and GTK+ currently.
 | 
					are not supported under Motif.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\wxheading{Allocation strategy}
 | 
					\wxheading{Allocation strategy}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,6 +29,7 @@ managed by wxNotebook.
 | 
				
			|||||||
\twocolitem{\windowstyle{wxNB\_BOTTOM}}{Place tabs under instead of above the notebook pages.}
 | 
					\twocolitem{\windowstyle{wxNB\_BOTTOM}}{Place tabs under instead of above the notebook pages.}
 | 
				
			||||||
\twocolitem{\windowstyle{wxNB\_FIXEDWIDTH}}{(Windows only) All tabs will have same width.}
 | 
					\twocolitem{\windowstyle{wxNB\_FIXEDWIDTH}}{(Windows only) All tabs will have same width.}
 | 
				
			||||||
\twocolitem{\windowstyle{wxNB\_MULTILINE}}{(Windows only) There can be several rows of tabs.}
 | 
					\twocolitem{\windowstyle{wxNB\_MULTILINE}}{(Windows only) There can be several rows of tabs.}
 | 
				
			||||||
 | 
					\twocolitem{\windowstyle{wxNB\_NOPAGETHEME}}{(Windows only) Display a solid colour on notebook pages, and not a gradient, which can reduce performance.}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\end{twocollist}
 | 
					\end{twocollist}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -39,6 +40,38 @@ See also \helpref{window styles overview}{windowstyles}.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
\input noteevt.inc
 | 
					\input noteevt.inc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\wxheading{Page backgrounds}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					On Windows XP, the default theme paints a gradient on the notebook's pages.
 | 
				
			||||||
 | 
					If you wish to suppress this theme, for aesthetic or performance reasons,
 | 
				
			||||||
 | 
					there are three ways of doing it. You can use wxNB\_NOPAGETHEME to disable
 | 
				
			||||||
 | 
					themed drawing for a particular notebook, you can call {\tt wxSystemOptions::SetOption} 
 | 
				
			||||||
 | 
					to disable it for the whole application, or you can disable it for individual
 | 
				
			||||||
 | 
					pages by using {\tt SetBackgroundColour}.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To disable themed pages globally:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\begin{verbatim}
 | 
				
			||||||
 | 
					    wxSystemOptions::SetOption(wxT("msw.notebook.themed-background"), 0);
 | 
				
			||||||
 | 
					\end{verbatim}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Set the value to 1 to enable it again.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To give a single page a solid background that more or less fits in with the
 | 
				
			||||||
 | 
					overall theme, use:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\begin{verbatim}
 | 
				
			||||||
 | 
					    wxColour col = notebook->GetThemeBackgroundColour();
 | 
				
			||||||
 | 
					    if (col.Ok())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        page->SetBackgroundColour(col);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					\end{verbatim}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					On platforms other than Windows, or if the application is not using Windows
 | 
				
			||||||
 | 
					themes, {\tt GetThemeBackgroundColour} will return an uninitialised colour object,
 | 
				
			||||||
 | 
					and the above code will therefore work on all platforms.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\wxheading{See also}
 | 
					\wxheading{See also}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\helpref{wxNotebookEvent}{wxnotebookevent}, \helpref{wxImageList}{wximagelist},\rtfsp
 | 
					\helpref{wxNotebookEvent}{wxnotebookevent}, \helpref{wxImageList}{wximagelist},\rtfsp
 | 
				
			||||||
@@ -228,6 +261,13 @@ the platform and so\rtfsp
 | 
				
			|||||||
\helpref{wxNotebookEvent::GetSelection}{wxnotebookeventgetselection} should be
 | 
					\helpref{wxNotebookEvent::GetSelection}{wxnotebookeventgetselection} should be
 | 
				
			||||||
used instead in this case.
 | 
					used instead in this case.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\membersection{wxNotebook::GetThemeBackgroundColour}\label{wxnotebookgetthemebackgroundcolour}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\constfunc{wxColour}{GetThemeBackgroundColour}{\void}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If running under Windows and themes are enabled for the application, this function
 | 
				
			||||||
 | 
					returns a suitable colour for painting the background of a notebook page, and can be passed
 | 
				
			||||||
 | 
					to {\tt SetBackgroundColour}. Otherwise, an uninitialised colour will be returned.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\membersection{wxNotebook::HitTest}\label{wxnotebookhittest}
 | 
					\membersection{wxNotebook::HitTest}\label{wxnotebookhittest}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1471,6 +1471,7 @@ enum wxBorder
 | 
				
			|||||||
#define wxNB_RIGHT            0x0040
 | 
					#define wxNB_RIGHT            0x0040
 | 
				
			||||||
#define wxNB_BOTTOM           0x0080
 | 
					#define wxNB_BOTTOM           0x0080
 | 
				
			||||||
#define wxNB_MULTILINE        0x0100
 | 
					#define wxNB_MULTILINE        0x0100
 | 
				
			||||||
 | 
					#define wxNB_NOPAGETHEME      0x0200
 | 
				
			||||||
#define wxNB_DEFAULT          wxNB_TOP
 | 
					#define wxNB_DEFAULT          wxNB_TOP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -167,6 +167,8 @@ public:
 | 
				
			|||||||
  virtual bool DoPhase(int nPhase);
 | 
					  virtual bool DoPhase(int nPhase);
 | 
				
			||||||
#endif // wxUSE_CONSTRAINTS
 | 
					#endif // wxUSE_CONSTRAINTS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Attempts to get colour for UX theme page background
 | 
				
			||||||
 | 
					  wxColour GetThemeBackgroundColour() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // implementation only
 | 
					  // implementation only
 | 
				
			||||||
  // -------------------
 | 
					  // -------------------
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -91,6 +91,9 @@ public:
 | 
				
			|||||||
    // implement some base class functions
 | 
					    // implement some base class functions
 | 
				
			||||||
    virtual wxSize CalcSizeFromPage(const wxSize& sizePage) const;
 | 
					    virtual wxSize CalcSizeFromPage(const wxSize& sizePage) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // On platforms that support it, get the theme page background colour, else invalid colour
 | 
				
			||||||
 | 
					    virtual wxColour GetThemeBackgroundColour() const { return wxNullColour; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
protected:
 | 
					protected:
 | 
				
			||||||
    DECLARE_NO_COPY_CLASS(wxNotebookBase)
 | 
					    DECLARE_NO_COPY_CLASS(wxNotebookBase)
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,6 +39,7 @@
 | 
				
			|||||||
    #include "wx/textctrl.h"
 | 
					    #include "wx/textctrl.h"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "wx/sysopt.h"
 | 
				
			||||||
#include "wx/bookctrl.h"
 | 
					#include "wx/bookctrl.h"
 | 
				
			||||||
#include "wx/sizer.h"
 | 
					#include "wx/sizer.h"
 | 
				
			||||||
#include "wx/colordlg.h"
 | 
					#include "wx/colordlg.h"
 | 
				
			||||||
@@ -220,7 +221,7 @@ bool WidgetsApp::OnInit()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    if ( !wxApp::OnInit() )
 | 
					    if ( !wxApp::OnInit() )
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    // the reason for having these ifdef's is that I often run two copies of
 | 
					    // the reason for having these ifdef's is that I often run two copies of
 | 
				
			||||||
    // this sample side by side and it is useful to see which one is which
 | 
					    // this sample side by side and it is useful to see which one is which
 | 
				
			||||||
    wxString title;
 | 
					    wxString title;
 | 
				
			||||||
@@ -288,11 +289,15 @@ WidgetsFrame::WidgetsFrame(const wxString& title)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL);
 | 
					    wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // we have 2 panes: book which pages demonstrating the controls in the
 | 
					    // we have 2 panes: book with pages demonstrating the controls in the
 | 
				
			||||||
    // upper one and the log window with some buttons in the lower
 | 
					    // upper one and the log window with some buttons in the lower
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    int style = wxNO_FULL_REPAINT_ON_RESIZE|wxCLIP_CHILDREN|wxBC_DEFAULT;
 | 
				
			||||||
 | 
					    // Uncomment to suppress page theme (draw in solid colour)
 | 
				
			||||||
 | 
					    // style |= wxNB_NOPAGETHEME;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    m_book = new wxBookCtrl(m_panel, wxID_ANY, wxDefaultPosition,
 | 
					    m_book = new wxBookCtrl(m_panel, wxID_ANY, wxDefaultPosition,
 | 
				
			||||||
        wxDefaultSize, wxNO_FULL_REPAINT_ON_RESIZE|wxCLIP_CHILDREN|wxBC_DEFAULT);
 | 
					        wxDefaultSize, style);
 | 
				
			||||||
    InitBook();
 | 
					    InitBook();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef __SMARTPHONE__
 | 
					#ifndef __SMARTPHONE__
 | 
				
			||||||
@@ -377,6 +382,11 @@ void WidgetsFrame::InitBook()
 | 
				
			|||||||
                        false, // don't select
 | 
					                        false, // don't select
 | 
				
			||||||
                        n // image id
 | 
					                        n // image id
 | 
				
			||||||
                       );
 | 
					                       );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					        wxColour colour = m_book->MSWGetBgColourForChild(pages[n]);
 | 
				
			||||||
 | 
					        pages[n]->SetBackgroundColour(colour);
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,6 +34,7 @@
 | 
				
			|||||||
#include  "wx/control.h"
 | 
					#include  "wx/control.h"
 | 
				
			||||||
#include  "wx/notebook.h"
 | 
					#include  "wx/notebook.h"
 | 
				
			||||||
#include  "wx/app.h"
 | 
					#include  "wx/app.h"
 | 
				
			||||||
 | 
					#include  "wx/sysopt.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include  "wx/msw/private.h"
 | 
					#include  "wx/msw/private.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -681,6 +682,17 @@ bool wxNotebook::InsertPage(size_t nPage,
 | 
				
			|||||||
        SetSelection(selNew);
 | 
					        SetSelection(selNew);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    InvalidateBestSize();
 | 
					    InvalidateBestSize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (HasFlag(wxNB_NOPAGETHEME) || (wxSystemOptions::HasOption(wxT("msw.notebook.themed-background")) &&
 | 
				
			||||||
 | 
					                                      wxSystemOptions::GetOptionInt(wxT("msw.notebook.themed-background")) == 0))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        wxColour col = GetThemeBackgroundColour();
 | 
				
			||||||
 | 
					        if (col.Ok())
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            pPage->SetBackgroundColour(col);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    return true;
 | 
					    return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -993,6 +1005,53 @@ wxColour wxNotebook::MSWGetBgColourForChild(wxWindow *win)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#endif // wxUSE_UXTHEME
 | 
					#endif // wxUSE_UXTHEME
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Windows only: attempts to get colour for UX theme page background
 | 
				
			||||||
 | 
					wxColour wxNotebook::GetThemeBackgroundColour() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if wxUSE_UXTHEME
 | 
				
			||||||
 | 
					    if (wxUxThemeEngine::Get())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        wxUxThemeHandle hTheme((wxNotebook*) this, L"TAB");
 | 
				
			||||||
 | 
					        if (hTheme)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            // This is total guesswork.
 | 
				
			||||||
 | 
					            // See PlatformSDK\Include\Tmschema.h for values
 | 
				
			||||||
 | 
					            COLORREF themeColor;
 | 
				
			||||||
 | 
					            wxUxThemeEngine::Get()->GetThemeColor(
 | 
				
			||||||
 | 
					                                        hTheme,
 | 
				
			||||||
 | 
					                                        10 /* TABP_BODY */,
 | 
				
			||||||
 | 
					                                        1 /* NORMAL */,
 | 
				
			||||||
 | 
					                                        3821 /* FILLCOLORHINT */,
 | 
				
			||||||
 | 
					                                        &themeColor);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /*
 | 
				
			||||||
 | 
					            [DS] Workaround for WindowBlinds:
 | 
				
			||||||
 | 
					            Some themes return a near black theme color using FILLCOLORHINT,
 | 
				
			||||||
 | 
					            this makes notebook pages have an ugly black background and makes
 | 
				
			||||||
 | 
					            text (usually black) unreadable. Retry again with FILLCOLOR.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            This workaround potentially breaks appearance of some themes,
 | 
				
			||||||
 | 
					            but in practice it already fixes some themes.
 | 
				
			||||||
 | 
					            */
 | 
				
			||||||
 | 
					            if (themeColor == 1)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                wxUxThemeEngine::Get()->GetThemeColor(
 | 
				
			||||||
 | 
					                                            hTheme,
 | 
				
			||||||
 | 
					                                            10 /* TABP_BODY */,
 | 
				
			||||||
 | 
					                                            1 /* NORMAL */,
 | 
				
			||||||
 | 
					                                            3802 /* FILLCOLOR */,
 | 
				
			||||||
 | 
					                                            &themeColor);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            wxColour colour(GetRValue(themeColor), GetGValue(themeColor), GetBValue(themeColor));
 | 
				
			||||||
 | 
					            return colour;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#endif // wxUSE_UXTHEME
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return GetBackgroundColour();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ----------------------------------------------------------------------------
 | 
					// ----------------------------------------------------------------------------
 | 
				
			||||||
// wxNotebook base class virtuals
 | 
					// wxNotebook base class virtuals
 | 
				
			||||||
// ----------------------------------------------------------------------------
 | 
					// ----------------------------------------------------------------------------
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user