]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/radiobox.cpp
Cured radiobutton non-setting by using BS_AUTORADIOBUTTON; cured gridg.cpp
[wxWidgets.git] / src / msw / radiobox.cpp
index c4fe0dc4b867cc687a0e8bbe675696fbde20fa8c..f49f7a857d7fb9ed4993c01763537644c150e9f2 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     04/01/98
 // RCS-ID:      $Id$
 // Copyright:   (c) Julian Smart and Markus Holzem
-// Licence:    wxWindows license
+// Licence:     wxWindows license
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
@@ -32,7 +32,7 @@
 IMPLEMENT_DYNAMIC_CLASS(wxRadioBox, wxControl)
 #endif
 
-bool wxRadioBox::MSWCommand(const WXUINT param, const WXWORD id)
+bool wxRadioBox::MSWCommand(WXUINT param, WXWORD id)
 {
   if (param == BN_CLICKED)
   {
@@ -85,10 +85,10 @@ wxRadioBox::wxRadioBox(void)
   m_radioHeight = NULL ;
 }
 
-bool wxRadioBox::Create(wxWindow *parent, const wxWindowID id, const wxString& title,
+bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title,
              const wxPoint& pos, const wxSize& size,
-             const int n, const wxString choices[],
-             const int majorDim, const long style,
+             int n, const wxString choices[],
+             int majorDim, long style,
              const wxValidator& val, const wxString& name)
 {
   m_selectedButton = -1;
@@ -98,8 +98,8 @@ bool wxRadioBox::Create(wxWindow *parent, const wxWindowID id, const wxString& t
   SetValidator(val);
 
   parent->AddChild(this);
-  m_backgroundColour = parent->GetDefaultBackgroundColour() ;
-  m_foregroundColour = parent->GetDefaultForegroundColour() ;
+  m_backgroundColour = parent->GetBackgroundColour() ;
+  m_foregroundColour = parent->GetForegroundColour() ;
 
   m_windowStyle = (long&)style;
 
@@ -116,7 +116,8 @@ bool wxRadioBox::Create(wxWindow *parent, const wxWindowID id, const wxString& t
   m_noRowsOrCols = majorDim;
   if (majorDim==0)
     m_majorDim = n ;
-  m_majorDim = majorDim ;
+  else // Seemed to make sense to put this 'else' here...  (RD)
+    m_majorDim = majorDim ;
 
   long msStyle = GROUP_FLAGS;
 
@@ -124,41 +125,39 @@ bool wxRadioBox::Create(wxWindow *parent, const wxWindowID id, const wxString& t
   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((DWORD) exStyle, GROUP_CLASS, (title == "" ? NULL : (const char *)title),
-                           msStyle,
-                           0,0,0,0,
-                           (HWND) parent->GetHWND(), (HMENU) m_windowId, wxGetInstance(), NULL) ;
-
   HWND the_handle = (HWND) parent->GetHWND() ;
 
+  m_hWnd = (WXHWND)::CreateWindowEx
+                     (
+                      (DWORD)exStyle,
+                      GROUP_CLASS,
+                      title,
+                      msStyle,
+                      0, 0, 0, 0,
+                      the_handle,
+                      (HMENU)m_windowId,
+                      wxGetInstance(),
+                      NULL
+                     );
+
 #if CTL3D
   if (want3D)
   {
-    Ctl3dSubclassCtl((HWND) m_hWnd);
-       m_useCtl3D = TRUE;
+    Ctl3dSubclassCtl((HWND)m_hWnd);
+    m_useCtl3D = TRUE;
   }
 #endif
 
-  SetFont(parent->GetFont());
+  SetFont(parent->GetFont());
 
-  // Subclass again for purposes of dialog editing mode
   SubclassWin((WXHWND)m_hWnd);
 
-/* Label will be the same as button font now.
-  if (labelFont)
-  {
-    labelFont->RealizeResource();
-    if (labelFont->GetResourceHandle())
-      SendMessage(ms_handle,WM_SETFONT,
-                (WPARAM)labelFont->GetResourceHandle(),0L);
-  }
-*/
-
   // Some radio boxes test consecutive id.
   (void)NewControlId() ;
   m_radioButtons = new WXHWND[n];
@@ -181,13 +180,13 @@ bool wxRadioBox::Create(wxWindow *parent, const wxWindowID id, const wxString& t
   if (want3D)
   {
     Ctl3dSubclassCtl((HWND) m_hWnd);
-       m_useCtl3D = TRUE;
+   m_useCtl3D = TRUE;
   }
 #endif
-    if (GetFont())
+    if (GetFont().Ok())
     {
        SendMessage((HWND)m_radioButtons[i],WM_SETFONT,
-                    (WPARAM)GetFont()->GetResourceHandle(),0L);
+                    (WPARAM)GetFont().GetResourceHandle(),0L);
     }
     m_subControls.Append((wxObject *)newId);
   }
@@ -203,10 +202,10 @@ bool wxRadioBox::Create(wxWindow *parent, const wxWindowID id, const wxString& t
 }
 
 #if 0
-bool wxRadioBox::Create(wxWindow *parent, const wxWindowID id, const wxString& title,
+bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title,
              const wxPoint& pos, const wxSize& size,
-             const int n, const wxBitmap *choices[],
-             const int majorDim, const long style,
+             int n, const wxBitmap *choices[],
+             int majorDim, long style,
              const wxValidator& val, const wxString& name)
 {
   m_selectedButton = -1;
@@ -217,8 +216,8 @@ bool wxRadioBox::Create(wxWindow *parent, const wxWindowID id, const wxString& t
   SetValidator(val);
 
   parent->AddChild(this);
-  m_backgroundColour = parent->GetDefaultBackgroundColour() ;
-  m_foregroundColour = parent->GetDefaultForegroundColour() ;
+  m_backgroundColour = parent->GetBackgroundColour() ;
+  m_foregroundColour = parent->GetForegroundColour() ;
 
   m_windowStyle = (long&)style;
 
@@ -245,8 +244,7 @@ bool wxRadioBox::Create(wxWindow *parent, const wxWindowID id, const wxString& t
   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((DWORD) exStyle, GROUP_CLASS, (title == "" ? NULL : (const char *)title),
@@ -254,26 +252,17 @@ bool wxRadioBox::Create(wxWindow *parent, const wxWindowID id, const wxString& t
                            0,0,0,0,
                            (HWND) parent->GetHWND(), (HMENU) m_windowId, wxGetInstance(), NULL) ;
 
-/*
-  if (labelFont)
-  {
-    labelFont->RealizeResource();
-    if (labelFont->GetResourceHandle())
-      SendMessage(ms_handle,WM_SETFONT,
-                (WPARAM)labelFont->GetResourceHandle(),0L);
-  }
-*/
   the_handle = (HWND) parent->GetHWND();
 
 #if 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);
@@ -302,7 +291,7 @@ bool wxRadioBox::Create(wxWindow *parent, const wxWindowID id, const wxString& t
   if (want3D)
   {
     Ctl3dSubclassCtl((HWND) m_hWnd);
-       m_useCtl3D = TRUE;
+   m_useCtl3D = TRUE;
   }
 #endif
     m_subControls.Append((wxObject *)newId);
@@ -321,7 +310,7 @@ bool wxRadioBox::Create(wxWindow *parent, const wxWindowID id, const wxString& t
 wxRadioBox::~wxRadioBox(void)
 {
   m_isBeingDeleted = TRUE;
-  
+
   if (m_radioButtons)
   {
     int i;
@@ -339,19 +328,19 @@ wxRadioBox::~wxRadioBox(void)
 
 }
 
-wxString wxRadioBox::GetLabel(const int item) const
+wxString wxRadioBox::GetLabel(int item) const
 {
   GetWindowText((HWND)m_radioButtons[item], wxBuffer, 300);
   return wxString(wxBuffer);
 }
 
-void wxRadioBox::SetLabel(const int item, const wxString& label)
+void wxRadioBox::SetLabel(int item, const wxString& label)
 {
   m_radioWidth[item] = m_radioHeight[item] = -1 ;
   SetWindowText((HWND)m_radioButtons[item], (const char *)label);
 }
 
-void wxRadioBox::SetLabel(const int item, wxBitmap *bitmap)
+void wxRadioBox::SetLabel(int item, wxBitmap *bitmap)
 {
 /*
     m_radioWidth[item] = bitmap->GetWidth() + FB_MARGIN ;
@@ -371,7 +360,7 @@ int wxRadioBox::FindString(const wxString& s) const
  return -1;
 }
 
-void wxRadioBox::SetSelection(const int N)
+void wxRadioBox::SetSelection(int N)
 {
   if ((N < 0) || (N >= m_noItems))
     return;
@@ -391,13 +380,13 @@ int wxRadioBox::GetSelection(void) const
 }
 
 // Find string for position
-wxString wxRadioBox::GetString(const int N) const
+wxString wxRadioBox::GetString(int N) const
 {
   GetWindowText((HWND) m_radioButtons[N], wxBuffer, 1000);
   return wxString(wxBuffer);
 }
 
-void wxRadioBox::SetSize(const int x, const int y, const int width, const int height, const int sizeFlags)
+void wxRadioBox::SetSize(int x, int y, int width, int height, int sizeFlags)
 {
   int currentX, currentY;
   GetPosition(&currentX, &currentY);
@@ -409,16 +398,16 @@ void wxRadioBox::SetSize(const int x, const int y, const int width, const int he
   if (y == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
     yy = currentY;
 
+  AdjustForParentClientOrigin(xx, yy, sizeFlags);
+
   char buf[400];
 
   int y_offset = yy;
   int x_offset = xx;
-  float current_width;
-
-  float cyf;
+  int current_width, cyf;
 
   int cx1,cy1 ;
-  wxGetCharSize(m_hWnd, &cx1, &cy1, GetFont());
+  wxGetCharSize(m_hWnd, &cx1, &cy1, GetFont());
   // Attempt to have a look coherent with other platforms:
   // We compute the biggest toggle dim, then we align all
   // items according this value.
@@ -434,7 +423,7 @@ void wxRadioBox::SetSize(const int x, const int y, const int width, const int he
     {
       // It's a labelled toggle
       GetWindowText((HWND) m_radioButtons[i], buf, 300);
-      GetTextExtent(buf, &current_width, &cyf,NULL,NULL, GetFont());
+      GetTextExtent(buf, &current_width, &cyf,NULL,NULL, GetFont());
       eachWidth = (int)(current_width + RADIO_SIZE);
       eachHeight = (int)((3*cyf)/2);
     }
@@ -514,7 +503,7 @@ void wxRadioBox::SetSize(const int x, const int y, const int width, const int he
     {
       // It's a labeled item
       GetWindowText((HWND) m_radioButtons[i], buf, 300);
-      GetTextExtent(buf, &current_width, &cyf,NULL,NULL,GetFont());
+      GetTextExtent(buf, &current_width, &cyf,NULL,NULL, & GetFont());
 
       // How do we find out radio button bitmap size!!
       // By adjusting them carefully, manually :-)
@@ -577,6 +566,15 @@ void wxRadioBox::GetPosition(int *x, int *y) const
   {
     ::ScreenToClient((HWND) parent->GetHWND(), &point);
   }
+  // We may be faking the client origin.
+  // So a window that's really at (0, 30) may appear
+  // (to wxWin apps) to be at (0, 0).
+  if (GetParent())
+  {
+    wxPoint pt(GetParent()->GetClientAreaOrigin());
+    point.x -= pt.x;
+    point.y -= pt.y;
+  }
 
   *x = point.x;
   *y = point.y;
@@ -600,11 +598,6 @@ void wxRadioBox::SetLabel(const wxString& label)
 
 void wxRadioBox::SetFocus(void)
 {
-/*
-  if (m_noItems > 0)
-   ::SetFocus((HWND) m_radioButtons[0]);
-*/
-/* Begin Alberts Patch 26. 5. 1997*/
   if (m_noItems > 0)
   {
     if (m_selectedButton == -1)
@@ -612,11 +605,10 @@ void wxRadioBox::SetFocus(void)
     else
       ::SetFocus((HWND) m_radioButtons[m_selectedButton]);
   }
-/* Ende Alberts Patch*/
 
 }
 
-bool wxRadioBox::Show(const bool show)
+bool wxRadioBox::Show(bool show)
 {
   int cshow;
   if (show)
@@ -632,7 +624,7 @@ bool wxRadioBox::Show(const bool show)
 }
 
 // Enable a specific button
-void wxRadioBox::Enable(const int item, const bool enable)
+void wxRadioBox::Enable(int item, bool enable)
 {
   if (item<0)
     wxWindow::Enable(enable) ;
@@ -641,17 +633,17 @@ void wxRadioBox::Enable(const int item, const bool enable)
 }
 
 // Enable all controls
-void wxRadioBox::Enable(const bool enable)
+void wxRadioBox::Enable(bool enable)
 {
   wxControl::Enable(enable);
-  
+
   int i;
   for (i = 0; i < m_noItems; i++)
     ::EnableWindow((HWND) m_radioButtons[i], enable);
 }
 
 // Show a specific button
-void wxRadioBox::Show(const int item, const bool show)
+void wxRadioBox::Show(int item, bool show)
 {
   if (item<0)
     wxRadioBox::Show(show) ;
@@ -666,8 +658,8 @@ void wxRadioBox::Show(const int item, const bool show)
   }
 }
 
-WXHBRUSH wxRadioBox::OnCtlColor(const WXHDC pDC, const WXHWND pWnd, const WXUINT nCtlColor,
-                       WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
+WXHBRUSH wxRadioBox::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
+      WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
 {
 #if CTL3D
   if ( m_useCtl3D )
@@ -715,43 +707,13 @@ bool wxRadioBox::SetStringSelection (const wxString& s)
     return FALSE;
 }
 
-/*
-void wxRadioBox::SetLabelFont(wxFont *font)
-{
-  // Decrement the usage count of the old label font
-  // (we may be able to free it up)
-  if (labelFont)
-    labelFont->ReleaseResource();
-
-  labelFont = font;
-
-  // Increment usage count
-  if (font)
-    font->UseResource();
-
-  HWND hWnd = GetHWND();
-  if (hWnd != 0)
-  {
-    if (font)
-    {
-      font->RealizeResource();
-      
-      if (font->GetResourceHandle())
-        SendMessage(hWnd, WM_SETFONT,
-                  (WPARAM)font->GetResourceHandle(),TRUE);
-    }
-  }
-}
-
-*/
-
 bool wxRadioBox::ContainsHWND(WXHWND hWnd) const
 {
-       int i;
+  int i;
     for (i = 0; i < Number(); i++)
        if (GetRadioButtons()[i] == hWnd)
           return TRUE;
-       return FALSE;
+  return FALSE;
 }
 
 void wxRadioBox::Command (wxCommandEvent & event)
@@ -760,4 +722,21 @@ void wxRadioBox::Command (wxCommandEvent & event)
   ProcessCommand (event);
 }
 
+long wxRadioBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
+{
+  if (nMsg == WM_NCHITTEST)
+    {
+        int xPos = LOWORD(lParam);  // horizontal position of cursor
+        int yPos = HIWORD(lParam);  // vertical position of cursor
+
+        ScreenToClient(&xPos, &yPos);
+
+        // Make sure you can drag by the top of the groupbox, but let
+        // other (enclosed) controls get mouse events also
+        if (yPos < 10)
+            return (long)HTCLIENT;
+    }
+
+  return wxControl::MSWWindowProc(nMsg, wParam, lParam);
+}