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:
Julian Smart
2005-02-06 19:17:35 +00:00
parent 0090a1538c
commit 25057abaac
8 changed files with 125 additions and 10 deletions

View File

@@ -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}:

View File

@@ -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}

View File

@@ -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}

View File

@@ -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
/* /*

View File

@@ -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
// ------------------- // -------------------

View File

@@ -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)
}; };

View File

@@ -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);
*/
} }
} }

View File

@@ -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
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------