]> git.saurik.com Git - wxWidgets.git/commitdiff
Can suppress themed notebook page with wxNB_NOPAGETHEME or
authorJulian Smart <julian@anthemion.co.uk>
Sun, 6 Feb 2005 19:17:35 +0000 (19:17 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Sun, 6 Feb 2005 19:17:35 +0000 (19:17 +0000)
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

docs/latex/wx/artprov.tex
docs/latex/wx/menu.tex
docs/latex/wx/notebook.tex
include/wx/defs.h
include/wx/msw/notebook.h
include/wx/notebook.h
samples/widgets/widgets.cpp
src/msw/notebook.cpp

index 109ae258802088f7dc67a53ab7d49b72ab9b9fa1..c30aaaf8244f773da020538914e09e5e4ad8af32 100644 (file)
@@ -6,11 +6,11 @@
 \section{\class{wxArtProvider}}\label{wxartprovider}
 
 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
-dialog), it does not use hard-coded resource but asks wxArtProvider for it
-instead. This way the users can plug in own wxArtProvider class and easily
-replace standard art with his/her own version. It is easy thing to do: all
-that is needed is to derive a class from wxArtProvider, override it's
+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
+instead. This way users can plug in their own wxArtProvider class and easily
+replace standard art with their own version. All
+that is needed is to derive a class from wxArtProvider, override its
 \helpref{CreateBitmap}{wxartprovidercreatebitmap} method and register the
 provider with
 \helpref{wxArtProvider::PushProvider}{wxartproviderpushprovider}:
index f4bd4b7c5041e39bd295b21e42b1ddb9a81ca12d..6e88366e339b1569190916ec6f04321481e304f9 100644 (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
 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
-the radio items risks to not work correctly. Finally note that the radio items
-are only supported under Windows and GTK+ currently.
+the radio items risks to not work correctly. Finally note that radio items
+are not supported under Motif.
 
 \wxheading{Allocation strategy}
 
index e3b4287fdf80806f14e4e4ed08d24e3d1a17e0d8..514a1076848be49b10d6bf00968de726a99f1776 100644 (file)
@@ -29,6 +29,7 @@ managed by wxNotebook.
 \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\_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}
 
@@ -39,6 +40,38 @@ See also \helpref{window styles overview}{windowstyles}.
 
 \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}
 
 \helpref{wxNotebookEvent}{wxnotebookevent}, \helpref{wxImageList}{wximagelist},\rtfsp
@@ -228,6 +261,13 @@ the platform and so\rtfsp
 \helpref{wxNotebookEvent::GetSelection}{wxnotebookeventgetselection} should be
 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}
 
index aef702f39796104c7a8fb4841f15c66496362ffb..a5ecd73a6d7f620bcbfd84c25de1d0486564ee80 100644 (file)
@@ -1471,6 +1471,7 @@ enum wxBorder
 #define wxNB_RIGHT            0x0040
 #define wxNB_BOTTOM           0x0080
 #define wxNB_MULTILINE        0x0100
+#define wxNB_NOPAGETHEME      0x0200
 #define wxNB_DEFAULT          wxNB_TOP
 
 /*
index 97a3141c54dbb30067f96259bfeed5c6e4479452..6bed22bbfe54121bbab9416520e78622e5fd346c 100644 (file)
@@ -167,6 +167,8 @@ public:
   virtual bool DoPhase(int nPhase);
 #endif // wxUSE_CONSTRAINTS
 
+  // Attempts to get colour for UX theme page background
+  wxColour GetThemeBackgroundColour() const;
 
   // implementation only
   // -------------------
index 3160358587f11b720fe9834873a8dfa24bc3d1c2..d67a95e65a251badf87414fb768f60ae281a339d 100644 (file)
@@ -91,6 +91,9 @@ public:
     // implement some base class functions
     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:
     DECLARE_NO_COPY_CLASS(wxNotebookBase)
 };
index 3f956fd3837011062aa5772b7018409bf5ae0a63..fc545d0008b48c803c892bfdd37c74d3cd31d7bb 100644 (file)
@@ -39,6 +39,7 @@
     #include "wx/textctrl.h"
 #endif
 
+#include "wx/sysopt.h"
 #include "wx/bookctrl.h"
 #include "wx/sizer.h"
 #include "wx/colordlg.h"
@@ -220,7 +221,7 @@ bool WidgetsApp::OnInit()
 {
     if ( !wxApp::OnInit() )
         return false;
-
+    
     // 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
     wxString title;
@@ -288,11 +289,15 @@ WidgetsFrame::WidgetsFrame(const wxString& title)
 
     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
+    
+    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,
-        wxDefaultSize, wxNO_FULL_REPAINT_ON_RESIZE|wxCLIP_CHILDREN|wxBC_DEFAULT);
+        wxDefaultSize, style);
     InitBook();
 
 #ifndef __SMARTPHONE__
@@ -377,6 +382,11 @@ void WidgetsFrame::InitBook()
                         false, // don't select
                         n // image id
                        );
+
+/*
+        wxColour colour = m_book->MSWGetBgColourForChild(pages[n]);
+        pages[n]->SetBackgroundColour(colour);
+*/
     }
 }
 
index 7b5b6de8e51f36e9f163b53df414d64ced22592b..3f2390950ca0b731370110f07cf19c29acf3d690 100644 (file)
@@ -34,6 +34,7 @@
 #include  "wx/control.h"
 #include  "wx/notebook.h"
 #include  "wx/app.h"
+#include  "wx/sysopt.h"
 
 #include  "wx/msw/private.h"
 
@@ -681,6 +682,17 @@ bool wxNotebook::InsertPage(size_t nPage,
         SetSelection(selNew);
 
     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;
 }
 
@@ -993,6 +1005,53 @@ wxColour wxNotebook::MSWGetBgColourForChild(wxWindow *win)
 
 #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
 // ----------------------------------------------------------------------------