//
if (m_windowStyle & wxCLIP_SIBLINGS )
lStyle |= WS_CLIPSIBLINGS;
- //
- // If the parent is a scrolled window the controls must
- // have this style or they will overlap the scrollbars
- //
- if (pParent)
- if (pParent->IsKindOf(CLASSINFO(wxScrolledWindow)) ||
- pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow)))
- lStyle |= WS_CLIPSIBLINGS;
m_hWnd = (WXHWND)::WinCreateWindow( GetHwndOf(pParent) // Parent handle
,WC_BUTTON // A Button class window
// Subclass again for purposes of dialog editing mode
//
SubclassWin(m_hWnd);
- SetFont(pParent->GetFont());
+ wxFont* pButtonFont = new wxFont( 8
+ ,wxSWISS
+ ,wxNORMAL
+ ,wxNORMAL
+ );
+ SetFont(*pButtonFont);
+ SetXComp(0);
+ SetYComp(0);
SetSize( rPos.x
,rPos.y
,rSize.x
,rSize.y
);
+ delete pButtonFont;
return TRUE;
} // end of wxButton::Create
//
nHeightButton += nHeightChar/1.5;
- wxSize vSize = GetDefaultSize();
+ if (!HasFlag(wxBU_EXACTFIT))
+ {
+ wxSize vSize = GetDefaultSize();
- if (nWidthButton > vSize.x)
- vSize.x = nWidthButton;
- if (nHeightButton > vSize.y)
- vSize.y = nHeightButton;
- return vSize;
+ if (nWidthButton > vSize.x)
+ vSize.x = nWidthButton;
+ if (nHeightButton > vSize.y)
+ vSize.y = nHeightButton;
+ return vSize;
+ }
+ return wxSize( nWidthButton
+ ,nHeightButton
+ );
} // end of wxButton::DoGetBestSize
/* static */
void wxButton::SetDefault()
{
wxWindow* pParent = GetParent();
- wxButton* pBtnOldDefault = NULL;
- wxPanel* pPanel = wxDynamicCast(pParent, wxPanel);
- long lStyle = 0L;
- if (pParent)
+ wxCHECK_RET( pParent, _T("button without parent?") );
+
+ //
+ // Set this one as the default button both for wxWindows and Windows
+ //
+ wxWindow* pWinOldDefault = pParent->SetDefaultItem(this);
+ UpdateDefaultStyle( this
+ ,pWinOldDefault
+ );
+} // end of wxButton::SetDefault
+
+void wxButton::SetTmpDefault()
+{
+ wxWindow* pParent = GetParent();
+
+ wxCHECK_RET( pParent, _T("button without parent?") );
+
+ wxWindow* pWinOldDefault = pParent->GetDefaultItem();
+ pParent->SetTmpDefaultItem(this);
+ if (pWinOldDefault != this)
{
- wxWindow* pWinOldDefault = pParent->SetDefaultItem(this);
+ UpdateDefaultStyle( this
+ ,pWinOldDefault
+ );
+ }
+ //else: no styles to update
+} // end of wxButton::SetTmpDefault
+
+void wxButton::UnsetTmpDefault()
+{
+ wxWindow* pParent = GetParent();
+
+ wxCHECK_RET( pParent, _T("button without parent?") );
- pBtnOldDefault = wxDynamicCast(pWinOldDefault, wxButton);
+ pParent->SetTmpDefaultItem(NULL);
+
+ wxWindow* pWinOldDefault = pParent->GetDefaultItem();
+
+ if (pWinOldDefault != this)
+ {
+ UpdateDefaultStyle( pWinOldDefault
+ ,this
+ );
}
- if (pBtnOldDefault && pBtnOldDefault != this)
+ //else: we had been default before anyhow
+} // end of wxButton::UnsetTmpDefault
+
+void wxButton::UpdateDefaultStyle(
+ wxWindow* pWinDefault
+, wxWindow* pWinOldDefault)
+{
+ wxButton* pBtnOldDefault = wxDynamicCast(pWinOldDefault, wxButton);
+ long lStyle;
+
+ if ( pBtnOldDefault && pBtnOldDefault != pWinDefault )
{
- //
- // Remove the BS_DEFPUSHBUTTON style from the other button
- //
lStyle = ::WinQueryWindowULong(GetHwndOf(pBtnOldDefault), QWL_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 ((lStyle & BS_USERBUTTON) != BS_USERBUTTON)
{
lStyle &= ~BS_DEFAULT;
}
else
{
- //
- // Redraw the button - it will notice itself that it's not the
+ // redraw the button - it will notice itself that it's not the
// default one any longer
- //
pBtnOldDefault->Refresh();
}
}
- //
- // Set this button as the default
- //
- lStyle = ::WinQueryWindowULong(GetHwnd(), QWL_STYLE);
- if ((lStyle & BS_USERBUTTON) != BS_USERBUTTON)
+ wxButton* pBtnDefault = wxDynamicCast(pWinDefault, wxButton);
+
+ if (pBtnDefault)
{
- lStyle != BS_DEFAULT;
- ::WinSetWindowULong(GetHwnd(), QWL_STYLE, lStyle);
+ lStyle = ::WinQueryWindowULong(GetHwndOf(pBtnDefault), QWL_STYLE);
+ if ((lStyle & BS_USERBUTTON) != BS_USERBUTTON)
+ {
+ lStyle != BS_DEFAULT;
+ ::WinSetWindowULong(GetHwndOf(pBtnDefault), QWL_STYLE, lStyle);
+ }
}
-} // end of wxButton::SetDefault
+} // end of wxButton::UpdateDefaultStyle
// ----------------------------------------------------------------------------
// event/message handlers
lStyle |= BS_USERBUTTON;
::WinSetWindowULong(GetHwnd(), QWL_STYLE, lStyle);
}
-} // end of wxCButton::MakeOwnerDrawn
+} // end of wxButton::MakeOwnerDrawn
+
+WXDWORD wxButton::OS2GetStyle(
+ long lStyle
+, WXDWORD* pdwExstyle
+) const
+{
+ //
+ // Buttons never have an external border, they draw their own one
+ //
+ WXDWORD dwStyle = wxControl::OS2GetStyle( (lStyle & ~wxBORDER_MASK) | wxBORDER_NONE
+ ,pdwExstyle
+ );
+
+ //
+ // We must use WS_CLIPSIBLINGS with the buttons or they would draw over
+ // each other in any resizeable dialog which has more than one button in
+ // the bottom
+ //
+ dwStyle |= WS_CLIPSIBLINGS;
+ return dwStyle;
+} // end of wxButton::OS2GetStyle
MRESULT wxButton::WindowProc(
WXUINT uMsg
)
{
//
- // When we receive focus, we want to become the default button in our
- // parent panel
+ // When we receive focus, we want to temporary become the default button in
+ // our parent panel so that pressing "Enter" would activate us -- and when
+ // losing it we should restore the previous default button as well
//
if (uMsg == WM_SETFOCUS)
{
- SetDefault();
+ if (SHORT1FROMMP(lParam) == TRUE)
+ SetTmpDefault();
+ else
+ UnsetTmpDefault();
//
// Let the default processign take place too
,wParam
,lParam
));
-} // end of wxW indowProc
+} // end of wxWindowProc