]> git.saurik.com Git - wxWidgets.git/blob - src/msw/renderer.cpp
implemented a simple DoGetBestSize() for MSW's wxScrollBar
[wxWidgets.git] / src / msw / renderer.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: msw/renderer.cpp
3 // Purpose: implementation of wxRendererNative for Windows
4 // Author: Vadim Zeitlin
5 // Modified by:
6 // Created: 20.07.2003
7 // RCS-ID: $Id$
8 // Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwindows.org>
9 // License: wxWindows license
10 ///////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // declarations
14 // ============================================================================
15
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19
20 // for compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
22
23 #ifdef __BORLANDC__
24 #pragma hdrstop
25 #endif
26
27 #ifndef WX_PRECOMP
28 #include "wx/string.h"
29 #include "wx/window.h"
30 #include "wx/dc.h"
31 #endif //WX_PRECOMP
32
33 #include "wx/splitter.h"
34 #include "wx/renderer.h"
35 #include "wx/msw/uxtheme.h"
36
37 // ----------------------------------------------------------------------------
38 // wxRendererMSW: wxRendererNative implementation for "old" Win32 systems
39 // ----------------------------------------------------------------------------
40
41 class WXDLLEXPORT wxRendererMSW : public wxDelegateRendererNative
42 {
43 public:
44 wxRendererMSW() { }
45
46 static wxRendererNative& Get();
47
48 private:
49 DECLARE_NO_COPY_CLASS(wxRendererMSW)
50 };
51
52 // ----------------------------------------------------------------------------
53 // wxRendererXP: wxRendererNative implementation for Windows XP and later
54 // ----------------------------------------------------------------------------
55
56 class WXDLLEXPORT wxRendererXP : public wxDelegateRendererNative
57 {
58 public:
59 wxRendererXP() : wxDelegateRendererNative(wxRendererMSW::Get()) { }
60
61 static wxRendererNative& Get();
62
63 virtual void DrawSplitterBorder(wxWindow *win,
64 wxDC& dc,
65 const wxRect& rect,
66 int flags = 0);
67 virtual void DrawSplitterSash(wxWindow *win,
68 wxDC& dc,
69 const wxSize& size,
70 wxCoord position,
71 wxOrientation orient,
72 int flags = 0);
73 virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win);
74
75 private:
76 DECLARE_NO_COPY_CLASS(wxRendererXP)
77 };
78
79 // ============================================================================
80 // wxRendererNative and wxRendererMSW implementation
81 // ============================================================================
82
83 /* static */
84 wxRendererNative& wxRendererNative::GetDefault()
85 {
86 wxUxThemeEngine *themeEngine = wxUxThemeEngine::Get();
87 return themeEngine && themeEngine->IsAppThemed() ? wxRendererXP::Get()
88 : wxRendererMSW::Get();
89 }
90
91 /* static */
92 wxRendererNative& wxRendererMSW::Get()
93 {
94 static wxRendererMSW s_rendererMSW;
95
96 return s_rendererMSW;
97 }
98
99 // ============================================================================
100 // wxRendererXP implementation
101 // ============================================================================
102
103 /* static */
104 wxRendererNative& wxRendererXP::Get()
105 {
106 static wxRendererXP s_rendererXP;
107
108 return s_rendererXP;
109 }
110
111 // ----------------------------------------------------------------------------
112 // splitter drawing
113 // ----------------------------------------------------------------------------
114
115 // the width of the sash: this is the same as used by Explorer...
116 static const wxCoord SASH_WIDTH = 4;
117
118 wxSplitterRenderParams
119 wxRendererXP::GetSplitterParams(const wxWindow * win)
120 {
121 if (win->GetWindowStyle() & wxSP_NO_XP_THEME)
122 return m_rendererNative.GetSplitterParams(win);
123 else
124 return wxSplitterRenderParams(SASH_WIDTH, 0, false);
125 }
126
127 void
128 wxRendererXP::DrawSplitterBorder(wxWindow * win,
129 wxDC& dc,
130 const wxRect& rect,
131 int flags)
132 {
133 if (win->GetWindowStyle() & wxSP_NO_XP_THEME)
134 {
135 m_rendererNative.DrawSplitterBorder(win, dc, rect, flags);
136 }
137 }
138
139 void
140 wxRendererXP::DrawSplitterSash(wxWindow *win,
141 wxDC& dc,
142 const wxSize& size,
143 wxCoord position,
144 wxOrientation orient,
145 int flags)
146 {
147 if (win->GetWindowStyle() & wxSP_NO_XP_THEME)
148 {
149 m_rendererNative.DrawSplitterSash(
150 win, dc, size, position, orient, flags);
151 return;
152 }
153
154 // I don't know if it is correct to use the rebar background for the
155 // splitter but it least this works ok in the default theme
156 wxUxThemeHandle hTheme(win, L"REBAR");
157 if ( hTheme )
158 {
159 RECT rect;
160 if ( orient == wxVERTICAL )
161 {
162 rect.left = position;
163 rect.right = position + SASH_WIDTH;
164 rect.top = 0;
165 rect.bottom = size.y;
166 }
167 else // wxHORIZONTAL
168 {
169 rect.left = 0;
170 rect.right = size.x;
171 rect.top = position;
172 rect.bottom = position + SASH_WIDTH;
173 }
174
175 wxUxThemeEngine::Get()->DrawThemeBackground
176 (
177 (WXHTHEME)hTheme,
178 dc.GetHDC(),
179 3 /* RP_BAND */,
180 0 /* no state */ ,
181 &rect,
182 NULL
183 );
184 }
185 }
186