1 ///////////////////////////////////////////////////////////////////////////////
3 // Purpose: Owner-draw sample, for Windows
4 // Author: Vadim Zeitlin
8 // Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9 // Licence: wxWindows license
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/msw/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
, char *title
, int x
, int y
, int w
, int h
);
47 void OnQuit (wxCommandEvent
& event
);
48 void OnAbout (wxCommandEvent
& event
);
49 void OnListboxSelect (wxCommandEvent
& event
);
50 void OnCheckboxToggle (wxCommandEvent
& event
);
51 void OnListboxDblClick (wxCommandEvent
& event
);
52 bool OnClose () { return TRUE
; }
59 wxCheckListBox
*m_pListBox
;
66 Menu_Test1
, Menu_Test2
, Menu_Test3
,
67 Menu_Bitmap
, Menu_Bitmap2
,
68 Menu_Submenu
, Menu_Sub1
, Menu_Sub2
, Menu_Sub3
,
70 Control_Listbox
, Control_Listbox2
,
73 BEGIN_EVENT_TABLE(OwnerDrawnFrame
, wxFrame
)
74 EVT_MENU(Menu_Quit
, OwnerDrawnFrame::OnQuit
)
75 EVT_LISTBOX(Control_Listbox
, OwnerDrawnFrame::OnListboxSelect
)
76 EVT_CHECKLISTBOX(Control_Listbox
, OwnerDrawnFrame::OnCheckboxToggle
)
77 EVT_COMMAND(Control_Listbox
, wxEVT_COMMAND_LISTBOX_DOUBLECLICKED
,
78 OwnerDrawnFrame::OnListboxDblClick
)
81 IMPLEMENT_APP(OwnerDrawnApp
);
83 // init our app: create windows
84 bool OwnerDrawnApp::OnInit(void)
86 OwnerDrawnFrame
*pFrame
87 = new OwnerDrawnFrame(NULL
, "wxWindows Ownerdraw Sample",
95 // create the menu bar for the main frame
96 void OwnerDrawnFrame::InitMenu()
99 wxMenu
*file_menu
= new wxMenu
,
100 *sub_menu
= new wxMenu
;
102 // vars used for menu construction
104 wxFont
fontLarge(18, wxROMAN
, wxNORMAL
, wxBOLD
, FALSE
),
105 fontUlined(12, wxDEFAULT
, wxNORMAL
, wxNORMAL
, TRUE
),
106 fontItalic(12, wxMODERN
, wxITALIC
, wxBOLD
, FALSE
),
107 // should be at least of the size of bitmaps
108 fontBmp(14, wxDEFAULT
, wxNORMAL
, wxNORMAL
, FALSE
);
110 // sorry for my artistic skills...
111 wxBitmap
bmpBell("bell"), bmpSound("sound"), bmpNoSound("nosound");
114 pItem
= new wxMenuItem(sub_menu
, Menu_Sub1
, "Submenu &first", "large");
116 pItem
->SetFont(fontLarge
);
117 sub_menu
->Append(pItem
);
119 pItem
= new wxMenuItem(sub_menu
, Menu_Sub2
, "Submenu &second", "italic",
121 pItem
->SetFont(fontItalic
);
122 sub_menu
->Append(pItem
);
124 pItem
= new wxMenuItem(sub_menu
, Menu_Sub3
, "Submenu &third", "underlined",
126 pItem
->SetFont(fontUlined
);
127 sub_menu
->Append(pItem
);
130 pItem
= new wxMenuItem(file_menu
, Menu_Test1
, "&Uncheckable", "red item");
131 pItem
->SetFont(*wxITALIC_FONT
);
132 pItem
->SetTextColour(wxColor(255, 0, 0));
133 pItem
->SetMarginWidth(23);
134 file_menu
->Append(pItem
);
136 pItem
= new wxMenuItem(file_menu
, Menu_Test2
, "&Checkable",
137 "checkable item", wxITEM_CHECK
);
138 pItem
->SetFont(*wxSMALL_FONT
);
139 file_menu
->Append(pItem
);
140 file_menu
->Check(Menu_Test2
, TRUE
);
142 pItem
= new wxMenuItem(file_menu
, Menu_Test3
, "&Disabled", "disabled item");
143 pItem
->SetFont(*wxNORMAL_FONT
);
144 file_menu
->Append(pItem
);
145 file_menu
->Enable(Menu_Test3
, FALSE
);
147 file_menu
->AppendSeparator();
149 pItem
= new wxMenuItem(file_menu
, Menu_Bitmap
, "&Bell",
150 "check/uncheck me!", wxITEM_CHECK
);
151 pItem
->SetFont(fontBmp
);
152 pItem
->SetBitmaps(bmpBell
);
153 file_menu
->Append(pItem
);
155 pItem
= new wxMenuItem(file_menu
, Menu_Bitmap2
, "So&und",
156 "icon changes!", wxITEM_CHECK
);
157 pItem
->SetFont(fontBmp
);
158 pItem
->SetBitmaps(bmpSound
, bmpNoSound
);
159 file_menu
->Append(pItem
);
161 file_menu
->AppendSeparator();
163 pItem
= new wxMenuItem(file_menu
, Menu_Submenu
, "&Sub menu", "",
164 wxITEM_CHECK
, sub_menu
);
165 pItem
->SetFont(*wxSWISS_FONT
);
166 file_menu
->Append(pItem
);
168 file_menu
->AppendSeparator();
169 file_menu
->Append(Menu_Quit
, "&Quit", "Normal item");
171 wxMenuBar
*menu_bar
= new wxMenuBar
;
173 menu_bar
->Append(file_menu
, "&File");
174 SetMenuBar(menu_bar
);
177 // main frame constructor
178 OwnerDrawnFrame::OwnerDrawnFrame(wxFrame
*frame
, char *title
,
179 int x
, int y
, int w
, int h
)
180 : wxFrame(frame
, -1, title
, wxPoint(x
, y
), wxSize(w
, h
))
183 SetIcon(wxIcon("mondrian"));
188 // create the status line
189 const int widths
[] = { -1, 60 };
191 SetStatusWidths(2, widths
);
192 SetStatusText("no selection", 0);
194 // make a panel with some controls
195 wxPanel
*pPanel
= new wxPanel(this, -1, wxPoint(0, 0),
196 wxSize(400, 200), wxTAB_TRAVERSAL
);
199 static const char* aszChoices
[] = { "Hello", "world", "and",
200 "goodbye", "cruel", "world",
201 "-------", "owner-drawn", "listbox" };
203 wxString
*astrChoices
= new wxString
[WXSIZEOF(aszChoices
)];
205 for ( ui
= 0; ui
< WXSIZEOF(aszChoices
); ui
++ )
206 astrChoices
[ui
] = aszChoices
[ui
];
208 m_pListBox
= new wxCheckListBox
211 Control_Listbox
, // control id
212 wxPoint(10, 10), // listbox position
213 wxSize(200, 200), // listbox size
214 WXSIZEOF(aszChoices
), // number of strings
215 astrChoices
// array of strings
218 delete [] astrChoices
;
220 for ( ui
= 0; ui
< WXSIZEOF(aszChoices
); ui
+= 2 )
222 m_pListBox
->GetItem(ui
)->SetBackgroundColour(wxColor(200, 200, 200));
225 m_pListBox
->Check(2);
227 // normal (but owner-drawn) listbox
228 static const char* aszColors
[] = { "Red", "Blue", "Pink",
231 struct { unsigned int r
, g
, b
; } aColors
[] =
233 {255,0,0}, {0,0,255}, {255,128,192},
234 {0,255,0}, {255,255,128},
238 astrChoices
= new wxString
[WXSIZEOF(aszColors
)];
240 for ( ui
= 0; ui
< WXSIZEOF(aszColors
); ui
++ )
242 astrChoices
[ui
] = aszColors
[ui
];
245 wxListBox
*pListBox
= new wxListBox
248 Control_Listbox2
, // control id
249 wxPoint(220, 10), // listbox position
250 wxDefaultSize
, // listbox size
251 WXSIZEOF(aszColors
), // number of strings
252 astrChoices
, // array of strings
253 wxLB_OWNERDRAW
, // owner-drawn
254 wxDefaultValidator
, //
258 for ( ui
= 0; ui
< WXSIZEOF(aszColors
); ui
++ )
260 pListBox
->GetItem(ui
)->SetTextColour(wxColor(aColors
[ui
].r
,
263 // yellow on white is horrible...
266 pListBox
->GetItem(ui
)->SetBackgroundColour(wxColor(0, 0, 0));
271 delete[] astrChoices
;
276 OwnerDrawnFrame::~OwnerDrawnFrame()
280 void OwnerDrawnFrame::OnQuit(wxCommandEvent
& event
)
285 void OwnerDrawnFrame::OnAbout(wxCommandEvent
& event
)
287 wxMessageDialog
dialog(this,
288 "Demo of owner-drawn controls\n",
289 "About wxOwnerDrawn", wxYES_NO
| wxCANCEL
);
293 void OwnerDrawnFrame::OnListboxSelect(wxCommandEvent
& event
)
295 wxString strSelection
;
296 unsigned int nSel
= event
.GetSelection();
297 strSelection
.sprintf(wxT("item %d selected (%schecked)"), nSel
,
298 m_pListBox
->IsChecked(nSel
) ? wxT("") : wxT("not "));
299 SetStatusText(strSelection
);
302 void OwnerDrawnFrame::OnListboxDblClick(wxCommandEvent
& event
)
304 wxString strSelection
;
305 strSelection
.sprintf(wxT("item %d double clicked"),
306 m_pListBox
->GetSelection());
307 wxMessageDialog
dialog(this, strSelection
);
311 void OwnerDrawnFrame::OnCheckboxToggle(wxCommandEvent
& event
)
313 wxString strSelection
;
314 unsigned int nItem
= event
.GetInt();
315 strSelection
.sprintf(wxT("item %d was %schecked"), nItem
,
316 m_pListBox
->IsChecked(nItem
) ? wxT("") : wxT("un"));
317 SetStatusText(strSelection
);