]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/combobox.cpp
Patch [ 1314868 ] [wxMSW] Show MDI child menubars when ShowFullScreen(false)
[wxWidgets.git] / src / msw / combobox.cpp
index 04c3639c910e7fa12ee69d8b6e90c68cbcf9a30e..50681b9440f0be2af8fc69da7261d4455d4cb110 100644 (file)
 // headers
 // ----------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "combobox.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
@@ -174,6 +170,9 @@ LRESULT APIENTRY _EXPORT wxComboEditWndProc(HWND hWnd,
         case WM_KEYUP:
         case WM_KEYDOWN:
         case WM_CHAR:
+        case WM_SYSCHAR:
+        case WM_SYSKEYDOWN:
+        case WM_SYSKEYUP:
         case WM_SETFOCUS:
         case WM_KILLFOCUS:
             {
@@ -241,41 +240,44 @@ LRESULT APIENTRY _EXPORT wxComboEditWndProc(HWND hWnd,
 
 WXLRESULT wxComboBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
 {
-    bool isSize = false;
-    long fromOld, toOld;
+    // TODO: handle WM_CTLCOLOR messages from our EDIT control to be able to
+    //       set its colour correctly (to be the same as our own one)
 
-    // handle WM_CTLCOLOR messages from our EDIT control to be able to set its
-    // colour correctly (to be the same as our own one)
     switch ( nMsg )
     {
         case CB_SETCURSEL:
             // Selection was set with SetSelection.  Update the value too.
             if ((int)wParam > GetCount())
-                m_value = wxEmptyString;
+                m_value.clear();
             else
                 m_value = GetString(wParam);
             m_selectionOld = -1;
             break;
+
         case WM_SIZE:
-            GetSelection(&fromOld, &toOld);
-            isSize = true;
-            break;
-    }
+        // wxStaticBox can generate this message, when modifying the control's style.
+        // This causes the content of the combobox to be selected, for some reason.
+        case WM_STYLECHANGED:
+            {
+                // combobox selection sometimes spontaneously changes when its
+                // size changes, restore it to the old value if necessary
+                long fromOld, toOld;
+                GetSelection(&fromOld, &toOld);
+                WXLRESULT result = wxChoice::MSWWindowProc(nMsg, wParam, lParam);
 
-    WXLRESULT result = wxChoice::MSWWindowProc(nMsg, wParam, lParam);
+                long fromNew, toNew;
+                GetSelection(&fromNew, &toNew);
 
-    if(isSize)
-    {
-        long fromNew, toNew;
-        GetSelection(&fromNew, &toNew);
+                if ( fromOld != fromNew || toOld != toNew )
+                {
+                    SetSelection(fromOld, toOld);
+                }
 
-        if ( fromOld != fromNew || toOld != toNew )
-        {
-            SetSelection(fromOld, toOld);
-        }
+                return result;
+            }
     }
 
-    return result;
+    return wxChoice::MSWWindowProc(nMsg, wParam, lParam);
 }
 
 bool wxComboBox::MSWProcessEditMsg(WXUINT msg, WXWPARAM wParam, WXLPARAM lParam)
@@ -299,12 +301,16 @@ bool wxComboBox::MSWProcessEditMsg(WXUINT msg, WXWPARAM wParam, WXLPARAM lParam)
                     return true;
                 }
             }
+            // fall through
 
+        case WM_SYSCHAR:
             return HandleChar(wParam, lParam, true /* isASCII */);
 
+        case WM_SYSKEYDOWN:
         case WM_KEYDOWN:
             return HandleKeyDown(wParam, lParam);
 
+        case WM_SYSKEYUP:
         case WM_KEYUP:
             return HandleKeyUp(wParam, lParam);
 
@@ -318,7 +324,7 @@ bool wxComboBox::MSWProcessEditMsg(WXUINT msg, WXWPARAM wParam, WXLPARAM lParam)
     return false;
 }
 
-bool wxComboBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
+bool wxComboBox::MSWCommand(WXUINT param, WXWORD id)
 {
     wxString value;
     int sel = -1;
@@ -388,10 +394,14 @@ bool wxComboBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
                 ProcessCommand(event);
             }
             break;
+
+        default:
+            return wxChoice::MSWCommand(param, id);
     }
 
-    // there is no return value for the CBN_ notifications, so always return
-    // false from here to pass the message to DefWindowProc()
+    // let the def window proc have it by returning false, but do not pass the
+    // message we've already handled here (notably CBN_SELCHANGE) to the base
+    // class as it would generate another event for them
     return false;
 }
 
@@ -564,7 +574,7 @@ bool wxComboBox::CanUndo() const
 {
     if (!IsEditable())
         return false;
-    
+
     HWND hEditWnd = (HWND) GetEditHWND() ;
     if ( hEditWnd )
         return ::SendMessage(hEditWnd, EM_CANUNDO, 0, 0) != 0;
@@ -576,7 +586,7 @@ bool wxComboBox::CanRedo() const
 {
     if (!IsEditable())
         return false;
-    
+
     HWND hEditWnd = (HWND) GetEditHWND() ;
     if ( hEditWnd )
         return ::SendMessage(hEditWnd, EM_CANUNDO, 0, 0) != 0;
@@ -660,11 +670,10 @@ void wxComboBox::SetInsertionPointEnd()
 
 long wxComboBox::GetInsertionPoint() const
 {
-    // CB_GETEDITSEL returns the index of the last character after selection in
-    // its high-order word
+    // CB_GETEDITSEL returns the index of the first character of the selection in
+    // its low-order word
     DWORD pos= (DWORD)::SendMessage(GetHwnd(), CB_GETEDITSEL, 0, 0L);
-
-    return HIWORD(pos);
+    return LOWORD(pos);
 }
 
 wxTextPos wxComboBox::GetLastPosition() const
@@ -688,6 +697,10 @@ void wxComboBox::Replace(long from, long to, const wxString& value)
 
     // Paste into edit control
     SendMessage(GetHwnd(), WM_PASTE, (WPARAM)0, (LPARAM)0L);
+#else
+    wxUnusedVar(from);
+    wxUnusedVar(to);
+    wxUnusedVar(value);
 #endif
 }