X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4e47fd5a1b5eecdd668fcbe96b8a64c39af1c196..9d5507f7a2701395e1d5c121bd877bb9066ee6ea:/src/msw/ownerdrw.cpp diff --git a/src/msw/ownerdrw.cpp b/src/msw/ownerdrw.cpp index 5b3312796e..c781c560c3 100644 --- a/src/msw/ownerdrw.cpp +++ b/src/msw/ownerdrw.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: msw/ownerdrw.cpp +// Name: src/msw/ownerdrw.cpp // Purpose: implementation of wxOwnerDrawn class // Author: Vadim Zeitlin // Modified by: @@ -11,27 +11,27 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#include "wx/msw/private.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif #ifndef WX_PRECOMP - #include "wx/window.h" - #include "wx/msw/private.h" - #include "wx/font.h" - #include "wx/bitmap.h" - #include "wx/dcmemory.h" - #include "wx/menu.h" - #include "wx/utils.h" + #include "wx/window.h" + #include "wx/msw/private.h" + #include "wx/font.h" + #include "wx/bitmap.h" + #include "wx/image.h" + #include "wx/dcmemory.h" + #include "wx/menu.h" + #include "wx/utils.h" + #include "wx/settings.h" + #include "wx/menuitem.h" + #include "wx/module.h" #endif -#include "wx/settings.h" #include "wx/ownerdrw.h" -#include "wx/menuitem.h" #include "wx/fontutil.h" -#include "wx/module.h" #if wxUSE_OWNER_DRAWN @@ -100,12 +100,12 @@ IMPLEMENT_DYNAMIC_CLASS(wxMSWSystemMenuFontModule, wxModule) // a UDT. Will produce errors if applied using infix notation. // // shut it down -#ifdef __VISUALC__ - #if __VISUALC__ <= 1300 +#if defined __VISUALC__ && __VISUALC__ <= 1300 + #if __VISUALC__ >= 1200 #pragma warning(push) - #pragma warning(disable: 4284) #define POP_WARNINGS #endif + #pragma warning(disable: 4284) #endif #include "wx/hashset.h" @@ -192,13 +192,16 @@ bool wxOwnerDrawn::OnMeasureItem(size_t *pwidth, size_t *pheight) // placed on top of each other. if ( !m_strAccel.empty() ) { - str.Pad(str.Length()%8); + str.Pad(str.length()%8); str += m_strAccel; } dc.SetFont(GetFontToUse()); - dc.GetTextExtent(str, (long *)pwidth, (long *)pheight); + wxCoord w, h; + dc.GetTextExtent(str, &w, &h); + *pwidth = w; + *pheight = h; // add space at the end of the menu for the submenu expansion arrow // this will also allow offsetting the accel string from the right edge @@ -309,7 +312,8 @@ bool wxOwnerDrawn::OnDrawItem(wxDC& dc, } - HDC hdc = GetHdcOf(dc); + wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl(); + HDC hdc = GetHdcOf(*impl); COLORREF colOldText = ::SetTextColor(hdc, colText), colOldBack = ::SetBkColor(hdc, colBack); @@ -353,9 +357,10 @@ bool wxOwnerDrawn::OnDrawItem(wxDC& dc, xText += 3; // separate text from the highlight rectangle SIZE sizeRect; - ::GetTextExtentPoint32(hdc, strMenuText.c_str(), strMenuText.Length(), &sizeRect); + ::GetTextExtentPoint32(hdc, strMenuText.c_str(), strMenuText.length(), &sizeRect); ::DrawState(hdc, NULL, NULL, - (LPARAM)strMenuText.c_str(), strMenuText.length(), + (LPARAM)strMenuText.wx_str(), + strMenuText.length(), xText, rc.y + (int) ((rc.GetHeight()-sizeRect.cy)/2.0), // centre text vertically rc.GetWidth()-margin, sizeRect.cy, DST_PREFIXTEXT | @@ -372,7 +377,8 @@ bool wxOwnerDrawn::OnDrawItem(wxDC& dc, // right align accel string with right edge of menu ( offset by the // margin width ) ::DrawState(hdc, NULL, NULL, - (LPARAM)m_strAccel.c_str(), m_strAccel.length(), + (LPARAM)m_strAccel.wx_str(), + m_strAccel.length(), rc.GetWidth()-16-accel_width, rc.y+(int) ((rc.GetHeight()-sizeRect.cy)/2.0), 0, 0, DST_TEXT | @@ -422,15 +428,26 @@ bool wxOwnerDrawn::OnDrawItem(wxDC& dc, if ( !bmp.Ok() ) { - // for not checkable bitmaps we should always use unchecked one because - // their checked bitmap is not set + // for not checkable bitmaps we should always use unchecked one + // because their checked bitmap is not set bmp = GetBitmap(!IsCheckable() || (st & wxODChecked)); + +#if wxUSE_IMAGE + if ( bmp.Ok() && st & wxODDisabled ) + { + // we need to grey out the bitmap as we don't have any specific + // disabled bitmap + wxImage imgGrey = bmp.ConvertToImage().ConvertToGreyscale(); + if ( imgGrey.Ok() ) + bmp = wxBitmap(imgGrey); + } +#endif // wxUSE_IMAGE } if ( bmp.Ok() ) { wxMemoryDC dcMem(&dc); - dcMem.SelectObject(bmp); + dcMem.SelectObjectAsSource(bmp); // center bitmap int nBmpWidth = bmp.GetWidth(), @@ -465,4 +482,3 @@ bool wxOwnerDrawn::OnDrawItem(wxDC& dc, #endif // wxUSE_OWNER_DRAWN -