]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/menu.cpp
Reset g_lastMouseEvent after processing the mouse button release event
[wxWidgets.git] / src / msw / menu.cpp
index 5d48faebf45e0e4d59b75d1e0ba02e48c9c40633..94e9827cdb632b5b303671320730da828dfaf78d 100644 (file)
@@ -401,28 +401,56 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos)
 
     BOOL ok = false;
 
+#if wxUSE_OWNER_DRAWN
+    // Currently, mixing owner-drawn and non-owner-drawn items results in
+    // inconsistent margins, so we force this to be owner-drawn if any other
+    // items already are. Later we might want to use a boolean in the wxMenu
+    // to avoid search. Also we might make this fix unnecessary by getting the correct
+    // margin using NONCLIENTMETRICS.
+    if ( !pItem->IsOwnerDrawn() && !pItem->IsSeparator() )
+    {
+        // Check if any other items are ownerdrawn, and make ownerdrawn if so
+        wxMenuItemList::compatibility_iterator node = GetMenuItems().GetFirst();
+        while (node)
+        {
+            if (node->GetData()->IsOwnerDrawn())
+            {
+                pItem->SetOwnerDrawn(true);
+                break;
+            }
+            node = node->GetNext();
+        }
+    }
+#endif
+
     // check if we have something more than a simple text item
 #if wxUSE_OWNER_DRAWN
     if ( pItem->IsOwnerDrawn() )
     {
-        // is the item owner-drawn just because of the bitmap?
-        if ( pItem->GetBitmap().Ok() &&
+        // is the item owner-drawn just because of the [checked] bitmap?
+        if ( (pItem->GetBitmap(false).Ok() || pItem->GetBitmap(true).Ok()) &&
                 !pItem->GetTextColour().Ok() &&
                     !pItem->GetBackgroundColour().Ok() &&
-                        !pItem->GetFont().Ok() &&
-                            !pItem->GetBitmap(true).Ok() )
+                        !pItem->GetFont().Ok() )
         {
             // try to use InsertMenuItem() as it's guaranteed to look correct
             // while our owner-drawn code is not
 
             // first compile-time check
-#if defined(MIIM_BITMAP) && !defined(__MINGW32__)
+#if defined(MIIM_BITMAP) && (_WIN32_WINNT >= 0x0500)
             WinStruct<MENUITEMINFO> mii;
 
             // now run-time one: MIIM_BITMAP only works under WinME/2000+
             if ( wxGetWinVersion() >= wxWinVersion_98 )
             {
                 mii.fMask = MIIM_STRING | MIIM_DATA | MIIM_BITMAP;
+                if ( pItem->IsCheckable() )
+                {
+                    // need to set checked/unchecked bitmaps as otherwise our
+                    // MSWOnDrawItem() item is not called
+                    mii.fMask |= MIIM_CHECKMARKS;
+                }
+
                 mii.cch = itemText.length();
                 mii.dwTypeData = wx_const_cast(wxChar *, itemText.c_str());
 
@@ -445,6 +473,11 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos)
                 //
                 // so instead draw it ourselves in MSWOnDrawItem()
                 mii.dwItemData = wx_reinterpret_cast(ULONG_PTR, pItem);
+                if ( pItem->IsCheckable() )
+                {
+                    mii.hbmpChecked =
+                    mii.hbmpUnchecked = HBMMENU_CALLBACK;
+                }
                 mii.hbmpItem = HBMMENU_CALLBACK;
 
                 ok = ::InsertMenuItem(GetHmenu(), pos, TRUE /* by pos */, &mii);