1
///////////////////////////////////////////////////////////////////////////////
3
// Purpose: Owner-draw sample, for Windows
4
// Author: Vadim Zeitlin
7
// RCS-ID: $Id: ownerdrw.cpp 66528 2011-01-02 22:05:14Z VZ $
8
// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9
// Licence: wxWindows licence
10
///////////////////////////////////////////////////////////////////////////////
12
// ============================================================================
13
// headers & declarations
14
// ============================================================================
16
// For compilers that support precompilation, includes "wx.h".
17
#include "wx/wxprec.h"
27
#include "wx/ownerdrw.h"
28
#include "wx/menuitem.h"
29
#include "wx/checklst.h"
31
// Define a new application type
32
class OwnerDrawnApp: public wxApp
38
// Define a new frame type
39
class OwnerDrawnFrame : public wxFrame
43
OwnerDrawnFrame(wxFrame *frame, const wxChar *title, int x, int y, int w, int h);
47
void OnQuit (wxCommandEvent& event);
48
void OnMenuToggle (wxCommandEvent& event);
49
void OnAbout (wxCommandEvent& event);
50
void OnListboxSelect (wxCommandEvent& event);
51
void OnCheckboxToggle (wxCommandEvent& event);
52
void OnListboxDblClick (wxCommandEvent& event);
53
bool OnClose () { return true; }
60
wxCheckListBox *m_pListBox;
61
wxMenuItem *pAboutItem;
68
Menu_Test1, Menu_Test2, Menu_Test3,
69
Menu_Bitmap, Menu_Bitmap2,
70
Menu_Submenu, Menu_Sub1, Menu_Sub2, Menu_Sub3,
71
Menu_Toggle, Menu_About,
72
Menu_Drawn1, Menu_Drawn2, Menu_Drawn3, Menu_Drawn4, Menu_Drawn5,
73
Menu_Native1, Menu_Native2, Menu_Native3, Menu_Native4, Menu_Native5,
75
Control_Listbox, Control_Listbox2
78
BEGIN_EVENT_TABLE(OwnerDrawnFrame, wxFrame)
79
EVT_MENU(Menu_Toggle, OwnerDrawnFrame::OnMenuToggle)
80
EVT_MENU(Menu_About, OwnerDrawnFrame::OnAbout)
81
EVT_MENU(Menu_Quit, OwnerDrawnFrame::OnQuit)
82
EVT_LISTBOX(Control_Listbox, OwnerDrawnFrame::OnListboxSelect)
83
EVT_CHECKLISTBOX(Control_Listbox, OwnerDrawnFrame::OnCheckboxToggle)
84
EVT_COMMAND(Control_Listbox, wxEVT_COMMAND_LISTBOX_DOUBLECLICKED,
85
OwnerDrawnFrame::OnListboxDblClick)
88
IMPLEMENT_APP(OwnerDrawnApp)
90
// init our app: create windows
91
bool OwnerDrawnApp::OnInit(void)
93
if ( !wxApp::OnInit() )
96
OwnerDrawnFrame *pFrame
97
= new OwnerDrawnFrame(NULL, wxT("wxWidgets Ownerdraw Sample"),
103
// create the menu bar for the main frame
104
void OwnerDrawnFrame::InitMenu()
108
wxMenu *file_menu = new wxMenu;
110
#ifndef __WXUNIVERSAL__
111
wxMenu *sub_menu = new wxMenu;
113
// vars used for menu construction
114
wxFont fontLarge(18, wxROMAN, wxNORMAL, wxBOLD, false),
115
fontUlined(12, wxDEFAULT, wxNORMAL, wxNORMAL, true),
116
fontItalic(12, wxMODERN, wxITALIC, wxBOLD, false),
117
// should be at least of the size of bitmaps
118
fontBmp(14, wxDEFAULT, wxNORMAL, wxNORMAL, false);
120
// sorry for my artistic skills...
121
wxBitmap bmpBell(wxT("bell")),
122
bmpSound(wxT("sound")),
123
bmpNoSound(wxT("nosound")),
124
bmpInfo(wxT("info")),
125
bmpInfo_mono(wxT("info_mono"));
128
pItem = new wxMenuItem(sub_menu, Menu_Sub1, wxT("Submenu &first"), wxT("large"));
130
pItem->SetFont(fontLarge);
131
sub_menu->Append(pItem);
133
pItem = new wxMenuItem(sub_menu, Menu_Sub2, wxT("Submenu &second"), wxT("italic"),
135
pItem->SetFont(fontItalic);
136
sub_menu->Append(pItem);
138
pItem = new wxMenuItem(sub_menu, Menu_Sub3, wxT("Submenu &third"), wxT("underlined"),
140
pItem->SetFont(fontUlined);
141
sub_menu->Append(pItem);
144
pItem = new wxMenuItem(file_menu, Menu_Test1, wxT("&Uncheckable"), wxT("red item"));
145
pItem->SetFont(*wxITALIC_FONT);
146
pItem->SetTextColour(wxColor(255, 0, 0));
147
file_menu->Append(pItem);
149
pItem = new wxMenuItem(file_menu, Menu_Test2, wxT("&Checkable"),
150
wxT("checkable item"), wxITEM_CHECK);
151
pItem->SetFont(*wxSMALL_FONT);
152
file_menu->Append(pItem);
153
file_menu->Check(Menu_Test2, true);
155
pItem = new wxMenuItem(file_menu, Menu_Test3, wxT("&Disabled"), wxT("disabled item"));
156
pItem->SetFont(*wxNORMAL_FONT);
157
file_menu->Append(pItem);
158
file_menu->Enable(Menu_Test3, false);
160
file_menu->AppendSeparator();
162
pItem = new wxMenuItem(file_menu, Menu_Bitmap, wxT("&Bell"),
163
wxT("check/uncheck me!"), wxITEM_CHECK);
164
pItem->SetFont(fontBmp);
165
pItem->SetBitmaps(bmpBell);
166
file_menu->Append(pItem);
168
pItem = new wxMenuItem(file_menu, Menu_Bitmap2, wxT("So&und"),
169
wxT("icon changes!"), wxITEM_CHECK);
170
pItem->SetFont(fontBmp);
171
pItem->SetBitmaps(bmpSound, bmpNoSound);
172
file_menu->Append(pItem);
174
file_menu->AppendSeparator();
176
pItem = new wxMenuItem(file_menu, Menu_Submenu, wxT("&Sub menu"), wxT(""),
177
wxITEM_CHECK, sub_menu);
178
pItem->SetFont(*wxSWISS_FONT);
179
file_menu->Append(pItem);
181
file_menu->AppendSeparator();
182
pItem = new wxMenuItem(file_menu, Menu_Toggle, wxT("&Disable/Enable\tCtrl+D"),
183
wxT("enables/disables the About-Item"), wxITEM_NORMAL);
184
pItem->SetFont(*wxNORMAL_FONT);
185
file_menu->Append(pItem);
187
// Of course Ctrl+RatherLongAccel will not work in this example:
188
pAboutItem = new wxMenuItem(file_menu, Menu_About, wxT("&About\tCtrl+RatherLongAccel"),
189
wxT("display program information"), wxITEM_NORMAL);
190
pAboutItem->SetBitmap(bmpInfo);
191
pAboutItem->SetDisabledBitmap(bmpInfo_mono);
192
file_menu->Append(pAboutItem);
194
file_menu->AppendSeparator();
197
pItem = new wxMenuItem(file_menu, Menu_Quit, wxT("&Quit"), wxT("Normal item"),
199
file_menu->Append(pItem);
201
wxMenu* drawn_menu = new wxMenu;
202
pItem = new wxMenuItem(drawn_menu, Menu_Drawn1, wxT("&Menu item\tCtrl+K"));
203
drawn_menu->Append(pItem);
205
drawn_menu->AppendSeparator();
207
pItem = new wxMenuItem(drawn_menu, Menu_Drawn2, wxT("&Checked item"),
208
wxT("check/uncheck me!"), wxITEM_CHECK);
209
drawn_menu->Append(pItem);
210
drawn_menu->Check(Menu_Drawn2, true);
212
pItem = new wxMenuItem(drawn_menu, Menu_Drawn3, wxT("&Radio item"),
213
wxT("check/uncheck me!"), wxITEM_RADIO);
214
drawn_menu->Append(pItem);
216
drawn_menu->AppendSeparator();
218
pItem = new wxMenuItem(drawn_menu, Menu_Drawn4, wxT("&Disabled item\tCtrl+RatherLongAccel"),
219
wxT("disabled item"));
220
pItem->Enable(false);
221
drawn_menu->Append(pItem);
223
pItem = new wxMenuItem(drawn_menu, Menu_Drawn5, wxT("&Other\tCtrl+O"), wxT("other item"));
224
pItem->SetTextColour(*wxRED);
225
drawn_menu->Append(pItem);
227
wxMenu* native_menu = new wxMenu;
228
pItem = new wxMenuItem(native_menu, Menu_Native1, wxT("&Menu item\tCtrl+K"));
229
native_menu->Append(pItem);
231
native_menu->AppendSeparator();
233
pItem = new wxMenuItem(native_menu, Menu_Native2, wxT("&Checked item"),
234
wxT("check/uncheck me!"), wxITEM_CHECK);
235
native_menu->Append(pItem);
236
native_menu->Check(Menu_Native2, true);
238
pItem = new wxMenuItem(native_menu, Menu_Native3, wxT("&Radio item"),
239
wxT("check/uncheck me!"), wxITEM_RADIO);
240
native_menu->Append(pItem);
242
native_menu->AppendSeparator();
244
pItem = new wxMenuItem(native_menu, Menu_Native4, wxT("&Disabled item\tCtrl+RatherLongAccel"),
245
wxT("disabled item"));
246
pItem->Enable(false);
247
native_menu->Append(pItem);
249
pItem = new wxMenuItem(native_menu, Menu_Native5, wxT("&Other\tCtrl+O"), wxT("other item"));
250
native_menu->Append(pItem);
252
wxMenuBar *menu_bar = new wxMenuBar;
254
menu_bar->Append(file_menu, wxT("&File"));
255
menu_bar->Append(drawn_menu, wxT("&Drawn"));
256
menu_bar->Append(native_menu, wxT("&Native"));
257
SetMenuBar(menu_bar);
260
// main frame constructor
261
OwnerDrawnFrame::OwnerDrawnFrame(wxFrame *frame, const wxChar *title,
262
int x, int y, int w, int h)
263
: wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h))
266
SetIcon(wxICON(sample));
272
// create the status line
273
const int widths[] = { -1, 60 };
275
SetStatusWidths(2, widths);
276
SetStatusText(wxT("no selection"), 0);
277
#endif // wxUSE_STATUSBAR
279
// make a panel with some controls
280
wxPanel *pPanel = new wxPanel(this);
283
static const wxChar* aszChoices[] = { wxT("Hello"), wxT("world"), wxT("and"),
284
wxT("goodbye"), wxT("cruel"), wxT("world"),
285
wxT("-------"), wxT("owner-drawn"), wxT("listbox") };
287
wxString *astrChoices = new wxString[WXSIZEOF(aszChoices)];
289
for ( ui = 0; ui < WXSIZEOF(aszChoices); ui++ )
290
astrChoices[ui] = aszChoices[ui];
292
m_pListBox = new wxCheckListBox
295
Control_Listbox, // control id
296
wxPoint(10, 10), // listbox position
297
wxSize(200, 200), // listbox size
298
WXSIZEOF(aszChoices), // number of strings
299
astrChoices // array of strings
302
delete [] astrChoices;
304
for ( ui = 0; ui < WXSIZEOF(aszChoices); ui += 2 )
306
#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
307
m_pListBox->GetItem(ui)->SetBackgroundColour(wxColor(200, 200, 200));
311
m_pListBox->Check(2);
313
// normal (but owner-drawn) listbox
314
static const wxChar* aszColors[] = { wxT("Red"), wxT("Blue"), wxT("Pink"),
315
wxT("Green"), wxT("Yellow"),
316
wxT("Black"), wxT("Violet") };
318
astrChoices = new wxString[WXSIZEOF(aszColors)];
320
for ( ui = 0; ui < WXSIZEOF(aszColors); ui++ )
322
astrChoices[ui] = aszColors[ui];
325
wxListBox *pListBox = new wxListBox
328
Control_Listbox2, // control id
329
wxPoint(220, 10), // listbox position
330
wxSize(200, 200), // listbox size
331
WXSIZEOF(aszColors), // number of strings
332
astrChoices, // array of strings
333
wxLB_OWNERDRAW // owner-drawn
336
#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
338
struct { unsigned char r, g, b; } aColors[] =
340
{255,0,0}, {0,0,255}, {255,128,192},
341
{0,255,0}, {255,255,128},
345
for ( ui = 0; ui < WXSIZEOF(aszColors); ui++ )
347
pListBox->GetItem(ui)->SetTextColour(wxColor(aColors[ui].r,
350
// yellow on white is horrible...
353
pListBox->GetItem(ui)->SetBackgroundColour(wxColor(0, 0, 0));
358
wxUnusedVar( pListBox );
361
delete[] astrChoices;
366
void OwnerDrawnFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
371
void OwnerDrawnFrame::OnMenuToggle(wxCommandEvent& WXUNUSED(event))
373
// This example shows the use of bitmaps in ownerdrawn menuitems and is not a good
374
// example on how to enable and disable menuitems - this should be done with the help of
375
// EVT_UPDATE_UI and EVT_UPDATE_UI_RANGE !
376
pAboutItem->Enable( pAboutItem->IsEnabled() ? false : true );
379
void OwnerDrawnFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
381
wxMessageDialog dialog(this,
382
wxT("Demo of owner-drawn controls\n"),
383
wxT("About wxOwnerDrawn"), wxYES_NO | wxCANCEL);
387
void OwnerDrawnFrame::OnListboxSelect(wxCommandEvent& event)
390
wxString strSelection;
391
unsigned int nSel = event.GetSelection();
392
strSelection.Printf(wxT("item %d selected (%schecked)"), nSel,
393
m_pListBox->IsChecked(nSel) ? wxT("") : wxT("not "));
394
SetStatusText(strSelection);
397
#endif // wxUSE_STATUSBAR
400
void OwnerDrawnFrame::OnListboxDblClick(wxCommandEvent& WXUNUSED(event))
402
wxString strSelection;
403
strSelection.Printf(wxT("item %d double clicked"),
404
m_pListBox->GetSelection());
405
wxMessageDialog dialog(this, strSelection);
409
void OwnerDrawnFrame::OnCheckboxToggle(wxCommandEvent& event)
412
wxString strSelection;
413
unsigned int nItem = event.GetInt();
414
strSelection.Printf(wxT("item %d was %schecked"), nItem,
415
m_pListBox->IsChecked(nItem) ? wxT("") : wxT("un"));
416
SetStatusText(strSelection);
419
#endif // wxUSE_STATUSBAR