/////////////////////////////////////////////////////////////////////////////
-// Name: radiobut.cpp
+// Name: msw/radiobut.cpp
// Purpose: wxRadioButton
// Author: Julian Smart
// Modified by:
// Created: 04/01/98
// RCS-ID: $Id$
// Copyright: (c) Julian Smart and Markus Holzem
-// Licence: wxWindows license
+// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
-#pragma implementation "radiobut.h"
+ #pragma implementation "radiobut.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
-#pragma hdrstop
+ #pragma hdrstop
#endif
+#if wxUSE_RADIOBTN
+
#ifndef WX_PRECOMP
-#include <stdio.h>
-#include "wx/setup.h"
-#include "wx/radiobut.h"
+ #include "wx/radiobut.h"
+ #include "wx/settings.h"
+ #include "wx/brush.h"
#endif
#include "wx/msw/private.h"
-#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxRadioButton, wxControl)
// IMPLEMENT_DYNAMIC_CLASS(wxBitmapRadioButton, wxRadioButton)
-#endif
-bool wxRadioButton::Create(wxWindow *parent, const wxWindowID id,
- const wxString& label,
+bool wxRadioButton::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
+{
+ if (param == BN_CLICKED)
+ {
+ wxCommandEvent event(wxEVT_COMMAND_RADIOBUTTON_SELECTED, m_windowId);
+ event.SetEventObject( this );
+ event.SetInt( GetValue() );
+ ProcessCommand(event);
+ return TRUE;
+ }
+ else return FALSE;
+}
+
+bool wxRadioButton::Create(wxWindow *parent, wxWindowID id,
+ const wxString& label,
const wxPoint& pos,
- const wxSize& size, const long style,
+ const wxSize& size, long style,
const wxValidator& validator,
const wxString& name)
{
SetName(name);
+#if wxUSE_VALIDATORS
SetValidator(validator);
+#endif // wxUSE_VALIDATORS
if (parent) parent->AddChild(this);
- SetBackgroundColour(parent->GetDefaultBackgroundColour());
- SetForegroundColour(parent->GetDefaultForegroundColour());
+ SetBackgroundColour(parent->GetBackgroundColour());
+ SetForegroundColour(parent->GetForegroundColour());
if ( id == -1 )
- m_windowId = (int)NewControlId();
+ m_windowId = (int)NewControlId();
else
- m_windowId = id;
+ m_windowId = id;
int x = pos.x;
int y = pos.y;
groupStyle = WS_GROUP;
// long msStyle = groupStyle | RADIO_FLAGS;
- long msStyle = groupStyle | BS_RADIOBUTTON | WS_CHILD | WS_VISIBLE ;
+ long msStyle = groupStyle | BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE /* | WS_CLIPSIBLINGS */;
+
+ if ( m_windowStyle & wxCLIP_SIBLINGS )
+ msStyle |= WS_CLIPSIBLINGS;
+
bool want3D;
WXDWORD exStyle = Determine3DEffects(0, &want3D) ;
// Even with extended styles, need to combine with WS_BORDER
// for them to look right.
- if (want3D && ((m_windowStyle & wxSIMPLE_BORDER) || (m_windowStyle & wxRAISED_BORDER) ||
- (m_windowStyle & wxSUNKEN_BORDER) || (m_windowStyle & wxDOUBLE_BORDER)))
+/*
+ if ( want3D || wxStyleHasBorder(m_windowStyle) )
msStyle |= WS_BORDER;
+*/
- m_hWnd = (WXHWND) CreateWindowEx(exStyle, RADIO_CLASS, (const char *)label,
+ m_hWnd = (WXHWND) CreateWindowEx(exStyle, RADIO_CLASS, (const wxChar *)label,
msStyle,0,0,0,0,
(HWND) parent->GetHWND(), (HMENU)m_windowId, wxGetInstance(), NULL);
-#if CTL3D
+
+ wxCHECK_MSG( m_hWnd, FALSE, wxT("Failed to create radiobutton") );
+
+#if wxUSE_CTL3D
if (want3D)
{
Ctl3dSubclassCtl((HWND) m_hWnd);
- m_useCtl3D = TRUE;
+ m_useCtl3D = TRUE;
}
#endif
- SetFont(* parent->GetFont());
+ SetFont(parent->GetFont());
// Subclass again for purposes of dialog editing mode
SubclassWin((WXHWND)m_hWnd);
// SetValue(value);
// start GRW fix
- if (label != "")
+ if (label != wxT(""))
{
- float label_width, label_height;
- GetTextExtent(label, &label_width, &label_height, NULL, NULL, GetFont());
+ int label_width, label_height;
+ GetTextExtent(label, &label_width, &label_height, NULL, NULL, & this->GetFont());
if (width < 0)
width = (int)(label_width + RADIO_SIZE);
if (height<0)
SetSize(x, y, width, height);
+ // for compatibility with wxGTK, the first radio button in a group is
+ // always checked (this makes sense anyhow as you need to ensure that at
+ // least one button in the group is checked and this is the simlpest way to
+ // do it)
+ if ( m_windowStyle & wxRB_GROUP )
+ SetValue(TRUE);
+
return TRUE;
}
void wxRadioButton::SetLabel(const wxString& label)
{
- SetWindowText((HWND) GetHWND(), (const char *)label);
+ SetWindowText((HWND) GetHWND(), (const wxChar *)label);
}
-void wxRadioButton::SetValue(const bool value)
+void wxRadioButton::SetValue(bool value)
{
// Following necessary for Win32s, because Win32s translate BM_SETCHECK
SendMessage((HWND) GetHWND(), BM_SETCHECK, (WPARAM)value, 0L);
}
-// Get single selection, for single choice list items
+// Get single selection
bool wxRadioButton::GetValue(void) const
{
- return (SendMessage((HWND) GetHWND(), BM_SETCHECK, 0, 0L) != 0);
+ return (SendMessage((HWND) GetHWND(), BM_GETCHECK, 0, 0L) != 0);
}
-WXHBRUSH wxRadioButton::OnCtlColor(const WXHDC pDC, const WXHWND pWnd, const WXUINT nCtlColor,
- WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
+void wxRadioButton::Command (wxCommandEvent & event)
{
-#if CTL3D
- if ( m_useCtl3D )
- {
- HBRUSH hbrush = Ctl3dCtlColorEx(message, wParam, lParam);
- return (WXHBRUSH) hbrush;
- }
+ SetValue ( (event.m_commandInt != 0) );
+ ProcessCommand (event);
+}
+
+WXHBRUSH wxRadioButton::OnCtlColor(WXHDC pDC, WXHWND WXUNUSED(pWnd), WXUINT WXUNUSED(nCtlColor),
+#if wxUSE_CTL3D
+ WXUINT message,
+ WXWPARAM wParam,
+ WXLPARAM lParam
+#else
+ WXUINT WXUNUSED(message),
+ WXWPARAM WXUNUSED(wParam),
+ WXLPARAM WXUNUSED(lParam)
#endif
+ )
+{
+#if wxUSE_CTL3D
+ if ( m_useCtl3D )
+ {
+ HBRUSH hbrush = Ctl3dCtlColorEx(message, wParam, lParam);
+ return (WXHBRUSH) hbrush;
+ }
+#endif // wxUSE_CTL3D
- if (GetParent()->GetTransparentBackground())
- SetBkMode((HDC) pDC, TRANSPARENT);
- else
- SetBkMode((HDC) pDC, OPAQUE);
+ HDC hdc = (HDC)pDC;
+ if (GetParent()->GetTransparentBackground())
+ SetBkMode(hdc, TRANSPARENT);
+ else
+ SetBkMode(hdc, OPAQUE);
- ::SetBkColor((HDC) pDC, RGB(GetBackgroundColour().Red(), GetBackgroundColour().Green(), GetBackgroundColour().Blue()));
- ::SetTextColor((HDC) pDC, RGB(GetForegroundColour().Red(), GetForegroundColour().Green(), GetForegroundColour().Blue()));
+ wxColour colBack = GetBackgroundColour();
- wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID);
+ if (!IsEnabled())
+ colBack = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE);
- // Note that this will be cleaned up in wxApp::OnIdle, if backgroundBrush
- // has a zero usage count.
-// backgroundBrush->RealizeResource();
- return (WXHBRUSH) backgroundBrush->GetResourceHandle();
-}
+ ::SetBkColor(hdc, wxColourToRGB(colBack));
+ ::SetTextColor(hdc, wxColourToRGB(GetForegroundColour()));
-void wxRadioButton::Command (wxCommandEvent & event)
-{
- SetValue ( (event.m_commandInt != 0) );
- ProcessCommand (event);
-}
+ wxBrush *brush = wxTheBrushList->FindOrCreateBrush(colBack, wxSOLID);
+ return (WXHBRUSH)brush->GetResourceHandle();
+}
// Not implemented
#if 0
-bool wxBitmapRadioButton::Create(wxWindow *parent, const wxWindowID id,
- const wxBitmap *bitmap,
+bool wxBitmapRadioButton::Create(wxWindow *parent, wxWindowID id,
+ const wxBitmap *bitmap,
const wxPoint& pos,
- const wxSize& size, const long style,
+ const wxSize& size, long style,
const wxValidator& validator,
const wxString& name)
{
SetValidator(validator);
if (parent) parent->AddChild(this);
- SetBackgroundColour(parent->GetDefaultBackgroundColour());
- SetForegroundColour(parent->GetDefaultForegroundColour());
+ SetBackgroundColour(parent->GetBackgroundColour());
+ SetForegroundColour(parent->GetForegroundColour());
if ( id == -1 )
- m_windowId = (int)NewControlId();
+ m_windowId = (int)NewControlId();
else
- m_windowId = id;
+ m_windowId = id;
int x = pos.x;
int y = pos.y;
m_hWnd = (WXHWND) CreateWindowEx(MakeExtendedStyle(m_windowStyle), RADIO_CLASS, "toggle",
msStyle,0,0,0,0,
(HWND) parent->GetHWND(), (HMENU)m_windowId, wxGetInstance(), NULL);
-#if CTL3D
+
+ wxCHECK_MSG( m_hWnd, "Failed to create radio button", FALSE );
+
+#if wxUSE_CTL3D
if (!(GetParent()->GetWindowStyleFlag() & wxUSER_COLOURS))
{
Ctl3dSubclassCtl((HWND) GetHWND());
- m_useCtl3D = TRUE;
+ m_useCtl3D = TRUE;
}
#endif
{
}
-void wxBitmapRadioButton::SetValue(const bool value)
+void wxBitmapRadioButton::SetValue(bool value)
{
// Following necessary for Win32s, because Win32s translate BM_SETCHECK
SendMessage((HWND) GetHWND(), BM_SETCHECK, (WPARAM)value, 0L);
}
#endif
+
+#endif // wxUSE_RADIOBTN