]>
git.saurik.com Git - wxWidgets.git/blob - samples/render/render.cpp
a68df35e474408187ad81ebf8c883bb783593251
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Render wxWidgets sample
4 // Author: Vadim Zeitlin
8 // Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org>
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 // For compilers that support precompilation, includes "wx/wx.h".
21 #include "wx/wxprec.h"
31 #include "wx/dcclient.h"
34 #include "wx/textdlg.h"
36 #include "wx/msgdlg.h"
40 #include "wx/apptrait.h"
41 #include "wx/renderer.h"
43 // ----------------------------------------------------------------------------
45 // ----------------------------------------------------------------------------
47 // the application icon (under Windows and OS/2 it is in resources)
48 #if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__) || defined(__WXX11__)
49 #include "../sample.xpm"
52 // ----------------------------------------------------------------------------
54 // ----------------------------------------------------------------------------
56 // A renderer class draws the header buttons in a "special" way
57 class MyRenderer
: public wxDelegateRendererNative
60 MyRenderer() : wxDelegateRendererNative(wxRendererNative::GetDefault()) { }
62 virtual int DrawHeaderButton(wxWindow
*WXUNUSED(win
),
65 int WXUNUSED(flags
) = 0,
66 wxHeaderSortIconType
WXUNUSED(sortArrow
) = wxHDR_SORT_ICON_NONE
,
67 wxHeaderButtonParams
* WXUNUSED(params
) = NULL
)
69 wxDCBrushChanger
setBrush(dc
, *wxBLUE_BRUSH
);
70 wxDCTextColourChanger
setFgCol(dc
, *wxWHITE
);
71 dc
.DrawRoundedRectangle(rect
, 5);
72 dc
.DrawLabel(wxT("MyRenderer"), wxNullBitmap
, rect
, wxALIGN_CENTER
);
77 // To use a different renderer from the very beginning we must override
78 // wxAppTraits method creating the renderer (another, simpler, alternative is
79 // to call wxRendererNative::Set() a.s.a.p. which should work in 99% of the
80 // cases, but we show this here just for completeness)
81 class MyTraits
: public wxGUIAppTraits
83 virtual wxRendererNative
*CreateRenderer()
85 // it will be deleted on program shutdown by wxWidgets itself
86 return new MyRenderer
;
90 // Define a new application type, each program should derive a class from wxApp
91 class MyApp
: public wxApp
94 virtual bool OnInit();
96 // if we want MyTraits to be used we must override CreateTraits()
97 virtual wxAppTraits
*CreateTraits() { return new MyTraits
; }
100 // Define a new frame type: this is going to be our main frame
101 class MyFrame
: public wxFrame
109 // event handlers (these functions should _not_ be virtual)
110 void OnDrawDisabled(wxCommandEvent
& event
)
111 { OnToggleDrawFlag(event
, wxCONTROL_DISABLED
); }
112 void OnDrawFocused(wxCommandEvent
& event
)
113 { OnToggleDrawFlag(event
, wxCONTROL_FOCUSED
); }
114 void OnDrawPressed(wxCommandEvent
& event
)
115 { OnToggleDrawFlag(event
, wxCONTROL_PRESSED
); }
116 void OnDrawChecked(wxCommandEvent
& event
)
117 { OnToggleDrawFlag(event
, wxCONTROL_CHECKED
); }
118 void OnDrawHot(wxCommandEvent
& event
)
119 { OnToggleDrawFlag(event
, wxCONTROL_CURRENT
); }
121 #if wxUSE_DYNLIB_CLASS
122 void OnLoad(wxCommandEvent
& event
);
123 void OnUnload(wxCommandEvent
& event
);
124 #endif // wxUSE_DYNLIB_CLASS
125 void OnQuit(wxCommandEvent
& event
);
126 void OnAbout(wxCommandEvent
& event
);
128 void OnToggleDrawFlag(wxCommandEvent
& event
, int flag
);
130 class MyPanel
*m_panel
;
132 // any class wishing to process wxWidgets events must use this macro
133 DECLARE_EVENT_TABLE()
136 // a very simple class just to have something to draw on
137 class MyPanel
: public wxPanel
140 MyPanel(wxWindow
*parent
) : wxPanel(parent
) { m_flags
= 0; }
142 int GetFlags() const { return m_flags
; }
143 void SetFlags(int flags
) { m_flags
= flags
; }
146 void OnPaint(wxPaintEvent
&)
150 wxRendererNative
& renderer
= wxRendererNative::Get();
152 int x1
= 10, // text offset
153 x2
= 200, // drawing offset
156 const int lineHeight
= dc
.GetCharHeight();
157 dc
.DrawText("Demonstration of various wxRenderer functions:", x1
, y
);
159 wxString flagsString
;
160 if ( m_flags
& wxCONTROL_DISABLED
)
161 flagsString
+= "wxCONTROL_DISABLED ";
162 if ( m_flags
& wxCONTROL_FOCUSED
)
163 flagsString
+= "wxCONTROL_FOCUSED ";
164 if ( m_flags
& wxCONTROL_PRESSED
)
165 flagsString
+= "wxCONTROL_PRESSED ";
166 if ( m_flags
& wxCONTROL_CURRENT
)
167 flagsString
+= "wxCONTROL_CURRENT ";
168 if ( m_flags
& wxCONTROL_CHECKED
)
169 flagsString
+= "wxCONTROL_CHECKED ";
170 if ( flagsString
.empty() )
171 flagsString
= "(none)";
172 dc
.DrawText("Using flags: " + flagsString
, x1
, y
);
175 dc
.DrawText("DrawHeaderButton() (overridden)", x1
, y
);
176 const wxCoord heightHdr
= renderer
.GetHeaderButtonHeight(this);
177 renderer
.DrawHeaderButton(this, dc
,
178 wxRect(x2
, y
, 100, heightHdr
), m_flags
);
179 y
+= lineHeight
+ heightHdr
;
181 dc
.DrawText("DrawCheckBox()", x1
, y
);
182 const wxSize sizeCheck
= renderer
.GetCheckBoxSize(this);
183 renderer
.DrawCheckBox(this, dc
,
184 wxRect(wxPoint(x2
, y
), sizeCheck
), m_flags
);
185 y
+= lineHeight
+ sizeCheck
.y
;
187 dc
.DrawText("DrawRadioBitmap()", x1
, y
);
188 renderer
.DrawRadioBitmap(this, dc
,
189 wxRect(wxPoint(x2
, y
), sizeCheck
), m_flags
);
190 y
+= lineHeight
+ sizeCheck
.y
;
192 dc
.DrawText("DrawTreeItemButton()", x1
, y
);
193 renderer
.DrawTreeItemButton(this, dc
,
194 wxRect(x2
, y
, 20, 20), m_flags
);
195 y
+= lineHeight
+ 20;
200 DECLARE_EVENT_TABLE()
203 BEGIN_EVENT_TABLE(MyPanel
, wxPanel
)
204 EVT_PAINT(MyPanel::OnPaint
)
207 // ----------------------------------------------------------------------------
209 // ----------------------------------------------------------------------------
211 // IDs for the controls and the menu commands
215 Render_DrawDisabled
= 100,
221 #if wxUSE_DYNLIB_CLASS
224 #endif // wxUSE_DYNLIB_CLASS
226 // standard menu items
227 Render_Quit
= wxID_EXIT
,
229 // it is important for the id corresponding to the "About" command to have
230 // this standard value as otherwise it won't be handled properly under Mac
231 // (where it is special and put into the "Apple" menu)
232 Render_About
= wxID_ABOUT
235 // ----------------------------------------------------------------------------
236 // event tables and other macros for wxWidgets
237 // ----------------------------------------------------------------------------
239 // the event tables connect the wxWidgets events with the functions (event
240 // handlers) which process them. It can be also done at run-time, but for the
241 // simple menu events like this the static method is much simpler.
242 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
243 EVT_MENU(Render_DrawDisabled
, MyFrame::OnDrawDisabled
)
244 EVT_MENU(Render_DrawFocused
, MyFrame::OnDrawFocused
)
245 EVT_MENU(Render_DrawPressed
, MyFrame::OnDrawPressed
)
246 EVT_MENU(Render_DrawChecked
, MyFrame::OnDrawChecked
)
247 EVT_MENU(Render_DrawHot
, MyFrame::OnDrawHot
)
249 #if wxUSE_DYNLIB_CLASS
250 EVT_MENU(Render_Load
, MyFrame::OnLoad
)
251 EVT_MENU(Render_Unload
,MyFrame::OnUnload
)
252 #endif // wxUSE_DYNLIB_CLASS
253 EVT_MENU(Render_Quit
, MyFrame::OnQuit
)
255 EVT_MENU(Render_About
, MyFrame::OnAbout
)
258 // Create a new application object: this macro will allow wxWidgets to create
259 // the application object during program execution (it's better than using a
260 // static object for many reasons) and also implements the accessor function
261 // wxGetApp() which will return the reference of the right type (i.e. MyApp and
265 // ============================================================================
267 // ============================================================================
269 // ----------------------------------------------------------------------------
270 // the application class
271 // ----------------------------------------------------------------------------
273 // 'Main program' equivalent: the program execution "starts" here
276 if ( !wxApp::OnInit() )
279 // create the main application window
285 // ----------------------------------------------------------------------------
287 // ----------------------------------------------------------------------------
293 wxT("Render wxWidgets Sample"),
297 // set the frame icon
298 SetIcon(wxICON(sample
));
302 wxMenu
*menuFile
= new wxMenu
;
303 menuFile
->AppendCheckItem(Render_DrawDisabled
,
304 "Draw in &disabled state\tCtrl-D");
305 menuFile
->AppendCheckItem(Render_DrawFocused
,
306 "Draw in &focused state\tCtrl-F");
307 menuFile
->AppendCheckItem(Render_DrawPressed
,
308 "Draw in &pressed state\tCtrl-P");
309 menuFile
->AppendCheckItem(Render_DrawChecked
,
310 "Draw in &checked state\tCtrl-C");
311 menuFile
->AppendCheckItem(Render_DrawHot
,
312 "Draw in &hot state\tCtrl-H");
313 menuFile
->AppendSeparator();
314 #if wxUSE_DYNLIB_CLASS
315 menuFile
->Append(Render_Load
, wxT("&Load renderer...\tCtrl-L"));
316 menuFile
->Append(Render_Unload
, wxT("&Unload renderer\tCtrl-U"));
317 menuFile
->AppendSeparator();
318 #endif // wxUSE_DYNLIB_CLASS
319 menuFile
->Append(Render_Quit
);
321 // the "About" item should be in the help menu
322 wxMenu
*helpMenu
= new wxMenu
;
323 helpMenu
->Append(Render_About
);
325 // now append the freshly created menu to the menu bar...
326 wxMenuBar
*menuBar
= new wxMenuBar();
327 menuBar
->Append(menuFile
, wxT("&File"));
328 menuBar
->Append(helpMenu
, wxT("&Help"));
330 // ... and attach this menu bar to the frame
332 #endif // wxUSE_MENUS
334 m_panel
= new MyPanel(this);
337 // create a status bar just for fun (by default with 1 pane only)
339 SetStatusText(wxT("Welcome to wxWidgets!"));
340 #endif // wxUSE_STATUSBAR
347 delete wxRendererNative::Set(NULL
);
353 void MyFrame::OnToggleDrawFlag(wxCommandEvent
& event
, int flag
)
355 int flags
= m_panel
->GetFlags();
356 if ( event
.IsChecked() )
361 m_panel
->SetFlags(flags
);
365 #if wxUSE_DYNLIB_CLASS
367 void MyFrame::OnLoad(wxCommandEvent
& WXUNUSED(event
))
369 static wxString s_name
= wxT("renddll");
371 wxString name
= wxGetTextFromUser
373 wxT("Name of the renderer to load:"),
374 wxT("Render wxWidgets Sample"),
386 wxRendererNative
*renderer
= wxRendererNative::Load(name
);
389 wxLogError(wxT("Failed to load renderer \"%s\"."), name
.c_str());
393 delete wxRendererNative::Set(renderer
);
397 wxLogStatus(this, wxT("Successfully loaded the renderer \"%s\"."),
402 void MyFrame::OnUnload(wxCommandEvent
& WXUNUSED(event
))
404 wxRendererNative
*renderer
= wxRendererNative::Set(NULL
);
411 wxLogStatus(this, wxT("Unloaded the previously loaded renderer."));
415 wxLogWarning(wxT("No renderer to unload."));
419 #endif // wxUSE_DYNLIB_CLASS
421 void MyFrame::OnQuit(wxCommandEvent
& WXUNUSED(event
))
423 // true is to force the frame to close
427 void MyFrame::OnAbout(wxCommandEvent
& WXUNUSED(event
))
429 wxMessageBox(wxT("Render sample shows how to use custom renderers.\n")
431 wxT("(c) 2003 Vadim Zeitlin"),
432 wxT("About Render wxWidgets Sample"),
433 wxOK
| wxICON_INFORMATION
, this);