]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/menu.cpp
update frm Ivan Masar
[wxWidgets.git] / src / msw / menu.cpp
index 94e9827cdb632b5b303671320730da828dfaf78d..5e24fd40b9d5a831fb1540f99716225a66d83c5d 100644 (file)
 // other standard headers
 #include <string.h>
 
 // other standard headers
 #include <string.h>
 
-#if wxUSE_OWNER_DRAWN && defined(MIIM_BITMAP)
+//VC6 needs these defining, though they are in winuser.h
+#ifndef MIIM_BITMAP
+#define MIIM_STRING      0x00000040
+#define MIIM_BITMAP      0x00000080
+#define MIIM_FTYPE       0x00000100
+#define HBMMENU_CALLBACK            ((HBITMAP) -1)
+typedef struct tagMENUINFO
+{
+    DWORD   cbSize;
+    DWORD   fMask;
+    DWORD   dwStyle;
+    UINT    cyMax;
+    HBRUSH  hbrBack;
+    DWORD   dwContextHelpID;
+    DWORD   dwMenuData;
+}   MENUINFO, FAR *LPMENUINFO;
+#endif
+
+#if wxUSE_OWNER_DRAWN
     #include "wx/dynlib.h"
 #endif
 
     #include "wx/dynlib.h"
 #endif
 
@@ -435,12 +453,10 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos)
         {
             // try to use InsertMenuItem() as it's guaranteed to look correct
             // while our owner-drawn code is not
         {
             // 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) && (_WIN32_WINNT >= 0x0500)
+#ifndef __DMC__
+            // DMC at march 2007 doesn't have HBITMAP hbmpItem tagMENUITEMINFOA /W
+            // MIIM_BITMAP only works under WinME/2000+
             WinStruct<MENUITEMINFO> mii;
             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 ( wxGetWinVersion() >= wxWinVersion_98 )
             {
                 mii.fMask = MIIM_STRING | MIIM_DATA | MIIM_BITMAP;
@@ -452,7 +468,7 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos)
                 }
 
                 mii.cch = itemText.length();
                 }
 
                 mii.cch = itemText.length();
-                mii.dwTypeData = wx_const_cast(wxChar *, itemText.c_str());
+                mii.dwTypeData = wx_const_cast(wxChar *, itemText.wx_str());
 
                 if (flags & MF_POPUP)
                 {
 
                 if (flags & MF_POPUP)
                 {
@@ -512,7 +528,7 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos)
                     pItem->ResetOwnerDrawn();
                 }
             }
                     pItem->ResetOwnerDrawn();
                 }
             }
-#endif // MIIM_BITMAP
+#endif // __DMC__
         }
 
         if ( !ok )
         }
 
         if ( !ok )
@@ -532,7 +548,7 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos)
         itemText = wxMenuItem::GetLabelFromText(itemText);
 #endif
 
         itemText = wxMenuItem::GetLabelFromText(itemText);
 #endif
 
-        pData = (wxChar*)itemText.c_str();
+        pData = (wxChar*)itemText.wx_str();
     }
 
     // item might have already been inserted by InsertMenuItem() above
     }
 
     // item might have already been inserted by InsertMenuItem() above
@@ -777,10 +793,15 @@ bool wxMenu::MSWCommand(WXUINT WXUNUSED(param), WXWORD id)
     // ignore commands from the menu title
     if ( id != (WXWORD)idMenuTitle )
     {
     // ignore commands from the menu title
     if ( id != (WXWORD)idMenuTitle )
     {
-        // get the checked status of the command: notice that menuState is the
-        // old state of the menu, so the test for MF_CHECKED must be inverted
+        // update the check item when it's clicked
+        wxMenuItem * const item = FindItem(id);
+        if ( item && item->IsCheckable() )
+            item->Toggle();
+
+        // get the status of the menu item: note that it has been just changed
+        // by Toggle() above so here we already get the new state of the item
         UINT menuState = ::GetMenuState(GetHmenu(), id, MF_BYCOMMAND);
         UINT menuState = ::GetMenuState(GetHmenu(), id, MF_BYCOMMAND);
-        SendEvent(id, !(menuState & MF_CHECKED));
+        SendEvent(id, menuState & MF_CHECKED);
     }
 
     return true;
     }
 
     return true;