]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/ownerdrw.cpp
don't create m_dottedPen with an invalid 0 style which results in an assert under MSW
[wxWidgets.git] / src / msw / ownerdrw.cpp
index 1931e8c11cdab6410ec9e2f7a722966aaeb21e84..12f6d210bced38b39111b39e8160b9c3316b7923 100644 (file)
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////////
-// Name:        msw/ownerdrw.cpp
+// Name:        src/msw/ownerdrw.cpp
 // Purpose:     implementation of wxOwnerDrawn class
 // Author:      Vadim Zeitlin
 // Modified by:
 
 // 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
 
@@ -93,12 +93,6 @@ bool wxMSWSystemMenuFontModule::ms_showCues = true;
 IMPLEMENT_DYNAMIC_CLASS(wxMSWSystemMenuFontModule, wxModule)
 
 
-// temporary hack to implement wxOwnerDrawn::IsMenuItem() without breaking
-// backwards compatibility
-#if wxCHECK_VERSION(2, 7, 0)
-    #pragma warning "TODO: remove gs_menuItems hack"
-#endif
-
 // VC++ 6 gives a warning here:
 //
 //      return type for 'OwnerDrawnSet_wxImplementation_HashTable::iterator::
@@ -106,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"
@@ -121,8 +115,6 @@ WX_DECLARE_HASH_SET(wxOwnerDrawn*, wxPointerHash, wxPointerEqual, OwnerDrawnSet)
     #pragma warning(pop)
 #endif
 
-static OwnerDrawnSet gs_menuItems;
-
 // ============================================================================
 // implementation of wxOwnerDrawn class
 // ============================================================================
@@ -134,7 +126,7 @@ wxOwnerDrawn::wxOwnerDrawn(const wxString& str,
                            bool bMenuItem)
             : m_strName(str)
 {
-    if (ms_nDefaultMarginWidth == 0)
+    if ( ms_nDefaultMarginWidth == 0 )
     {
        ms_nDefaultMarginWidth = ::GetSystemMetrics(SM_CXMENUCHECK) +
                                 wxSystemSettings::GetMetric(wxSYS_EDGE_X);
@@ -143,32 +135,19 @@ wxOwnerDrawn::wxOwnerDrawn(const wxString& str,
 
     m_bCheckable   = bCheckable;
     m_bOwnerDrawn  = false;
+    m_isMenuItem   = bMenuItem;
     m_nHeight      = 0;
     m_nMarginWidth = ms_nLastMarginWidth;
     m_nMinHeight   = wxMSWSystemMenuFontModule::ms_systemMenuHeight;
-
-    m_bmpDisabled = wxNullBitmap;
-
-    // TODO: we can't add new m_isMenuItem field in 2.6, so we use this hack
-    //       with the map, but do add m_isMenuItem in 2.7
-    if ( bMenuItem )
-    {
-        gs_menuItems.insert(this);
-    }
 }
 
 wxOwnerDrawn::~wxOwnerDrawn()
 {
-    // TODO: remove this in 2.7
-    gs_menuItems.erase(this);
 }
 
 bool wxOwnerDrawn::IsMenuItem() const
 {
-    // TODO: in 2.7, replace this with simple "return m_isMenuItem"
-
-    // some versions of mingw have problems without const_cast when wxUSE_STL=1
-    return gs_menuItems.count(wx_const_cast(wxOwnerDrawn *, this)) == 1;
+    return m_isMenuItem;
 }
 
 
@@ -213,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
@@ -374,9 +356,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 |
@@ -393,7 +376,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 |
@@ -443,15 +427,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(),
@@ -486,4 +481,3 @@ bool wxOwnerDrawn::OnDrawItem(wxDC& dc,
 
 
 #endif // wxUSE_OWNER_DRAWN
-