]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/window.cpp
many fixes to wxTextCrtl, wxTreeCrtl, wxListBox,
[wxWidgets.git] / src / msw / window.cpp
index 8fdc4d7cb9f24e0cdaf80e82757bcc099224b4e1..ce22737cb54c186b025b1fd91e537e1c7e42118b 100644 (file)
@@ -46,6 +46,7 @@
 #endif
 
 #include "wx/menuitem.h"
+#include "wx/log.h"
 #include "wx/msw/private.h"
 
 #include <string.h>
 #undef GetClassInfo
 #endif
 
+#ifdef  __WXDEBUG__
+  static const char *GetMessageName(int message);
+#endif  //WXDEBUG
+
 #define WINDOW_MARGIN 3 // This defines sensitivity of Leave events
 
 wxMenu *wxCurrentPopupMenu = NULL;
@@ -93,7 +98,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxEvtHandler)
 
 BEGIN_EVENT_TABLE(wxWindow, wxEvtHandler)
   EVT_CHAR(wxWindow::OnChar)
-  EVT_SIZE(wxWindow::OnSize)
   EVT_ERASE_BACKGROUND(wxWindow::OnEraseBackground)
   EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged)
   EVT_INIT_DIALOG(wxWindow::OnInitDialog)
@@ -803,7 +807,7 @@ void wxWindow::GetTextExtent(const wxString& string, int *x, int *y,
   if (fontToUse && fontToUse->Ok())
   {
     if ((fnt=(HFONT) fontToUse->GetResourceHandle()))
-      was = SelectObject(dc,fnt) ;
+      was = (HFONT) SelectObject(dc,fnt) ;
   }
 
   SIZE sizeRect;
@@ -861,7 +865,7 @@ LRESULT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
        wxWndHook = NULL;
     wnd->m_hWnd = (WXHWND) hWnd;
   }
-#if (DEBUG > 1)
+#if (WXDEBUG > 1)
   wxDebugMsg("hWnd = %d, m_hWnd = %d, msg = %d\n", hWnd, m_hWnd, message);
 #endif
   // Stop right here if we don't have a valid handle
@@ -895,57 +899,9 @@ LRESULT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
 // Main Windows 3 window proc
 long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
 {
-#if 0
-  switch (message)
-  {
-        case WM_INITDIALOG:
-        case WM_ACTIVATE:
-        case WM_SETFOCUS:
-        case WM_KILLFOCUS:
-       case WM_CREATE:
-       case WM_PAINT:
-       case WM_QUERYDRAGICON:
-        case WM_SIZE:
-        case WM_RBUTTONDOWN:
-        case WM_RBUTTONUP:
-        case WM_RBUTTONDBLCLK:
-        case WM_MBUTTONDOWN:
-        case WM_MBUTTONUP:
-        case WM_MBUTTONDBLCLK:
-        case WM_LBUTTONDOWN:
-        case WM_LBUTTONUP:
-        case WM_LBUTTONDBLCLK:
-        case WM_MOUSEMOVE:
-//        case WM_DESTROY:
-        case WM_COMMAND:
-        case WM_NOTIFY:
-        case WM_MENUSELECT:
-        case WM_INITMENUPOPUP:
-        case WM_DRAWITEM:
-        case WM_MEASUREITEM:
-        case WM_KEYDOWN:
-        case WM_KEYUP:
-        case WM_CHAR: // Always an ASCII character
-        case WM_HSCROLL:
-        case WM_VSCROLL:
-        case WM_CTLCOLORBTN:
-        case WM_CTLCOLORDLG:
-        case WM_CTLCOLORLISTBOX:
-        case WM_CTLCOLORMSGBOX:
-        case WM_CTLCOLORSCROLLBAR:
-        case WM_CTLCOLORSTATIC:
-        case WM_CTLCOLOREDIT:
-        case WM_SYSCOLORCHANGE:
-        case WM_ERASEBKGND:
-        case WM_MDIACTIVATE:
-        case WM_DROPFILES:
-        case WM_QUERYENDSESSION:
-//        case WM_CLOSE:
-        case WM_GETMINMAXINFO:
-            return MSWDefWindowProc(message, wParam, lParam );
-    }
-#endif
-
+  #ifdef __WXDEBUG__
+    wxLogTrace(wxTraceMessages, "Processing %s", GetMessageName(message));
+  #endif // WXDEBUG
 
   HWND hWnd = (HWND)m_hWnd;
 
@@ -986,27 +942,27 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
               return MSWDefWindowProc(message, wParam, lParam );
             break;
         }
-       case WM_CREATE:
-       {
-          MSWOnCreate((WXLPCREATESTRUCT) (LPCREATESTRUCT)lParam);
-          return 0;
-          break;
-       }
-       case WM_SHOWWINDOW:
-       {
-          MSWOnShow((wParam != 0), (int) lParam);
-          break;
-       }
-       case WM_PAINT:
-       {
+        case WM_CREATE:
+        {
+                MSWOnCreate((WXLPCREATESTRUCT) (LPCREATESTRUCT)lParam);
+                return 0;
+                break;
+        }
+        case WM_SHOWWINDOW:
+        {
+                MSWOnShow((wParam != 0), (int) lParam);
+                break;
+        }
+        case WM_PAINT:
+        {
           if (MSWOnPaint())
             return 0;
           else return MSWDefWindowProc(message, wParam, lParam );
           break;
         }
-       case WM_QUERYDRAGICON:
-       {
-         HICON hIcon = 0;
+        case WM_QUERYDRAGICON:
+        {
+          HICON hIcon = 0;
           if ((hIcon = (HICON) MSWOnQueryDragIcon()))
             return (long)hIcon;
           else return MSWDefWindowProc(message, wParam, lParam );
@@ -1165,7 +1121,7 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
             break;
         }
         case WM_COMMAND:
-       {
+        {
 #ifdef __WIN32__
             WORD id = LOWORD(wParam);
             HWND hwnd = (HWND)lParam;
@@ -1178,10 +1134,10 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
             if (!MSWOnCommand(id, cmd, (WXHWND) hwnd))
               return MSWDefWindowProc(message, wParam, lParam );
             break;
-        }
+        }
 #if defined(__WIN95__)
         case WM_NOTIFY:
-       {
+        {
           if (!MSWOnNotify(wParam, lParam))
             return MSWDefWindowProc(message, wParam, lParam );
           break;
@@ -1216,33 +1172,33 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
         }
 
         case WM_KEYDOWN:
-        {
-            if (wParam == VK_SHIFT)
-               return Default();
-
-            else if (wParam == VK_CONTROL)
-               return Default();
-
+            // we consider these message "not interesting"
+            if ( wParam == VK_SHIFT || wParam == VK_CONTROL )
+              return Default();
+        
             // Avoid duplicate messages to OnChar
-            else if ((wParam != VK_ESCAPE) && (wParam != VK_SPACE) && (wParam != VK_RETURN) && (wParam != VK_BACK) && (wParam != VK_TAB))
-               {
+            if ( (wParam != VK_ESCAPE) && (wParam != VK_SPACE) &&
+                 (wParam != VK_RETURN) && (wParam != VK_BACK) &&
+                 (wParam != VK_TAB) )
+            {
               MSWOnChar((WORD)wParam, lParam);
-              if (::GetKeyState(VK_CONTROL)&0x100?TRUE:FALSE)
-                           return Default();
-               }
-                       else
-                               return Default();
-        }
+              if ( ::GetKeyState(VK_CONTROL) & 0x100 )
+                return Default();
+            }
+            else if ( ::GetKeyState(VK_CONTROL) & 0x100 )
+              MSWOnChar((WORD)wParam, lParam);
+            else
+              return Default();
+            break;
+
         case WM_KEYUP:
-        {
             break;
-        }
-        // VZ: WM_KEYUP not processed
+
         case WM_CHAR: // Always an ASCII character
-        {
-          MSWOnChar((WORD)wParam, lParam, TRUE);
-          break;
-        }
+          {
+            MSWOnChar((WORD)wParam, lParam, TRUE);
+            break;
+          }
 
         case WM_HSCROLL:
         {
@@ -1274,68 +1230,68 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
         }
 #ifdef __WIN32__
         case WM_CTLCOLORBTN:
-       {
+        {
           int nCtlColor = CTLCOLOR_BTN;
           HWND control = (HWND)lParam;
           HDC pDC = (HDC)wParam;
           return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor,
                                         message, wParam, lParam);
           break;
-       }
+        }
         case WM_CTLCOLORDLG:
-       {
+        {
           int nCtlColor = CTLCOLOR_DLG;
           HWND control = (HWND)lParam;
           HDC pDC = (HDC)wParam;
           return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor,
                                         message, wParam, lParam);\
           break;
-       }
+        }
         case WM_CTLCOLORLISTBOX:
-       {
+        {
           int nCtlColor = CTLCOLOR_LISTBOX;
           HWND control = (HWND)lParam;
           HDC pDC = (HDC)wParam;
           return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor,
                                         message, wParam, lParam);
           break;
-       }
+        }
         case WM_CTLCOLORMSGBOX:
-       {
+        {
           int nCtlColor = CTLCOLOR_MSGBOX;
           HWND control = (HWND)lParam;
           HDC pDC = (HDC)wParam;
           return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor,
                                         message, wParam, lParam);
           break;
-       }
+        }
         case WM_CTLCOLORSCROLLBAR:
-       {
+        {
           int nCtlColor = CTLCOLOR_SCROLLBAR;
           HWND control = (HWND)lParam;
           HDC pDC = (HDC)wParam;
           return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor,
                                         message, wParam, lParam);
           break;
-       }
+        }
         case WM_CTLCOLORSTATIC:
-       {
+        {
           int nCtlColor = CTLCOLOR_STATIC;
           HWND control = (HWND)lParam;
           HDC pDC = (HDC)wParam;
           return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor,
                                         message, wParam, lParam);
           break;
-       }
+        }
         case WM_CTLCOLOREDIT:
-       {
+        {
           int nCtlColor = CTLCOLOR_EDIT;
           HWND control = (HWND)lParam;
           HDC pDC = (HDC)wParam;
           return (DWORD)MSWOnCtlColor((WXHDC) pDC, (WXHWND) control, nCtlColor,
                                         message, wParam, lParam);
           break;
-       }
+        }
 #else
         case WM_CTLCOLOR:
         {
@@ -1384,15 +1340,15 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
         {
             MSWOnDropFiles(wParam);
             break;
-               }
+        }
         case WM_INITDIALOG:
         {
             return 0; // MSWOnInitDialog((WXHWND)(HWND)wParam);
             break;
-               }
+        }
         case WM_QUERYENDSESSION:
         {
-           // Same as WM_CLOSE, but inverted results. Thx Microsoft :-)
+            // Same as WM_CLOSE, but inverted results. Thx Microsoft :-)
             return MSWOnClose();
             break;
         }
@@ -1420,6 +1376,9 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
           break;
         }
 
+        case WM_GETDLGCODE:
+          return MSWGetDlgCode();
+
 /*
 #if HAVE_SOCKET
         case WM_TIMER:
@@ -1476,7 +1435,7 @@ void wxWindow::MSWDestroyWindow(void)
 {
 #if 0
 
-#if DEBUG > 1
+#if WXDEBUG > 1
   wxDebugMsg("wxWindow::MSWDestroyWindow %d\n", handle);
 #endif
   MSWDetachWindowMenu();
@@ -1581,7 +1540,7 @@ void wxWindow::MSWCreate(int id, wxWindow *parent, const char *wclass, wxWindow
   wxWndHook = NULL;
   wxWinHandleList->Append((long)m_hWnd, this);
 
-#if DEBUG > 1
+#if WXDEBUG > 1
   wxDebugMsg("wxWindow::MSWCreate %d\n", m_hWnd);
 #endif
 }
@@ -1592,7 +1551,7 @@ void wxWindow::MSWOnCreate(WXLPCREATESTRUCT WXUNUSED(cs))
 
 bool wxWindow::MSWOnClose(void)
 {
-#if DEBUG > 1
+#if WXDEBUG > 1
   wxDebugMsg("wxWindow::MSWOnClose %d\n", handle);
 #endif
   return FALSE;
@@ -1600,7 +1559,7 @@ bool wxWindow::MSWOnClose(void)
 
 bool wxWindow::MSWOnDestroy(void)
 {
-#if DEBUG > 1
+#if WXDEBUG > 1
   wxDebugMsg("wxWindow::MSWOnDestroy %d\n", handle);
 #endif
   // delete our drop target if we've got one
@@ -1661,22 +1620,18 @@ bool wxWindow::MSWOnNotify(WXWPARAM wParam, WXLPARAM lParam)
 
 void wxWindow::MSWOnMenuHighlight(WXWORD WXUNUSED(item), WXWORD WXUNUSED(flags), WXHMENU WXUNUSED(sysmenu))
 {
-#if DEBUG > 1
+#if WXDEBUG > 1
   wxDebugMsg("wxWindow::MSWOnMenuHighlight %d\n", handle);
 #endif
 }
 
 void wxWindow::MSWOnInitMenuPopup(WXHMENU menu, int pos, bool isSystem)
 {
-/*
-  if (!isSystem)
-    OldOnInitMenuPopup(pos);
-*/
 }
 
 bool wxWindow::MSWOnActivate(int state, bool WXUNUSED(minimized), WXHWND WXUNUSED(activate))
 {
-#if DEBUG > 1
+#if WXDEBUG > 1
   wxDebugMsg("wxWindow::MSWOnActivate %d\n", handle);
 #endif
 
@@ -1689,7 +1644,7 @@ bool wxWindow::MSWOnActivate(int state, bool WXUNUSED(minimized), WXHWND WXUNUSE
 
 bool wxWindow::MSWOnSetFocus(WXHWND WXUNUSED(hwnd))
 {
-#if DEBUG > 1
+#if WXDEBUG > 1
   wxDebugMsg("wxWindow::MSWOnSetFocus %d\n", m_hWnd);
 #endif
     // Deal with caret
@@ -1709,7 +1664,7 @@ bool wxWindow::MSWOnSetFocus(WXHWND WXUNUSED(hwnd))
 
 bool wxWindow::MSWOnKillFocus(WXHWND WXUNUSED(hwnd))
 {
-#if DEBUG > 1
+#if WXDEBUG > 1
   wxDebugMsg("wxWindow::MSWOnKillFocus %d\n", m_hWnd);
 #endif
     // Deal with caret
@@ -1727,11 +1682,11 @@ bool wxWindow::MSWOnKillFocus(WXHWND WXUNUSED(hwnd))
 
 void wxWindow::MSWOnDropFiles(WXWPARAM wParam)
 {
-#if DEBUG > 1
+#if WXDEBUG > 1
   wxDebugMsg("wxWindow::MSWOnDropFiles %d\n", m_hWnd);
 #endif
 
-  HANDLE hFilesInfo = (HANDLE)wParam;
+  HDROP hFilesInfo = (HDROP) wParam;
   POINT dropPoint;
   DragQueryPoint(hFilesInfo, (LPPOINT) &dropPoint);
 
@@ -1820,7 +1775,7 @@ bool wxWindow::MSWOnMeasureItem(int id, WXMEASUREITEMSTRUCT *itemStruct)
 WXHBRUSH wxWindow::MSWOnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
                          WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
 {
-#if DEBUG > 1
+#if WXDEBUG > 1
   wxDebugMsg("wxWindow::MSWOnCtlColour %d\n", m_hWnd);
 #endif
   if (nCtlColor == CTLCOLOR_DLG)
@@ -1896,33 +1851,85 @@ long wxWindow::Default()
     if (m_lastMsg == 0)
         return 0;
 
+    #ifdef __WXDEBUG__
+        wxLogTrace(wxTraceMessages, "Forwarding %s to DefWindowProc.",
+                  GetMessageName(m_lastMsg));
+    #endif // WXDEBUG
+
     return this->MSWDefWindowProc(m_lastMsg, m_lastWParam, m_lastLParam);
 }
 
 bool wxWindow::MSWProcessMessage(WXMSG* pMsg)
 {
-  if (!m_hWnd)
-    return FALSE;
-  else
-  {
-    // Suggestion by Andrew Davison to allow
-    // a panel to accept character input in user edit mode
-    
-    // OK, what we probably want to do here for wxWin 2.0
-    // is have a window style to indicate whether the window
-    // should process dialog-style input, since we can't
-    // otherwise tell whether it's supposed to do tab traversal
-    // or not.
-    if (GetWindowStyleFlag() & wxTAB_TRAVERSAL)
-      return (::IsDialogMessage((HWND) m_hWnd, (MSG *)pMsg) != 0);
-    else
-      return FALSE;
+  if ( m_hWnd != 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL) ) {
+    // intercept dialog navigation keys
+    MSG *msg = (MSG *)pMsg;
+    bool bProcess = TRUE;
+    if ( msg->message != WM_KEYDOWN )
+      bProcess = FALSE;
+
+    if ( (HIWORD(msg->lParam) & KF_ALTDOWN) == KF_ALTDOWN )
+      bProcess = FALSE;
+
+    bool bCtrlDown = (::GetKeyState(VK_CONTROL) & 0x100) != 0;
+
+    // WM_GETDLGCODE: if the control wants it for itself, don't process it
+    // (except for Ctrl-Tab combination which is always processed)
+    LONG lDlgCode;
+    if ( bProcess && !bCtrlDown ) {
+      lDlgCode = ::SendMessage(msg->hwnd, WM_GETDLGCODE, 0, 0);
+    }
+
+    bool bForward;
+    if ( bProcess ) {
+      switch ( msg->wParam ) {
+        case VK_TAB:
+          if ( lDlgCode & DLGC_WANTTAB )
+            bProcess = FALSE;
+          else
+            bForward = !(::GetKeyState(VK_SHIFT) & 0x100);
+          break;
+
+        case VK_UP:
+        case VK_LEFT:
+          if ( lDlgCode & DLGC_WANTARROWS || bCtrlDown )
+            bProcess = FALSE;
+          else
+            bForward = FALSE;
+          break;
+
+        case VK_DOWN:
+        case VK_RIGHT:
+          if ( lDlgCode & DLGC_WANTARROWS || bCtrlDown )
+            bProcess = FALSE;
+          else
+            bForward = TRUE;
+          break;
+
+        default:
+          bProcess = FALSE;
+      }
+    }
+
+    if ( bProcess ) {
+      wxNavigationKeyEvent event;
+      event.SetDirection(bForward);
+      event.SetWindowChange(bCtrlDown);
+      event.SetEventObject(this);
+
+      if ( GetEventHandler()->ProcessEvent(event) )
+        return TRUE;
+    }
+
+    return ::IsDialogMessage((HWND)GetHWND(), msg) != 0;
   }
+
+  return FALSE;
 }
 
 long wxWindow::MSWOnMDIActivate(long WXUNUSED(flag), WXHWND WXUNUSED(activate), WXHWND WXUNUSED(deactivate))
 {
-#if DEBUG > 1
+#if WXDEBUG > 1
   wxDebugMsg("wxWindow::MSWOnMDIActivate %d\n", m_hWnd);
 #endif
   return 1;
@@ -1961,7 +1968,7 @@ void wxWindow::MSWOnSize(int w, int h, WXUINT WXUNUSED(flag))
   if (m_inOnSize)
     return;
     
-#if DEBUG > 1
+#if WXDEBUG > 1
   wxDebugMsg("wxWindow::MSWOnSize %d\n", m_hWnd);
 #endif
   if (!m_hWnd)
@@ -1985,7 +1992,7 @@ void wxWindow::MSWOnWindowPosChanging(void *WXUNUSED(lpPos))
 // Deal with child commands from buttons etc.
 bool wxWindow::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND WXUNUSED(control))
 {
-#if DEBUG > 1
+#if WXDEBUG > 1
   wxDebugMsg("wxWindow::MSWOnCommand\n");
 #endif
   if (wxCurrentPopupMenu)
@@ -1995,7 +2002,7 @@ bool wxWindow::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND WXUNUSED(control))
     bool succ = popupMenu->MSWCommand(cmd, id);
     return succ;
   }
-#if DEBUG > 1
+#if WXDEBUG > 1
   char buf[80];
   sprintf(buf, "Looking for item %d...\n", id);
   wxDebugMsg(buf);
@@ -2005,7 +2012,7 @@ bool wxWindow::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND WXUNUSED(control))
   if (item)
   {
     bool value = item->MSWCommand(cmd, id);
-#if DEBUG > 1
+#if WXDEBUG > 1
     if (value)
       wxDebugMsg("MSWCommand succeeded\n");
     else
@@ -2015,7 +2022,7 @@ bool wxWindow::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND WXUNUSED(control))
   }
   else
   {
-#if DEBUG > 1
+#if WXDEBUG > 1
     wxDebugMsg("Could not find item!\n");
     char buf[100];
     wxDebugMsg("Item ids for this panel:\n");
@@ -2494,15 +2501,15 @@ void wxWindow::MSWOnVScroll(WXWORD wParam, WXWORD pos, WXHWND control)
   if (control)
   {
     wxWindow *child = wxFindWinFromHandle(control);
-       if ( child )
-       child->MSWOnVScroll(wParam, pos, control);
+  if ( child )
+      child->MSWOnVScroll(wParam, pos, control);
     return;
   }
 
-    wxScrollEvent event;
-    event.SetPosition(pos);
-    event.SetOrientation(wxVERTICAL);
-    event.m_eventObject = this;
+  wxScrollEvent event;
+  event.SetPosition(pos);
+  event.SetOrientation(wxVERTICAL);
+  event.m_eventObject = this;
 
        switch ( wParam )
        {
@@ -2549,18 +2556,18 @@ void wxWindow::MSWOnHScroll( WXWORD wParam, WXWORD pos, WXHWND control)
   if (control)
   {
     wxWindow *child = wxFindWinFromHandle(control);
-       if ( child )
-       child->MSWOnHScroll(wParam, pos, control);
+    if ( child )
+      child->MSWOnHScroll(wParam, pos, control);
     return;
   }
-
-    wxScrollEvent event;
-    event.SetPosition(pos);
-    event.SetOrientation(wxHORIZONTAL);
-    event.m_eventObject = this;
-
-       switch ( wParam )
-       {
+  
+  wxScrollEvent event;
+  event.SetPosition(pos);
+  event.SetOrientation(wxHORIZONTAL);
+  event.m_eventObject = this;
+  
+  switch ( wParam )
+  {
                case SB_TOP:
                        event.m_eventType = wxEVT_SCROLL_TOP;
                        break;
@@ -2600,30 +2607,30 @@ void wxWindow::MSWOnHScroll( WXWORD wParam, WXWORD pos, WXHWND control)
 
 void wxWindow::MSWOnShow(bool show, int status)
 {
-       wxShowEvent event(GetId(), show);
-       event.m_eventObject = this;
-       GetEventHandler()->ProcessEvent(event);
+  wxShowEvent event(GetId(), show);
+  event.m_eventObject = this;
+  GetEventHandler()->ProcessEvent(event);
 }
 
 bool wxWindow::MSWOnInitDialog(WXHWND WXUNUSED(hWndFocus))
 {
-       wxInitDialogEvent event(GetId());
-       event.m_eventObject = this;
-       GetEventHandler()->ProcessEvent(event);
-       return TRUE;
+  wxInitDialogEvent event(GetId());
+  event.m_eventObject = this;
+  GetEventHandler()->ProcessEvent(event);
+  return TRUE;
 }
 
 void wxWindow::InitDialog(void)
 {
- wxInitDialogEvent event(GetId());
- event.SetEventObject( this );
- GetEventHandler()->ProcessEvent(event);
 wxInitDialogEvent event(GetId());
 event.SetEventObject( this );
 GetEventHandler()->ProcessEvent(event);
 }
 
 // Default init dialog behaviour is to transfer data to window
 void wxWindow::OnInitDialog(wxInitDialogEvent& event)
 {
-       TransferDataToWindow();
+  TransferDataToWindow();
 }
 
 void wxGetCharSize(WXHWND wnd, int *x, int *y,wxFont *the_font)
@@ -2634,18 +2641,18 @@ void wxGetCharSize(WXHWND wnd, int *x, int *y,wxFont *the_font)
   HFONT was = 0;
   if (the_font)
   {
-#if DEBUG > 1
+#if WXDEBUG > 1
     wxDebugMsg("wxGetCharSize: Selecting HFONT %X\n", fnt);
 #endif
 //    the_font->UseResource();
 //    the_font->RealizeResource();
     if ((fnt=(HFONT) the_font->GetResourceHandle()))
-      was = SelectObject(dc,fnt) ;
+      was = (HFONT) SelectObject(dc,fnt) ;
   }
   GetTextMetrics(dc, &tm);
   if (the_font && fnt && was)
   {
-#if DEBUG > 1
+#if WXDEBUG > 1
     wxDebugMsg("wxGetCharSize: Selecting old HFONT %X\n", was);
 #endif
     SelectObject(dc,was) ;
@@ -3439,15 +3446,6 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRectangle *rect)
                ::ScrollWindow((HWND) GetHWND(), dx, dy, NULL, NULL);
 }
 
-void wxWindow::OnSize(wxSizeEvent& event)
-{
-       Default();
-#if USE_CONSTRAINTS
-  if (GetAutoLayout())
-    Layout();
-#endif
-}
-
 /*
 void wxWindow::CalcScrolledPosition(int x, int y, int *xx, int *yy) const
 {
@@ -3592,64 +3590,25 @@ WXDWORD wxWindow::Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D)
   return exStyle;
 }
 
-/*
-#if WXWIN_COMPATIBILITY
-void wxWindow::OldOnPaint(void)
-{
-  wxPaintEvent event(m_windowId);
-  event.m_eventObject = this;
-  if (!GetEventHandler()->ProcessEvent(event))
-    Default();
-};
-
-void wxWindow::OldOnSize(int w, int h)
-{
-  wxSizeEvent event(wxSize(w, h), m_windowId);
-  event.m_eventObject = this;
-  if (!GetEventHandler()->ProcessEvent(event))
-    Default();
-};
-
-void wxWindow::OldOnMouseEvent(wxMouseEvent& event)
-{
-  if (!GetEventHandler()->ProcessEvent(event))
-    Default();
-};
-
-void wxWindow::OldOnChar(wxKeyEvent& event)
-{
-  if (!GetEventHandler()->ProcessEvent(event))
-    Default();
-};
-
-void wxWindow::OldOnSetFocus(void)
-{
-  wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId);
-  event.m_eventObject = this;
-  if (!GetEventHandler()->ProcessEvent(event))
-    Default();
-};
-
-void wxWindow::OldOnKillFocus(void)
-{
-  wxFocusEvent event(wxEVT_KILL_FOCUS, m_windowId);
-  event.m_eventObject = this;
-  if (!GetEventHandler()->ProcessEvent(event))
-    Default();
-};
-#endif
-*/
-
 void wxWindow::OnChar(wxKeyEvent& event)
 {
-       bool isVirtual;
-       int id = wxCharCodeWXToMSW((int)event.KeyCode(), &isVirtual);
+    if ( event.KeyCode() == WXK_TAB ) {
+        // propagate the TABs to the parent - it's up to it to decide what
+        // to do with it
+        if ( GetParent() ) {
+            if ( GetParent()->ProcessEvent(event) )
+                return;
+        }
+    }
+
+    bool isVirtual;
+    int id = wxCharCodeWXToMSW((int)event.KeyCode(), &isVirtual);
 
-       if ( id == -1 )
-               id= m_lastWParam;
+    if ( id == -1 )
+        id= m_lastWParam;
 
     if ( !event.ControlDown() )
-           (void) MSWDefWindowProc(m_lastMsg, (WPARAM) id, m_lastLParam);
+        (void) MSWDefWindowProc(m_lastMsg, (WPARAM) id, m_lastLParam);
 }
 
 void wxWindow::OnPaint(wxPaintEvent& event)
@@ -4386,7 +4345,7 @@ void wxWindow::OnChar(wxKeyEvent& event)
   if (vert_units)
         y_pages = (int)(v_height/vert_units) - y_page;
 
-#ifdef __WINDOWS__
+#ifdef __WXMSW__
   int y = 0;
 #else
   int y = y_page-1;
@@ -4538,3 +4497,156 @@ void wxWindow::Lower(void)
     ::SetWindowPos((HWND) GetHWND(), HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
 }
 
+long wxWindow::MSWGetDlgCode()
+{
+  // default: just forward to def window proc (the msg has no parameters)
+  return MSWDefWindowProc(WM_GETDLGCODE, 0, 0);
+}
+
+bool wxWindow::AcceptsFocus() const
+{
+  return IsShown() && IsEnabled();
+}
+
+#ifdef __WXDEBUG__
+static const char *GetMessageName(int message)
+{
+  switch ( message ) {
+    case 0x0000: return "WM_NULL";
+    case 0x0001: return "WM_CREATE";
+    case 0x0002: return "WM_DESTROY";
+    case 0x0003: return "WM_MOVE";
+    case 0x0005: return "WM_SIZE";
+    case 0x0006: return "WM_ACTIVATE";
+    case 0x0007: return "WM_SETFOCUS";
+    case 0x0008: return "WM_KILLFOCUS";
+    case 0x000A: return "WM_ENABLE";
+    case 0x000B: return "WM_SETREDRAW";
+    case 0x000C: return "WM_SETTEXT";
+    case 0x000D: return "WM_GETTEXT";
+    case 0x000E: return "WM_GETTEXTLENGTH";
+    case 0x000F: return "WM_PAINT";
+    case 0x0010: return "WM_CLOSE";
+    case 0x0011: return "WM_QUERYENDSESSION";
+    case 0x0012: return "WM_QUIT";
+    case 0x0013: return "WM_QUERYOPEN";
+    case 0x0014: return "WM_ERASEBKGND";
+    case 0x0015: return "WM_SYSCOLORCHANGE";
+    case 0x0016: return "WM_ENDSESSION";
+    case 0x0017: return "WM_SYSTEMERROR";
+    case 0x0018: return "WM_SHOWWINDOW";
+    case 0x0019: return "WM_CTLCOLOR";
+    case 0x001A: return "WM_WININICHANGE";
+    case 0x001B: return "WM_DEVMODECHANGE";
+    case 0x001C: return "WM_ACTIVATEAPP";
+    case 0x001D: return "WM_FONTCHANGE";
+    case 0x001E: return "WM_TIMECHANGE";
+    case 0x001F: return "WM_CANCELMODE";
+    case 0x0020: return "WM_SETCURSOR";
+    case 0x0021: return "WM_MOUSEACTIVATE";
+    case 0x0022: return "WM_CHILDACTIVATE";
+    case 0x0023: return "WM_QUEUESYNC";
+    case 0x0024: return "WM_GETMINMAXINFO";
+    case 0x0026: return "WM_PAINTICON";
+    case 0x0027: return "WM_ICONERASEBKGND";
+    case 0x0028: return "WM_NEXTDLGCTL";
+    case 0x002A: return "WM_SPOOLERSTATUS";
+    case 0x002B: return "WM_DRAWITEM";
+    case 0x002C: return "WM_MEASUREITEM";
+    case 0x002D: return "WM_DELETEITEM";
+    case 0x002E: return "WM_VKEYTOITEM";
+    case 0x002F: return "WM_CHARTOITEM";
+    case 0x0030: return "WM_SETFONT";
+    case 0x0031: return "WM_GETFONT";
+    case 0x0037: return "WM_QUERYDRAGICON";
+    case 0x0039: return "WM_COMPAREITEM";
+    case 0x0041: return "WM_COMPACTING";
+    case 0x0044: return "WM_COMMNOTIFY";
+    case 0x0046: return "WM_WINDOWPOSCHANGING";
+    case 0x0047: return "WM_WINDOWPOSCHANGED";
+    case 0x0048: return "WM_POWER";
+    case 0x0081: return "WM_NCCREATE";
+    case 0x0082: return "WM_NCDESTROY";
+    case 0x0083: return "WM_NCCALCSIZE";
+    case 0x0084: return "WM_NCHITTEST";
+    case 0x0085: return "WM_NCPAINT";
+    case 0x0086: return "WM_NCACTIVATE";
+    case 0x0087: return "WM_GETDLGCODE";
+    case 0x00A0: return "WM_NCMOUSEMOVE";
+    case 0x00A1: return "WM_NCLBUTTONDOWN";
+    case 0x00A2: return "WM_NCLBUTTONUP";
+    case 0x00A3: return "WM_NCLBUTTONDBLCLK";
+    case 0x00A4: return "WM_NCRBUTTONDOWN";
+    case 0x00A5: return "WM_NCRBUTTONUP";
+    case 0x00A6: return "WM_NCRBUTTONDBLCLK";
+    case 0x00A7: return "WM_NCMBUTTONDOWN";
+    case 0x00A8: return "WM_NCMBUTTONUP";
+    case 0x00A9: return "WM_NCMBUTTONDBLCLK";
+    case 0x0100: return "WM_KEYDOWN";
+    case 0x0101: return "WM_KEYUP";
+    case 0x0102: return "WM_CHAR";
+    case 0x0103: return "WM_DEADCHAR";
+    case 0x0104: return "WM_SYSKEYDOWN";
+    case 0x0105: return "WM_SYSKEYUP";
+    case 0x0106: return "WM_SYSCHAR";
+    case 0x0107: return "WM_SYSDEADCHAR";
+    case 0x0108: return "WM_KEYLAST";
+    case 0x0110: return "WM_INITDIALOG";
+    case 0x0111: return "WM_COMMAND";
+    case 0x0112: return "WM_SYSCOMMAND";
+    case 0x0113: return "WM_TIMER";
+    case 0x0114: return "WM_HSCROLL";
+    case 0x0115: return "WM_VSCROLL";
+    case 0x0116: return "WM_INITMENU";
+    case 0x0117: return "WM_INITMENUPOPUP";
+    case 0x011F: return "WM_MENUSELECT";
+    case 0x0120: return "WM_MENUCHAR";
+    case 0x0121: return "WM_ENTERIDLE";
+    case 0x0200: return "WM_MOUSEMOVE";
+    case 0x0201: return "WM_LBUTTONDOWN";
+    case 0x0202: return "WM_LBUTTONUP";
+    case 0x0203: return "WM_LBUTTONDBLCLK";
+    case 0x0204: return "WM_RBUTTONDOWN";
+    case 0x0205: return "WM_RBUTTONUP";
+    case 0x0206: return "WM_RBUTTONDBLCLK";
+    case 0x0207: return "WM_MBUTTONDOWN";
+    case 0x0208: return "WM_MBUTTONUP";
+    case 0x0209: return "WM_MBUTTONDBLCLK";
+    case 0x0210: return "WM_PARENTNOTIFY";
+    case 0x0220: return "WM_MDICREATE";
+    case 0x0221: return "WM_MDIDESTROY";
+    case 0x0222: return "WM_MDIACTIVATE";
+    case 0x0223: return "WM_MDIRESTORE";
+    case 0x0224: return "WM_MDINEXT";
+    case 0x0225: return "WM_MDIMAXIMIZE";
+    case 0x0226: return "WM_MDITILE";
+    case 0x0227: return "WM_MDICASCADE";
+    case 0x0228: return "WM_MDIICONARRANGE";
+    case 0x0229: return "WM_MDIGETACTIVE";
+    case 0x0230: return "WM_MDISETMENU";
+    case 0x0233: return "WM_DROPFILES";
+    case 0x0300: return "WM_CUT";
+    case 0x0301: return "WM_COPY";
+    case 0x0302: return "WM_PASTE";
+    case 0x0303: return "WM_CLEAR";
+    case 0x0304: return "WM_UNDO";
+    case 0x0305: return "WM_RENDERFORMAT";
+    case 0x0306: return "WM_RENDERALLFORMATS";
+    case 0x0307: return "WM_DESTROYCLIPBOARD";
+    case 0x0308: return "WM_DRAWCLIPBOARD";
+    case 0x0309: return "WM_PAINTCLIPBOARD";
+    case 0x030A: return "WM_VSCROLLCLIPBOARD";
+    case 0x030B: return "WM_SIZECLIPBOARD";
+    case 0x030C: return "WM_ASKCBFORMATNAME";
+    case 0x030D: return "WM_CHANGECBCHAIN";
+    case 0x030E: return "WM_HSCROLLCLIPBOARD";
+    case 0x030F: return "WM_QUERYNEWPALETTE";
+    case 0x0310: return "WM_PALETTEISCHANGING";
+    case 0x0311: return "WM_PALETTECHANGED";
+    default:
+      static char s_szBuf[128];
+      sprintf(s_szBuf, "<unknown message = %d>", message);
+      return s_szBuf;
+  }
+}
+#endif //WXDEBUG