From f2e763d7f1907f7e239afc0f7a8c3e8db3a520cc Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 20 Jan 2013 02:09:56 +0000 Subject: [PATCH] Fix appearance of multiline wxCheckBox with non-standard colours in wxMSW. 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 | 1 + src/msw/checkbox.cpp | 37 +++++++++++++++++++++++++------------ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 4b2afe56a7..606d65d40d 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -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). +- Fix appearance of multiline coloured wxCheckBox (Catalin Raceanu). wxOSX/Cocoa: diff --git a/src/msw/checkbox.cpp b/src/msw/checkbox.cpp index 4912796413..b793c2a589 100644 --- a/src/msw/checkbox.cpp +++ b/src/msw/checkbox.cpp @@ -378,32 +378,35 @@ bool wxCheckBox::MSWOnDraw(WXDRAWITEMSTRUCT *item) 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 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 ) { - rectCheck.right = rect.right; - rectCheck.left = rectCheck.right - checkSize; - - rectLabel.right = rectCheck.left - MARGIN; + rectLabel.right = rect.right - CXMENUCHECK; rectLabel.left = rect.left; + + rectCheck.left = rectLabel.right + ( CXMENUCHECK + MARGIN - checkSize ) / 2; + rectCheck.right = rectCheck.left + checkSize; } else // normal, left-aligned checkbox { - rectCheck.left = rect.left; + rectCheck.left = rect.left + ( CXMENUCHECK - MARGIN - checkSize ) / 2; rectCheck.right = rectCheck.left + checkSize; - rectLabel.left = rectCheck.right + MARGIN; + rectLabel.left = rect.left + CXMENUCHECK; rectLabel.right = rect.right; } - // show we draw a focus rect? + // shall we draw a focus rect? const bool isFocused = m_isPressed || FindFocus() == this; @@ -456,11 +459,21 @@ bool wxCheckBox::MSWOnDraw(WXDRAWITEMSTRUCT *item) // 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 ( 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() ) -- 2.45.2