From febd929f0f264c64c15750bc477abfdb97f6ee87 Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Sun, 10 Dec 2017 18:15:41 +0100 Subject: [PATCH 1/4] Improve wxRadioBox width on wxMSW Do not use 'RADIO_SIZE 20' as the fixed width of the radio button, but use the actual width as returned by wxRendererNative. wxRendererNative has no GetRadioButtonSize, so for now use GetCheckBoxSize. It returns the same sizes. Also add a half character width to account for the space between the button and the label. There is no need to add extra width to the label of the static box. Closes #18010. --- include/wx/msw/private.h | 1 - src/msw/radiobox.cpp | 14 +++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/include/wx/msw/private.h b/include/wx/msw/private.h index 69a36d0036..6e435871d2 100644 --- a/include/wx/msw/private.h +++ b/include/wx/msw/private.h @@ -100,7 +100,6 @@ WXDLLIMPEXP_BASE void wxSetInstance(HINSTANCE hInst); #define CHECK_IS_FAFA FALSE #define RADIO_CLASS wxT("BUTTON") #define RADIO_FLAGS (BS_AUTORADIOBUTTON|WS_CHILD|WS_VISIBLE) -#define RADIO_SIZE 20 #define RADIO_IS_FAFA FALSE #define PURE_WINDOWS #define GROUP_CLASS wxT("BUTTON") diff --git a/src/msw/radiobox.cpp b/src/msw/radiobox.cpp index 0bc13ada81..8c99b27b1b 100644 --- a/src/msw/radiobox.cpp +++ b/src/msw/radiobox.cpp @@ -36,6 +36,7 @@ #endif #include "wx/msw/subwin.h" +#include "wx/renderer.h" #if wxUSE_TOOLTIPS #include "wx/tooltip.h" @@ -549,6 +550,15 @@ WX_FORWARD_STD_METHODS_TO_SUBWINDOWS(wxRadioBox, wxStaticBox, m_radioButtons) wxSize wxRadioBox::GetMaxButtonSize() const { + // We use GetCheckBox() because there is no dedicated GetRadioBox() method + // in wxRendererNative, but check and radio boxes are usually of the same + // size anyhow. We also add half a character of width to account for the + // extra space after the radio box itself. + const int radioWidth = + wxRendererNative::Get().GetCheckBoxSize( + reinterpret_cast(const_cast(this))).x + + GetCharWidth() / 2; + // calculate the max button size int widthMax = 0, heightMax = 0; @@ -561,8 +571,7 @@ wxSize wxRadioBox::GetMaxButtonSize() const GetTextExtent(wxGetWindowText((*m_radioButtons)[i]), &width, &height); // adjust the size to take into account the radio box itself - // FIXME this is totally bogus! - width += RADIO_SIZE; + width += radioWidth; height *= 3; height /= 2; } @@ -599,7 +608,6 @@ wxSize wxRadioBox::GetTotalButtonSize(const wxSize& sizeBtn) const // and also wide enough for its label int widthLabel; GetTextExtent(GetLabelText(), &widthLabel, NULL); - widthLabel += RADIO_SIZE; // FIXME this is bogus too if ( widthLabel > width ) width = widthLabel; From f696d035a6c03d1210d6c5508e2c056144be6477 Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Sun, 10 Dec 2017 18:18:07 +0100 Subject: [PATCH 2/4] Remove unused variables from wxRadioBox These variables never got assigned a value. --- include/wx/msw/radiobox.h | 5 ----- src/msw/radiobox.cpp | 35 +++++------------------------------ 2 files changed, 5 insertions(+), 35 deletions(-) diff --git a/include/wx/msw/radiobox.h b/include/wx/msw/radiobox.h index 8295bd3da5..f3898edc1e 100644 --- a/include/wx/msw/radiobox.h +++ b/include/wx/msw/radiobox.h @@ -172,11 +172,6 @@ protected: WXHWND m_dummyHwnd; wxWindowIDRef m_dummyId; - // array of widths and heights of the buttons, may be wxDefaultCoord if the - // corresponding quantity should be computed - int *m_radioWidth; - int *m_radioHeight; - // currently selected button or wxNOT_FOUND if none int m_selectedButton; diff --git a/src/msw/radiobox.cpp b/src/msw/radiobox.cpp index 8c99b27b1b..8658a483d4 100644 --- a/src/msw/radiobox.cpp +++ b/src/msw/radiobox.cpp @@ -147,8 +147,6 @@ void wxRadioBox::Init() m_selectedButton = wxNOT_FOUND; m_radioButtons = NULL; m_dummyHwnd = NULL; - m_radioWidth = NULL; - m_radioHeight = NULL; } bool wxRadioBox::Create(wxWindow *parent, @@ -187,13 +185,8 @@ bool wxRadioBox::Create(wxWindow *parent, // buttons to include the dummy button m_radioButtons = new wxSubwindows(n); - m_radioWidth = new int[n]; - m_radioHeight = new int[n]; - for ( int i = 0; i < n; i++ ) { - m_radioWidth[i] = - m_radioHeight[i] = wxDefaultCoord; long styleBtn = BS_AUTORADIOBUTTON | WS_TABSTOP | WS_CHILD | WS_VISIBLE; if ( i == 0 ) styleBtn |= WS_GROUP; @@ -296,9 +289,6 @@ wxRadioBox::~wxRadioBox() if ( m_dummyHwnd ) DestroyWindow((HWND)m_dummyHwnd); - - delete[] m_radioWidth; - delete[] m_radioHeight; } // NB: if this code is changed, wxGetWindowForHWND() which relies on having the @@ -398,9 +388,6 @@ void wxRadioBox::SetString(unsigned int item, const wxString& label) { wxCHECK_RET( IsValid(item), wxT("invalid radiobox index") ); - m_radioWidth[item] = - m_radioHeight[item] = wxDefaultCoord; - ::SetWindowText((*m_radioButtons)[item], label.c_str()); InvalidateBestSize(); @@ -566,20 +553,12 @@ wxSize wxRadioBox::GetMaxButtonSize() const for ( unsigned int i = 0 ; i < count; i++ ) { int width, height; - if ( m_radioWidth[i] < 0 ) - { - GetTextExtent(wxGetWindowText((*m_radioButtons)[i]), &width, &height); + GetTextExtent(wxGetWindowText((*m_radioButtons)[i]), &width, &height); - // adjust the size to take into account the radio box itself - width += radioWidth; - height *= 3; - height /= 2; - } - else - { - width = m_radioWidth[i]; - height = m_radioHeight[i]; - } + // adjust the size to take into account the radio box itself + width += radioWidth; + height *= 3; + height /= 2; if ( widthMax < width ) widthMax = width; @@ -717,8 +696,6 @@ wxRadioBox::PositionAllButtons(int x, int y, int width, int WXUNUSED(height)) { x_offset = startX; y_offset += maxHeight; - if (m_radioWidth[0]>0) - y_offset += cy1/2; } } @@ -747,8 +724,6 @@ wxRadioBox::PositionAllButtons(int x, int y, int width, int WXUNUSED(height)) { // below this one y_offset += maxHeight; - if (m_radioWidth[0]>0) - y_offset += cy1/2; } else { From 6168e44846403e12cd227eb9cb68f9a5d0be8b12 Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Sun, 10 Dec 2017 18:19:26 +0100 Subject: [PATCH 3/4] Remove unused defines from private wxMSW header --- include/wx/msw/private.h | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/include/wx/msw/private.h b/include/wx/msw/private.h index 6e435871d2..f833a58a0f 100644 --- a/include/wx/msw/private.h +++ b/include/wx/msw/private.h @@ -75,41 +75,9 @@ WXDLLIMPEXP_BASE void wxSetInstance(HINSTANCE hInst); typedef FARPROC WndProcCast; #endif - #define CASTWNDPROC (WndProcCast) - -// --------------------------------------------------------------------------- -// some stuff for old Windows versions (FIXME: what does it do here??) -// --------------------------------------------------------------------------- - -#if !defined(APIENTRY) // NT defines APIENTRY, 3.x not - #define APIENTRY FAR PASCAL -#endif - -/* - * Decide what window classes we're going to use - * for this combination of CTl3D/FAFA settings - */ - -#define STATIC_CLASS wxT("STATIC") -#define STATIC_FLAGS (SS_LEFT|WS_CHILD|WS_VISIBLE) -#define CHECK_CLASS wxT("BUTTON") -#define CHECK_FLAGS (BS_AUTOCHECKBOX|WS_TABSTOP|WS_CHILD) -#define CHECK_IS_FAFA FALSE -#define RADIO_CLASS wxT("BUTTON") -#define RADIO_FLAGS (BS_AUTORADIOBUTTON|WS_CHILD|WS_VISIBLE) -#define RADIO_IS_FAFA FALSE -#define PURE_WINDOWS -#define GROUP_CLASS wxT("BUTTON") -#define GROUP_FLAGS (BS_GROUPBOX|WS_CHILD|WS_VISIBLE) - -/* -#define BITCHECK_FLAGS (FB_BITMAP|FC_BUTTONDRAW|FC_DEFAULT|WS_VISIBLE) -#define BITRADIO_FLAGS (FC_BUTTONDRAW|FB_BITMAP|FC_RADIO|WS_CHILD|WS_VISIBLE) -*/ - // --------------------------------------------------------------------------- // misc macros // --------------------------------------------------------------------------- From b833b12931a9d221eefc3297a458e19340341cef Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Sun, 10 Dec 2017 18:23:20 +0100 Subject: [PATCH 4/4] Improve wxRadioBox height on wxMSW With larger fonts, there is an excessive gap between the box and the first (and last) radio button. Instead of using the dynamic character size, use the fixed size of the radio button to determine this height. --- src/msw/radiobox.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/msw/radiobox.cpp b/src/msw/radiobox.cpp index 8658a483d4..7ed9d135ee 100644 --- a/src/msw/radiobox.cpp +++ b/src/msw/radiobox.cpp @@ -582,7 +582,8 @@ wxSize wxRadioBox::GetTotalButtonSize(const wxSize& sizeBtn) const // Add extra space under the label, if it exists. if (!wxControl::GetLabel().empty()) - height += cy1/2; + height += wxRendererNative::Get().GetCheckBoxSize( + reinterpret_cast(const_cast(this))).y / 2; // and also wide enough for its label int widthLabel; @@ -658,7 +659,8 @@ wxRadioBox::PositionAllButtons(int x, int y, int width, int WXUNUSED(height)) // Add extra space under the label, if it exists. if (!wxControl::GetLabel().empty()) - y_offset += cy1/2; + y_offset += wxRendererNative::Get().GetCheckBoxSize( + reinterpret_cast(this)).y / 2; int startX = x_offset; int startY = y_offset;