]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/checkbox.cpp
yet another attempt to fix LastFocus bug in wxFrame
[wxWidgets.git] / src / msw / checkbox.cpp
index bffacc03447c024fe286f9bf4be2dca834f95632..24a3e7ce5b7766561fd299dc7f516eb3fca3f032 100644 (file)
@@ -31,6 +31,8 @@
 #ifndef WX_PRECOMP
     #include "wx/checkbox.h"
     #include "wx/brush.h"
+    #include "wx/dcscreen.h"
+    #include "wx/settings.h"
 #endif
 
 #include "wx/msw/private.h"
 // macros
 // ----------------------------------------------------------------------------
 
-#if !USE_SHARED_LIBRARY
-    IMPLEMENT_DYNAMIC_CLASS(wxCheckBox, wxControl)
-    IMPLEMENT_DYNAMIC_CLASS(wxBitmapCheckBox, wxCheckBox)
-#endif
+IMPLEMENT_DYNAMIC_CLASS(wxCheckBox, wxControl)
+IMPLEMENT_DYNAMIC_CLASS(wxBitmapCheckBox, wxCheckBox)
 
 // ============================================================================
 // implementation
@@ -62,14 +62,18 @@ bool wxCheckBox::MSWCommand(WXUINT WXUNUSED(param), WXWORD WXUNUSED(id))
 }
 
 // Single check box item
-bool wxCheckBox::Create(wxWindow *parent, wxWindowID id, const wxString& label,
-           const wxPoint& pos,
-           const wxSize& size, long style,
-           const wxValidator& validator,
-           const wxString& name)
+bool wxCheckBox::Create(wxWindow *parent,
+                        wxWindowID id,
+                        const wxString& label,
+                        const wxPoint& pos,
+                        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->GetBackgroundColour()) ;
@@ -77,9 +81,14 @@ bool wxCheckBox::Create(wxWindow *parent, wxWindowID id, const wxString& label,
 
     m_windowStyle = style;
 
+    // VZ: disabling this ugliness which completely breaks checkboxes in wxGrid
+    //     whoever did it, please tell me where and how does the checkbox fail
+    //     to appear
+#if 0
     wxString Label = label;
     if (Label == wxT(""))
         Label = wxT(" "); // Apparently needed or checkbox won't show
+#endif // 0
 
     if ( id == -1 )
         m_windowId = NewControlId();
@@ -95,6 +104,9 @@ bool wxCheckBox::Create(wxWindow *parent, wxWindowID id, const wxString& label,
     if ( style & wxALIGN_RIGHT )
         msStyle |= BS_LEFTTEXT;
 
+    if ( style & wxCLIP_SIBLINGS )
+        msStyle |= WS_CLIPSIBLINGS;
+
     // We perhaps have different concepts of 3D here - a 3D border,
     // versus a 3D button.
     // So we only wish to give a border if this is specified
@@ -109,7 +121,7 @@ bool wxCheckBox::Create(wxWindow *parent, wxWindowID id, const wxString& label,
        msStyle |= WS_BORDER;
      */
 
-    m_hWnd = (WXHWND)CreateWindowEx(exStyle, wxT("BUTTON"), Label,
+    m_hWnd = (WXHWND)CreateWindowEx(exStyle, wxT("BUTTON"), label,
             msStyle,
             0, 0, 0, 0,
             (HWND)parent->GetHWND(), (HMENU)m_windowId,
@@ -135,27 +147,36 @@ bool wxCheckBox::Create(wxWindow *parent, wxWindowID id, const wxString& label,
 
 void wxCheckBox::SetLabel(const wxString& label)
 {
-  SetWindowText(GetHwnd(), label);
+    SetWindowText(GetHwnd(), label);
 }
 
-wxSize wxCheckBox::DoGetBestSize()
+wxSize wxCheckBox::DoGetBestSize() const
 {
-    int wCheckbox, hCheckbox;
+    static int s_checkSize = 0;
+
+    if ( !s_checkSize )
+    {
+        wxScreenDC dc;
+        dc.SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
+
+        s_checkSize = (3*dc.GetCharHeight())/2;
+    }
 
     wxString str = wxGetWindowText(GetHWND());
 
+    int wCheckbox, hCheckbox;
     if ( !str.IsEmpty() )
     {
         GetTextExtent(str, &wCheckbox, &hCheckbox);
-        wCheckbox += RADIO_SIZE;
+        wCheckbox += s_checkSize + GetCharWidth();
 
-        if ( hCheckbox < RADIO_SIZE )
-            hCheckbox = RADIO_SIZE;
+        if ( hCheckbox < s_checkSize )
+            hCheckbox = s_checkSize;
     }
     else
     {
-        wCheckbox = RADIO_SIZE;
-        hCheckbox = RADIO_SIZE;
+        wCheckbox = s_checkSize;
+        hCheckbox = s_checkSize;
     }
 
     return wxSize(wCheckbox, hCheckbox);
@@ -175,38 +196,10 @@ bool wxCheckBox::GetValue() const
 #ifdef __WIN32__
   return (SendMessage(GetHwnd(), BM_GETCHECK, 0, 0) == BST_CHECKED);
 #else
-  return ((0x003 & SendMessage(GetHwnd(), BM_GETCHECK, 0, 0)) == 0x003);
+  return ((0x001 & SendMessage(GetHwnd(), BM_GETCHECK, 0, 0)) == 0x001);
 #endif
 }
 
-WXHBRUSH wxCheckBox::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
-                                WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
-{
-#if wxUSE_CTL3D
-  if ( m_useCtl3D )
-  {
-    HBRUSH hbrush = Ctl3dCtlColorEx(message, wParam, lParam);
-
-      return (WXHBRUSH) hbrush;
-  }
-#endif
-
-  if (GetParent()->GetTransparentBackground())
-    SetBkMode((HDC) pDC, TRANSPARENT);
-  else
-    SetBkMode((HDC) pDC, OPAQUE);
-
-  ::SetBkColor((HDC) pDC, RGB(GetBackgroundColour().Red(), GetBackgroundColour().Green(), GetBackgroundColour().Blue()));
-  ::SetTextColor((HDC) pDC, RGB(GetForegroundColour().Red(), GetForegroundColour().Green(), GetForegroundColour().Blue()));
-
-  wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID);
-
-  // Note that this will be cleaned up in wxApp::OnIdle, if backgroundBrush
-  // has a zero usage count.
-//  backgroundBrush->RealizeResource();
-  return (WXHBRUSH) backgroundBrush->GetResourceHandle();
-}
-
 void wxCheckBox::Command (wxCommandEvent & event)
 {
   SetValue ((event.GetInt() != 0));
@@ -217,14 +210,16 @@ void wxCheckBox::Command (wxCommandEvent & event)
 // wxBitmapCheckBox
 // ----------------------------------------------------------------------------
 
-bool wxBitmapCheckBox::Create(wxWindow *parent, wxWindowID id, const wxBitmap *label,
+bool wxBitmapCheckBox::Create(wxWindow *parent, wxWindowID id, const wxBitmap *WXUNUSED(label),
            const wxPoint& pos,
            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->GetBackgroundColour()) ;
@@ -270,7 +265,7 @@ bool wxBitmapCheckBox::Create(wxWindow *parent, wxWindowID id, const wxBitmap *l
   return TRUE;
 }
 
-void wxBitmapCheckBox::SetLabel(const wxBitmap& bitmap)
+void wxBitmapCheckBox::SetLabel(const wxBitmap& WXUNUSED(bitmap))
 {
     wxFAIL_MSG(wxT("not implemented"));
 }