+ wxString label = wxGetWindowText(GetHWND());
+ int wBtn;
+ GetTextExtent(label, &wBtn, NULL);
+
+ int wChar, hChar;
+ wxGetCharSize(GetHWND(), &wChar, &hChar, &GetFont());
+
+ // add a margin - the button is wider than just its label
+ wBtn += 3*wChar;
+
+ // the button height is proportional to the height of the font used
+ int hBtn = BUTTON_HEIGHT_FROM_CHAR_HEIGHT(hChar);
+
+ wxSize sz = GetDefaultSize();
+ if (wBtn > sz.x) sz.x = wBtn;
+ if (hBtn > sz.y) sz.y = hBtn;
+
+ return sz;
+}
+
+/* static */
+wxSize wxButton::GetDefaultSize()
+{
+ static wxSize s_sizeBtn;
+
+ if ( s_sizeBtn.x == 0 )
+ {
+ wxScreenDC dc;
+ dc.SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
+
+ // the size of a standard button in the dialog units is 50x14,
+ // translate this to pixels
+ // NB1: the multipliers come from the Windows convention
+ // NB2: the extra +1/+2 were needed to get the size be the same as the
+ // size of the buttons in the standard dialog - I don't know how
+ // this happens, but on my system this size is 75x23 in pixels and
+ // 23*8 isn't even divisible by 14... Would be nice to understand
+ // why these constants are needed though!
+ s_sizeBtn.x = (50 * (dc.GetCharWidth() + 1))/4;
+ s_sizeBtn.y = ((14 * dc.GetCharHeight()) + 2)/8;
+ }
+
+ return s_sizeBtn;
+}
+
+// ----------------------------------------------------------------------------
+// set this button as the default one in its panel
+// ----------------------------------------------------------------------------
+
+void wxButton::SetDefault()
+{
+ wxWindow *parent = GetParent();
+ wxButton *btnOldDefault = NULL;
+ wxPanel *panel = wxDynamicCast(parent, wxPanel);
+ if ( panel )
+ {
+ btnOldDefault = panel->GetDefaultItem();
+ panel->SetDefaultItem(this);
+ }
+
+ if ( parent )
+ {
+ SendMessage(GetWinHwnd(parent), DM_SETDEFID, m_windowId, 0L);
+ }
+
+ if ( btnOldDefault )
+ {
+ // remove the BS_DEFPUSHBUTTON style from the other button
+ long style = GetWindowLong(GetHwndOf(btnOldDefault), GWL_STYLE);
+
+ // don't do it with the owner drawn buttons because it will reset
+ // BS_OWNERDRAW style bit too (BS_OWNERDRAW & BS_DEFPUSHBUTTON != 0)!
+ if ( (style & BS_OWNERDRAW) != BS_OWNERDRAW )
+ {
+ style &= ~BS_DEFPUSHBUTTON;
+ SendMessage(GetHwndOf(btnOldDefault), BM_SETSTYLE, style, 1L);
+ }
+ else
+ {
+ // redraw the button - it will notice itself that it's not the
+ // default one any longer
+ btnOldDefault->Refresh();
+ }
+ }
+
+ // set this button as the default
+ long style = GetWindowLong(GetHwnd(), GWL_STYLE);
+ if ( (style & BS_OWNERDRAW) != BS_OWNERDRAW )
+ {
+ style |= BS_DEFPUSHBUTTON;
+ SendMessage(GetHwnd(), BM_SETSTYLE, style, 1L);
+ }
+}
+
+// ----------------------------------------------------------------------------
+// helpers
+// ----------------------------------------------------------------------------
+
+bool wxButton::SendClickEvent()
+{
+ wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, GetId());