]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/checkbox.cpp
MSW fixes for the last change: call Realize() after changing the toolbar; hide/show...
[wxWidgets.git] / src / msw / checkbox.cpp
index 1734a9b214b700100ea147354a0ebd4b0321f64a..02a5a495c55ee59123880ba62abfc1d3febcba0c 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        msw/checkbox.cpp
+// Name:        src/msw/checkbox.cpp
 // Purpose:     wxCheckBox
 // Author:      Julian Smart
 // Modified by:
 // headers
 // ----------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "checkbox.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 
 #if wxUSE_CHECKBOX
 
+#include "wx/checkbox.h"
+
 #ifndef WX_PRECOMP
-    #include "wx/checkbox.h"
     #include "wx/brush.h"
     #include "wx/dcscreen.h"
     #include "wx/settings.h"
 #endif
 
+#include "wx/msw/dc.h"          // for wxDCTemp
 #include "wx/msw/uxtheme.h"
-#include "wx/msw/private.h"
+#include "wx/renderer.h"
 
 // ----------------------------------------------------------------------------
 // constants
     #define BST_INDETERMINATE 0x0002
 #endif
 
-#ifndef DFCS_HOT
-    #define DFCS_HOT 0x1000
-#endif
-
 #ifndef DT_HIDEPREFIX
     #define DT_HIDEPREFIX 0x00100000
 #endif
@@ -216,9 +210,9 @@ wxSize wxCheckBox::DoGetBestSize() const
     wxString str = wxGetWindowText(GetHWND());
 
     int wCheckbox, hCheckbox;
-    if ( !str.IsEmpty() )
+    if ( !str.empty() )
     {
-        GetTextExtent(str, &wCheckbox, &hCheckbox);
+        GetTextExtent(GetLabelText(str), &wCheckbox, &hCheckbox);
         wCheckbox += s_checkSize + GetCharWidth();
 
         if ( hCheckbox < s_checkSize )
@@ -374,6 +368,12 @@ void wxCheckBox::MakeOwnerDrawn(bool ownerDrawn)
     }
 
     ::SetWindowLong(GetHwnd(), GWL_STYLE, style);
+
+    if ( !ownerDrawn )
+    {
+        // ensure that controls state is consistent with internal state
+        DoSet3StateValue(m_state);
+    }
 }
 
 void wxCheckBox::OnMouseEnterOrLeave(wxMouseEvent& event)
@@ -446,23 +446,20 @@ bool wxCheckBox::MSWOnDraw(WXDRAWITEMSTRUCT *item)
     const bool isFocused = m_isPressed || FindFocus() == this;
 
 
-    // draw the checkbox itself: note that this should really, really be in
-    // wxRendererNative but unfortunately we can't add a new virtual function
-    // to it without breaking backwards compatibility
+    // draw the checkbox itself
+    wxDCTemp dc(hdc);
 
-    // classic Win32 version -- this can be useful when we move this into
-#if 0
-    UINT state = DFCS_BUTTONCHECK;
+    int flags = 0;
     if ( !IsEnabled() )
-        state |= DFCS_INACTIVE;
+        flags |= wxCONTROL_DISABLED;
     switch ( Get3StateValue() )
     {
         case wxCHK_CHECKED:
-            state |= DFCS_CHECKED;
+            flags |= wxCONTROL_CHECKED;
             break;
 
         case wxCHK_UNDETERMINED:
-            state |= DFCS_PUSHED;
+            flags |= wxCONTROL_PRESSED;
             break;
 
         default:
@@ -475,62 +472,10 @@ bool wxCheckBox::MSWOnDraw(WXDRAWITEMSTRUCT *item)
     }
 
     if ( wxFindWindowAtPoint(wxGetMousePosition()) == this )
-        state |= DFCS_HOT;
+        flags |= wxCONTROL_CURRENT;
 
-    if ( !::DrawFrameControl(hdc, &rectCheck, DFC_BUTTON, state) )
-    {
-        wxLogLastError(_T("DrawFrameControl(DFC_BUTTON)"));
-    }
-#else // XP version
-    wxUxThemeEngine *themeEngine = wxUxThemeEngine::GetIfActive();
-    if ( !themeEngine )
-        return false;
-
-    wxUxThemeHandle theme(this, L"BUTTON");
-    if ( !theme )
-        return false;
-
-    int state;
-    switch ( Get3StateValue() )
-    {
-        case wxCHK_CHECKED:
-            state = CBS_CHECKEDNORMAL;
-            break;
-
-        case wxCHK_UNDETERMINED:
-            state = CBS_MIXEDNORMAL;
-            break;
-
-        default:
-            wxFAIL_MSG( _T("unexpected Get3StateValue() return value") );
-            // fall through
-
-        case wxCHK_UNCHECKED:
-            state = CBS_UNCHECKEDNORMAL;
-            break;
-    }
-
-    if ( !IsEnabled() )
-        state += CBS_DISABLED_OFFSET;
-    else if ( m_isPressed )
-        state += CBS_PRESSED_OFFSET;
-    else if ( m_isHot )
-        state += CBS_HOT_OFFSET;
-
-    HRESULT hr = themeEngine->DrawThemeBackground
-                              (
-                                theme,
-                                hdc,
-                                BP_CHECKBOX,
-                                state,
-                                &rectCheck,
-                                NULL
-                              );
-    if ( FAILED(hr) )
-    {
-        wxLogApiError(_T("DrawThemeBackground(BP_CHECKBOX)"), hr);
-    }
-#endif // 0/1
+    wxRendererNative::Get().
+        DrawCheckBox(this, dc, wxRectFromRECT(rectCheck), flags);
 
     // draw the text
     const wxString& label = GetLabel();
@@ -550,7 +495,7 @@ bool wxCheckBox::MSWOnDraw(WXDRAWITEMSTRUCT *item)
     // around it
     if ( isFocused )
     {
-        if ( !::DrawText(hdc, label, label.length(), &rectLabel,
+        if ( !::DrawText(hdc, label.wx_str(), label.length(), &rectLabel,
                          fmt | DT_CALCRECT) )
         {
             wxLogLastError(_T("DrawText(DT_CALCRECT)"));
@@ -562,7 +507,7 @@ bool wxCheckBox::MSWOnDraw(WXDRAWITEMSTRUCT *item)
         ::SetTextColor(hdc, ::GetSysColor(COLOR_GRAYTEXT));
     }
 
-    if ( !::DrawText(hdc, label, label.length(), &rectLabel, fmt) )
+    if ( !::DrawText(hdc, label.wx_str(), label.length(), &rectLabel, fmt) )
     {
         wxLogLastError(_T("DrawText()"));
     }