X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cd0b170911637899ac3c126367ee5821f357c185..f49676ee8c0ed60d99582cc0b5f23ff7a7d5b970:/src/msw/button.cpp diff --git a/src/msw/button.cpp b/src/msw/button.cpp index e913563260..86f833762c 100644 --- a/src/msw/button.cpp +++ b/src/msw/button.cpp @@ -95,19 +95,6 @@ bool wxButton::Create(wxWindow *parent, 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; } @@ -143,7 +130,11 @@ wxSize wxButton::DoGetBestSize() const // the button height is proportional to the height of the font used int hBtn = BUTTON_HEIGHT_FROM_CHAR_HEIGHT(hChar); - return wxSize(wBtn, hBtn); + wxSize sz = GetDefaultSize(); + if (wBtn > sz.x) sz.x = wBtn; + if (hBtn > sz.y) sz.y = hBtn; + + return sz; } /* static */ @@ -198,17 +189,26 @@ void wxButton::SetDefault() // 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) ) + 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); - style |= BS_DEFPUSHBUTTON; - SendMessage(GetHwnd(), BM_SETSTYLE, style, 1L); + if ( (style & BS_OWNERDRAW) != BS_OWNERDRAW ) + { + style |= BS_DEFPUSHBUTTON; + SendMessage(GetHwnd(), BM_SETSTYLE, style, 1L); + } } // ---------------------------------------------------------------------------- @@ -248,24 +248,13 @@ bool wxButton::MSWCommand(WXUINT param, WXWORD id) long wxButton::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) { - // 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) ) + // when we receive focus, we want to become the default button in our + // parent panel + if ( nMsg == WM_SETFOCUS ) { - 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... - } + SetDefault(); + + // let the default processign take place too } // let the base class do all real processing @@ -307,7 +296,7 @@ static void DrawRect(HDC hdc, const RECT& r) void wxButton::MakeOwnerDrawn() { long style = GetWindowLong(GetHwnd(), GWL_STYLE); - if ( !(style & BS_OWNERDRAW) ) + if ( (style & BS_OWNERDRAW) != BS_OWNERDRAW ) { // make it so style |= BS_OWNERDRAW; @@ -477,23 +466,18 @@ bool wxButton::MSWOnDraw(WXDRAWITEMSTRUCT *wxdis) DrawFocusRect(hdc, &rectFocus); } + if ( pushed ) + { + // the label is shifted by 1 pixel to create "pushed" effect + OffsetRect(&rectBtn, 1, 1); + } + DrawButtonText(hdc, &rectBtn, GetLabel(), state & ODS_DISABLED ? GetSysColor(COLOR_GRAYTEXT) : colFg); ::DeleteObject(hbrushBackground); -#if 0 - wxString s = "button state: "; - if ( selected ) - s += "selected "; - if ( pushed ) - s += "pushed "; - if ( state & ODS_FOCUS ) - s += "focused "; - wxLogStatus(s); -#endif - return TRUE; }