1 /////////////////////////////////////////////////////////////////////////////
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "button.h"
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
24 #include "wx/button.h"
28 #include "wx/msw/private.h"
30 #if !USE_SHARED_LIBRARY
31 IMPLEMENT_DYNAMIC_CLASS(wxButton
, wxControl
)
34 #define BUTTON_HEIGHT_FROM_CHAR_HEIGHT(cy) (11*EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy)/10)
38 bool wxButton::MSWCommand(WXUINT param
, WXWORD id
)
40 if (param
== BN_CLICKED
|| (param
== 1)) // 1 for accelerator
42 wxCommandEvent
event(wxEVT_COMMAND_BUTTON_CLICKED
, id
);
43 event
.SetEventObject(this);
44 ProcessCommand(event
);
50 bool wxButton::Create(wxWindow
*parent
, wxWindowID id
, const wxString
& label
,
52 const wxSize
& size
, long style
,
53 const wxValidator
& validator
,
57 SetValidator(validator
);
59 parent
->AddChild((wxButton
*)this);
60 m_backgroundColour
= parent
->GetBackgroundColour() ;
61 m_foregroundColour
= parent
->GetForegroundColour() ;
63 m_windowStyle
= (long&)style
;
71 m_windowId
= NewControlId();
75 DWORD exStyle
= MakeExtendedStyle(m_windowStyle
);
77 CreateWindowEx(exStyle
, "BUTTON", label
, BS_PUSHBUTTON
| WS_TABSTOP
| WS_CHILD
,
78 0, 0, 0, 0, (HWND
) parent
->GetHWND(), (HMENU
)m_windowId
,
79 wxGetInstance(), NULL
);
81 m_hWnd
= (WXHWND
)wx_button
;
83 // Subclass again for purposes of dialog editing mode
84 SubclassWin((WXHWND
)wx_button
);
86 SetFont(parent
->GetFont());
88 SetSize(x
, y
, width
, height
);
89 ShowWindow(wx_button
, SW_SHOW
);
94 void wxButton::DoSetSize(int x
, int y
, int width
, int height
, int sizeFlags
)
96 int currentX
, currentY
;
97 GetPosition(¤tX
, ¤tY
);
100 if (x
== -1 || (sizeFlags
& wxSIZE_ALLOW_MINUS_ONE
))
102 if (y
== -1 || (sizeFlags
& wxSIZE_ALLOW_MINUS_ONE
))
105 AdjustForParentClientOrigin(x1
, y1
, sizeFlags
);
107 int actualWidth
= width
;
108 int actualHeight
= height
;
115 GetWindowText((HWND
) GetHWND(), buf
, 300);
116 GetTextExtent(buf
, ¤t_width
, &cyf
,NULL
,NULL
,
119 // If we're prepared to use the existing width, then...
120 if (width
== -1 && ((sizeFlags
& wxSIZE_AUTO_WIDTH
) != wxSIZE_AUTO_WIDTH
))
122 else if (width
== -1)
126 wxGetCharSize(GetHWND(), &cx
, &cy
, & this->GetFont());
127 actualWidth
= (int)(current_width
+ 3*cx
) ;
130 // If we're prepared to use the existing height, then...
131 if (height
== -1 && ((sizeFlags
& wxSIZE_AUTO_HEIGHT
) != wxSIZE_AUTO_HEIGHT
))
133 else if (height
== -1)
135 actualHeight
= BUTTON_HEIGHT_FROM_CHAR_HEIGHT(cyf
);
138 MoveWindow((HWND
) GetHWND(), x1
, y1
, actualWidth
, actualHeight
, TRUE
);
141 void wxButton::SetDefault(void)
143 wxWindow
*parent
= (wxWindow
*)GetParent();
145 parent
->SetDefaultItem(this);
149 SendMessage((HWND
)parent
->GetHWND(), DM_SETDEFID
, m_windowId
, 0L);
152 SendMessage((HWND
)GetHWND(), BM_SETSTYLE
, BS_DEFPUSHBUTTON
, 1L);
155 wxString
wxButton::GetLabel(void) const
157 GetWindowText((HWND
) GetHWND(), wxBuffer
, 300);
158 return wxString(wxBuffer
);
161 void wxButton::SetLabel(const wxString
& label
)
163 SetWindowText((HWND
) GetHWND(), (const char *) label
);
166 WXHBRUSH
wxButton::OnCtlColor(WXHDC pDC
, WXHWND pWnd
, WXUINT nCtlColor
,
167 WXUINT message
, WXWPARAM wParam
, WXLPARAM lParam
)
170 WXHBRUSH hBrush = (WXHBRUSH) MSWDefWindowProc(message, wParam, lParam);
171 // ::SetTextColor((HDC) pDC, GetSysColor(COLOR_BTNTEXT));
172 ::SetTextColor((HDC) pDC, RGB(GetForegroundColour().Red(), GetForegroundColour().Green(),
173 GetForegroundColour().Blue()));
177 // This doesn't in fact seem to make any difference at all - buttons are always
179 ::SetBkColor((HDC
) pDC
, RGB(GetBackgroundColour().Red(), GetBackgroundColour().Green(), GetBackgroundColour().Blue()));
180 ::SetTextColor((HDC
) pDC
, RGB(GetForegroundColour().Red(), GetForegroundColour().Green(), GetForegroundColour().Blue()));
182 wxBrush
*backgroundBrush
= wxTheBrushList
->FindOrCreateBrush(GetBackgroundColour(), wxSOLID
);
184 // Note that this will be cleaned up in wxApp::OnIdle, if backgroundBrush
185 // has a zero usage count.
187 // backgroundBrush->RealizeResource();
188 return (WXHBRUSH
) backgroundBrush
->GetResourceHandle();
191 void wxButton::Command (wxCommandEvent
& event
)
193 ProcessCommand (event
);