]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/ownerdrw.cpp
check that the version of __sync_sub_and_fetch that returns a value is supported...
[wxWidgets.git] / src / msw / ownerdrw.cpp
index 94eca7820cb06e7ed7e3c99c2315bea638295ff0..c781c560c38c6a3a30e79b905796e535d2549461 100644 (file)
     #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/ownerdrw.h"
-#include "wx/menuitem.h"
 #include "wx/fontutil.h"
-#include "wx/module.h"
 
 #if wxUSE_OWNER_DRAWN
 
@@ -197,7 +198,10 @@ bool wxOwnerDrawn::OnMeasureItem(size_t *pwidth, size_t *pheight)
 
         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
@@ -308,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);
 
@@ -354,7 +359,8 @@ bool wxOwnerDrawn::OnDrawItem(wxDC& dc,
         SIZE 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 |
@@ -371,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 |
@@ -421,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(),