{
     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;
     }
 
     if ( !s_wndprocRadioBtn )
         s_wndprocRadioBtn = (WXFARPROC)::GetWindowLong(hwndBtn, GWL_WNDPROC);
-//        s_wndprocRadioBtn = (WNDPROC)::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();
+            }
         }
     }