// 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
/////////////////////////////////////////////////////////////////////////////
// ============================================================================
// headers
// ----------------------------------------------------------------------------
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "button.h"
#endif
#if wxUSE_BUTTON
#ifndef WX_PRECOMP
+ #include "wx/app.h"
#include "wx/button.h"
#include "wx/brush.h"
#include "wx/panel.h"
// macros
// ----------------------------------------------------------------------------
+#if wxUSE_EXTENDED_RTTI
+
+WX_DEFINE_FLAGS( wxButtonStyle )
+
+wxBEGIN_FLAGS( wxButtonStyle )
+ // new style border flags, we put them first to
+ // use them for streaming out
+ wxFLAGS_MEMBER(wxBORDER_SIMPLE)
+ wxFLAGS_MEMBER(wxBORDER_SUNKEN)
+ wxFLAGS_MEMBER(wxBORDER_DOUBLE)
+ wxFLAGS_MEMBER(wxBORDER_RAISED)
+ wxFLAGS_MEMBER(wxBORDER_STATIC)
+ wxFLAGS_MEMBER(wxBORDER_NONE)
+
+ // old style border flags
+ wxFLAGS_MEMBER(wxSIMPLE_BORDER)
+ wxFLAGS_MEMBER(wxSUNKEN_BORDER)
+ wxFLAGS_MEMBER(wxDOUBLE_BORDER)
+ wxFLAGS_MEMBER(wxRAISED_BORDER)
+ wxFLAGS_MEMBER(wxSTATIC_BORDER)
+ wxFLAGS_MEMBER(wxBORDER)
+
+ // standard window styles
+ wxFLAGS_MEMBER(wxTAB_TRAVERSAL)
+ wxFLAGS_MEMBER(wxCLIP_CHILDREN)
+ wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW)
+ wxFLAGS_MEMBER(wxWANTS_CHARS)
+ wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE)
+ wxFLAGS_MEMBER(wxALWAYS_SHOW_SB )
+ wxFLAGS_MEMBER(wxVSCROLL)
+ wxFLAGS_MEMBER(wxHSCROLL)
+
+ wxFLAGS_MEMBER(wxBU_LEFT)
+ wxFLAGS_MEMBER(wxBU_RIGHT)
+ wxFLAGS_MEMBER(wxBU_TOP)
+ wxFLAGS_MEMBER(wxBU_BOTTOM)
+ wxFLAGS_MEMBER(wxBU_EXACTFIT)
+wxEND_FLAGS( wxButtonStyle )
+
+IMPLEMENT_DYNAMIC_CLASS_XTI(wxButton, wxControl,"wx/button.h")
+
+wxBEGIN_PROPERTIES_TABLE(wxButton)
+ wxEVENT_PROPERTY( Click , wxEVT_COMMAND_BUTTON_CLICKED , wxCommandEvent)
+
+ wxPROPERTY( Font , wxFont , SetFont , GetFont , EMPTY_MACROVALUE, 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
+ wxPROPERTY( Label, wxString , SetLabel, GetLabel, wxString(), 0 /*flags*/ , wxT("Helpstring") , wxT("group") )
+
+ wxPROPERTY_FLAGS( WindowStyle , wxButtonStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style
+
+wxEND_PROPERTIES_TABLE()
+
+wxBEGIN_HANDLERS_TABLE(wxButton)
+wxEND_HANDLERS_TABLE()
+
+wxCONSTRUCTOR_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
const wxString& name)
{
if ( !CreateControl(parent, id, pos, size, style, validator, name) )
- return FALSE;
+ return false;
WXDWORD exstyle;
WXDWORD msStyle = MSWGetStyle(style, &exstyle);
msStyle |= BS_TOP;
if ( style & wxBU_BOTTOM )
msStyle |= BS_BOTTOM;
+#ifndef __WXWINCE__
+ // flat 2d buttons
+ if ( style & wxNO_BORDER )
+ msStyle |= BS_FLAT;
+#endif // __WXWINCE__
#endif // __WIN32__
return msStyle;
GetTextExtent(wxGetWindowText(GetHWND()), &wBtn, NULL);
int wChar, hChar;
- wxGetCharSize(GetHWND(), &wChar, &hChar, &GetFont());
+ wxGetCharSize(GetHWND(), &wChar, &hChar, GetFont());
// add a margin -- the button is wider than just its label
wBtn += 3*wChar;
NB: all this is quite complicated by now and the worst is that normally
it shouldn't be necessary at all as for the normal Windows programs
DefWindowProc() and IsDialogMessage() take care of all this
- automatically -- however in wxWindows programs this doesn't work for
+ automatically -- however in wxWidgets programs this doesn't work for
nested hierarchies (i.e. a notebook inside a notebook) for unknown
reason and so we have to reproduce all this code ourselves. It would be
very nice if we could avoid doing it.
wxCHECK_RET( parent, _T("button without parent?") );
- // set this one as the default button both for wxWindows ...
+ // set this one as the default button both for wxWidgets ...
wxWindow *winOldDefault = parent->SetDefaultItem(this);
// ... and Windows
- SetDefaultStyle(wxDynamicCast(winOldDefault, wxButton), FALSE);
- SetDefaultStyle(this, TRUE);
+ SetDefaultStyle(wxDynamicCast(winOldDefault, wxButton), false);
+ SetDefaultStyle(this, true);
}
// set this button as being currently default
wxWindow *winOldDefault = parent->GetDefaultItem();
parent->SetTmpDefaultItem(this);
- SetDefaultStyle(wxDynamicCast(winOldDefault, wxButton), FALSE);
- SetDefaultStyle(this, TRUE);
+ SetDefaultStyle(wxDynamicCast(winOldDefault, wxButton), false);
+ SetDefaultStyle(this, true);
}
// unset this button as currently default, it may still stay permanent default
wxWindow *winOldDefault = parent->GetDefaultItem();
- SetDefaultStyle(this, FALSE);
- SetDefaultStyle(wxDynamicCast(winOldDefault, wxButton), TRUE);
+ SetDefaultStyle(this, false);
+ SetDefaultStyle(wxDynamicCast(winOldDefault, wxButton), true);
}
/* static */
bool wxButton::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
{
- bool processed = FALSE;
+ 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 EVT_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;
}
return processed;
}
-long wxButton::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
+WXLRESULT wxButton::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
{
- // when we receive focus, we want to temporary become the default button in
+ // when we receive focus, we want to temporarily 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 ( nMsg == WM_SETFOCUS )
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);
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()
if ( !wxControl::SetBackgroundColour(colour) )
{
// nothing to do
- return FALSE;
+ return false;
}
MakeOwnerDrawn();
Refresh();
- return TRUE;
+ return true;
}
bool wxButton::SetForegroundColour(const wxColour &colour)
if ( !wxControl::SetForegroundColour(colour) )
{
// nothing to do
- return FALSE;
+ return false;
}
MakeOwnerDrawn();
Refresh();
- return TRUE;
+ return true;
}
/*
DrawRect(hdc, r);
(void)SelectObject(hdc, hpenGrey);
- InflateRect(&r, -1, -1);
+ ::InflateRect(&r, -1, -1);
DrawRect(hdc, r);
}
{
DrawRect(hdc, r);
- InflateRect(&r, -1, -1);
+ ::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);
::DeleteObject(hbrushBackground);
- return TRUE;
+ return true;
}
#endif // __WIN32__