X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7fb1b2b4c4f9f92e40584899ce627dde38b376c1..1e52188741389278cd99abf79218162c87024ba3:/src/msw/button.cpp diff --git a/src/msw/button.cpp b/src/msw/button.cpp index 35effc181d..8ee6217a77 100644 --- a/src/msw/button.cpp +++ b/src/msw/button.cpp @@ -5,8 +5,8 @@ // Modified by: // Created: 04/01/98 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Copyright: (c) Julian Smart +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "button.h" #endif @@ -31,6 +31,7 @@ #if wxUSE_BUTTON #ifndef WX_PRECOMP + #include "wx/app.h" #include "wx/button.h" #include "wx/brush.h" #include "wx/panel.h" @@ -45,7 +46,79 @@ // macros // ---------------------------------------------------------------------------- +#if wxUSE_EXTENDED_RTTI + +enum wxButtonStyleBits +{ + wxButtonExactFitBit = 0 , + wxButtonLeftBit = 6 , + wxButtonTopBit = 7 , + wxButtonRightBit = 8 , + wxButtonBottomBit = 9 , + +// wxNoFullRepaintOnResizeBit = 16 , +// wxPopUpWindowBit = 17 , + wxWantCharsBit = 18 , +// wxTabTraversalBit = 19 , + + wxTransparentWindowBit = 20 , + wxBorderNoneBit = 21 , +// wxClipChildrenBit = 22 , +// wxAlwaysShowScrollBarsBit = 23 , + + wxBorderStaticBit = 24 , + wxBorderSimpleBit = 25 , + wxBorderRaisedBit = 26 , + wxBorderSunkenBit = 27 , + + wxBorderDoubleBit = 28 , +// wxCaptionBit = 29 , +// wxClipSiblingsBit = 29 , // caption not used for non toplevel +// wxHScrolBit = 30 , +// wxVScrollBit = 31 , +} ; + +typedef wxFlags wxButtonStyleFlags ; + +WX_BEGIN_ENUM( wxButtonStyleBits) + WX_ENUM_MEMBER( wxButtonExactFitBit) + WX_ENUM_MEMBER( wxButtonLeftBit) + WX_ENUM_MEMBER( wxButtonTopBit) + WX_ENUM_MEMBER( wxButtonRightBit) + WX_ENUM_MEMBER( wxButtonBottomBit) + WX_ENUM_MEMBER( wxWantCharsBit) + WX_ENUM_MEMBER( wxTransparentWindowBit) + WX_ENUM_MEMBER( wxBorderNoneBit) + WX_ENUM_MEMBER( wxBorderStaticBit) + WX_ENUM_MEMBER( wxBorderSimpleBit) + WX_ENUM_MEMBER( wxBorderRaisedBit) + WX_ENUM_MEMBER( wxBorderSunkenBit) + WX_ENUM_MEMBER( wxBorderDoubleBit) +WX_END_ENUM( wxButtonStyleBits) + +WX_IMPLEMENT_SET_STREAMING( wxButtonStyleFlags , wxButtonStyleBits) + +IMPLEMENT_DYNAMIC_CLASS_XTI(wxButton, wxControl,"wx/button.h") + +WX_BEGIN_PROPERTIES_TABLE(wxButton) + WX_DELEGATE( OnClick , wxEVT_COMMAND_BUTTON_CLICKED , wxCommandEvent , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + + WX_PROPERTY( Font , wxFont , SetFont , GetFont , , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + WX_PROPERTY( Label, wxString , SetLabel, GetLabel, wxEmptyString, 0 /*flags*/ , wxT("Helpstring") , wxT("group") ) + + WX_PROPERTY_FLAGS( WindowStyle , wxButtonStyleFlags , long , SetWindowStyleFlag , GetWindowStyleFlag , , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style + +WX_END_PROPERTIES_TABLE() + +WX_BEGIN_HANDLERS_TABLE(wxButton) +WX_END_HANDLERS_TABLE() + +WX_CONSTRUCTOR_6( wxButton , wxWindow* , Parent , wxWindowID , Id , wxString , Label , wxPoint , Position , wxSize , Size , long , WindowStyle ) + + +#else IMPLEMENT_DYNAMIC_CLASS(wxButton, wxControl) +#endif // this macro tries to adjust the default button height to a reasonable value // using the char height as the base @@ -351,9 +424,18 @@ bool wxButton::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) bool processed = FALSE; switch ( param ) { + // NOTE: Apparently older versions (NT 4?) of the common controls send + // BN_DOUBLECLICKED but not a second BN_CLICKED for owner-drawn + // buttons, so in order to send two EVET_BUTTON events we should + // catch both types. Currently (Feb 2003) up-to-date versions of + // win98, win2k and winXP all send two BN_CLICKED messages for + // all button types, so we don't catch BN_DOUBLECLICKED anymore + // in order to not get 3 EVT_BUTTON events. If this is a problem + // then we need to figure out which version of the comctl32 changed + // this behaviour and test for it. + case 1: // message came from an accelerator case BN_CLICKED: // normal buttons send this - case BN_DOUBLECLICKED: // owner-drawn ones also send this processed = SendClickEvent(); break; } @@ -405,8 +487,8 @@ static void DrawButtonText(HDC hdc, COLORREF colOld = SetTextColor(hdc, col); int modeOld = SetBkMode(hdc, TRANSPARENT); - DrawText(hdc, text, text.length(), pRect, - DT_CENTER | DT_VCENTER | DT_SINGLELINE); + // Note: we must have DT_SINGLELINE for DT_VCENTER to work. + ::DrawText(hdc, text, text.length(), pRect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); SetBkMode(hdc, modeOld); SetTextColor(hdc, colOld); @@ -414,11 +496,10 @@ static void DrawButtonText(HDC hdc, static void DrawRect(HDC hdc, const RECT& r) { - MoveToEx(hdc, r.left, r.top, NULL); - LineTo(hdc, r.right, r.top); - LineTo(hdc, r.right, r.bottom); - LineTo(hdc, r.left, r.bottom); - LineTo(hdc, r.left, r.top); + wxDrawLine(hdc, r.left, r.top, r.right, r.top); + wxDrawLine(hdc, r.right, r.top, r.right, r.bottom); + wxDrawLine(hdc, r.right, r.bottom, r.left, r.bottom); + wxDrawLine(hdc, r.left, r.bottom, r.left, r.top); } void wxButton::MakeOwnerDrawn() @@ -532,24 +613,20 @@ static void DrawButtonFrame(HDC hdc, const RECT& rectBtn, InflateRect(&r, -1, -1); } - MoveToEx(hdc, r.left, r.bottom, NULL); - LineTo(hdc, r.right, r.bottom); - LineTo(hdc, r.right, r.top - 1); + wxDrawLine(hdc, r.left, r.bottom, r.right, r.bottom); + wxDrawLine(hdc, r.right, r.bottom, r.right, r.top - 1); (void)SelectObject(hdc, hpenWhite); - MoveToEx(hdc, r.left, r.bottom - 1, NULL); - LineTo(hdc, r.left, r.top); - LineTo(hdc, r.right, r.top); + wxDrawLine(hdc, r.left, r.bottom - 1, r.left, r.top); + wxDrawLine(hdc, r.left, r.top, r.right, r.top); (void)SelectObject(hdc, hpenLightGr); - MoveToEx(hdc, r.left + 1, r.bottom - 2, NULL); - LineTo(hdc, r.left + 1, r.top + 1); - LineTo(hdc, r.right - 1, r.top + 1); + wxDrawLine(hdc, r.left + 1, r.bottom - 2, r.left + 1, r.top + 1); + wxDrawLine(hdc, r.left + 1, r.top + 1, r.right - 1, r.top + 1); (void)SelectObject(hdc, hpenGrey); - MoveToEx(hdc, r.left + 1, r.bottom - 1, NULL); - LineTo(hdc, r.right - 1, r.bottom - 1); - LineTo(hdc, r.right - 1, r.top); + wxDrawLine(hdc, r.left + 1, r.bottom - 1, r.right - 1, r.bottom - 1); + wxDrawLine(hdc, r.right - 1, r.bottom - 1, r.right - 1, r.top); } (void)SelectObject(hdc, hpenOld);