]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/window.cpp
Somehow, setting a tint color makes gauge work :/.
[wxWidgets.git] / src / os2 / window.cpp
index 51b1e6107d884527ab944a29ea66bd087b9fada1..8a7945ab516eb808df6d95ca28c4364f009ae545 100644 (file)
@@ -1,10 +1,9 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        windows.cpp
+// Name:        src/os2/window.cpp
 // Purpose:     wxWindow
 // Author:      David Webster
 // Modified by:
 // Created:     10/12/99
-// RCS-ID:      $Id$
 // Copyright:   (c) David Webster
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 //
 #include "wx/wxprec.h"
 
+#include "wx/window.h"
+
 #ifndef WX_PRECOMP
     #define INCL_DOS
     #define INCL_PM
     #include <os2.h>
-    #include "wx/window.h"
     #include "wx/accel.h"
-    #include "wx/setup.h"
     #include "wx/menu.h"
     #include "wx/dc.h"
     #include "wx/dcclient.h"
     #include "wx/statusbr.h"
     #include "wx/toolbar.h"
     #include "wx/settings.h"
+    #include "wx/intl.h"
+    #include "wx/log.h"
+    #include "wx/textctrl.h"
+    #include "wx/menuitem.h"
     #include <stdio.h>
 #endif
 
-#if     wxUSE_OWNER_DRAWN
+#include "wx/os2/dcclient.h"
+
+#if wxUSE_OWNER_DRAWN
     #include "wx/ownerdrw.h"
 #endif
 
@@ -55,9 +60,6 @@
     #include "wx/dnd.h"
 #endif
 
-#include "wx/menuitem.h"
-#include "wx/log.h"
-
 #include "wx/os2/private.h"
 
 #if wxUSE_TOOLTIPS
     #include "wx/caret.h"
 #endif // wxUSE_CARET
 
-#include "wx/intl.h"
-#include "wx/log.h"
-
-
-#include "wx/textctrl.h"
-
 #include <string.h>
 
 //
 QMSG                      s_currentMsg;
 
 #if wxUSE_MENUS_NATIVE
-wxMenu*                   wxCurrentPopupMenu = NULL;
+extern wxMenu*            wxCurrentPopupMenu;
 #endif // wxUSE_MENUS_NATIVE
 
 // ---------------------------------------------------------------------------
@@ -143,7 +139,7 @@ MRESULT EXPENTRY wxWndProc( HWND hWnd
                           );
 
 #ifdef  __WXDEBUG__
-    const char *wxGetMessageName(int message);
+    const wxChar *wxGetMessageName(int message);
 #endif  //__WXDEBUG__
 
 wxWindowOS2* FindWindowForMouseEvent( wxWindow* pWin
@@ -159,8 +155,9 @@ wxWindow* wxFindWinFromHandle(WXHWND hWnd);
 //
 // get the current state of SHIFT/CTRL keys
 //
-static inline bool IsShiftDown() { return (::WinGetKeyState(HWND_DESKTOP, VK_SHIFT) & 0x8000) != 0; }
-static inline bool IsCtrlDown() { return (::WinGetKeyState(HWND_DESKTOP, VK_CTRL) & 0x8000) != 0; }
+static inline bool IsKeyDown(LONG key) {return (::WinGetKeyState(HWND_DESKTOP, key) & 0x8000) != 0; }
+static inline bool IsShiftDown() { return IsKeyDown(VK_SHIFT); }
+static inline bool IsCtrlDown() { return IsKeyDown(VK_CTRL); }
 
 static wxWindow*                    gpWinBeingCreated = NULL;
 
@@ -172,9 +169,7 @@ static wxWindow*                    gpWinBeingCreated = NULL;
 // method
 #ifdef __WXUNIVERSAL__
     IMPLEMENT_ABSTRACT_CLASS(wxWindowOS2, wxWindowBase)
-#else // __WXPM__
-    IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxWindowBase)
-#endif // __WXUNIVERSAL__/__WXPM__
+#endif // __WXUNIVERSAL__
 
 BEGIN_EVENT_TABLE(wxWindowOS2, wxWindowBase)
     EVT_ERASE_BACKGROUND(wxWindowOS2::OnEraseBackground)
@@ -299,7 +294,6 @@ void wxWindowOS2::Init()
     m_bUseCtl3D             = false;
     m_bMouseInWindow        = false;
     m_bLastKeydownProcessed = false;
-    m_pChildrenDisabled     = NULL;
 
     //
     // wxWnd
@@ -337,7 +331,7 @@ void wxWindowOS2::Init()
 //
 wxWindowOS2::~wxWindowOS2()
 {
-    m_isBeingDeleted = true;
+    SendDestroyEvent();
 
     for (wxWindow* pWin = GetParent(); pWin; pWin = pWin->GetParent())
     {
@@ -355,13 +349,14 @@ wxWindowOS2::~wxWindowOS2()
     if (m_hWnd)
     {
         if(!::WinDestroyWindow(GetHWND()))
+        {
             wxLogLastError(wxT("DestroyWindow"));
+        }
         //
         // remove hWnd <-> wxWindow association
         //
         wxRemoveHandleAssociation(this);
     }
-    delete m_pChildrenDisabled;
 } // end of wxWindowOS2::~wxWindowOS2
 
 // real construction (Init() must have been called before!)
@@ -388,7 +383,7 @@ bool wxWindowOS2::Create( wxWindow*       pParent,
     // static box
     //
     wxASSERT_MSG( !wxDynamicCast(pParent, wxStaticBox),
-                  _T("wxStaticBox can't be used as a window parent!") );
+                  wxT("wxStaticBox can't be used as a window parent!") );
 #endif // wxUSE_STATBOX
 
      // Ensure groupbox backgrounds are painted
@@ -410,9 +405,7 @@ bool wxWindowOS2::Create( wxWindow*       pParent,
         pParent->AddChild(this);
         hParent = GetWinHwnd(pParent);
 
-        if ( pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow)) ||
-             pParent->IsKindOf(CLASSINFO(wxScrolledWindow))
-           )
+        if (pParent->IsKindOf(CLASSINFO(wxScrolledWindow)))
             ulCreateFlags |= WS_CLIPSIBLINGS;
     }
 
@@ -460,7 +453,7 @@ bool wxWindowOS2::Create( wxWindow*       pParent,
 void wxWindowOS2::SetFocus()
 {
     HWND                            hWnd = GetHwnd();
-    wxCHECK_RET( hWnd, _T("can't set focus to invalid window") );
+    wxCHECK_RET( hWnd, wxT("can't set focus to invalid window") );
 
     if (hWnd)
         ::WinSetFocus(HWND_DESKTOP, hWnd);
@@ -485,70 +478,12 @@ wxWindow* wxWindowBase::DoFindFocus()
     return NULL;
 } // wxWindowBase::DoFindFocus
 
-bool wxWindowOS2::Enable( bool bEnable )
+void wxWindowOS2::DoEnable( bool bEnable )
 {
-    if (!wxWindowBase::Enable(bEnable))
-        return false;
-
     HWND                            hWnd = GetHwnd();
-
     if ( hWnd )
         ::WinEnableWindow(hWnd, (BOOL)bEnable);
-
-    //
-    // The logic below doesn't apply to the top level windows -- otherwise
-    // showing a modal dialog would result in total greying out (and ungreying
-    // out later) of everything which would be really ugly
-    //
-    if (IsTopLevel())
-        return true;
-
-    wxWindowList::compatibility_iterator     node = GetChildren().GetFirst();
-
-    while (node)
-    {
-        wxWindow*                   pChild = node->GetData();
-
-        if (bEnable)
-        {
-            //
-            // Enable the child back unless it had been disabled before us
-            //
-            if (!m_pChildrenDisabled || !m_pChildrenDisabled->Find(pChild))
-                pChild->Enable();
-        }
-        else // we're being disabled
-        {
-            if (pChild->IsEnabled())
-            {
-                //
-                // Disable it as children shouldn't stay enabled while the
-                // parent is not
-                //
-                pChild->Disable();
-            }
-            else // child already disabled, remember it
-            {
-                //
-                // Have we created the list of disabled children already?
-                //
-                if (!m_pChildrenDisabled)
-                    m_pChildrenDisabled = new wxWindowList;
-                m_pChildrenDisabled->Append(pChild);
-            }
-        }
-        node = node->GetNext();
-    }
-    if (bEnable && m_pChildrenDisabled)
-    {
-        //
-        // We don't need this list any more, don't keep unused memory
-        //
-        delete m_pChildrenDisabled;
-        m_pChildrenDisabled = NULL;
-    }
-    return true;
-} // end of wxWindowOS2::Enable
+}
 
 bool wxWindowOS2::Show( bool bShow )
 {
@@ -576,15 +511,15 @@ void wxWindowOS2::Lower()
     ::WinSetWindowPos(GetHwnd(), HWND_BOTTOM, 0, 0, 0, 0, SWP_ZORDER | SWP_DEACTIVATE);
 } // end of wxWindowOS2::Lower
 
-void wxWindowOS2::SetTitle( const wxString& rTitle )
+void wxWindowOS2::SetLabel( const wxString& label )
 {
-    ::WinSetWindowText(GetHwnd(), (PSZ)rTitle.c_str());
-} // end of wxWindowOS2::SetTitle
+    ::WinSetWindowText(GetHwnd(), label.c_str());
+} // end of wxWindowOS2::SetLabel
 
-wxString wxWindowOS2::GetTitle() const
+wxString wxWindowOS2::GetLabel() const
 {
     return wxGetWindowText(GetHWND());
-} // end of wxWindowOS2::GetTitle
+} // end of wxWindowOS2::GetLabel
 
 void wxWindowOS2::DoCaptureMouse()
 {
@@ -595,7 +530,7 @@ void wxWindowOS2::DoCaptureMouse()
         ::WinSetCapture(HWND_DESKTOP, hWnd);
         m_bWinCaptured = true;
     }
-} // end of wxWindowOS2::GetTitle
+} // end of wxWindowOS2::DoCaptureMouse
 
 void wxWindowOS2::DoReleaseMouse()
 {
@@ -609,7 +544,7 @@ void wxWindowOS2::DoReleaseMouse()
 /* static */ wxWindow* wxWindowBase::GetCapture()
 {
     HWND hwnd = ::WinQueryCapture(HWND_DESKTOP);
-    return hwnd ? wxFindWinFromHandle((WXHWND)hwnd) : (wxWindow *)NULL;
+    return hwnd ? wxFindWinFromHandle((WXHWND)hwnd) : NULL;
 } // end of wxWindowBase::GetCapture
 
 bool wxWindowOS2::SetFont( const wxFont& rFont )
@@ -635,7 +570,7 @@ bool wxWindowOS2::SetCursor( const wxCursor& rCursor)
         return false;
     }
 
-    if ( m_cursor.Ok() ) {
+    if ( m_cursor.IsOk() ) {
         HWND                            hWnd = GetHwnd();
         POINTL                          vPoint;
         RECTL                           vRect;
@@ -727,6 +662,10 @@ void wxWindowOS2::SetScrollbar( int  nOrient,
     int                             nOldRange = nRange - nThumbVisible;
     int                             nRange1 = nOldRange;
     int                             nPageSize = nThumbVisible;
+    int         nVSBWidth  = wxSystemSettingsNative::GetMetric(wxSYS_VSCROLL_X,
+                                                               this);
+    int         nHSBHeight = wxSystemSettingsNative::GetMetric(wxSYS_HSCROLL_Y,
+                                                               this);
 
     SBCDATA                         vInfo;
     ULONG                           ulStyle = WS_VISIBLE | WS_SYNCPAINT;
@@ -788,8 +727,8 @@ void wxWindowOS2::SetScrollbar( int  nOrient,
                                                     ,ulStyle
                                                     ,vSwp.x
                                                     ,vSwp.y
-                                                    ,vSwp.cx - 20
-                                                    ,20
+                                                    ,vSwp.cx - nVSBWidth
+                                                    ,nHSBHeight
                                                     ,hWnd
                                                     ,HWND_TOP
                                                     ,60000
@@ -806,18 +745,19 @@ void wxWindowOS2::SetScrollbar( int  nOrient,
             // origin, not the frame's client window origin.
             // The starting x position is the same as the starting x position
             // of the owner, but in terms of the parent frame.
-            // The starting y position is 20 pels below the origin of the
-            // owner in terms of the parent frame.
-            // The horz bar is the same width as the owner and 20 pels high.
+            // The starting y position is wxSYS_HSCROLL_Y pels below the
+            // origin of the owner in terms of the parent frame.
+            // The horz bar is the same width as the owner and wxSYS_HSCROLL_Y
+            // pels high.
             //
             if (nRange1 >= nThumbVisible)
             {
                 ::WinSetWindowPos( m_hWndScrollBarHorz
                                   ,HWND_TOP
                                   ,vSwp.x + vSwpOwner.x
-                                  ,(vSwp.y + vSwpOwner.y) - 20
+                                  ,(vSwp.y + vSwpOwner.y) - nHSBHeight
                                   ,vSwpOwner.cx
-                                  ,20
+                                  ,nHSBHeight
                                   ,SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER
                                  );
                 ::WinSendMsg( m_hWndScrollBarHorz
@@ -858,10 +798,10 @@ void wxWindowOS2::SetScrollbar( int  nOrient,
                                                     ,WC_SCROLLBAR
                                                     ,(PSZ)NULL
                                                     ,ulStyle
-                                                    ,vSwp.x + vSwp.cx - 20
-                                                    ,vSwp.y + 20
-                                                    ,20
-                                                    ,vSwp.cy - 20
+                                                    ,vSwp.x + vSwp.cx - nVSBWidth
+                                                    ,vSwp.y + nHSBHeight
+                                                    ,nVSBWidth
+                                                    ,vSwp.cy - nHSBHeight
                                                     ,hWnd
                                                     ,HWND_TOP
                                                     ,60001
@@ -884,7 +824,7 @@ void wxWindowOS2::SetScrollbar( int  nOrient,
             // position of the scrollbar relative to the parent frame (the vert
             // scrollbar is on the right and starts at the bottom of the
             // owner window).
-            // It is 20 pels wide and the same height as the owner.
+            // It is wxSYS_VSCROLL_X pels wide and the same height as the owner.
             //
             if (nRange1 >= nThumbVisible)
             {
@@ -892,7 +832,7 @@ void wxWindowOS2::SetScrollbar( int  nOrient,
                                   ,HWND_TOP
                                   ,vSwp.x + vSwpOwner.x + vSwpOwner.cx
                                   ,vSwp.y + vSwpOwner.y
-                                  ,20
+                                  ,nVSBWidth
                                   ,vSwpOwner.cy
                                   ,SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW
                                  );
@@ -1143,17 +1083,15 @@ void wxWindowOS2::OnIdle(
                            ,vPoint.y
                            ,nState
                           );
-            (void)GetEventHandler()->ProcessEvent(rEvent);
+            (void)HandleWindowEvent(rEvent);
         }
     }
-    if (wxUpdateUIEvent::CanUpdate(this))
-        UpdateWindowUI(wxUPDATE_UI_FROMIDLE);
 } // end of wxWindowOS2::OnIdle
 
 //
 // Set this window to be the child of 'parent'.
 //
-bool wxWindowOS2::Reparent( wxWindow* pParent)
+bool wxWindowOS2::Reparent( wxWindowBase* pParent)
 {
     if (!wxWindowBase::Reparent(pParent))
         return false;
@@ -1170,12 +1108,12 @@ void wxWindowOS2::Update()
     ::WinUpdateWindow(GetHwnd());
 } // end of wxWindowOS2::Update
 
-void wxWindowOS2::Freeze()
+void wxWindowOS2::DoFreeze()
 {
    ::WinSendMsg(GetHwnd(), WM_VRNDISABLED, (MPARAM)0, (MPARAM)0);
 } // end of wxWindowOS2::Freeze
 
-void wxWindowOS2::Thaw()
+void wxWindowOS2::DoThaw()
 {
    ::WinSendMsg(GetHwnd(), WM_VRNENABLED, (MPARAM)TRUE, (MPARAM)0);
 
@@ -1296,7 +1234,10 @@ void wxWindowOS2::DoGetPosition(
 , int*                              pY
 ) const
 {
-    HWND                            hWnd = GetHwnd();
+    //
+    // Return parameters assume wxWidgets coordinate system
+    //
+    HWND                            hWnd;
     SWP                             vSwp;
     POINTL                          vPoint;
     wxWindow*                       pParent = GetParent();
@@ -1306,17 +1247,30 @@ void wxWindowOS2::DoGetPosition(
     // the WIN32 WinGetRect, but unlike WinGetRect which returns the window
     // origin position in screen coordinates, WinQueryWindowRect returns it
     // relative to itself, i.e. (0,0).  To get the same under PM we must
-    // us WinQueryWindowPos.  This call, unlike the WIN32 call, however,
+    // use WinQueryWindowPos.  This call, unlike the WIN32 call, however,
     // returns a position relative to it's parent, so no parent adujstments
     // are needed under OS/2.  Also, windows should be created using
-    // wxWindow coordinates, i.e 0,0 is the TOP left so vSwp will already
-    // reflect that.
+    // wxWindow coordinates, i.e. 0,0 is the TOP left.
     //
+    if (IsKindOf(CLASSINFO(wxFrame)))
+    {
+        wxFrame*                    pFrame = wxDynamicCast(this, wxFrame);
+        hWnd = pFrame->GetFrame();
+    }
+    else
+        hWnd = GetHwnd();
+
     ::WinQueryWindowPos(hWnd, &vSwp);
 
     vPoint.x = vSwp.x;
     vPoint.y = vSwp.y;
 
+    // We need to convert to wxWidgets coordinates
+    int vHeight;
+    DoGetSize(NULL,&vHeight);
+    wxWindow* pWindow = wxDynamicCast(this,wxWindow);
+    vPoint.y = pWindow->GetOS2ParentHeight(pParent) - vPoint.y - vHeight;
+
     //
     // We may be faking the client origin. So a window that's really at (0,
     // 30) may appear (to wxWin apps) to be at (0, 0).
@@ -1448,18 +1402,12 @@ void wxWindowOS2::DoMoveWindow(
 , int                               nHeight
 )
 {
+    //
+    // Input parameters assume wxWidgets coordinate system
+    //
     RECTL                           vRect;
     wxWindow*                       pParent = GetParent();
-
-    /* Due to OS/2's inverted coordinate system, changing the height
-       of a window requires repositioning all it's children, e.g. if
-       you want a child of height 100 to be at the top left corner of
-       the parent you need to position the lower left corner of the
-       child at (0, (height of parent - 100)), so, obviously, if the
-       height of the parent changes, the child needs to be repositioned. */
-    int                         nHeightDelta;
-    GetSize(0, &nHeightDelta);
-    nHeightDelta = nHeight - nHeightDelta;
+    HWND                            hWnd = GetHwnd();
 
     if (pParent && !IsKindOf(CLASSINFO(wxDialog)))
     {
@@ -1489,64 +1437,26 @@ void wxWindowOS2::DoMoveWindow(
     if (IsKindOf(CLASSINFO(wxFrame)))
     {
         RECTL                       vFRect;
-        HWND                        hWndFrame;
         int                         nWidthFrameDelta = 0;
         int                         nHeightFrameDelta = 0;
-        int                         nHeightFrame = 0;
-        int                         nWidthFrame = 0;
         wxFrame*                    pFrame;
 
         pFrame = wxDynamicCast(this, wxFrame);
-        hWndFrame = pFrame->GetFrame();
-        ::WinQueryWindowRect(hWndFrame, &vRect);
-        ::WinMapWindowPoints(hWndFrame, HWND_DESKTOP, (PPOINTL)&vRect, 2);
+        hWnd = pFrame->GetFrame();
+        ::WinQueryWindowRect(hWnd, &vRect);
+        ::WinMapWindowPoints(hWnd, HWND_DESKTOP, (PPOINTL)&vRect, 2);
         vFRect = vRect;
-        ::WinCalcFrameRect(hWndFrame, &vRect, TRUE);
+        ::WinCalcFrameRect(hWnd, &vRect, TRUE);
         nWidthFrameDelta = ((vRect.xLeft - vFRect.xLeft) + (vFRect.xRight - vRect.xRight));
         nHeightFrameDelta = ((vRect.yBottom - vFRect.yBottom) + (vFRect.yTop - vRect.yTop));
-        nWidthFrame = vFRect.xRight - vFRect.xLeft;
-        nHeightFrame = vFRect.yTop - vFRect.yBottom;
-
-        if (nWidth == vFRect.xRight - vFRect.xLeft &&
-            nHeight == vFRect.yTop - vFRect.yBottom)
-        {
-            //
-            // In this case the caller is not aware of OS/2's need to size both
-            // the frame and it's client and is really only moving the window,
-            // not resizeing it.  So move the frame, and back off the sizes
-            // for a proper client fit.
-            //
-            ::WinSetWindowPos( hWndFrame
-                              ,HWND_TOP
-                              ,(LONG)nX - (vRect.xLeft - vFRect.xLeft)
-                              ,(LONG)nY - (vRect.yBottom - vFRect.yBottom)
-                              ,(LONG)0
-                              ,(LONG)0
-                              ,SWP_MOVE
-                             );
-            nX += (vRect.xLeft - vFRect.xLeft);
-            nY += (vRect.yBottom - vFRect.yBottom);
-            nWidth -= nWidthFrameDelta;
-            nHeight -= nHeightFrameDelta;
-        }
-        else
-        {
-            if (nWidth > nWidthFrame - nHeightFrameDelta ||
-                nHeight > nHeightFrame - nHeightFrameDelta)
-            {
-                ::WinSetWindowPos( hWndFrame
-                                  ,HWND_TOP
-                                  ,(LONG)nX - (vRect.xLeft - vFRect.xLeft)
-                                  ,(LONG)nY - (vRect.yBottom - vFRect.yBottom)
-                                  ,(LONG)nWidth + nWidthFrameDelta
-                                  ,(LONG)nHeight + nHeightFrameDelta
-                                  ,SWP_MOVE | SWP_SIZE
-                                 );
-            }
-        }
+        // Input values refer to the window position relative to its parent
+        // which may be the Desktop so we need to calculate
+        // the new frame values to keep the wxWidgets frame origin constant
+        nY -= nHeightFrameDelta;
+        nWidth += nWidthFrameDelta;
+        nHeight += nHeightFrameDelta;
     }
-
-    ::WinSetWindowPos( GetHwnd()
+    ::WinSetWindowPos( hWnd
                       ,HWND_TOP
                       ,(LONG)nX
                       ,(LONG)nY
@@ -1558,17 +1468,15 @@ void wxWindowOS2::DoMoveWindow(
         //
         // Uninitialized
         //
-        ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp);
+        ::WinQueryWindowPos(hWnd, &m_vWinSwp);
     else
     {
-        int                         nYDiff = m_vWinSwp.cy - nHeight;
-
         //
         // Handle resizing of scrolled windows.  The target or window to
-        // be scrolled is the owner (gets the scroll notificaitons).  The
+        // be scrolled is the owner (gets the scroll notifications).  The
         // parent is usually the parent frame of the scrolled panel window.
         // In order to show the scrollbars the target window will be shrunk
-        // by the size of the scroll bar widths (20) and moved in the X and Y
+        // by the size of the scroll bar widths and moved in the X and Y
         // directon.  That value will be computed as part of the diff for
         // moving the children.  Everytime the window is sized the
         // toplevel OnSize is going to resize the panel to fit the client
@@ -1577,26 +1485,28 @@ void wxWindowOS2::DoMoveWindow(
         // which will cause the scrollbars to be displayed via the SetScrollbar
         // call in CWindow.
         //
-        if ( IsKindOf(CLASSINFO(wxGenericScrolledWindow)) ||
-             IsKindOf(CLASSINFO(wxScrolledWindow))
-           )
+        if (IsKindOf(CLASSINFO(wxScrolledWindow)))
         {
             int                     nAdjustWidth  = 0;
             int                     nAdjustHeight = 0;
+            int nHSBHeight = wxSystemSettingsNative::GetMetric(wxSYS_HSCROLL_Y,
+                                                               this);
+            int nVSBWidth  = wxSystemSettingsNative::GetMetric(wxSYS_VSCROLL_X,
+                                                               this);
             SWP                     vSwpScroll;
 
             if (GetScrollBarHorz() == NULLHANDLE ||
                 !WinIsWindowShowing(GetScrollBarHorz()))
                 nAdjustHeight = 0L;
             else
-                nAdjustHeight = 20L;
+                nAdjustHeight = nHSBHeight;
             if (GetScrollBarVert() == NULLHANDLE ||
                 !WinIsWindowShowing(GetScrollBarVert()))
                 nAdjustWidth = 0L;
             else
-                nAdjustWidth = 20L;
-            ::WinQueryWindowPos(GetHWND(), &vSwpScroll);
-            ::WinSetWindowPos( GetHWND()
+                nAdjustWidth = nVSBWidth;
+            ::WinQueryWindowPos(hWnd, &vSwpScroll);
+            ::WinSetWindowPos( hWnd
                               ,HWND_TOP
                               ,vSwpScroll.x
                               ,vSwpScroll.y + nAdjustHeight
@@ -1604,19 +1514,9 @@ void wxWindowOS2::DoMoveWindow(
                               ,vSwpScroll.cy - nAdjustHeight
                               ,SWP_MOVE | SWP_SIZE
                              );
-            nYDiff -= nAdjustHeight;
         }
-        MoveChildren(nYDiff);
-        ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp);
+        ::WinQueryWindowPos(hWnd, &m_vWinSwp);
     }
-#if 0
-    // FIXME: By my logic, the next line should be needed as it moves child
-    //        windows when resizing the parent (see comment at beginning of
-    //        function). However, this seems to cause lots of problems. At
-    //        least, e.g. the grid sample almost works with this line
-    //        commented out but crashes badly with it.
-    MoveChildren(nHeightDelta);
-#endif
 } // end of wxWindowOS2::DoMoveWindow
 
 //
@@ -1635,6 +1535,10 @@ void wxWindowOS2::DoSetSize( int nX,
                              int nHeight,
                              int nSizeFlags )
 {
+    //
+    // Input & output parameters assume wxWidgets coordinate system
+    //
+
     //
     // Get the current size and position...
     //
@@ -1650,12 +1554,7 @@ void wxWindowOS2::DoSetSize( int nX,
     //
     // ... and don't do anything (avoiding flicker) if it's already ok
     //
-    //
-    // Must convert Y coords to test for equality under OS/2
-    //
-    int                             nY2 = nY;
-
-    if (nX == nCurrentX && nY2 == nCurrentY &&
+    if (nX == nCurrentX && nY == nCurrentY &&
         nWidth == nCurrentWidth && nHeight == nCurrentHeight)
     {
         return;
@@ -1707,55 +1606,20 @@ void wxWindowOS2::DoSetSize( int nX,
 void wxWindowOS2::DoSetClientSize( int nWidth,
                                    int nHeight )
 {
-    POINTL    vPoint;
-    int       nActualWidth;
-    int       nActualHeight;
-    wxWindow* pParent = (wxWindow*)GetParent();
-    HWND      hParentWnd = (HWND)0;
-
-    if (pParent)
-        hParentWnd = (HWND)pParent->GetHWND();
-
-    if (IsKindOf(CLASSINFO(wxFrame)))
-    {
-        wxFrame* pFrame = wxDynamicCast(this, wxFrame);
-        HWND     hFrame = pFrame->GetFrame();
-        RECTL    vRect;
-        RECTL    vRect2;
-        RECTL    vRect3;
-
-        ::WinQueryWindowRect(GetHwnd(), &vRect2);
-        ::WinQueryWindowRect(hFrame, &vRect);
-        ::WinQueryWindowRect(hParentWnd, &vRect3);
-        nActualWidth = vRect2.xRight - vRect2.xLeft - vRect.xRight + nWidth;
-        nActualHeight = vRect2.yTop - vRect2.yBottom - vRect.yTop + nHeight;
-
-        vPoint.x = vRect2.xLeft;
-        vPoint.y = vRect2.yBottom;
-        if (pParent)
-        {
-            vPoint.x -= vRect3.xLeft;
-            vPoint.y -= vRect3.yBottom;
-        }
-    }
-    else
-    {
-        int nX;
-        int nY;
+    //
+    // nX & nY assume wxWidgets coordinate system
+    //
+    int nX;
+    int nY;
 
-        GetPosition(&nX, &nY);
-        nActualWidth  = nWidth;
-        nActualHeight = nHeight;
+    GetPosition(&nX, &nY);
 
-        vPoint.x = nX;
-        vPoint.y = nY;
-    }
-    DoMoveWindow( vPoint.x, vPoint.y, nActualWidth, nActualHeight );
+    DoMoveWindow( nX, nY, nWidth, nHeight );
 
     wxSize size( nWidth, nHeight );
     wxSizeEvent vEvent( size, m_windowId );
     vEvent.SetEventObject(this);
-    GetEventHandler()->ProcessEvent(vEvent);
+    HandleWindowEvent(vEvent);
 } // end of wxWindowOS2::DoSetClientSize
 
 // ---------------------------------------------------------------------------
@@ -1794,12 +1658,12 @@ int wxWindowOS2::GetCharWidth() const
     return(vFontMetrics.lAveCharWidth);
 } // end of wxWindowOS2::GetCharWidth
 
-void wxWindowOS2::GetTextExtent( const wxString& rString,
-                                 int* pX,
-                                 int* pY,
-                                 int* pDescent,
-                                 int* pExternalLeading,
-                                 const wxFont* WXUNUSED(pTheFont) ) const
+void wxWindowOS2::DoGetTextExtent( const wxString& rString,
+                                   int* pX,
+                                   int* pY,
+                                   int* pDescent,
+                                   int* pExternalLeading,
+                                   const wxFont* WXUNUSED(pTheFont) ) const
 {
     POINTL      avPoint[TXTBOX_COUNT];
     POINTL      vPtMin;
@@ -1808,25 +1672,22 @@ void wxWindowOS2::GetTextExtent( const wxString& rString,
     int         l;
     FONTMETRICS vFM; // metrics structure
     BOOL        bRc = FALSE;
-    char*       pStr;
     HPS         hPS;
 
     hPS = ::WinGetPS(GetHwnd());
 
-    l = rString.Length();
+    l = rString.length();
     if (l > 0L)
     {
-        pStr = (PCH)rString.c_str();
-
         //
         // In world coordinates.
         //
-        bRc = ::GpiQueryTextBox( hPS
-                                ,l
-                                ,pStr
-                                ,TXTBOX_COUNT // return maximum information
-                                ,avPoint      // array of coordinates points
-                               );
+        bRc = ::GpiQueryTextBox( hPS,
+                                 l,
+                                 (char*) rString.wx_str(),
+                                 TXTBOX_COUNT,// return maximum information
+                                 avPoint      // array of coordinates points
+                                );
         if (bRc)
         {
             vPtMin.x = avPoint[0].x;
@@ -1886,7 +1747,7 @@ void wxWindowOS2::GetTextExtent( const wxString& rString,
             *pExternalLeading = 0;
     }
     ::WinReleasePS(hPS);
-} // end of wxWindow::GetTextExtent
+} // end of wxWindow::DoGetTextExtent
 
 bool wxWindowOS2::IsMouseInWindow() const
 {
@@ -1914,9 +1775,7 @@ bool wxWindowOS2::IsMouseInWindow() const
 // ---------------------------------------------------------------------------
 //
 #if wxUSE_MENUS_NATIVE
-bool wxWindowOS2::DoPopupMenu( wxMenu* pMenu,
-                               int nX,
-                               int nY )
+bool wxWindowOS2::DoPopupMenu( wxMenu* pMenu, int nX, int nY )
 {
     HWND hWndOwner = GetHwnd();
     HWND hWndParent = GetHwnd();
@@ -1924,11 +1783,6 @@ bool wxWindowOS2::DoPopupMenu( wxMenu* pMenu,
     bool bIsWaiting = true;
     int nHeight;
 
-    // Protect against recursion
-    if (wxCurrentPopupMenu)
-        return false;
-
-    pMenu->SetInvokingWindow(this);
     pMenu->UpdateUI();
 
     if ( nX == -1 && nY == -1 )
@@ -1944,7 +1798,6 @@ bool wxWindowOS2::DoPopupMenu( wxMenu* pMenu,
         DoGetSize(0,&nHeight);
         nY = nHeight - nY;
     }
-    wxCurrentPopupMenu = pMenu;
 
     ::WinPopupMenu( hWndParent
                    ,hWndOwner
@@ -1965,8 +1818,6 @@ bool wxWindowOS2::DoPopupMenu( wxMenu* pMenu,
         ::WinDispatchMsg(vHabmain, (PQMSG)&vMsg);
     }
 
-    wxCurrentPopupMenu = NULL;
-    pMenu->SetInvokingWindow(NULL);
     return true;
 } // end of wxWindowOS2::DoPopupMenu
 #endif // wxUSE_MENUS_NATIVE
@@ -2098,9 +1949,13 @@ bool wxWindowOS2::OS2ProcessMessage( WXMSG* pMsg )
                         }
                         else
                         {
-                            wxButton*   pBtn = wxDynamicCast( GetDefaultItem()
-                                                             ,wxButton
-                                                            );
+                            wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow);
+                            wxButton*   pBtn = NULL;
+
+                            if (tlw)
+                            {
+                                pBtn = wxDynamicCast(tlw->GetDefaultItem(), wxButton);
+                            }
 
                             if (pBtn && pBtn->IsEnabled())
                             {
@@ -2137,7 +1992,7 @@ bool wxWindowOS2::OS2ProcessMessage( WXMSG* pMsg )
                 vEvent.SetWindowChange(bWindowChange);
                 vEvent.SetEventObject(this);
 
-                if (GetEventHandler()->ProcessEvent(vEvent))
+                if (HandleWindowEvent(vEvent))
                 {
                     wxButton*       pBtn = wxDynamicCast(FindFocus(), wxButton);
 
@@ -2469,9 +2324,6 @@ MRESULT wxWindowOS2::OS2WindowProc( WXUINT uMsg,
         case WM_BUTTON3MOTIONEND:
         case WM_BUTTON3MOTIONSTART:
             {
-                if (uMsg == WM_BUTTON1DOWN && AcceptsFocus())
-                    SetFocus();
-
                 short               nX = LOWORD(wParam);
                 short               nY = HIWORD(wParam);
 
@@ -2494,7 +2346,7 @@ MRESULT wxWindowOS2::OS2WindowProc( WXUINT uMsg,
                                                                   );
                     if (!pWin->IsOfStandardClass())
                     {
-                        if (uMsg == WM_BUTTON1DOWN && pWin->AcceptsFocus() )
+                        if (uMsg == WM_BUTTON1DOWN && pWin->CanAcceptFocus() )
                             pWin->SetFocus();
                     }
                     bProcessed = pWin->HandleMouseEvent( uMsg
@@ -2691,7 +2543,7 @@ MRESULT wxWindowOS2::OS2WindowProc( WXUINT uMsg,
                             (pPage->ulPageIdNew > 0L && pPage->ulPageIdCur > 0L))
                         {
                             wxWindowOS2*        pWin = wxFindWinFromHandle(pPage->hwndBook);
-                            wxNotebookEvent     vEvent( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
+                            wxBookCtrlEvent     vEvent( wxEVT_NOTEBOOK_PAGE_CHANGED
                                                        ,(int)SHORT1FROMMP(wParam)
                                                        ,(int)pPage->ulPageIdNew
                                                        ,(int)pPage->ulPageIdCur
@@ -2717,6 +2569,7 @@ MRESULT wxWindowOS2::OS2WindowProc( WXUINT uMsg,
                     }
                     break;
 
+                case CBN_LBSELECT:
                 case BN_CLICKED: // Dups as LN_SELECT and CBN_LBSELECT
                     {
                         HWND                hWnd = ::WinWindowFromID((HWND)GetHwnd(), SHORT1FROMMP(wParam));
@@ -2773,11 +2626,19 @@ MRESULT wxWindowOS2::OS2WindowProc( WXUINT uMsg,
                                                   ,(WXWORD)SHORT1FROMMP(wParam)
                                                  );
                         }
+                        if (pWin->IsKindOf(CLASSINFO(wxChoice)))
+                        {
+                            wxChoice*           pChoice = wxDynamicCast(pWin, wxChoice);
+
+                            pChoice->OS2Command( (WXUINT)SHORT2FROMMP(wParam)
+                                                ,(WXWORD)SHORT1FROMMP(wParam)
+                                               );
+                        }
                         return 0;
                     }
                     // break;
 
-                case LN_ENTER:   /* dups as CBN_EFCHANGE */
+                case LN_ENTER:
                     {
                         HWND                hWnd = HWNDFROMMP(lParam);
                         wxWindowOS2*        pWin = wxFindWinFromHandle(hWnd);
@@ -2981,16 +2842,16 @@ void wxAssociateWinWithHandle(
     wxCHECK_RET( hWnd != (HWND)NULL,
                  wxT("attempt to add a NULL hWnd to window list ignored") );
 
-
     wxWindow*                       pOldWin = wxFindWinFromHandle((WXHWND) hWnd);
 
     if (pOldWin && (pOldWin != pWin))
     {
-        wxString                    str(pWin->GetClassInfo()->GetClassName());
-
-        wxLogError( _T("Bug! Found existing HWND %X for new window of class %s")
-                   ,(int)hWnd
-                   ,str.c_str()
+        wxString  Newstr(pWin->GetClassInfo()->GetClassName());
+        wxString Oldstr(pOldWin->GetClassInfo()->GetClassName());
+        wxLogError( wxT("Bug! New window of class %s has same HWND %X as old window of class %s"),
+                    Newstr.c_str(),
+                    (int)hWnd,
+                    Oldstr.c_str()
                   );
     }
     else if (!pOldWin)
@@ -3071,6 +2932,7 @@ bool wxWindowOS2::OS2Create( PSZ            zClass,
     long                 lControlId = 0L;
     wxWindowCreationHook vHook(this);
     wxString             sClassName((wxChar*)zClass);
+    wxString             sTitle(zTitle ? zTitle : wxEmptyString);
 
     OS2GetCreateWindowCoords( rPos
                              ,rSize
@@ -3098,8 +2960,8 @@ bool wxWindowOS2::OS2Create( PSZ            zClass,
         sClassName += wxT("NR");
     }
     m_hWnd = (WXHWND)::WinCreateWindow( (HWND)OS2GetParent()
-                                       ,(PSZ)sClassName.c_str()
-                                       ,(PSZ)(zTitle ? zTitle : wxEmptyString)
+                                       ,sClassName.c_str()
+                                       ,sTitle.c_str()
                                        ,(ULONG)dwStyle
                                        ,(LONG)0L
                                        ,(LONG)0L
@@ -3120,7 +2982,7 @@ bool wxWindowOS2::OS2Create( PSZ            zClass,
     SubclassWin(m_hWnd);
     SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
 
-    m_backgroundColour.Set(wxString(wxT("GREY")));
+    SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE));
 
     LONG lColor = (LONG)m_backgroundColour.GetPixel();
 
@@ -3132,7 +2994,7 @@ bool wxWindowOS2::OS2Create( PSZ            zClass,
     {
         vError = ::WinGetLastError(vHabmain);
         sError = wxPMErrorToStr(vError);
-        wxLogError(_T("Error creating frame. Error: %s\n"), sError.c_str());
+        wxLogError(wxT("Error creating frame. Error: %s\n"), sError.c_str());
         return false;
     }
     SetSize( nX
@@ -3141,7 +3003,7 @@ bool wxWindowOS2::OS2Create( PSZ            zClass,
             ,nHeight
            );
     return true;
-} // end of WinGuiBase_Window::OS2Create
+} // end of wxWindowOS2::OS2Create
 
 // ===========================================================================
 // OS2 PM message handlers
@@ -3156,7 +3018,7 @@ bool wxWindowOS2::HandleCreate( WXLPCREATESTRUCT WXUNUSED(vCs),
 {
     wxWindowCreateEvent             vEvent((wxWindow*)this);
 
-    (void)GetEventHandler()->ProcessEvent(vEvent);
+    (void)HandleWindowEvent(vEvent);
     *pbMayCreate = true;
     return true;
 } // end of wxWindowOS2::HandleCreate
@@ -3165,17 +3027,13 @@ bool wxWindowOS2::HandleDestroy()
 {
     wxWindowDestroyEvent            vEvent((wxWindow*)this);
     vEvent.SetId(GetId());
-    (void)GetEventHandler()->ProcessEvent(vEvent);
+    (void)HandleWindowEvent(vEvent);
 
     //
     // Delete our drop target if we've got one
     //
 #if wxUSE_DRAG_AND_DROP
-    if (m_dropTarget != NULL)
-    {
-        delete m_dropTarget;
-        m_dropTarget = NULL;
-    }
+    wxDELETE(m_dropTarget);
 #endif // wxUSE_DRAG_AND_DROP
 
     //
@@ -3204,7 +3062,7 @@ bool wxWindowOS2::HandleActivate(
                                            ,m_windowId
                                           );
     vEvent.SetEventObject(this);
-    return GetEventHandler()->ProcessEvent(vEvent);
+    return HandleWindowEvent(vEvent);
 } // end of wxWindowOS2::HandleActivate
 
 bool wxWindowOS2::HandleSetFocus( WXHWND WXUNUSED(hWnd) )
@@ -3214,7 +3072,7 @@ bool wxWindowOS2::HandleSetFocus( WXHWND WXUNUSED(hWnd) )
     // purposes that we got it
     //
     wxChildFocusEvent               vEventFocus((wxWindow *)this);
-    (void)GetEventHandler()->ProcessEvent(vEventFocus);
+    (void)HandleWindowEvent(vEventFocus);
 
 #if wxUSE_CARET
     //
@@ -3238,7 +3096,7 @@ bool wxWindowOS2::HandleSetFocus( WXHWND WXUNUSED(hWnd) )
     wxFocusEvent                    vEvent(wxEVT_SET_FOCUS, m_windowId);
 
     vEvent.SetEventObject(this);
-    return GetEventHandler()->ProcessEvent(vEvent);
+    return HandleWindowEvent(vEvent);
 } // end of wxWindowOS2::HandleSetFocus
 
 bool wxWindowOS2::HandleKillFocus( WXHWND hWnd )
@@ -3285,7 +3143,7 @@ bool wxWindowOS2::HandleKillFocus( WXHWND hWnd )
     // wxFindWinFromHandle() may return NULL, it is ok
     //
     vEvent.SetWindow(wxFindWinFromHandle(hWnd));
-    return GetEventHandler()->ProcessEvent(vEvent);
+    return HandleWindowEvent(vEvent);
 } // end of wxWindowOS2::HandleKillFocus
 
 // ---------------------------------------------------------------------------
@@ -3300,7 +3158,7 @@ bool wxWindowOS2::HandleShow(
     wxShowEvent                     vEvent(GetId(), bShow);
 
     vEvent.SetEventObject(this);
-    return GetEventHandler()->ProcessEvent(vEvent);
+    return HandleWindowEvent(vEvent);
 } // end of wxWindowOS2::HandleShow
 
 bool wxWindowOS2::HandleInitDialog( WXHWND WXUNUSED(hWndFocus) )
@@ -3308,7 +3166,7 @@ bool wxWindowOS2::HandleInitDialog( WXHWND WXUNUSED(hWndFocus) )
     wxInitDialogEvent               vEvent(GetId());
 
     vEvent.SetEventObject(this);
-    return GetEventHandler()->ProcessEvent(vEvent);
+    return HandleWindowEvent(vEvent);
 } // end of wxWindowOS2::HandleInitDialog
 
 bool wxWindowOS2::HandleEndDrag(WXWPARAM WXUNUSED(wParam))
@@ -3335,7 +3193,7 @@ bool wxWindowOS2::OS2OnDrawItem( int vId,
                                  WXDRAWITEMSTRUCT* pItemStruct )
 {
 #if wxUSE_OWNER_DRAWN
-    wxDC                            vDc;
+    wxClientDC                      vDc(this);
 
 #if wxUSE_MENUS_NATIVE
     //
@@ -3354,8 +3212,10 @@ bool wxWindowOS2::OS2OnDrawItem( int vId,
                                           ,pMeasureStruct->rclItem.xRight - pMeasureStruct->rclItem.xLeft
                                           ,pMeasureStruct->rclItem.yTop - pMeasureStruct->rclItem.yBottom
                                          );
-        vDc.SetHDC( hDC, false );
-        vDc.SetHPS( pMeasureStruct->hps );
+
+        wxPMDCImpl *impl = (wxPMDCImpl*) vDc.GetImpl();
+        impl->SetHDC( hDC, false );
+        impl->SetHPS( pMeasureStruct->hps );
         //
         // Load the wxWidgets Pallete and set to RGB mode
         //
@@ -3369,7 +3229,7 @@ bool wxWindowOS2::OS2OnDrawItem( int vId,
         {
             vError = ::WinGetLastError(vHabmain);
             sError = wxPMErrorToStr(vError);
-            wxLogError(_T("Unable to set current color table. Error: %s\n"), sError.c_str());
+            wxLogError(wxT("Unable to set current color table (1). Error: %s\n"), sError.c_str());
         }
         //
         // Set the color table to RGB mode
@@ -3384,7 +3244,7 @@ bool wxWindowOS2::OS2OnDrawItem( int vId,
         {
             vError = ::WinGetLastError(vHabmain);
             sError = wxPMErrorToStr(vError);
-            wxLogError(_T("Unable to set current color table. Error: %s\n"), sError.c_str());
+            wxLogError(wxT("Unable to set current color table (2). Error: %s\n"), sError.c_str());
         }
 
         wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
@@ -3545,7 +3405,7 @@ bool wxWindowOS2::HandleSysColorChange()
     wxSysColourChangedEvent         vEvent;
 
     vEvent.SetEventObject(this);
-    return GetEventHandler()->ProcessEvent(vEvent);
+    return HandleWindowEvent(vEvent);
 } // end of wxWindowOS2::HandleSysColorChange
 
 bool wxWindowOS2::HandleCtlColor( WXHBRUSH* WXUNUSED(phBrush) )
@@ -3578,7 +3438,7 @@ bool wxWindowOS2::HandlePaletteChanged()
     vEvent.SetEventObject(this);
     vEvent.SetChangedWindow(wxFindWinFromHandle(hWndPalChange));
 
-    return GetEventHandler()->ProcessEvent(vEvent);
+    return HandleWindowEvent(vEvent);
 } // end of wxWindowOS2::HandlePaletteChanged
 
 //
@@ -3602,7 +3462,7 @@ void wxWindowOS2::OnSysColourChanged(
             wxSysColourChangedEvent vEvent;
 
             rEvent.SetEventObject(pWin);
-            pWin->GetEventHandler()->ProcessEvent(vEvent);
+            pWin->HandleWindowEvent(vEvent);
         }
         node = node->GetNext();
     }
@@ -3616,7 +3476,7 @@ void wxWindow::OnPaint (
   wxPaintEvent&                     rEvent
 )
 {
-    HDC                             hDC = (HDC)wxPaintDC::FindDCInCache((wxWindow*) rEvent.GetEventObject());
+    HDC                             hDC = (HDC)wxPaintDCImpl::FindDCInCache((wxWindow*) rEvent.GetEventObject());
 
     if (hDC != 0)
     {
@@ -3644,15 +3504,10 @@ bool wxWindowOS2::HandlePaint()
          wxLogLastError(wxT("CreateRectRgn"));
          return false;
     }
-
     // Get all the rectangles from the region, convert the individual
     // rectangles to "the other" coordinate system and reassemble a
     // region from the rectangles, to be feed into m_updateRegion.
     //
-    // FIXME: This is a bad hack since OS/2 API specifies that rectangles
-    //        passed into GpiSetRegion must not have Bottom > Top,
-    //        however, at first sight, it _seems_ to work nonetheless.
-    //
     RGNRECT                     vRgnData;
     PRECTL                      pUpdateRects = NULL;
     vRgnData.ulDirection = RECTDIR_LFRT_TOPBOT;
@@ -3682,18 +3537,17 @@ bool wxWindowOS2::HandlePaint()
             {
                 int                 rectHeight;
                 rectHeight = pUpdateRects[i].yTop - pUpdateRects[i].yBottom;
-                pUpdateRects[i].yTop = height - pUpdateRects[i].yTop;
-                pUpdateRects[i].yBottom = pUpdateRects[i].yTop + rectHeight;
+                pUpdateRects[i].yBottom = height - pUpdateRects[i].yTop;
+                pUpdateRects[i].yTop = pUpdateRects[i].yBottom + rectHeight;
             }
             ::GpiSetRegion(hPS, hRgn, vRgnData.crc, pUpdateRects);
             delete [] pUpdateRects;
         }
     }
-
     m_updateRegion = wxRegion(hRgn, hPS);
 
     vEvent.SetEventObject(this);
-    bProcessed = GetEventHandler()->ProcessEvent(vEvent);
+    bProcessed = HandleWindowEvent(vEvent);
 
     if (!bProcessed &&
          IsKindOf(CLASSINFO(wxPanel)) &&
@@ -3807,31 +3661,28 @@ bool wxWindowOS2::HandleEraseBkgnd( WXHDC hDC )
     if (vSwp.fl & SWP_MINIMIZE)
         return true;
 
-    wxDC vDC;
-
-    vDC.m_hPS = (HPS)hDC; // this is really a PS
-    vDC.SetWindow((wxWindow*)this);
-    vDC.BeginDrawing();
+    wxClientDC vDC(this);
+    wxPMDCImpl *impl = (wxPMDCImpl*) vDC.GetImpl();
+    impl->SetHDC(hDC);
+    impl->SetHPS((HPS)hDC); // this is really a PS
 
     wxEraseEvent vEvent(m_windowId, &vDC);
 
     vEvent.SetEventObject(this);
 
-    rc = GetEventHandler()->ProcessEvent(vEvent);
+    rc = HandleWindowEvent(vEvent);
 
-    vDC.EndDrawing();
-    vDC.m_hPS = NULLHANDLE;
+    impl->SetHPS(NULLHANDLE);
     return true;
 } // end of wxWindowOS2::HandleEraseBkgnd
 
-void wxWindowOS2::OnEraseBackground(
-  wxEraseEvent&                     rEvent
-)
+void wxWindowOS2::OnEraseBackground(wxEraseEvent& rEvent)
 {
-    RECTL                           vRect;
-    HPS                             hPS = rEvent.m_dc->m_hPS;
-    APIRET                          rc;
-    LONG                            lColor = m_backgroundColour.GetPixel();
+    RECTL   vRect;
+    wxPMDCImpl *impl = (wxPMDCImpl*) rEvent.GetDC()->GetImpl();
+    HPS     hPS = impl->GetHPS();
+    APIRET  rc;
+    LONG    lColor = m_backgroundColour.GetPixel();
 
     rc = ::WinQueryWindowRect(GetHwnd(), &vRect);
     rc = ::WinFillRect(hPS, &vRect, lColor);
@@ -3846,7 +3697,7 @@ bool wxWindowOS2::HandleMinimize()
     wxIconizeEvent                  vEvent(m_windowId);
 
     vEvent.SetEventObject(this);
-    return GetEventHandler()->ProcessEvent(vEvent);
+    return HandleWindowEvent(vEvent);
 } // end of wxWindowOS2::HandleMinimize
 
 bool wxWindowOS2::HandleMaximize()
@@ -3854,7 +3705,7 @@ bool wxWindowOS2::HandleMaximize()
     wxMaximizeEvent                 vEvent(m_windowId);
 
     vEvent.SetEventObject(this);
-    return GetEventHandler()->ProcessEvent(vEvent);
+    return HandleWindowEvent(vEvent);
 } // end of wxWindowOS2::HandleMaximize
 
 bool wxWindowOS2::HandleMove( int nX, int nY )
@@ -3863,7 +3714,7 @@ bool wxWindowOS2::HandleMove( int nX, int nY )
     wxMoveEvent vEvent(pt, m_windowId);
 
     vEvent.SetEventObject(this);
-    return GetEventHandler()->ProcessEvent(vEvent);
+    return HandleWindowEvent(vEvent);
 }  // end of wxWindowOS2::HandleMove
 
 bool wxWindowOS2::HandleSize( int    nWidth,
@@ -3874,7 +3725,7 @@ bool wxWindowOS2::HandleSize( int    nWidth,
     wxSizeEvent vEvent(sz, m_windowId);
 
     vEvent.SetEventObject(this);
-    return GetEventHandler()->ProcessEvent(vEvent);
+    return HandleWindowEvent(vEvent);
 } // end of wxWindowOS2::HandleSize
 
 bool wxWindowOS2::HandleGetMinMaxInfo( PSWP pSwp )
@@ -3884,25 +3735,15 @@ bool wxWindowOS2::HandleGetMinMaxInfo( PSWP pSwp )
     switch(pSwp->fl)
     {
         case SWP_MAXIMIZE:
-#if !(defined(__WATCOMC__) && __WATCOMC__ < 1240 )
-// Open Watcom 1.3 had incomplete headers
-// that's reported and should be fixed for OW 1.4
             ::WinGetMaxPosition(GetHwnd(), pSwp);
             m_maxWidth = pSwp->cx;
             m_maxHeight = pSwp->cy;
-#endif
             break;
 
         case SWP_MINIMIZE:
-#if !(defined(__WATCOMC__) && __WATCOMC__ < 1240 )
-// Open Watcom 1.3 had incomplete headers
-// that's reported and should be fixed for OW 1.4
             ::WinGetMinPosition(GetHwnd(), pSwp, &vPoint);
             m_minWidth = pSwp->cx;
             m_minHeight = pSwp->cy;
-#else
-            wxUnusedVar(vPoint);
-#endif
             break;
 
         default:
@@ -3961,7 +3802,7 @@ bool wxWindowOS2::HandleSysCommand( WXWPARAM wParam,
 // ---------------------------------------------------------------------------
 // mouse events
 // ---------------------------------------------------------------------------
-//TODO!!! check against MSW
+//TODO: check against MSW
 void wxWindowOS2::InitMouseEvent(
   wxMouseEvent&                     rEvent
 , int                               nX
@@ -3977,12 +3818,9 @@ void wxWindowOS2::InitMouseEvent(
     rEvent.m_shiftDown   = ((uFlags & KC_SHIFT) != 0);
     rEvent.m_controlDown = ((uFlags & KC_CTRL) != 0);
     rEvent.m_altDown     = ((uFlags & KC_ALT) != 0);
-    rEvent.m_leftDown    = (::WinGetKeyState(HWND_DESKTOP, VK_BUTTON1) &
-                           0x8000) != 0;
-    rEvent.m_middleDown  = (::WinGetKeyState(HWND_DESKTOP, VK_BUTTON3) &
-                           0x8000) != 0;
-    rEvent.m_rightDown   = (::WinGetKeyState(HWND_DESKTOP, VK_BUTTON2) &
-                           0x8000) != 0;
+    rEvent.m_leftDown    = IsKeyDown(VK_BUTTON1);
+    rEvent.m_middleDown  = IsKeyDown(VK_BUTTON3);
+    rEvent.m_rightDown   = IsKeyDown(VK_BUTTON2);
     rEvent.SetTimestamp(s_currentMsg.time);
     rEvent.SetEventObject(this);
     rEvent.SetId(GetId());
@@ -4032,7 +3870,7 @@ bool wxWindowOS2::HandleMouseEvent( WXUINT uMsg,
                        ,uFlags
                        );
 
-        bProcessed = GetEventHandler()->ProcessEvent(vEvent);
+        bProcessed = HandleWindowEvent(vEvent);
         if (!bProcessed)
         {
             HPOINTER hCursor = (HPOINTER)GetCursor().GetHCURSOR();
@@ -4066,7 +3904,7 @@ bool wxWindowOS2::HandleMouseMove( int nX,
                        ,uFlags
                       );
 
-        (void)GetEventHandler()->ProcessEvent(vEvent);
+        (void)HandleWindowEvent(vEvent);
     }
     return HandleMouseEvent( WM_MOUSEMOVE
                             ,nX
@@ -4188,7 +4026,7 @@ bool wxWindowOS2::HandleChar( WXWPARAM WXUNUSED(wParam),
         vEvent.m_controlDown = true;
     }
 
-    return (GetEventHandler()->ProcessEvent(vEvent));
+    return (HandleWindowEvent(vEvent));
 }
 
 bool wxWindowOS2::HandleKeyDown( WXWPARAM wParam,
@@ -4212,7 +4050,7 @@ bool wxWindowOS2::HandleKeyDown( WXWPARAM wParam,
                                           ,(MPARAM)wParam
                                          ));
 
-        if (GetEventHandler()->ProcessEvent(vEvent))
+        if (HandleWindowEvent(vEvent))
         {
             return true;
         }
@@ -4241,7 +4079,7 @@ bool wxWindowOS2::HandleKeyUp( WXWPARAM wParam,
                                          ,(MPARAM)wParam
                                         ));
 
-        if (GetEventHandler()->ProcessEvent(vEvent))
+        if (HandleWindowEvent(vEvent))
             return true;
     }
     return false;
@@ -4307,91 +4145,12 @@ bool wxWindowOS2::OS2OnScroll( int nOrientation,
         default:
             return false;
     }
-    return GetEventHandler()->ProcessEvent(vEvent);
+    return HandleWindowEvent(vEvent);
 } // end of wxWindowOS2::OS2OnScroll
 
-void wxWindowOS2::MoveChildren(
-  int                               nDiff
-)
-{
-    //
-    // We want to handle top levels ourself, manually
-    //
-    if (!IsTopLevel() && GetAutoLayout())
-    {
-        Layout();
-    }
-    else
-    {
-        SWP                         vSwp;
-
-        for (wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
-             node;
-             node = node->GetNext())
-        {
-            wxWindow*               pWin = node->GetData();
-
-            ::WinQueryWindowPos( GetHwndOf(pWin)
-                                ,&vSwp
-                               );
-            // Actually, only move children that already are placed on the
-            // frame, not ones which are still at wxDefaultCoord.
-            if (vSwp.y == wxDefaultCoord)
-                continue;
-            if (pWin->IsKindOf(CLASSINFO(wxControl)))
-            {
-                wxControl*          pCtrl;
-
-                //
-                // Must deal with controls that have margins like ENTRYFIELD.  The SWP
-                // struct of such a control will have and origin offset from its intended
-                // position by the width of the margins.
-                //
-                pCtrl = wxDynamicCast(pWin, wxControl);
-                vSwp.y -= pCtrl->GetYComp();
-                vSwp.x -= pCtrl->GetXComp();
-            }
-            ::WinSetWindowPos( GetHwndOf(pWin)
-                              ,HWND_TOP
-                              ,vSwp.x
-                              ,vSwp.y - nDiff
-                              ,vSwp.cx
-                              ,vSwp.cy
-                              ,SWP_MOVE
-                             );
-            ::WinQueryWindowPos(GetHwndOf(pWin), pWin->GetSwp());
-            if (pWin->IsKindOf(CLASSINFO(wxRadioBox)))
-            {
-                wxRadioBox*     pRadioBox;
-
-                pRadioBox = wxDynamicCast(pWin, wxRadioBox);
-                pRadioBox->AdjustButtons( (int)vSwp.x
-                                         ,(int)vSwp.y - nDiff
-                                         ,(int)vSwp.cx
-                                         ,(int)vSwp.cy
-                                         ,pRadioBox->GetSizeFlags()
-                                        );
-            }
-            if (pWin->IsKindOf(CLASSINFO(wxSlider)))
-            {
-                wxSlider*           pSlider;
-
-                pSlider = wxDynamicCast(pWin, wxSlider);
-                pSlider->AdjustSubControls( (int)vSwp.x
-                                           ,(int)vSwp.y - nDiff
-                                           ,(int)vSwp.cx
-                                           ,(int)vSwp.cy
-                                           ,(int)pSlider->GetSizeFlags()
-                                          );
-            }
-        }
-    }
-    Refresh();
-} // end of wxWindowOS2::MoveChildren
-
 //
 //  Getting the Y position for a window, like a control, is a real
-//  pain.  There are three sitatuions we must deal with in determining
+//  pain.  There are three situations we must deal with in determining
 //  the OS2 to wxWidgets Y coordinate.
 //
 //  1)  The controls are created in a dialog.
@@ -4422,11 +4181,13 @@ void wxWindowOS2::MoveChildren(
 //
 int wxWindowOS2::GetOS2ParentHeight( wxWindowOS2* pParent )
 {
+    if (pParent)
+    {
     //
     // Case 1
     //
-    if (pParent->IsKindOf(CLASSINFO(wxDialog)))
-        return(pParent->GetClientSize().y);
+        if (pParent->IsKindOf(CLASSINFO(wxDialog)))
+            return(pParent->GetClientSize().y);
 
     //
     // Case 2 -- if we are one of the separately built standard Frame
@@ -4434,40 +4195,43 @@ int wxWindowOS2::GetOS2ParentHeight( wxWindowOS2* pParent )
     //           use the frame, itself, for positioning.  Otherwise we are
     //           child window and want to use the Frame's client.
     //
-    else if (pParent->IsKindOf(CLASSINFO(wxFrame)))
-    {
-        if (IsKindOf(CLASSINFO(wxStatusBar)) ||
-            IsKindOf(CLASSINFO(wxMenuBar))   ||
-            IsKindOf(CLASSINFO(wxToolBar))
-           )
+        else if (pParent->IsKindOf(CLASSINFO(wxFrame)))
         {
-            if (IsKindOf(CLASSINFO(wxToolBar)))
+            if (IsKindOf(CLASSINFO(wxStatusBar)) ||
+                IsKindOf(CLASSINFO(wxMenuBar))   ||
+                IsKindOf(CLASSINFO(wxToolBar))
+               )
             {
-                wxFrame*            pFrame = wxDynamicCast(GetParent(), wxFrame);
+                if (IsKindOf(CLASSINFO(wxToolBar)))
+                {
+                    wxFrame*        pFrame = wxDynamicCast(GetParent(), wxFrame);
 
-                if (pFrame->GetToolBar() == this)
-                    return(pParent->GetSize().y);
+                    if (pFrame->GetToolBar() == this)
+                        return(pParent->GetSize().y);
+                    else
+                        return(pParent->GetClientSize().y);
+                }
                 else
-                    return(pParent->GetClientSize().y);
+                    return(pParent->GetSize().y);
             }
             else
-                return(pParent->GetSize().y);
+                return(pParent->GetClientSize().y);
         }
+        //
+        // Case -- this is for any window that is the sole child of a Frame.
+        //         The grandparent must exist and it must be of type CFrame
+        //         and it's height must be different. Otherwise the standard
+        //         applies.
+        //
         else
             return(pParent->GetClientSize().y);
     }
-    //
-    // Case -- this is for any window that is the sole child of a Frame.
-    //         The grandparent must exist and it must be of type CFrame
-    //         and it's height must be different. Otherwise the standard
-    //         applies.
-    //
-    // else
-    // {
-
-    return(pParent->GetClientSize().y);
-
-    // }
+    else // We must be a child of the screen
+    {
+        int nHeight;
+        wxDisplaySize(NULL,&nHeight);
+        return(nHeight);
+    }
 } // end of wxWindowOS2::GetOS2ParentHeight
 
 //
@@ -4541,8 +4305,8 @@ int wxCharCodeOS2ToWX(
         case VK_CTRL:       nId = WXK_CONTROL; break;
         case VK_PAUSE:      nId = WXK_PAUSE; break;
         case VK_SPACE:      nId = WXK_SPACE; break;
-        case VK_PAGEUP:     nId = WXK_PRIOR; break;
-        case VK_PAGEDOWN:   nId = WXK_NEXT; break;
+        case VK_PAGEUP:     nId = WXK_PAGEUP; break;
+        case VK_PAGEDOWN:   nId = WXK_PAGEDOWN; break;
         case VK_ESC:        nId = WXK_ESCAPE; break;
         case VK_END:        nId = WXK_END; break;
         case VK_HOME :      nId = WXK_HOME; break;
@@ -4604,15 +4368,16 @@ int wxCharCodeWXToOS2( int nId,
 {
     int nKeySym = 0;
 
-    *bIsVirtual = true;
+    if ( bIsVirtual )
+        *bIsVirtual = true;
     switch (nId)
     {
         case WXK_CLEAR:     nKeySym = VK_CLEAR; break;
         case WXK_SHIFT:     nKeySym = VK_SHIFT; break;
         case WXK_CONTROL:   nKeySym = VK_CTRL; break;
         case WXK_PAUSE:     nKeySym = VK_PAUSE; break;
-        case WXK_PRIOR:     nKeySym = VK_PAGEUP; break;
-        case WXK_NEXT :     nKeySym = VK_PAGEDOWN; break;
+        case WXK_PAGEUP:    nKeySym = VK_PAGEUP; break;
+        case WXK_PAGEDOWN:  nKeySym = VK_PAGEDOWN; break;
         case WXK_END:       nKeySym = VK_END; break;
         case WXK_HOME :     nKeySym = VK_HOME; break;
         case WXK_LEFT :     nKeySym = VK_LEFT; break;
@@ -4650,7 +4415,8 @@ int wxCharCodeWXToOS2( int nId,
         case WXK_SCROLL:    nKeySym = VK_SCRLLOCK; break;
         default:
         {
-            *bIsVirtual = false;
+            if ( bIsVirtual )
+                *bIsVirtual = false;
             nKeySym = nId;
             break;
         }
@@ -4658,6 +4424,29 @@ int wxCharCodeWXToOS2( int nId,
     return nKeySym;
 } // end of wxCharCodeWXToOS2
 
+
+bool wxGetKeyState(wxKeyCode key)
+{
+    wxASSERT_MSG(key != WXK_LBUTTON && key != WXK_RBUTTON && key !=
+        WXK_MBUTTON, wxT("can't use wxGetKeyState() for mouse buttons"));
+
+    const LONG vk = wxCharCodeWXToOS2(key);
+    // if the requested key is a LED key, return true if the led is pressed
+    if ( key == WXK_NUMLOCK || key == WXK_CAPITAL || key == WXK_SCROLL )
+    {
+        // low order bit means LED is highlighted and high order one means the
+        // key is down; for compatibility with the other ports return true if
+        // either one is set
+        return ::WinGetKeyState(HWND_DESKTOP, vk) != 0;
+
+    }
+    else // normal key
+    {
+        return IsKeyDown(vk);
+    }
+}
+
+
 wxWindow* wxGetActiveWindow()
 {
     HWND                            hWnd = ::WinQueryActiveWindow(HWND_DESKTOP);
@@ -4670,464 +4459,464 @@ wxWindow* wxGetActiveWindow()
 } // end of wxGetActiveWindow
 
 #ifdef __WXDEBUG__
-const char* wxGetMessageName( int nMessage )
+const wxChar* wxGetMessageName( int nMessage )
 {
     switch (nMessage)
     {
-        case 0x0000: return "WM_NULL";
-        case 0x0001: return "WM_CREATE";
-        case 0x0002: return "WM_DESTROY";
-        case 0x0004: return "WM_ENABLE";
-        case 0x0005: return "WM_SHOW";
-        case 0x0006: return "WM_MOVE";
-        case 0x0007: return "WM_SIZE";
-        case 0x0008: return "WM_ADJUSTWINDOWPOS";
-        case 0x0009: return "WM_CALCVALIDRECTS";
-        case 0x000A: return "WM_SETWINDOWPARAMS";
-        case 0x000B: return "WM_QUERYWINDOWPARAMS";
-        case 0x000C: return "WM_HITTEST";
-        case 0x000D: return "WM_ACTIVATE";
-        case 0x000F: return "WM_SETFOCUS";
-        case 0x0010: return "WM_SETSELECTION";
-        case 0x0011: return "WM_PPAINT";
-        case 0x0012: return "WM_PSETFOCUS";
-        case 0x0013: return "WM_PSYSCOLORCHANGE";
-        case 0x0014: return "WM_PSIZE";
-        case 0x0015: return "WM_PACTIVATE";
-        case 0x0016: return "WM_PCONTROL";
-        case 0x0020: return "WM_COMMAND";
-        case 0x0021: return "WM_SYSCOMMAND";
-        case 0x0022: return "WM_HELP";
-        case 0x0023: return "WM_PAINT";
-        case 0x0024: return "WM_TIMER";
-        case 0x0025: return "WM_SEM1";
-        case 0x0026: return "WM_SEM2";
-        case 0x0027: return "WM_SEM3";
-        case 0x0028: return "WM_SEM4";
-        case 0x0029: return "WM_CLOSE";
-        case 0x002A: return "WM_QUIT";
-        case 0x002B: return "WM_SYSCOLORCHANGE";
-        case 0x002D: return "WM_SYSVALUECHANGE";
-        case 0x002E: return "WM_APPTERMINATENOTIFY";
-        case 0x002F: return "WM_PRESPARAMCHANGED";
+        case 0x0000: return wxT("WM_NULL");
+        case 0x0001: return wxT("WM_CREATE");
+        case 0x0002: return wxT("WM_DESTROY");
+        case 0x0004: return wxT("WM_ENABLE");
+        case 0x0005: return wxT("WM_SHOW");
+        case 0x0006: return wxT("WM_MOVE");
+        case 0x0007: return wxT("WM_SIZE");
+        case 0x0008: return wxT("WM_ADJUSTWINDOWPOS");
+        case 0x0009: return wxT("WM_CALCVALIDRECTS");
+        case 0x000A: return wxT("WM_SETWINDOWPARAMS");
+        case 0x000B: return wxT("WM_QUERYWINDOWPARAMS");
+        case 0x000C: return wxT("WM_HITTEST");
+        case 0x000D: return wxT("WM_ACTIVATE");
+        case 0x000F: return wxT("WM_SETFOCUS");
+        case 0x0010: return wxT("WM_SETSELECTION");
+        case 0x0011: return wxT("WM_PPAINT");
+        case 0x0012: return wxT("WM_PSETFOCUS");
+        case 0x0013: return wxT("WM_PSYSCOLORCHANGE");
+        case 0x0014: return wxT("WM_PSIZE");
+        case 0x0015: return wxT("WM_PACTIVATE");
+        case 0x0016: return wxT("WM_PCONTROL");
+        case 0x0020: return wxT("WM_COMMAND");
+        case 0x0021: return wxT("WM_SYSCOMMAND");
+        case 0x0022: return wxT("WM_HELP");
+        case 0x0023: return wxT("WM_PAINT");
+        case 0x0024: return wxT("WM_TIMER");
+        case 0x0025: return wxT("WM_SEM1");
+        case 0x0026: return wxT("WM_SEM2");
+        case 0x0027: return wxT("WM_SEM3");
+        case 0x0028: return wxT("WM_SEM4");
+        case 0x0029: return wxT("WM_CLOSE");
+        case 0x002A: return wxT("WM_QUIT");
+        case 0x002B: return wxT("WM_SYSCOLORCHANGE");
+        case 0x002D: return wxT("WM_SYSVALUECHANGE");
+        case 0x002E: return wxT("WM_APPTERMINATENOTIFY");
+        case 0x002F: return wxT("WM_PRESPARAMCHANGED");
         // Control notification messages
-        case 0x0030: return "WM_CONTROL";
-        case 0x0031: return "WM_VSCROLL";
-        case 0x0032: return "WM_HSCROLL";
-        case 0x0033: return "WM_INITMENU";
-        case 0x0034: return "WM_MENUSELECT";
-        case 0x0035: return "WM_MENUSEND";
-        case 0x0036: return "WM_DRAWITEM";
-        case 0x0037: return "WM_MEASUREITEM";
-        case 0x0038: return "WM_CONTROLPOINTER";
-        case 0x003A: return "WM_QUERYDLGCODE";
-        case 0x003B: return "WM_INITDLG";
-        case 0x003C: return "WM_SUBSTITUTESTRING";
-        case 0x003D: return "WM_MATCHMNEMONIC";
-        case 0x003E: return "WM_SAVEAPPLICATION";
-        case 0x0129: return "WM_CTLCOLORCHANGE";
-        case 0x0130: return "WM_QUERYCTLTYPE";
+        case 0x0030: return wxT("WM_CONTROL");
+        case 0x0031: return wxT("WM_VSCROLL");
+        case 0x0032: return wxT("WM_HSCROLL");
+        case 0x0033: return wxT("WM_INITMENU");
+        case 0x0034: return wxT("WM_MENUSELECT");
+        case 0x0035: return wxT("WM_MENUSEND");
+        case 0x0036: return wxT("WM_DRAWITEM");
+        case 0x0037: return wxT("WM_MEASUREITEM");
+        case 0x0038: return wxT("WM_CONTROLPOINTER");
+        case 0x003A: return wxT("WM_QUERYDLGCODE");
+        case 0x003B: return wxT("WM_INITDLG");
+        case 0x003C: return wxT("WM_SUBSTITUTESTRING");
+        case 0x003D: return wxT("WM_MATCHMNEMONIC");
+        case 0x003E: return wxT("WM_SAVEAPPLICATION");
+        case 0x0129: return wxT("WM_CTLCOLORCHANGE");
+        case 0x0130: return wxT("WM_QUERYCTLTYPE");
         // Frame messages
-        case 0x0040: return "WM_FLASHWINDOW";
-        case 0x0041: return "WM_FORMATFRAME";
-        case 0x0042: return "WM_UPDATEFRAME";
-        case 0x0043: return "WM_FOCUSCHANGE";
-        case 0x0044: return "WM_SETBORDERSIZE";
-        case 0x0045: return "WM_TRACKFRAME";
-        case 0x0046: return "WM_MINMAXFRAME";
-        case 0x0047: return "WM_SETICON";
-        case 0x0048: return "WM_QUERYICON";
-        case 0x0049: return "WM_SETACCELTABLE";
-        case 0x004A: return "WM_QUERYACCELTABLE";
-        case 0x004B: return "WM_TRANSLATEACCEL";
-        case 0x004C: return "WM_QUERYTRACKINFO";
-        case 0x004D: return "WM_QUERYBORDERSIZE";
-        case 0x004E: return "WM_NEXTMENU";
-        case 0x004F: return "WM_ERASEBACKGROUND";
-        case 0x0050: return "WM_QUERYFRAMEINFO";
-        case 0x0051: return "WM_QUERYFOCUSCHAIN";
-        case 0x0052: return "WM_OWNERPOSCHANGE";
-        case 0x0053: return "WM_CACLFRAMERECT";
-        case 0x0055: return "WM_WINDOWPOSCHANGED";
-        case 0x0056: return "WM_ADJUSTFRAMEPOS";
-        case 0x0059: return "WM_QUERYFRAMECTLCOUNT";
-        case 0x005B: return "WM_QUERYHELPINFO";
-        case 0x005C: return "WM_SETHELPINFO";
-        case 0x005D: return "WM_ERROR";
-        case 0x005E: return "WM_REALIZEPALETTE";
+        case 0x0040: return wxT("WM_FLASHWINDOW");
+        case 0x0041: return wxT("WM_FORMATFRAME");
+        case 0x0042: return wxT("WM_UPDATEFRAME");
+        case 0x0043: return wxT("WM_FOCUSCHANGE");
+        case 0x0044: return wxT("WM_SETBORDERSIZE");
+        case 0x0045: return wxT("WM_TRACKFRAME");
+        case 0x0046: return wxT("WM_MINMAXFRAME");
+        case 0x0047: return wxT("WM_SETICON");
+        case 0x0048: return wxT("WM_QUERYICON");
+        case 0x0049: return wxT("WM_SETACCELTABLE");
+        case 0x004A: return wxT("WM_QUERYACCELTABLE");
+        case 0x004B: return wxT("WM_TRANSLATEACCEL");
+        case 0x004C: return wxT("WM_QUERYTRACKINFO");
+        case 0x004D: return wxT("WM_QUERYBORDERSIZE");
+        case 0x004E: return wxT("WM_NEXTMENU");
+        case 0x004F: return wxT("WM_ERASEBACKGROUND");
+        case 0x0050: return wxT("WM_QUERYFRAMEINFO");
+        case 0x0051: return wxT("WM_QUERYFOCUSCHAIN");
+        case 0x0052: return wxT("WM_OWNERPOSCHANGE");
+        case 0x0053: return wxT("WM_CACLFRAMERECT");
+        case 0x0055: return wxT("WM_WINDOWPOSCHANGED");
+        case 0x0056: return wxT("WM_ADJUSTFRAMEPOS");
+        case 0x0059: return wxT("WM_QUERYFRAMECTLCOUNT");
+        case 0x005B: return wxT("WM_QUERYHELPINFO");
+        case 0x005C: return wxT("WM_SETHELPINFO");
+        case 0x005D: return wxT("WM_ERROR");
+        case 0x005E: return wxT("WM_REALIZEPALETTE");
         // Clipboard messages
-        case 0x0060: return "WM_RENDERFMT";
-        case 0x0061: return "WM_RENDERALLFMTS";
-        case 0x0062: return "WM_DESTROYCLIPBOARD";
-        case 0x0063: return "WM_PAINTCLIPBOARD";
-        case 0x0064: return "WM_SIZECLIPBOARD";
-        case 0x0065: return "WM_HSCROLLCLIPBOARD";
-        case 0x0066: return "WM_VSCROLLCLIPBOARD";
-        case 0x0067: return "WM_DRAWCLIPBOARD";
+        case 0x0060: return wxT("WM_RENDERFMT");
+        case 0x0061: return wxT("WM_RENDERALLFMTS");
+        case 0x0062: return wxT("WM_DESTROYCLIPBOARD");
+        case 0x0063: return wxT("WM_PAINTCLIPBOARD");
+        case 0x0064: return wxT("WM_SIZECLIPBOARD");
+        case 0x0065: return wxT("WM_HSCROLLCLIPBOARD");
+        case 0x0066: return wxT("WM_VSCROLLCLIPBOARD");
+        case 0x0067: return wxT("WM_DRAWCLIPBOARD");
         // mouse messages
-        case 0x0070: return "WM_MOUSEMOVE";
-        case 0x0071: return "WM_BUTTON1DOWN";
-        case 0x0072: return "WM_BUTTON1UP";
-        case 0x0073: return "WM_BUTTON1DBLCLK";
-        case 0x0074: return "WM_BUTTON2DOWN";
-        case 0x0075: return "WM_BUTTON2UP";
-        case 0x0076: return "WM_BUTTON2DBLCLK";
-        case 0x0077: return "WM_BUTTON3DOWN";
-        case 0x0078: return "WM_BUTTON3UP";
-        case 0x0079: return "WM_BUTTON3DBLCLK";
-        case 0x007D: return "WM_MOUSEMAP";
-        case 0x007E: return "WM_VRNDISABLED";
-        case 0x007F: return "WM_VRNENABLED";
-        case 0x0410: return "WM_CHORD";
-        case 0x0411: return "WM_BUTTON1MOTIONSTART";
-        case 0x0412: return "WM_BUTTON1MOTIONEND";
-        case 0x0413: return "WM_BUTTON1CLICK";
-        case 0x0414: return "WM_BUTTON2MOTIONSTART";
-        case 0x0415: return "WM_BUTTON2MOTIONEND";
-        case 0x0416: return "WM_BUTTON2CLICK";
-        case 0x0417: return "WM_BUTTON3MOTIONSTART";
-        case 0x0418: return "WM_BUTTON3MOTIONEND";
-        case 0x0419: return "WM_BUTTON3CLICK";
-        case 0x0420: return "WM_BEGINDRAG";
-        case 0x0421: return "WM_ENDDRAG";
-        case 0x0422: return "WM_SINGLESELECT";
-        case 0x0423: return "WM_OPEN";
-        case 0x0424: return "WM_CONTEXTMENU";
-        case 0x0425: return "WM_CONTEXTHELP";
-        case 0x0426: return "WM_TEXTEDIT";
-        case 0x0427: return "WM_BEGINSELECT";
-        case 0x0228: return "WM_ENDSELECT";
-        case 0x0429: return "WM_PICKUP";
-        case 0x04C0: return "WM_PENFIRST";
-        case 0x04FF: return "WM_PENLAST";
-        case 0x0500: return "WM_MMPMFIRST";
-        case 0x05FF: return "WM_MMPMLAST";
-        case 0x0600: return "WM_STDDLGFIRST";
-        case 0x06FF: return "WM_STDDLGLAST";
-        case 0x0BD0: return "WM_BIDI_FIRST";
-        case 0x0BFF: return "WM_BIDI_LAST";
+        case 0x0070: return wxT("WM_MOUSEMOVE");
+        case 0x0071: return wxT("WM_BUTTON1DOWN");
+        case 0x0072: return wxT("WM_BUTTON1UP");
+        case 0x0073: return wxT("WM_BUTTON1DBLCLK");
+        case 0x0074: return wxT("WM_BUTTON2DOWN");
+        case 0x0075: return wxT("WM_BUTTON2UP");
+        case 0x0076: return wxT("WM_BUTTON2DBLCLK");
+        case 0x0077: return wxT("WM_BUTTON3DOWN");
+        case 0x0078: return wxT("WM_BUTTON3UP");
+        case 0x0079: return wxT("WM_BUTTON3DBLCLK");
+        case 0x007D: return wxT("WM_MOUSEMAP");
+        case 0x007E: return wxT("WM_VRNDISABLED");
+        case 0x007F: return wxT("WM_VRNENABLED");
+        case 0x0410: return wxT("WM_CHORD");
+        case 0x0411: return wxT("WM_BUTTON1MOTIONSTART");
+        case 0x0412: return wxT("WM_BUTTON1MOTIONEND");
+        case 0x0413: return wxT("WM_BUTTON1CLICK");
+        case 0x0414: return wxT("WM_BUTTON2MOTIONSTART");
+        case 0x0415: return wxT("WM_BUTTON2MOTIONEND");
+        case 0x0416: return wxT("WM_BUTTON2CLICK");
+        case 0x0417: return wxT("WM_BUTTON3MOTIONSTART");
+        case 0x0418: return wxT("WM_BUTTON3MOTIONEND");
+        case 0x0419: return wxT("WM_BUTTON3CLICK");
+        case 0x0420: return wxT("WM_BEGINDRAG");
+        case 0x0421: return wxT("WM_ENDDRAG");
+        case 0x0422: return wxT("WM_SINGLESELECT");
+        case 0x0423: return wxT("WM_OPEN");
+        case 0x0424: return wxT("WM_CONTEXTMENU");
+        case 0x0425: return wxT("WM_CONTEXTHELP");
+        case 0x0426: return wxT("WM_TEXTEDIT");
+        case 0x0427: return wxT("WM_BEGINSELECT");
+        case 0x0228: return wxT("WM_ENDSELECT");
+        case 0x0429: return wxT("WM_PICKUP");
+        case 0x04C0: return wxT("WM_PENFIRST");
+        case 0x04FF: return wxT("WM_PENLAST");
+        case 0x0500: return wxT("WM_MMPMFIRST");
+        case 0x05FF: return wxT("WM_MMPMLAST");
+        case 0x0600: return wxT("WM_STDDLGFIRST");
+        case 0x06FF: return wxT("WM_STDDLGLAST");
+        case 0x0BD0: return wxT("WM_BIDI_FIRST");
+        case 0x0BFF: return wxT("WM_BIDI_LAST");
         // keyboard input
-        case 0x007A: return "WM_CHAR";
-        case 0x007B: return "WM_VIOCHAR";
+        case 0x007A: return wxT("WM_CHAR");
+        case 0x007B: return wxT("WM_VIOCHAR");
         // DDE messages
-        case 0x00A0: return "WM_DDE_INITIATE";
-        case 0x00A1: return "WM_DDE_REQUEST";
-        case 0x00A2: return "WM_DDE_ACK";
-        case 0x00A3: return "WM_DDE_DATA";
-        case 0x00A4: return "WM_DDE_ADVISE";
-        case 0x00A5: return "WM_DDE_UNADVISE";
-        case 0x00A6: return "WM_DDE_POKE";
-        case 0x00A7: return "WM_DDE_EXECUTE";
-        case 0x00A8: return "WM_DDE_TERMINATE";
-        case 0x00A9: return "WM_DDE_INITIATEACK";
-        case 0x00AF: return "WM_DDE_LAST";
+        case 0x00A0: return wxT("WM_DDE_INITIATE");
+        case 0x00A1: return wxT("WM_DDE_REQUEST");
+        case 0x00A2: return wxT("WM_DDE_ACK");
+        case 0x00A3: return wxT("WM_DDE_DATA");
+        case 0x00A4: return wxT("WM_DDE_ADVISE");
+        case 0x00A5: return wxT("WM_DDE_UNADVISE");
+        case 0x00A6: return wxT("WM_DDE_POKE");
+        case 0x00A7: return wxT("WM_DDE_EXECUTE");
+        case 0x00A8: return wxT("WM_DDE_TERMINATE");
+        case 0x00A9: return wxT("WM_DDE_INITIATEACK");
+        case 0x00AF: return wxT("WM_DDE_LAST");
         // Buttons
-        case 0x0120: return "BM_CLICK";
-        case 0x0121: return "BM_QUERYCHECKINDEX";
-        case 0x0122: return "BM_QUERYHILITE";
-        case 0x0123: return "BM_SETHILITE";
-        case 0x0124: return "BM_QUERYCHECK";
-        case 0x0125: return "BM_SETCHECK";
-        case 0x0126: return "BM_SETDEFAULT";
-        case 0x0128: return "BM_AUTOSIZE";
+        case 0x0120: return wxT("BM_CLICK");
+        case 0x0121: return wxT("BM_QUERYCHECKINDEX");
+        case 0x0122: return wxT("BM_QUERYHILITE");
+        case 0x0123: return wxT("BM_SETHILITE");
+        case 0x0124: return wxT("BM_QUERYCHECK");
+        case 0x0125: return wxT("BM_SETCHECK");
+        case 0x0126: return wxT("BM_SETDEFAULT");
+        case 0x0128: return wxT("BM_AUTOSIZE");
         // Combo boxes
-        case 0x029A: return "CBID_LIST";
-        case 0x029B: return "CBID_EDIT";
-        case 0x0170: return "CBM_SHOWLIST";
-        case 0x0171: return "CBM_HILITE";
-        case 0x0172: return "CBM_ISLISTSHOWING";
+        case 0x029A: return wxT("CBID_LIST");
+        case 0x029B: return wxT("CBID_EDIT");
+        case 0x0170: return wxT("CBM_SHOWLIST");
+        case 0x0171: return wxT("CBM_HILITE");
+        case 0x0172: return wxT("CBM_ISLISTSHOWING");
         // Edit fields
-        case 0x0140: return "EM_QUERYCHANGED";
-        case 0x0141: return "EM_QUERYSEL";
-        case 0x0142: return "EM_SETSEL";
-        case 0x0143: return "EM_SETTEXTLIMIT";
-        case 0x0144: return "EM_CUT";
-        case 0x0145: return "EM_COPY";
-        case 0x0146: return "EM_CLEAR";
-        case 0x0147: return "EM_PASTE";
-        case 0x0148: return "EM_QUERYFIRSTCHAR";
-        case 0x0149: return "EM_SETFIRSTCHAR";
-        case 0x014A: return "EM_QUERYREADONLY";
-        case 0x014B: return "EM_SETREADONLY";
-        case 0x014C: return "EM_SETINSERTMODE";
+        case 0x0140: return wxT("EM_QUERYCHANGED");
+        case 0x0141: return wxT("EM_QUERYSEL");
+        case 0x0142: return wxT("EM_SETSEL");
+        case 0x0143: return wxT("EM_SETTEXTLIMIT");
+        case 0x0144: return wxT("EM_CUT");
+        case 0x0145: return wxT("EM_COPY");
+        case 0x0146: return wxT("EM_CLEAR");
+        case 0x0147: return wxT("EM_PASTE");
+        case 0x0148: return wxT("EM_QUERYFIRSTCHAR");
+        case 0x0149: return wxT("EM_SETFIRSTCHAR");
+        case 0x014A: return wxT("EM_QUERYREADONLY");
+        case 0x014B: return wxT("EM_SETREADONLY");
+        case 0x014C: return wxT("EM_SETINSERTMODE");
         // Listboxes
-        case 0x0160: return "LM_QUERYITEMCOUNT";
-        case 0x0161: return "LM_INSERTITEM";
-        case 0x0162: return "LM_SETOPENINDEX";
-        case 0x0163: return "LM_DELETEITEM";
-        case 0x0164: return "LM_SELECTITEM";
-        case 0x0165: return "LM_QUERYSELECTION";
-        case 0x0166: return "LM_SETITEMTEXT";
-        case 0x0167: return "LM_QUERYITEMTEXTLENGTH";
-        case 0x0168: return "LM_QUERYITEMTEXT";
-        case 0x0169: return "LM_SETITEMHANDLE";
-        case 0x016A: return "LM_QUERYITEMHANDLE";
-        case 0x016B: return "LM_SEARCHSTRING";
-        case 0x016C: return "LM_SETITEMHEIGHT";
-        case 0x016D: return "LM_QUERYTOPINDEX";
-        case 0x016E: return "LM_DELETEALL";
-        case 0x016F: return "LM_INSERTMULITEMS";
-        case 0x0660: return "LM_SETITEMWIDTH";
+        case 0x0160: return wxT("LM_QUERYITEMCOUNT");
+        case 0x0161: return wxT("LM_INSERTITEM");
+        case 0x0162: return wxT("LM_SETOPENINDEX");
+        case 0x0163: return wxT("LM_DELETEITEM");
+        case 0x0164: return wxT("LM_SELECTITEM");
+        case 0x0165: return wxT("LM_QUERYSELECTION");
+        case 0x0166: return wxT("LM_SETITEMTEXT");
+        case 0x0167: return wxT("LM_QUERYITEMTEXTLENGTH");
+        case 0x0168: return wxT("LM_QUERYITEMTEXT");
+        case 0x0169: return wxT("LM_SETITEMHANDLE");
+        case 0x016A: return wxT("LM_QUERYITEMHANDLE");
+        case 0x016B: return wxT("LM_SEARCHSTRING");
+        case 0x016C: return wxT("LM_SETITEMHEIGHT");
+        case 0x016D: return wxT("LM_QUERYTOPINDEX");
+        case 0x016E: return wxT("LM_DELETEALL");
+        case 0x016F: return wxT("LM_INSERTMULITEMS");
+        case 0x0660: return wxT("LM_SETITEMWIDTH");
         // Menus
-        case 0x0180: return "MM_INSERTITEM";
-        case 0x0181: return "MM_DELETEITEM";
-        case 0x0182: return "MM_QUERYITEM";
-        case 0x0183: return "MM_SETITEM";
-        case 0x0184: return "MM_QUERYITEMCOUNT";
-        case 0x0185: return "MM_STARTMENUMODE";
-        case 0x0186: return "MM_ENDMENUMODE";
-        case 0x0188: return "MM_REMOVEITEM";
-        case 0x0189: return "MM_SELECTITEM";
-        case 0x018A: return "MM_QUERYSELITEMID";
-        case 0x018B: return "MM_QUERYITEMTEXT";
-        case 0x018C: return "MM_QUERYITEMTEXTLENGTH";
-        case 0x018D: return "MM_SETITEMHANDLE";
-        case 0x018E: return "MM_SETITEMTEXT";
-        case 0x018F: return "MM_ITEMPOSITIONFROMID";
-        case 0x0190: return "MM_ITEMIDFROMPOSITION";
-        case 0x0191: return "MM_QUERYITEMATTR";
-        case 0x0192: return "MM_SETITEMATTR";
-        case 0x0193: return "MM_ISITEMVALID";
-        case 0x0194: return "MM_QUERYITEMRECT";
-        case 0x0431: return "MM_QUERYDEFAULTITEMID";
-        case 0x0432: return "MM_SETDEFAULTITEMID";
+        case 0x0180: return wxT("MM_INSERTITEM");
+        case 0x0181: return wxT("MM_DELETEITEM");
+        case 0x0182: return wxT("MM_QUERYITEM");
+        case 0x0183: return wxT("MM_SETITEM");
+        case 0x0184: return wxT("MM_QUERYITEMCOUNT");
+        case 0x0185: return wxT("MM_STARTMENUMODE");
+        case 0x0186: return wxT("MM_ENDMENUMODE");
+        case 0x0188: return wxT("MM_REMOVEITEM");
+        case 0x0189: return wxT("MM_SELECTITEM");
+        case 0x018A: return wxT("MM_QUERYSELITEMID");
+        case 0x018B: return wxT("MM_QUERYITEMTEXT");
+        case 0x018C: return wxT("MM_QUERYITEMTEXTLENGTH");
+        case 0x018D: return wxT("MM_SETITEMHANDLE");
+        case 0x018E: return wxT("MM_SETITEMTEXT");
+        case 0x018F: return wxT("MM_ITEMPOSITIONFROMID");
+        case 0x0190: return wxT("MM_ITEMIDFROMPOSITION");
+        case 0x0191: return wxT("MM_QUERYITEMATTR");
+        case 0x0192: return wxT("MM_SETITEMATTR");
+        case 0x0193: return wxT("MM_ISITEMVALID");
+        case 0x0194: return wxT("MM_QUERYITEMRECT");
+        case 0x0431: return wxT("MM_QUERYDEFAULTITEMID");
+        case 0x0432: return wxT("MM_SETDEFAULTITEMID");
         // Scrollbars
-        case 0x01A0: return "SBM_SETSCROLLBAR";
-        case 0x01A1: return "SBM_SETPOS";
-        case 0x01A2: return "SBM_QUERYPOS";
-        case 0x01A3: return "SBM_QUERYRANGE";
-        case 0x01A6: return "SBM_SETTHUMBSIZE";
+        case 0x01A0: return wxT("SBM_SETSCROLLBAR");
+        case 0x01A1: return wxT("SBM_SETPOS");
+        case 0x01A2: return wxT("SBM_QUERYPOS");
+        case 0x01A3: return wxT("SBM_QUERYRANGE");
+        case 0x01A6: return wxT("SBM_SETTHUMBSIZE");
 
         // Help messages
-        case 0x0F00: return "WM_HELPBASE";
-        case 0x0FFF: return "WM_HELPTOP";
+        case 0x0F00: return wxT("WM_HELPBASE");
+        case 0x0FFF: return wxT("WM_HELPTOP");
         // Beginning of user defined messages
-        case 0x1000: return "WM_USER";
+        case 0x1000: return wxT("WM_USER");
 
         // wxWidgets user defined types
 
         // listview
-        // case 0x1000 + 0: return "LVM_GETBKCOLOR";
-        case 0x1000 + 1: return "LVM_SETBKCOLOR";
-        case 0x1000 + 2: return "LVM_GETIMAGELIST";
-        case 0x1000 + 3: return "LVM_SETIMAGELIST";
-        case 0x1000 + 4: return "LVM_GETITEMCOUNT";
-        case 0x1000 + 5: return "LVM_GETITEMA";
-        case 0x1000 + 75: return "LVM_GETITEMW";
-        case 0x1000 + 6: return "LVM_SETITEMA";
-        case 0x1000 + 76: return "LVM_SETITEMW";
-        case 0x1000 + 7: return "LVM_INSERTITEMA";
-        case 0x1000 + 77: return "LVM_INSERTITEMW";
-        case 0x1000 + 8: return "LVM_DELETEITEM";
-        case 0x1000 + 9: return "LVM_DELETEALLITEMS";
-        case 0x1000 + 10: return "LVM_GETCALLBACKMASK";
-        case 0x1000 + 11: return "LVM_SETCALLBACKMASK";
-        case 0x1000 + 12: return "LVM_GETNEXTITEM";
-        case 0x1000 + 13: return "LVM_FINDITEMA";
-        case 0x1000 + 83: return "LVM_FINDITEMW";
-        case 0x1000 + 14: return "LVM_GETITEMRECT";
-        case 0x1000 + 15: return "LVM_SETITEMPOSITION";
-        case 0x1000 + 16: return "LVM_GETITEMPOSITION";
-        case 0x1000 + 17: return "LVM_GETSTRINGWIDTHA";
-        case 0x1000 + 87: return "LVM_GETSTRINGWIDTHW";
-        case 0x1000 + 18: return "LVM_HITTEST";
-        case 0x1000 + 19: return "LVM_ENSUREVISIBLE";
-        case 0x1000 + 20: return "LVM_SCROLL";
-        case 0x1000 + 21: return "LVM_REDRAWITEMS";
-        case 0x1000 + 22: return "LVM_ARRANGE";
-        case 0x1000 + 23: return "LVM_EDITLABELA";
-        case 0x1000 + 118: return "LVM_EDITLABELW";
-        case 0x1000 + 24: return "LVM_GETEDITCONTROL";
-        case 0x1000 + 25: return "LVM_GETCOLUMNA";
-        case 0x1000 + 95: return "LVM_GETCOLUMNW";
-        case 0x1000 + 26: return "LVM_SETCOLUMNA";
-        case 0x1000 + 96: return "LVM_SETCOLUMNW";
-        case 0x1000 + 27: return "LVM_INSERTCOLUMNA";
-        case 0x1000 + 97: return "LVM_INSERTCOLUMNW";
-        case 0x1000 + 28: return "LVM_DELETECOLUMN";
-        case 0x1000 + 29: return "LVM_GETCOLUMNWIDTH";
-        case 0x1000 + 30: return "LVM_SETCOLUMNWIDTH";
-        case 0x1000 + 31: return "LVM_GETHEADER";
-        case 0x1000 + 33: return "LVM_CREATEDRAGIMAGE";
-        case 0x1000 + 34: return "LVM_GETVIEWRECT";
-        case 0x1000 + 35: return "LVM_GETTEXTCOLOR";
-        case 0x1000 + 36: return "LVM_SETTEXTCOLOR";
-        case 0x1000 + 37: return "LVM_GETTEXTBKCOLOR";
-        case 0x1000 + 38: return "LVM_SETTEXTBKCOLOR";
-        case 0x1000 + 39: return "LVM_GETTOPINDEX";
-        case 0x1000 + 40: return "LVM_GETCOUNTPERPAGE";
-        case 0x1000 + 41: return "LVM_GETORIGIN";
-        case 0x1000 + 42: return "LVM_UPDATE";
-        case 0x1000 + 43: return "LVM_SETITEMSTATE";
-        case 0x1000 + 44: return "LVM_GETITEMSTATE";
-        case 0x1000 + 45: return "LVM_GETITEMTEXTA";
-        case 0x1000 + 115: return "LVM_GETITEMTEXTW";
-        case 0x1000 + 46: return "LVM_SETITEMTEXTA";
-        case 0x1000 + 116: return "LVM_SETITEMTEXTW";
-        case 0x1000 + 47: return "LVM_SETITEMCOUNT";
-        case 0x1000 + 48: return "LVM_SORTITEMS";
-        case 0x1000 + 49: return "LVM_SETITEMPOSITION32";
-        case 0x1000 + 50: return "LVM_GETSELECTEDCOUNT";
-        case 0x1000 + 51: return "LVM_GETITEMSPACING";
-        case 0x1000 + 52: return "LVM_GETISEARCHSTRINGA";
-        case 0x1000 + 117: return "LVM_GETISEARCHSTRINGW";
-        case 0x1000 + 53: return "LVM_SETICONSPACING";
-        case 0x1000 + 54: return "LVM_SETEXTENDEDLISTVIEWSTYLE";
-        case 0x1000 + 55: return "LVM_GETEXTENDEDLISTVIEWSTYLE";
-        case 0x1000 + 56: return "LVM_GETSUBITEMRECT";
-        case 0x1000 + 57: return "LVM_SUBITEMHITTEST";
-        case 0x1000 + 58: return "LVM_SETCOLUMNORDERARRAY";
-        case 0x1000 + 59: return "LVM_GETCOLUMNORDERARRAY";
-        case 0x1000 + 60: return "LVM_SETHOTITEM";
-        case 0x1000 + 61: return "LVM_GETHOTITEM";
-        case 0x1000 + 62: return "LVM_SETHOTCURSOR";
-        case 0x1000 + 63: return "LVM_GETHOTCURSOR";
-        case 0x1000 + 64: return "LVM_APPROXIMATEVIEWRECT";
-        case 0x1000 + 65: return "LVM_SETWORKAREA";
+        // case 0x1000 + 0: return wxT("LVM_GETBKCOLOR");
+        case 0x1000 + 1: return wxT("LVM_SETBKCOLOR");
+        case 0x1000 + 2: return wxT("LVM_GETIMAGELIST");
+        case 0x1000 + 3: return wxT("LVM_SETIMAGELIST");
+        case 0x1000 + 4: return wxT("LVM_GETITEMCOUNT");
+        case 0x1000 + 5: return wxT("LVM_GETITEMA");
+        case 0x1000 + 75: return wxT("LVM_GETITEMW");
+        case 0x1000 + 6: return wxT("LVM_SETITEMA");
+        case 0x1000 + 76: return wxT("LVM_SETITEMW");
+        case 0x1000 + 7: return wxT("LVM_INSERTITEMA");
+        case 0x1000 + 77: return wxT("LVM_INSERTITEMW");
+        case 0x1000 + 8: return wxT("LVM_DELETEITEM");
+        case 0x1000 + 9: return wxT("LVM_DELETEALLITEMS");
+        case 0x1000 + 10: return wxT("LVM_GETCALLBACKMASK");
+        case 0x1000 + 11: return wxT("LVM_SETCALLBACKMASK");
+        case 0x1000 + 12: return wxT("LVM_GETNEXTITEM");
+        case 0x1000 + 13: return wxT("LVM_FINDITEMA");
+        case 0x1000 + 83: return wxT("LVM_FINDITEMW");
+        case 0x1000 + 14: return wxT("LVM_GETITEMRECT");
+        case 0x1000 + 15: return wxT("LVM_SETITEMPOSITION");
+        case 0x1000 + 16: return wxT("LVM_GETITEMPOSITION");
+        case 0x1000 + 17: return wxT("LVM_GETSTRINGWIDTHA");
+        case 0x1000 + 87: return wxT("LVM_GETSTRINGWIDTHW");
+        case 0x1000 + 18: return wxT("LVM_HITTEST");
+        case 0x1000 + 19: return wxT("LVM_ENSUREVISIBLE");
+        case 0x1000 + 20: return wxT("LVM_SCROLL");
+        case 0x1000 + 21: return wxT("LVM_REDRAWITEMS");
+        case 0x1000 + 22: return wxT("LVM_ARRANGE");
+        case 0x1000 + 23: return wxT("LVM_EDITLABELA");
+        case 0x1000 + 118: return wxT("LVM_EDITLABELW");
+        case 0x1000 + 24: return wxT("LVM_GETEDITCONTROL");
+        case 0x1000 + 25: return wxT("LVM_GETCOLUMNA");
+        case 0x1000 + 95: return wxT("LVM_GETCOLUMNW");
+        case 0x1000 + 26: return wxT("LVM_SETCOLUMNA");
+        case 0x1000 + 96: return wxT("LVM_SETCOLUMNW");
+        case 0x1000 + 27: return wxT("LVM_INSERTCOLUMNA");
+        case 0x1000 + 97: return wxT("LVM_INSERTCOLUMNW");
+        case 0x1000 + 28: return wxT("LVM_DELETECOLUMN");
+        case 0x1000 + 29: return wxT("LVM_GETCOLUMNWIDTH");
+        case 0x1000 + 30: return wxT("LVM_SETCOLUMNWIDTH");
+        case 0x1000 + 31: return wxT("LVM_GETHEADER");
+        case 0x1000 + 33: return wxT("LVM_CREATEDRAGIMAGE");
+        case 0x1000 + 34: return wxT("LVM_GETVIEWRECT");
+        case 0x1000 + 35: return wxT("LVM_GETTEXTCOLOR");
+        case 0x1000 + 36: return wxT("LVM_SETTEXTCOLOR");
+        case 0x1000 + 37: return wxT("LVM_GETTEXTBKCOLOR");
+        case 0x1000 + 38: return wxT("LVM_SETTEXTBKCOLOR");
+        case 0x1000 + 39: return wxT("LVM_GETTOPINDEX");
+        case 0x1000 + 40: return wxT("LVM_GETCOUNTPERPAGE");
+        case 0x1000 + 41: return wxT("LVM_GETORIGIN");
+        case 0x1000 + 42: return wxT("LVM_UPDATE");
+        case 0x1000 + 43: return wxT("LVM_SETITEMSTATE");
+        case 0x1000 + 44: return wxT("LVM_GETITEMSTATE");
+        case 0x1000 + 45: return wxT("LVM_GETITEMTEXTA");
+        case 0x1000 + 115: return wxT("LVM_GETITEMTEXTW");
+        case 0x1000 + 46: return wxT("LVM_SETITEMTEXTA");
+        case 0x1000 + 116: return wxT("LVM_SETITEMTEXTW");
+        case 0x1000 + 47: return wxT("LVM_SETITEMCOUNT");
+        case 0x1000 + 48: return wxT("LVM_SORTITEMS");
+        case 0x1000 + 49: return wxT("LVM_SETITEMPOSITION32");
+        case 0x1000 + 50: return wxT("LVM_GETSELECTEDCOUNT");
+        case 0x1000 + 51: return wxT("LVM_GETITEMSPACING");
+        case 0x1000 + 52: return wxT("LVM_GETISEARCHSTRINGA");
+        case 0x1000 + 117: return wxT("LVM_GETISEARCHSTRINGW");
+        case 0x1000 + 53: return wxT("LVM_SETICONSPACING");
+        case 0x1000 + 54: return wxT("LVM_SETEXTENDEDLISTVIEWSTYLE");
+        case 0x1000 + 55: return wxT("LVM_GETEXTENDEDLISTVIEWSTYLE");
+        case 0x1000 + 56: return wxT("LVM_GETSUBITEMRECT");
+        case 0x1000 + 57: return wxT("LVM_SUBITEMHITTEST");
+        case 0x1000 + 58: return wxT("LVM_SETCOLUMNORDERARRAY");
+        case 0x1000 + 59: return wxT("LVM_GETCOLUMNORDERARRAY");
+        case 0x1000 + 60: return wxT("LVM_SETHOTITEM");
+        case 0x1000 + 61: return wxT("LVM_GETHOTITEM");
+        case 0x1000 + 62: return wxT("LVM_SETHOTCURSOR");
+        case 0x1000 + 63: return wxT("LVM_GETHOTCURSOR");
+        case 0x1000 + 64: return wxT("LVM_APPROXIMATEVIEWRECT");
+        case 0x1000 + 65: return wxT("LVM_SETWORKAREA");
 
         // tree view
-        case 0x1100 + 0: return "TVM_INSERTITEMA";
-        case 0x1100 + 50: return "TVM_INSERTITEMW";
-        case 0x1100 + 1: return "TVM_DELETEITEM";
-        case 0x1100 + 2: return "TVM_EXPAND";
-        case 0x1100 + 4: return "TVM_GETITEMRECT";
-        case 0x1100 + 5: return "TVM_GETCOUNT";
-        case 0x1100 + 6: return "TVM_GETINDENT";
-        case 0x1100 + 7: return "TVM_SETINDENT";
-        case 0x1100 + 8: return "TVM_GETIMAGELIST";
-        case 0x1100 + 9: return "TVM_SETIMAGELIST";
-        case 0x1100 + 10: return "TVM_GETNEXTITEM";
-        case 0x1100 + 11: return "TVM_SELECTITEM";
-        case 0x1100 + 12: return "TVM_GETITEMA";
-        case 0x1100 + 62: return "TVM_GETITEMW";
-        case 0x1100 + 13: return "TVM_SETITEMA";
-        case 0x1100 + 63: return "TVM_SETITEMW";
-        case 0x1100 + 14: return "TVM_EDITLABELA";
-        case 0x1100 + 65: return "TVM_EDITLABELW";
-        case 0x1100 + 15: return "TVM_GETEDITCONTROL";
-        case 0x1100 + 16: return "TVM_GETVISIBLECOUNT";
-        case 0x1100 + 17: return "TVM_HITTEST";
-        case 0x1100 + 18: return "TVM_CREATEDRAGIMAGE";
-        case 0x1100 + 19: return "TVM_SORTCHILDREN";
-        case 0x1100 + 20: return "TVM_ENSUREVISIBLE";
-        case 0x1100 + 21: return "TVM_SORTCHILDRENCB";
-        case 0x1100 + 22: return "TVM_ENDEDITLABELNOW";
-        case 0x1100 + 23: return "TVM_GETISEARCHSTRINGA";
-        case 0x1100 + 64: return "TVM_GETISEARCHSTRINGW";
-        case 0x1100 + 24: return "TVM_SETTOOLTIPS";
-        case 0x1100 + 25: return "TVM_GETTOOLTIPS";
+        case 0x1100 + 0: return wxT("TVM_INSERTITEMA");
+        case 0x1100 + 50: return wxT("TVM_INSERTITEMW");
+        case 0x1100 + 1: return wxT("TVM_DELETEITEM");
+        case 0x1100 + 2: return wxT("TVM_EXPAND");
+        case 0x1100 + 4: return wxT("TVM_GETITEMRECT");
+        case 0x1100 + 5: return wxT("TVM_GETCOUNT");
+        case 0x1100 + 6: return wxT("TVM_GETINDENT");
+        case 0x1100 + 7: return wxT("TVM_SETINDENT");
+        case 0x1100 + 8: return wxT("TVM_GETIMAGELIST");
+        case 0x1100 + 9: return wxT("TVM_SETIMAGELIST");
+        case 0x1100 + 10: return wxT("TVM_GETNEXTITEM");
+        case 0x1100 + 11: return wxT("TVM_SELECTITEM");
+        case 0x1100 + 12: return wxT("TVM_GETITEMA");
+        case 0x1100 + 62: return wxT("TVM_GETITEMW");
+        case 0x1100 + 13: return wxT("TVM_SETITEMA");
+        case 0x1100 + 63: return wxT("TVM_SETITEMW");
+        case 0x1100 + 14: return wxT("TVM_EDITLABELA");
+        case 0x1100 + 65: return wxT("TVM_EDITLABELW");
+        case 0x1100 + 15: return wxT("TVM_GETEDITCONTROL");
+        case 0x1100 + 16: return wxT("TVM_GETVISIBLECOUNT");
+        case 0x1100 + 17: return wxT("TVM_HITTEST");
+        case 0x1100 + 18: return wxT("TVM_CREATEDRAGIMAGE");
+        case 0x1100 + 19: return wxT("TVM_SORTCHILDREN");
+        case 0x1100 + 20: return wxT("TVM_ENSUREVISIBLE");
+        case 0x1100 + 21: return wxT("TVM_SORTCHILDRENCB");
+        case 0x1100 + 22: return wxT("TVM_ENDEDITLABELNOW");
+        case 0x1100 + 23: return wxT("TVM_GETISEARCHSTRINGA");
+        case 0x1100 + 64: return wxT("TVM_GETISEARCHSTRINGW");
+        case 0x1100 + 24: return wxT("TVM_SETTOOLTIPS");
+        case 0x1100 + 25: return wxT("TVM_GETTOOLTIPS");
 
         // header
-        case 0x1200 + 0: return "HDM_GETITEMCOUNT";
-        case 0x1200 + 1: return "HDM_INSERTITEMA";
-        case 0x1200 + 10: return "HDM_INSERTITEMW";
-        case 0x1200 + 2: return "HDM_DELETEITEM";
-        case 0x1200 + 3: return "HDM_GETITEMA";
-        case 0x1200 + 11: return "HDM_GETITEMW";
-        case 0x1200 + 4: return "HDM_SETITEMA";
-        case 0x1200 + 12: return "HDM_SETITEMW";
-        case 0x1200 + 5: return "HDM_LAYOUT";
-        case 0x1200 + 6: return "HDM_HITTEST";
-        case 0x1200 + 7: return "HDM_GETITEMRECT";
-        case 0x1200 + 8: return "HDM_SETIMAGELIST";
-        case 0x1200 + 9: return "HDM_GETIMAGELIST";
-        case 0x1200 + 15: return "HDM_ORDERTOINDEX";
-        case 0x1200 + 16: return "HDM_CREATEDRAGIMAGE";
-        case 0x1200 + 17: return "HDM_GETORDERARRAY";
-        case 0x1200 + 18: return "HDM_SETORDERARRAY";
-        case 0x1200 + 19: return "HDM_SETHOTDIVIDER";
+        case 0x1200 + 0: return wxT("HDM_GETITEMCOUNT");
+        case 0x1200 + 1: return wxT("HDM_INSERTITEMA");
+        case 0x1200 + 10: return wxT("HDM_INSERTITEMW");
+        case 0x1200 + 2: return wxT("HDM_DELETEITEM");
+        case 0x1200 + 3: return wxT("HDM_GETITEMA");
+        case 0x1200 + 11: return wxT("HDM_GETITEMW");
+        case 0x1200 + 4: return wxT("HDM_SETITEMA");
+        case 0x1200 + 12: return wxT("HDM_SETITEMW");
+        case 0x1200 + 5: return wxT("HDM_LAYOUT");
+        case 0x1200 + 6: return wxT("HDM_HITTEST");
+        case 0x1200 + 7: return wxT("HDM_GETITEMRECT");
+        case 0x1200 + 8: return wxT("HDM_SETIMAGELIST");
+        case 0x1200 + 9: return wxT("HDM_GETIMAGELIST");
+        case 0x1200 + 15: return wxT("HDM_ORDERTOINDEX");
+        case 0x1200 + 16: return wxT("HDM_CREATEDRAGIMAGE");
+        case 0x1200 + 17: return wxT("HDM_GETORDERARRAY");
+        case 0x1200 + 18: return wxT("HDM_SETORDERARRAY");
+        case 0x1200 + 19: return wxT("HDM_SETHOTDIVIDER");
 
         // tab control
-        case 0x1300 + 2: return "TCM_GETIMAGELIST";
-        case 0x1300 + 3: return "TCM_SETIMAGELIST";
-        case 0x1300 + 4: return "TCM_GETITEMCOUNT";
-        case 0x1300 + 5: return "TCM_GETITEMA";
-        case 0x1300 + 60: return "TCM_GETITEMW";
-        case 0x1300 + 6: return "TCM_SETITEMA";
-        case 0x1300 + 61: return "TCM_SETITEMW";
-        case 0x1300 + 7: return "TCM_INSERTITEMA";
-        case 0x1300 + 62: return "TCM_INSERTITEMW";
-        case 0x1300 + 8: return "TCM_DELETEITEM";
-        case 0x1300 + 9: return "TCM_DELETEALLITEMS";
-        case 0x1300 + 10: return "TCM_GETITEMRECT";
-        case 0x1300 + 11: return "TCM_GETCURSEL";
-        case 0x1300 + 12: return "TCM_SETCURSEL";
-        case 0x1300 + 13: return "TCM_HITTEST";
-        case 0x1300 + 14: return "TCM_SETITEMEXTRA";
-        case 0x1300 + 40: return "TCM_ADJUSTRECT";
-        case 0x1300 + 41: return "TCM_SETITEMSIZE";
-        case 0x1300 + 42: return "TCM_REMOVEIMAGE";
-        case 0x1300 + 43: return "TCM_SETPADDING";
-        case 0x1300 + 44: return "TCM_GETROWCOUNT";
-        case 0x1300 + 45: return "TCM_GETTOOLTIPS";
-        case 0x1300 + 46: return "TCM_SETTOOLTIPS";
-        case 0x1300 + 47: return "TCM_GETCURFOCUS";
-        case 0x1300 + 48: return "TCM_SETCURFOCUS";
-        case 0x1300 + 49: return "TCM_SETMINTABWIDTH";
-        case 0x1300 + 50: return "TCM_DESELECTALL";
+        case 0x1300 + 2: return wxT("TCM_GETIMAGELIST");
+        case 0x1300 + 3: return wxT("TCM_SETIMAGELIST");
+        case 0x1300 + 4: return wxT("TCM_GETITEMCOUNT");
+        case 0x1300 + 5: return wxT("TCM_GETITEMA");
+        case 0x1300 + 60: return wxT("TCM_GETITEMW");
+        case 0x1300 + 6: return wxT("TCM_SETITEMA");
+        case 0x1300 + 61: return wxT("TCM_SETITEMW");
+        case 0x1300 + 7: return wxT("TCM_INSERTITEMA");
+        case 0x1300 + 62: return wxT("TCM_INSERTITEMW");
+        case 0x1300 + 8: return wxT("TCM_DELETEITEM");
+        case 0x1300 + 9: return wxT("TCM_DELETEALLITEMS");
+        case 0x1300 + 10: return wxT("TCM_GETITEMRECT");
+        case 0x1300 + 11: return wxT("TCM_GETCURSEL");
+        case 0x1300 + 12: return wxT("TCM_SETCURSEL");
+        case 0x1300 + 13: return wxT("TCM_HITTEST");
+        case 0x1300 + 14: return wxT("TCM_SETITEMEXTRA");
+        case 0x1300 + 40: return wxT("TCM_ADJUSTRECT");
+        case 0x1300 + 41: return wxT("TCM_SETITEMSIZE");
+        case 0x1300 + 42: return wxT("TCM_REMOVEIMAGE");
+        case 0x1300 + 43: return wxT("TCM_SETPADDING");
+        case 0x1300 + 44: return wxT("TCM_GETROWCOUNT");
+        case 0x1300 + 45: return wxT("TCM_GETTOOLTIPS");
+        case 0x1300 + 46: return wxT("TCM_SETTOOLTIPS");
+        case 0x1300 + 47: return wxT("TCM_GETCURFOCUS");
+        case 0x1300 + 48: return wxT("TCM_SETCURFOCUS");
+        case 0x1300 + 49: return wxT("TCM_SETMINTABWIDTH");
+        case 0x1300 + 50: return wxT("TCM_DESELECTALL");
 
         // toolbar
-        case WM_USER+1000+1: return "TB_ENABLEBUTTON";
-        case WM_USER+1000+2: return "TB_CHECKBUTTON";
-        case WM_USER+1000+3: return "TB_PRESSBUTTON";
-        case WM_USER+1000+4: return "TB_HIDEBUTTON";
-        case WM_USER+1000+5: return "TB_INDETERMINATE";
-        case WM_USER+1000+9: return "TB_ISBUTTONENABLED";
-        case WM_USER+1000+10: return "TB_ISBUTTONCHECKED";
-        case WM_USER+1000+11: return "TB_ISBUTTONPRESSED";
-        case WM_USER+1000+12: return "TB_ISBUTTONHIDDEN";
-        case WM_USER+1000+13: return "TB_ISBUTTONINDETERMINATE";
-        case WM_USER+1000+17: return "TB_SETSTATE";
-        case WM_USER+1000+18: return "TB_GETSTATE";
-        case WM_USER+1000+19: return "TB_ADDBITMAP";
-        case WM_USER+1000+20: return "TB_ADDBUTTONS";
-        case WM_USER+1000+21: return "TB_INSERTBUTTON";
-        case WM_USER+1000+22: return "TB_DELETEBUTTON";
-        case WM_USER+1000+23: return "TB_GETBUTTON";
-        case WM_USER+1000+24: return "TB_BUTTONCOUNT";
-        case WM_USER+1000+25: return "TB_COMMANDTOINDEX";
-        case WM_USER+1000+26: return "TB_SAVERESTOREA";
-        case WM_USER+1000+76: return "TB_SAVERESTOREW";
-        case WM_USER+1000+27: return "TB_CUSTOMIZE";
-        case WM_USER+1000+28: return "TB_ADDSTRINGA";
-        case WM_USER+1000+77: return "TB_ADDSTRINGW";
-        case WM_USER+1000+29: return "TB_GETITEMRECT";
-        case WM_USER+1000+30: return "TB_BUTTONSTRUCTSIZE";
-        case WM_USER+1000+31: return "TB_SETBUTTONSIZE";
-        case WM_USER+1000+32: return "TB_SETBITMAPSIZE";
-        case WM_USER+1000+33: return "TB_AUTOSIZE";
-        case WM_USER+1000+35: return "TB_GETTOOLTIPS";
-        case WM_USER+1000+36: return "TB_SETTOOLTIPS";
-        case WM_USER+1000+37: return "TB_SETPARENT";
-        case WM_USER+1000+39: return "TB_SETROWS";
-        case WM_USER+1000+40: return "TB_GETROWS";
-        case WM_USER+1000+42: return "TB_SETCMDID";
-        case WM_USER+1000+43: return "TB_CHANGEBITMAP";
-        case WM_USER+1000+44: return "TB_GETBITMAP";
-        case WM_USER+1000+45: return "TB_GETBUTTONTEXTA";
-        case WM_USER+1000+75: return "TB_GETBUTTONTEXTW";
-        case WM_USER+1000+46: return "TB_REPLACEBITMAP";
-        case WM_USER+1000+47: return "TB_SETINDENT";
-        case WM_USER+1000+48: return "TB_SETIMAGELIST";
-        case WM_USER+1000+49: return "TB_GETIMAGELIST";
-        case WM_USER+1000+50: return "TB_LOADIMAGES";
-        case WM_USER+1000+51: return "TB_GETRECT";
-        case WM_USER+1000+52: return "TB_SETHOTIMAGELIST";
-        case WM_USER+1000+53: return "TB_GETHOTIMAGELIST";
-        case WM_USER+1000+54: return "TB_SETDISABLEDIMAGELIST";
-        case WM_USER+1000+55: return "TB_GETDISABLEDIMAGELIST";
-        case WM_USER+1000+56: return "TB_SETSTYLE";
-        case WM_USER+1000+57: return "TB_GETSTYLE";
-        case WM_USER+1000+58: return "TB_GETBUTTONSIZE";
-        case WM_USER+1000+59: return "TB_SETBUTTONWIDTH";
-        case WM_USER+1000+60: return "TB_SETMAXTEXTROWS";
-        case WM_USER+1000+61: return "TB_GETTEXTROWS";
-        case WM_USER+1000+41: return "TB_GETBITMAPFLAGS";
+        case WM_USER+1000+1: return wxT("TB_ENABLEBUTTON");
+        case WM_USER+1000+2: return wxT("TB_CHECKBUTTON");
+        case WM_USER+1000+3: return wxT("TB_PRESSBUTTON");
+        case WM_USER+1000+4: return wxT("TB_HIDEBUTTON");
+        case WM_USER+1000+5: return wxT("TB_INDETERMINATE");
+        case WM_USER+1000+9: return wxT("TB_ISBUTTONENABLED");
+        case WM_USER+1000+10: return wxT("TB_ISBUTTONCHECKED");
+        case WM_USER+1000+11: return wxT("TB_ISBUTTONPRESSED");
+        case WM_USER+1000+12: return wxT("TB_ISBUTTONHIDDEN");
+        case WM_USER+1000+13: return wxT("TB_ISBUTTONINDETERMINATE");
+        case WM_USER+1000+17: return wxT("TB_SETSTATE");
+        case WM_USER+1000+18: return wxT("TB_GETSTATE");
+        case WM_USER+1000+19: return wxT("TB_ADDBITMAP");
+        case WM_USER+1000+20: return wxT("TB_ADDBUTTONS");
+        case WM_USER+1000+21: return wxT("TB_INSERTBUTTON");
+        case WM_USER+1000+22: return wxT("TB_DELETEBUTTON");
+        case WM_USER+1000+23: return wxT("TB_GETBUTTON");
+        case WM_USER+1000+24: return wxT("TB_BUTTONCOUNT");
+        case WM_USER+1000+25: return wxT("TB_COMMANDTOINDEX");
+        case WM_USER+1000+26: return wxT("TB_SAVERESTOREA");
+        case WM_USER+1000+76: return wxT("TB_SAVERESTOREW");
+        case WM_USER+1000+27: return wxT("TB_CUSTOMIZE");
+        case WM_USER+1000+28: return wxT("TB_ADDSTRINGA");
+        case WM_USER+1000+77: return wxT("TB_ADDSTRINGW");
+        case WM_USER+1000+29: return wxT("TB_GETITEMRECT");
+        case WM_USER+1000+30: return wxT("TB_BUTTONSTRUCTSIZE");
+        case WM_USER+1000+31: return wxT("TB_SETBUTTONSIZE");
+        case WM_USER+1000+32: return wxT("TB_SETBITMAPSIZE");
+        case WM_USER+1000+33: return wxT("TB_AUTOSIZE");
+        case WM_USER+1000+35: return wxT("TB_GETTOOLTIPS");
+        case WM_USER+1000+36: return wxT("TB_SETTOOLTIPS");
+        case WM_USER+1000+37: return wxT("TB_SETPARENT");
+        case WM_USER+1000+39: return wxT("TB_SETROWS");
+        case WM_USER+1000+40: return wxT("TB_GETROWS");
+        case WM_USER+1000+42: return wxT("TB_SETCMDID");
+        case WM_USER+1000+43: return wxT("TB_CHANGEBITMAP");
+        case WM_USER+1000+44: return wxT("TB_GETBITMAP");
+        case WM_USER+1000+45: return wxT("TB_GETBUTTONTEXTA");
+        case WM_USER+1000+75: return wxT("TB_GETBUTTONTEXTW");
+        case WM_USER+1000+46: return wxT("TB_REPLACEBITMAP");
+        case WM_USER+1000+47: return wxT("TB_SETINDENT");
+        case WM_USER+1000+48: return wxT("TB_SETIMAGELIST");
+        case WM_USER+1000+49: return wxT("TB_GETIMAGELIST");
+        case WM_USER+1000+50: return wxT("TB_LOADIMAGES");
+        case WM_USER+1000+51: return wxT("TB_GETRECT");
+        case WM_USER+1000+52: return wxT("TB_SETHOTIMAGELIST");
+        case WM_USER+1000+53: return wxT("TB_GETHOTIMAGELIST");
+        case WM_USER+1000+54: return wxT("TB_SETDISABLEDIMAGELIST");
+        case WM_USER+1000+55: return wxT("TB_GETDISABLEDIMAGELIST");
+        case WM_USER+1000+56: return wxT("TB_SETSTYLE");
+        case WM_USER+1000+57: return wxT("TB_GETSTYLE");
+        case WM_USER+1000+58: return wxT("TB_GETBUTTONSIZE");
+        case WM_USER+1000+59: return wxT("TB_SETBUTTONWIDTH");
+        case WM_USER+1000+60: return wxT("TB_SETMAXTEXTROWS");
+        case WM_USER+1000+61: return wxT("TB_GETTEXTROWS");
+        case WM_USER+1000+41: return wxT("TB_GETBITMAPFLAGS");
     }
 
-    static char s_szBuf[128];
-    sprintf(s_szBuf, "<unknown message = %d>", nMessage);
-    return s_szBuf;
+    static wxString s_szBuf;
+    s_szBuf.Printf(wxT("<unknown message = %d>"), nMessage);
+    return s_szBuf.c_str();
 
 } // end of wxGetMessageName
 
@@ -5167,25 +4956,21 @@ static void TranslateKbdEventToMouse(
 
 // Find the wxWindow at the current mouse position, returning the mouse
 // position.
-wxWindow* wxFindWindowAtPointer(
-  wxPoint&                          WXUNUSED(rPt)
-)
+wxWindow* wxFindWindowAtPointer(wxPoint& WXUNUSED(rPt))
 {
     return wxFindWindowAtPoint(wxGetMousePosition());
 }
 
-wxWindow* wxFindWindowAtPoint(
-  const wxPoint&                    rPt
-)
+wxWindow* wxFindWindowAtPoint(const wxPoint& rPt)
 {
-    POINTL                          vPt2;
+    POINTL vPt2;
 
     vPt2.x = rPt.x;
     vPt2.y = rPt.y;
 
-    HWND                            hWndHit = ::WinWindowFromPoint(HWND_DESKTOP, &vPt2, FALSE);
-    wxWindow*                       pWin = wxFindWinFromHandle((WXHWND)hWndHit) ;
-    HWND                            hWnd = hWndHit;
+    HWND      hWndHit = ::WinWindowFromPoint(HWND_DESKTOP, &vPt2, FALSE);
+    wxWindow* pWin = wxFindWinFromHandle((WXHWND)hWndHit) ;
+    HWND      hWnd = hWndHit;
 
     //
     // Try to find a window with a wxWindow associated with it
@@ -5201,12 +4986,29 @@ wxWindow* wxFindWindowAtPoint(
 // Get the current mouse position.
 wxPoint wxGetMousePosition()
 {
-    POINTL                          vPt;
+    POINTL vPt;
 
     ::WinQueryPointerPos(HWND_DESKTOP, &vPt);
     return wxPoint(vPt.x, vPt.y);
 }
 
+wxMouseState wxGetMouseState()
+{
+    wxMouseState ms;
+    wxPoint pt = wxGetMousePosition();
+    ms.SetX(pt.x);
+    ms.SetY(pt.y);
+    ms.SetLeftDown(IsKeyDown(VK_BUTTON1));
+    ms.SetMiddleDown(IsKeyDown(VK_BUTTON3));
+    ms.SetRightDown(IsKeyDown(VK_BUTTON2));
+    ms.SetControlDown(IsCtrlDown());
+    ms.SetShiftDown(IsShiftDown());
+    ms.SetAltDown(IsKeyDown(VK_ALT)|IsKeyDown(VK_ALTGRAF));
+    ms.SetMetaDown(IsKeyDown(VK_ALTGRAF));
+    return ms;
+}
+
+
 wxWindowOS2* FindWindowForMouseEvent( wxWindow* pWin,
                                       short*    WXUNUSED(pnX),
                                       short*    WXUNUSED(pnY) )