]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/checkbox.cpp
added (wxMSW-only) wxToolTip::SetMaxWidth() and improve its default behaviour (#2817)
[wxWidgets.git] / src / msw / checkbox.cpp
index 8cbda8d72e70a5f01cfbc469a5c69c97bf5b9ff9..bc59d8ad1ae9ecab4a63e09dd65cc82b5d9ff599 100644 (file)
 
 #ifndef WX_PRECOMP
     #include "wx/brush.h"
+    #include "wx/dcclient.h"
     #include "wx/dcscreen.h"
     #include "wx/settings.h"
 #endif
 
+#include "wx/msw/dc.h"          // for wxDCTemp
+#include "wx/renderer.h"
 #include "wx/msw/uxtheme.h"
-#include "wx/msw/private.h"
+#include "wx/msw/private/button.h"
 
 // ----------------------------------------------------------------------------
 // constants
 // ----------------------------------------------------------------------------
 
-#ifndef BST_UNCHECKED
-    #define BST_UNCHECKED 0x0000
-#endif
-
-#ifndef BST_CHECKED
-    #define BST_CHECKED 0x0001
-#endif
-
-#ifndef BST_INDETERMINATE
-    #define BST_INDETERMINATE 0x0002
-#endif
-
-#ifndef DFCS_HOT
-    #define DFCS_HOT 0x1000
-#endif
-
-#ifndef DT_HIDEPREFIX
-    #define DT_HIDEPREFIX 0x00100000
-#endif
-
 #ifndef BP_CHECKBOX
     #define BP_CHECKBOX 3
 #endif
@@ -191,6 +174,8 @@ bool wxCheckBox::Create(wxWindow *parent,
         msStyle |= BS_LEFTTEXT | BS_RIGHT;
     }
 
+    msStyle |= wxMSWButton::GetMultilineStyle(label);
+
     return MSWCreateControl(wxT("BUTTON"), msStyle, pos, size, label, 0);
 }
 
@@ -215,7 +200,9 @@ wxSize wxCheckBox::DoGetBestSize() const
     int wCheckbox, hCheckbox;
     if ( !str.empty() )
     {
-        GetTextExtent(wxStripMenuCodes(str), &wCheckbox, &hCheckbox);
+        wxClientDC dc(const_cast<wxCheckBox *>(this));
+        dc.SetFont(GetFont());
+        dc.GetMultiLineTextExtent(GetLabelText(str), &wCheckbox, &hCheckbox);
         wCheckbox += s_checkSize + GetCharWidth();
 
         if ( hCheckbox < s_checkSize )
@@ -239,6 +226,13 @@ wxSize wxCheckBox::DoGetBestSize() const
 // wxCheckBox operations
 // ----------------------------------------------------------------------------
 
+void wxCheckBox::SetLabel(const wxString& label)
+{
+    wxMSWButton::UpdateMultilineStyle(GetHwnd(), label);
+
+    wxCheckBoxBase::SetLabel(label);
+}
+
 void wxCheckBox::SetValue(bool val)
 {
     Set3StateValue(val ? wxCHK_CHECKED : wxCHK_UNCHECKED);
@@ -449,24 +443,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
-    // wxRendererNative
-#if defined(__WXWINCE__) || !wxUSE_UXTHEME
-    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:
@@ -479,62 +469,10 @@ bool wxCheckBox::MSWOnDraw(WXDRAWITEMSTRUCT *item)
     }
 
     if ( wxFindWindowAtPoint(wxGetMousePosition()) == this )
-        state |= DFCS_HOT;
-
-    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;
-    }
+        flags |= wxCONTROL_CURRENT;
 
-    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();
@@ -554,7 +492,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)"));
@@ -566,7 +504,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()"));
     }