if ( !CreateBase(parent, id, pos, size, style, validator, name) )
return FALSE;
- SetValidator(validator);
-
parent->AddChild((wxButton *)this);
m_backgroundColour = parent->GetBackgroundColour() ;
m_hWnd = (WXHWND)CreateWindowEx
(
MakeExtendedStyle(m_windowStyle),
- _T("BUTTON"),
+ wxT("BUTTON"),
label,
WS_VISIBLE | WS_TABSTOP | WS_CHILD,
- 0, 0, 0, 0,
+ 0, 0, 0, 0,
GetWinHwnd(parent),
(HMENU)m_windowId,
wxGetInstance(),
SetSize(pos.x, pos.y, size.x, size.y);
+ // bad hack added by Robert to make buttons at least
+ // 80 pixels wide. There are probably better ways...
+ // TODO. FIXME.
+ wxSize nsize( GetSize() );
+ if ((nsize.x < 80) || (nsize.y < 23))
+ {
+ if ((size.x == -1) && (nsize.x < 80))
+ nsize.x = 80;
+ if ((size.y == -1) && (nsize.y < 23))
+ nsize.y = 23;
+ SetSize( nsize );
+ }
+
return TRUE;
}
// size management including autosizing
// ----------------------------------------------------------------------------
-wxSize wxButton::DoGetBestSize()
+wxSize wxButton::DoGetBestSize() const
{
wxString label = wxGetWindowText(GetHWND());
int wBtn;
bool processed = FALSE;
switch ( param )
{
- case 1: // 1 for accelerator
+ case 1: // means that the message came from an accelerator
case BN_CLICKED:
processed = SendClickEvent();
break;
return processed;
}
-WXHBRUSH wxButton::OnCtlColor(WXHDC pDC,
- WXHWND pWnd,
- WXUINT nCtlColor,
- WXUINT message,
- WXWPARAM wParam,
- WXLPARAM lParam)
+long wxButton::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
{
- wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID);
+ // make sure that we won't have BS_DEFPUSHBUTTON style any more if the
+ // focus is being transfered to another button with the same parent -
+ // otherwise, we could finish with 2 default buttons inside one panel
+ if ( (nMsg == WM_KILLFOCUS) &&
+ (GetWindowLong(GetHwnd(), GWL_STYLE) & BS_DEFPUSHBUTTON) )
+ {
+ wxWindow *parent = GetParent();
+ wxWindow *win = wxFindWinFromHandle((WXHWND)wParam);
+ if ( win && win->GetParent() == parent )
+ {
+ wxPanel *panel = wxDynamicCast(parent, wxPanel);
+ if ( panel )
+ {
+ panel->SetDefaultItem(this);
+ }
+ // else: I don't know what to do - we'll still have the problem
+ // with multiple default buttons in a dialog...
+ }
+ }
- return (WXHBRUSH) backgroundBrush->GetResourceHandle();
+ // let the base class do all real processing
+ return wxControl::MSWWindowProc(nMsg, wParam, lParam);
}
-