X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2f25981069f0409ec17d3ff946870b99f918b717..950905affdfa9041316f82308e1a11e82c783070:/src/msw/checkbox.cpp diff --git a/src/msw/checkbox.cpp b/src/msw/checkbox.cpp index 1734a9b214..1b47fbe0a4 100644 --- a/src/msw/checkbox.cpp +++ b/src/msw/checkbox.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msw/checkbox.cpp +// Name: src/msw/checkbox.cpp // Purpose: wxCheckBox // Author: Julian Smart // Modified by: @@ -17,10 +17,6 @@ // 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" @@ -30,15 +26,16 @@ #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/uxtheme.h" -#include "wx/msw/private.h" +#include "wx/renderer.h" // ---------------------------------------------------------------------------- // constants @@ -56,10 +53,6 @@ #define BST_INDETERMINATE 0x0002 #endif -#ifndef DFCS_HOT - #define DFCS_HOT 0x1000 -#endif - #ifndef DT_HIDEPREFIX #define DT_HIDEPREFIX 0x00100000 #endif @@ -216,9 +209,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 +367,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 +445,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 +471,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 +494,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 +506,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()")); }