]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix appearance of multiline wxCheckBox with non-standard colours in wxMSW.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 20 Jan 2013 02:09:56 +0000 (02:09 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 20 Jan 2013 02:09:56 +0000 (02:09 +0000)
Owner-drawn checkbox (which is used when wxCheckBox colour is changed) didn't
center its label correctly and didn't right align it when using wxALIGN_RIGHT
style in focused state.

Closes #9628.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73404 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
src/msw/checkbox.cpp

index 4b2afe56a7da8be32e1f5ef1ae072f2058626663..606d65d40d4fa9c4228b6eca7b8a068bbad5b356 100644 (file)
@@ -628,6 +628,7 @@ wxMSW:
 - Display system drag images during drag and drop if available (PeterO).
 - Fix setting initial wxSpinCtrl value outside 0..100 range (joim).
 - Fix changing labels of menu items with bitmaps (Daniel Hyams).
 - Display system drag images during drag and drop if available (PeterO).
 - Fix setting initial wxSpinCtrl value outside 0..100 range (joim).
 - Fix changing labels of menu items with bitmaps (Daniel Hyams).
+- Fix appearance of multiline coloured wxCheckBox (Catalin Raceanu).
 
 wxOSX/Cocoa:
 
 
 wxOSX/Cocoa:
 
index 491279641354063d05674f4112a2c2f1e47c447b..b793c2a589085986c07bf4cc200479047c700c72 100644 (file)
@@ -378,32 +378,35 @@ bool wxCheckBox::MSWOnDraw(WXDRAWITEMSTRUCT *item)
     RECT& rect = dis->rcItem;
     RECT rectCheck,
          rectLabel;
     RECT& rect = dis->rcItem;
     RECT rectCheck,
          rectLabel;
-    rectCheck.top =
-    rectLabel.top = rect.top;
-    rectCheck.bottom =
-    rectLabel.bottom = rect.bottom;
-    const int checkSize = GetBestSize().y;
+    rectLabel.top = rect.top + (rect.bottom - rect.top - GetBestSize().y) / 2;
+    rectLabel.bottom = rectLabel.top + GetBestSize().y;
     const int MARGIN = 3;
     const int MARGIN = 3;
+    const int CXMENUCHECK = ::GetSystemMetrics(SM_CXMENUCHECK);
+    // the space between the checkbox and the label is included in the
+    // check-mark bitmap
+    const int checkSize = wxMin(CXMENUCHECK - MARGIN, GetSize().y);
+    rectCheck.top = rect.top + (rect.bottom - rect.top - checkSize) / 2;
+    rectCheck.bottom = rectCheck.top + checkSize;
 
     const bool isRightAligned = HasFlag(wxALIGN_RIGHT);
     if ( isRightAligned )
     {
 
     const bool isRightAligned = HasFlag(wxALIGN_RIGHT);
     if ( isRightAligned )
     {
-        rectCheck.right = rect.right;
-        rectCheck.left = rectCheck.right - checkSize;
-
-        rectLabel.right = rectCheck.left - MARGIN;
+        rectLabel.right = rect.right - CXMENUCHECK;
         rectLabel.left = rect.left;
         rectLabel.left = rect.left;
+
+        rectCheck.left = rectLabel.right + ( CXMENUCHECK + MARGIN - checkSize ) / 2;
+        rectCheck.right = rectCheck.left + checkSize;
     }
     else // normal, left-aligned checkbox
     {
     }
     else // normal, left-aligned checkbox
     {
-        rectCheck.left = rect.left;
+        rectCheck.left = rect.left + ( CXMENUCHECK - MARGIN - checkSize ) / 2;
         rectCheck.right = rectCheck.left + checkSize;
 
         rectCheck.right = rectCheck.left + checkSize;
 
-        rectLabel.left = rectCheck.right + MARGIN;
+        rectLabel.left = rect.left + CXMENUCHECK;
         rectLabel.right = rect.right;
     }
 
         rectLabel.right = rect.right;
     }
 
-    // show we draw a focus rect?
+    // shall we draw a focus rect?
     const bool isFocused = m_isPressed || FindFocus() == this;
 
 
     const bool isFocused = m_isPressed || FindFocus() == this;
 
 
@@ -456,11 +459,21 @@ bool wxCheckBox::MSWOnDraw(WXDRAWITEMSTRUCT *item)
     // around it
     if ( isFocused )
     {
     // around it
     if ( isFocused )
     {
+        RECT oldLabelRect = rectLabel; // needed if right aligned
+
         if ( !::DrawText(hdc, label.t_str(), label.length(), &rectLabel,
                          fmt | DT_CALCRECT) )
         {
             wxLogLastError(wxT("DrawText(DT_CALCRECT)"));
         }
         if ( !::DrawText(hdc, label.t_str(), label.length(), &rectLabel,
                          fmt | DT_CALCRECT) )
         {
             wxLogLastError(wxT("DrawText(DT_CALCRECT)"));
         }
+
+        if ( isRightAligned )
+        {
+            // move the label rect to the right
+            const int labelWidth = rectLabel.right - rectLabel.left;
+            rectLabel.right = oldLabelRect.right;
+            rectLabel.left = rectLabel.right - labelWidth;
+        }
     }
 
     if ( !IsEnabled() )
     }
 
     if ( !IsEnabled() )