]> git.saurik.com Git - wxWidgets.git/commitdiff
fix several problems in handling of the menu items with negative ids
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 17 Nov 2007 20:38:07 +0000 (20:38 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 17 Nov 2007 20:38:07 +0000 (20:38 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@50033 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/msw/menuitem.h
src/msw/frame.cpp
src/msw/menu.cpp
src/msw/menuitem.cpp

index 6c6f5885a392d602ad72ab3bb6b9388114223a26..67e4bc8dd3abc2de29687bdf447458812e0de9c8 100644 (file)
@@ -53,8 +53,11 @@ public:
 
     // the id for a popup menu is really its menu handle (as required by
     // ::AppendMenu() API), so this function will return either the id or the
-    // menu handle depending on what we're
-    int GetRealId() const;
+    // menu handle depending on what we are
+    //
+    // notice that it also returns the id as an unsigned int, as required by
+    // Win32 API
+    unsigned GetMSWId() const;
 
     // mark item as belonging to the given radio group
     void SetAsRadioGroupStart();
index cbd908ce5ac7ef3583fb3f82b074f21bd6a5d4c9..245c466534831ab6397a690e99c83b0785c8cafc 100644 (file)
@@ -946,8 +946,11 @@ bool wxFrame::HandleSize(int WXUNUSED(x), int WXUNUSED(y), WXUINT id)
     return false;
 }
 
-bool wxFrame::HandleCommand(WXWORD id, WXWORD cmd, WXHWND control)
+bool wxFrame::HandleCommand(WXWORD id_, WXWORD cmd, WXHWND control)
 {
+    // sign extend to int from short before comparing with the other int ids
+    int id = (signed short)id_;
+
     if ( control )
     {
         // In case it's e.g. a toolbar.
index a6956295e2dcab2610ae3cda67df7397d2ab1ef6..4c4383e467dfed0c9180304a8345922bef490ba2 100644 (file)
@@ -97,7 +97,7 @@ typedef struct tagMENUINFO
 // ----------------------------------------------------------------------------
 
 // the (popup) menu title has this special id
-static const int idMenuTitle = -3;
+static const UINT idMenuTitle = (UINT)-3;
 
 // ----------------------------------------------------------------------------
 // private functions
@@ -399,7 +399,7 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos)
         flags |= MF_POPUP;
     }
     else {
-        id = pItem->GetId();
+        id = pItem->GetMSWId();
     }
 
 
@@ -564,7 +564,7 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos)
 
 
     // if we just appended the title, highlight it
-    if ( (int)id == idMenuTitle )
+    if ( id == idMenuTitle )
     {
         // visually select the menu title
         SetDefaultMenuItem(GetHmenu(), id);
@@ -731,7 +731,7 @@ void wxMenu::SetTitle(const wxString& label)
         if ( !label.empty() )
         {
             if ( !::InsertMenu(hMenu, 0u, MF_BYPOSITION | MF_STRING,
-                               (unsigned)idMenuTitle, m_title.wx_str()) ||
+                               idMenuTitle, m_title.wx_str()) ||
                  !::InsertMenu(hMenu, 1u, MF_BYPOSITION, (unsigned)-1, NULL) )
             {
                 wxLogLastError(wxT("InsertMenu"));
@@ -767,7 +767,7 @@ void wxMenu::SetTitle(const wxString& label)
 #else
             if ( !ModifyMenu(hMenu, 0u,
                              MF_BYPOSITION | MF_STRING,
-                             (unsigned)idMenuTitle, m_title.wx_str()) )
+                             idMenuTitle, m_title.wx_str()) )
             {
                 wxLogLastError(wxT("ModifyMenu"));
             }
@@ -779,7 +779,7 @@ void wxMenu::SetTitle(const wxString& label)
     // put the title string in bold face
     if ( !m_title.empty() )
     {
-        SetDefaultMenuItem(GetHmenu(), (UINT)idMenuTitle);
+        SetDefaultMenuItem(GetHmenu(), idMenuTitle);
     }
 #endif // Win32
 }
index 2398a129a55c4251a7cd43c79f4629a01cc43444..964e64892f867fa8594def0052e922a35f4f0622 100644 (file)
@@ -186,9 +186,14 @@ wxMenuItem::~wxMenuItem()
 // ----
 
 // return the id for calling Win32 API functions
-int wxMenuItem::GetRealId() const
+unsigned wxMenuItem::GetMSWId() const
 {
-    return m_subMenu ? (int)m_subMenu->GetHMenu() : GetId();
+    // we must use ids in unsigned short range with Windows functions, if we
+    // pass ids > USHRT_MAX to them they get very confused (e.g. start
+    // generating WM_COMMAND messages with negative high word of wParam), so
+    // use the cast to ensure the id is in range
+    return m_subMenu ? wx_reinterpret_cast(unsigned, m_subMenu->GetHMenu())
+                     : wx_static_cast(unsigned short, GetId());
 }
 
 // get item state
@@ -201,7 +206,7 @@ bool wxMenuItem::IsChecked() const
     if ( GetId() == wxID_SEPARATOR )
         return false ;
 
-    int flag = ::GetMenuState(GetHMenuOf(m_parentMenu), GetId(), MF_BYCOMMAND);
+    int flag = ::GetMenuState(GetHMenuOf(m_parentMenu), GetMSWId(), MF_BYCOMMAND);
 
     return (flag & MF_CHECKED) != 0;
 }
@@ -245,7 +250,7 @@ void wxMenuItem::Enable(bool enable)
         return;
 
     long rc = EnableMenuItem(GetHMenuOf(m_parentMenu),
-                             GetRealId(),
+                             GetMSWId(),
                              MF_BYCOMMAND |
                              (enable ? MF_ENABLED : MF_GRAYED));
 
@@ -327,7 +332,7 @@ void wxMenuItem::Check(bool check)
     else // check item
     {
         if ( ::CheckMenuItem(hmenu,
-                             GetRealId(),
+                             GetMSWId(),
                              MF_BYCOMMAND | flags) == (DWORD)-1 )
         {
             wxFAIL_MSG( _T("CheckMenuItem() failed, item not in the menu?") );
@@ -364,7 +369,7 @@ void wxMenuItem::SetItemLabel(const wxString& txt)
     m_parentMenu->UpdateAccel(this);
 #endif // wxUSE_ACCEL
 
-    UINT id = GetRealId();
+    UINT id = GetMSWId();
     UINT flagsOld = ::GetMenuState(hMenu, id, MF_BYCOMMAND);
     if ( flagsOld == 0xFFFFFFFF )
     {