// ---------------------------------------------------------------------------
// the pointer to standard radio button wnd proc
-static WNDPROC s_wndprocRadioBtn = (WNDPROC)NULL;
+// static WNDPROC s_wndprocRadioBtn = (WNDPROC)NULL;
+static WXFARPROC s_wndprocRadioBtn = (WXFARPROC)NULL;
// ===========================================================================
// implementation
{
if ( param == BN_CLICKED )
{
- m_selectedButton = -1;
+ int selectedButton = -1;
for ( int i = 0; i < m_noItems; i++ )
{
if ( id == GET_WIN_ID(m_radioButtons[i]) )
{
- m_selectedButton = i;
+ selectedButton = i;
break;
}
}
- wxASSERT_MSG( m_selectedButton != -1, "click from alien button?" );
+ wxASSERT_MSG( selectedButton != -1, "click from alien button?" );
- wxCommandEvent event(wxEVT_COMMAND_RADIOBOX_SELECTED, m_windowId);
- event.SetInt( m_selectedButton );
- event.SetEventObject( this );
- ProcessCommand(event);
+ if ( selectedButton != m_selectedButton )
+ {
+ m_selectedButton = selectedButton;
+
+ SendNotificationEvent();
+ }
+ //else: don't generate events when the selection doesn't change
return TRUE;
}
HWND hwndBtn = (HWND)hWndBtn;
if ( !s_wndprocRadioBtn )
- s_wndprocRadioBtn = (WNDPROC)::GetWindowLong(hwndBtn, GWL_WNDPROC);
+ s_wndprocRadioBtn = (WXFARPROC)::GetWindowLong(hwndBtn, GWL_WNDPROC);
// No GWL_USERDATA in Win16, so omit this subclassing.
#ifdef __WIN32__
#endif
}
+void wxRadioBox::SendNotificationEvent()
+{
+ wxCommandEvent event(wxEVT_COMMAND_RADIOBOX_SELECTED, m_windowId);
+ event.SetInt( m_selectedButton );
+ event.SetEventObject( this );
+ ProcessCommand(event);
+}
+
// ---------------------------------------------------------------------------
// window proc for radio buttons
// ---------------------------------------------------------------------------
if ( processed )
{
if ( sel >= 0 && sel < radiobox->Number() )
+ {
radiobox->SetSelection(sel);
+
+ // emulate the button click
+ radiobox->SendNotificationEvent();
+ }
}
}
if ( !processed )
- return ::CallWindowProc((WNDPROC) s_wndprocRadioBtn, hwnd, msg, wParam, lParam);
+ return ::CallWindowProc(CASTWNDPROC s_wndprocRadioBtn, hwnd, msg, wParam, lParam);
else
return 0;
}