1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/os2/window.cpp 
   4 // Author:      David Webster 
   8 // Copyright:   (c) David Webster 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  13 // For compilers that support precompilation, includes "wx.h". 
  15 #include "wx/wxprec.h" 
  17 #include "wx/window.h" 
  26     #include "wx/dcclient.h" 
  30     #include "wx/layout.h" 
  31     #include "wx/checkbox.h" 
  32     #include "wx/combobox.h" 
  33     #include "wx/dialog.h" 
  35     #include "wx/listbox.h" 
  36     #include "wx/button.h" 
  37     #include "wx/bmpbuttn.h" 
  38     #include "wx/msgdlg.h" 
  39     #include "wx/scrolwin.h" 
  40     #include "wx/radiobox.h" 
  41     #include "wx/radiobut.h" 
  42     #include "wx/slider.h" 
  43     #include "wx/statbox.h" 
  44     #include "wx/statusbr.h" 
  45     #include "wx/toolbar.h" 
  46     #include "wx/settings.h" 
  49     #include "wx/textctrl.h" 
  50     #include "wx/menuitem.h" 
  55     #include "wx/ownerdrw.h" 
  58 #if     wxUSE_DRAG_AND_DROP 
  62 #include "wx/os2/private.h" 
  65     #include "wx/tooltip.h" 
  69     #include "wx/notebook.h" 
  79 // Place compiler, OS specific includes here 
  83 // Standard macros -- these are for OS/2 PM, but most GUI's have something similar 
  87 //  SHORT1FROMMP -- LOWORD 
  89     #define GET_X_LPARAM(mp) ((unsigned short)(unsigned long)(mp)) 
  91 //  SHORT2FROMMP -- HIWORD 
  93     #define GET_Y_LPARAM(mp) ((unsigned short)(unsigned long)(mp >> 16)) 
  94 #endif // GET_X_LPARAM 
  97 #  define CW_USEDEFAULT    ((int)0x80000000) 
 101     #define VK_OEM_1        0xBA 
 102     #define VK_OEM_PLUS     0xBB 
 103     #define VK_OEM_COMMA    0xBC 
 104     #define VK_OEM_MINUS    0xBD 
 105     #define VK_OEM_PERIOD   0xBE 
 106     #define VK_OEM_2        0xBF 
 107     #define VK_OEM_3        0xC0 
 108     #define VK_OEM_4        0xDB 
 109     #define VK_OEM_5        0xDC 
 110     #define VK_OEM_6        0xDD 
 111     #define VK_OEM_7        0xDE 
 114 // --------------------------------------------------------------------------- 
 116 // --------------------------------------------------------------------------- 
 119 // The last PM message we got (MT-UNSAFE) 
 123 #if wxUSE_MENUS_NATIVE 
 124 wxMenu
*                   wxCurrentPopupMenu 
= NULL
; 
 125 #endif // wxUSE_MENUS_NATIVE 
 127 // --------------------------------------------------------------------------- 
 129 // --------------------------------------------------------------------------- 
 132 // the window proc for all our windows; most gui's have something similar 
 134 MRESULT EXPENTRY 
wxWndProc( HWND hWnd
 
 141     const wxChar 
*wxGetMessageName(int message
); 
 144 wxWindowOS2
* FindWindowForMouseEvent( wxWindow
* pWin
 
 148 void         wxRemoveHandleAssociation(wxWindowOS2
* pWin
); 
 149 void         wxAssociateWinWithHandle( HWND         hWnd
 
 152 wxWindow
* wxFindWinFromHandle(WXHWND hWnd
); 
 155 // get the current state of SHIFT/CTRL keys 
 157 static inline bool IsKeyDown(LONG key
) {return (::WinGetKeyState(HWND_DESKTOP
, key
) & 0x8000) != 0; } 
 158 static inline bool IsShiftDown() { return IsKeyDown(VK_SHIFT
); } 
 159 static inline bool IsCtrlDown() { return IsKeyDown(VK_CTRL
); } 
 161 static wxWindow
*                    gpWinBeingCreated 
= NULL
; 
 163 // --------------------------------------------------------------------------- 
 165 // --------------------------------------------------------------------------- 
 167 // in wxUniv-OS/2 this class is abstract because it doesn't have DoPopupMenu() 
 169 #ifdef __WXUNIVERSAL__ 
 170     IMPLEMENT_ABSTRACT_CLASS(wxWindowOS2
, wxWindowBase
) 
 172     IMPLEMENT_DYNAMIC_CLASS(wxWindow
, wxWindowBase
) 
 173 #endif // __WXUNIVERSAL__/__WXPM__ 
 175 BEGIN_EVENT_TABLE(wxWindowOS2
, wxWindowBase
) 
 176     EVT_ERASE_BACKGROUND(wxWindowOS2::OnEraseBackground
) 
 177     EVT_SYS_COLOUR_CHANGED(wxWindowOS2::OnSysColourChanged
) 
 178     EVT_IDLE(wxWindowOS2::OnIdle
) 
 179     EVT_SET_FOCUS(wxWindowOS2::OnSetFocus
) 
 182 // =========================================================================== 
 184 // =========================================================================== 
 186 // --------------------------------------------------------------------------- 
 187 // wxWindow utility functions 
 188 // --------------------------------------------------------------------------- 
 191 // Find an item given the PM Window id 
 193 wxWindow
* wxWindowOS2::FindItem( 
 198     wxControl
*                      pItem 
= wxDynamicCast(this, wxControl
); 
 203         // I it we or one of our "internal" children? 
 205         if (pItem
->GetId() == lId
 
 206 #ifndef __WXUNIVERSAL__ 
 207             || (pItem
->GetSubcontrols().Index(lId
) != wxNOT_FOUND
) 
 214 #endif // wxUSE_CONTROLS 
 216     wxWindowList::compatibility_iterator  current 
= GetChildren().GetFirst(); 
 220         wxWindow
*                   pChildWin 
= current
->GetData(); 
 221         wxWindow
*                   pWnd 
= pChildWin
->FindItem(lId
); 
 226         current 
= current
->GetNext(); 
 229 } // end of wxWindowOS2::FindItem 
 232 // Find an item given the PM Window handle 
 234 wxWindow
* wxWindowOS2::FindItemByHWND( 
 239     wxWindowList::compatibility_iterator current 
= GetChildren().GetFirst(); 
 243         wxWindow
*                   pParent 
= current
->GetData(); 
 246         // Do a recursive search. 
 248         wxWindow
*                   pWnd 
= pParent
->FindItemByHWND(hWnd
); 
 255             || pParent
->IsKindOf(CLASSINFO(wxControl
)) 
 256 #endif // wxUSE_CONTROLS 
 259             wxWindow
*               pItem 
= current
->GetData(); 
 261             if (pItem
->GetHWND() == hWnd
) 
 265                 if (pItem
->ContainsHWND(hWnd
)) 
 269         current 
= current
->GetNext(); 
 272 } // end of wxWindowOS2::FindItemByHWND 
 275 // Default command handler 
 277 bool wxWindowOS2::OS2Command( WXUINT 
WXUNUSED(uParam
), 
 278                               WXWORD 
WXUNUSED(uId
) ) 
 283 // ---------------------------------------------------------------------------- 
 284 // constructors and such 
 285 // ---------------------------------------------------------------------------- 
 287 void wxWindowOS2::Init() 
 292     m_bWinCaptured 
= false; 
 294     m_fnOldWndProc          
= NULL
; 
 296     m_bMouseInWindow        
= false; 
 297     m_bLastKeydownProcessed 
= false; 
 304     m_hWndScrollBarHorz 
= 0L; 
 305     m_hWndScrollBarVert 
= 0L; 
 307     memset(&m_vWinSwp
, '\0', sizeof (SWP
)); 
 310     // Pass WM_GETDLGCODE to DefWindowProc() 
 316     m_bBackgroundTransparent 
= false; 
 319     // As all windows are created with WS_VISIBLE style... 
 323 #if wxUSE_MOUSEEVENT_HACK 
 326     m_nLastMouseEvent 
= -1; 
 327 #endif // wxUSE_MOUSEEVENT_HACK 
 328 } // wxWindowOS2::Init 
 333 wxWindowOS2::~wxWindowOS2() 
 335     m_isBeingDeleted 
= true; 
 337     for (wxWindow
* pWin 
= GetParent(); pWin
; pWin 
= pWin
->GetParent()) 
 339         wxTopLevelWindow
*           pFrame 
= wxDynamicCast(pWin
, wxTopLevelWindow
); 
 343             if (pFrame
->GetLastFocus() == this) 
 344                 pFrame
->SetLastFocus(NULL
); 
 352         if(!::WinDestroyWindow(GetHWND())) 
 353             wxLogLastError(wxT("DestroyWindow")); 
 355         // remove hWnd <-> wxWindow association 
 357         wxRemoveHandleAssociation(this); 
 359 } // end of wxWindowOS2::~wxWindowOS2 
 361 // real construction (Init() must have been called before!) 
 362 bool wxWindowOS2::Create( wxWindow
*       pParent
, 
 367                           const wxString
& rName 
) 
 369     HWND hParent 
= NULLHANDLE
; 
 370     ULONG ulCreateFlags 
= 0; 
 371     WXDWORD dwExStyle 
= 0; 
 373     wxCHECK_MSG(pParent
, false, wxT("can't create wxWindow without parent")); 
 377     // wxGTK doesn't allow to create controls with static box as the parent so 
 378     // this will result in a crash when the program is ported to wxGTK - warn 
 381     // the correct solution is to create the controls as siblings of the 
 384     wxASSERT_MSG( !wxDynamicCast(pParent
, wxStaticBox
), 
 385                   _T("wxStaticBox can't be used as a window parent!") ); 
 386 #endif // wxUSE_STATBOX 
 388      // Ensure groupbox backgrounds are painted 
 389      if (IsKindOf(CLASSINFO(wxPanel
))) 
 390          lStyle 
&= ~wxCLIP_CHILDREN
; 
 392     if ( !CreateBase( pParent
 
 404         pParent
->AddChild(this); 
 405         hParent 
= GetWinHwnd(pParent
); 
 407         if (pParent
->IsKindOf(CLASSINFO(wxScrolledWindow
))) 
 408             ulCreateFlags 
|= WS_CLIPSIBLINGS
; 
 412     // Most wxSTYLES are really PM Class specific styles and will be 
 413     // set in those class create procs.  PM's basic windows styles are 
 416     ulCreateFlags 
|=  OS2GetCreateWindowFlags(&dwExStyle
); 
 419 #ifdef __WXUNIVERSAL__ 
 420     // no 3d effects, we draw them ourselves 
 422 #endif // !wxUniversal 
 423     if (lStyle 
& wxPOPUP_WINDOW
) 
 425         ulCreateFlags 
&= ~WS_VISIBLE
; 
 430         ulCreateFlags 
|= WS_VISIBLE
; 
 434     // Generic OS/2 Windows have no Control Data but other classes 
 435     // that call OS2Create may have some. 
 437     return(OS2Create( (PSZ
)wxCanvasClassName
 
 442                      ,NULL         
// Control Data 
 446 } // end of wxWindowOS2::Create 
 448 // --------------------------------------------------------------------------- 
 450 // --------------------------------------------------------------------------- 
 452 void wxWindowOS2::SetFocus() 
 454     HWND                            hWnd 
= GetHwnd(); 
 455     wxCHECK_RET( hWnd
, _T("can't set focus to invalid window") ); 
 458         ::WinSetFocus(HWND_DESKTOP
, hWnd
); 
 459 } // end of wxWindowOS2::SetFocus 
 461 void wxWindowOS2::SetFocusFromKbd() 
 464     // Nothing else to do under OS/2 
 466     wxWindowBase::SetFocusFromKbd(); 
 467 } // end of wxWindowOS2::SetFocus 
 469 wxWindow
* wxWindowBase::DoFindFocus() 
 471     HWND                            hWnd 
= ::WinQueryFocus(HWND_DESKTOP
); 
 475         return wxFindWinFromHandle((WXHWND
)hWnd
); 
 478 } // wxWindowBase::DoFindFocus 
 480 void wxWindowOS2::DoEnable( bool bEnable 
) 
 482     HWND                            hWnd 
= GetHwnd(); 
 484         ::WinEnableWindow(hWnd
, (BOOL
)bEnable
); 
 487 bool wxWindowOS2::Show( bool bShow 
) 
 489     if (!wxWindowBase::Show(bShow
)) 
 492     HWND                            hWnd 
= GetHwnd(); 
 494     ::WinShowWindow(hWnd
, bShow
); 
 498         ::WinSetWindowPos(hWnd
, HWND_TOP
, 0, 0, 0, 0, SWP_ACTIVATE 
| SWP_ZORDER
); 
 501 } // end of wxWindowOS2::Show 
 503 void wxWindowOS2::Raise() 
 505     ::WinSetWindowPos(GetHwnd(), HWND_TOP
, 0, 0, 0, 0, SWP_ZORDER 
| SWP_ACTIVATE
); 
 506 } // end of wxWindowOS2::Raise 
 508 void wxWindowOS2::Lower() 
 510     ::WinSetWindowPos(GetHwnd(), HWND_BOTTOM
, 0, 0, 0, 0, SWP_ZORDER 
| SWP_DEACTIVATE
); 
 511 } // end of wxWindowOS2::Lower 
 513 void wxWindowOS2::SetLabel( const wxString
& label 
) 
 515     ::WinSetWindowText(GetHwnd(), label
.c_str()); 
 516 } // end of wxWindowOS2::SetLabel 
 518 wxString 
wxWindowOS2::GetLabel() const 
 520     return wxGetWindowText(GetHWND()); 
 521 } // end of wxWindowOS2::GetLabel 
 523 void wxWindowOS2::DoCaptureMouse() 
 525     HWND hWnd 
= GetHwnd(); 
 527     if (hWnd 
&& !m_bWinCaptured
) 
 529         ::WinSetCapture(HWND_DESKTOP
, hWnd
); 
 530         m_bWinCaptured 
= true; 
 532 } // end of wxWindowOS2::DoCaptureMouse 
 534 void wxWindowOS2::DoReleaseMouse() 
 538         ::WinSetCapture(HWND_DESKTOP
, NULLHANDLE
); 
 539         m_bWinCaptured 
= false; 
 541 } // end of wxWindowOS2::ReleaseMouse 
 543 /* static */ wxWindow
* wxWindowBase::GetCapture() 
 545     HWND hwnd 
= ::WinQueryCapture(HWND_DESKTOP
); 
 546     return hwnd 
? wxFindWinFromHandle((WXHWND
)hwnd
) : (wxWindow 
*)NULL
; 
 547 } // end of wxWindowBase::GetCapture 
 549 bool wxWindowOS2::SetFont( const wxFont
& rFont 
) 
 551     if (!wxWindowBase::SetFont(rFont
)) 
 557     HWND hWnd 
= GetHwnd(); 
 559     wxOS2SetFont( hWnd
, rFont 
); 
 561 } // end of wxWindowOS2::SetFont 
 563 // check if base implementation is OK 
 564 bool wxWindowOS2::SetCursor( const wxCursor
& rCursor
) 
 566     if ( !wxWindowBase::SetCursor(rCursor
)) 
 572     if ( m_cursor
.Ok() ) { 
 573         HWND                            hWnd 
= GetHwnd(); 
 577         ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
 578         ::WinQueryWindowRect(hWnd
, &vRect
); 
 580         if (::WinPtInRect(vHabmain
, &vRect
, &vPoint
) && !wxIsBusy()) 
 582             ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)m_cursor
.GetHCURSOR()); 
 586 } // end of wxWindowOS2::SetCursor 
 588 void wxWindowOS2::WarpPointer( 
 597     ::WinQueryWindowRect(GetHwnd(), &vRect
); 
 601     ::WinSetPointerPos(HWND_DESKTOP
, (LONG
)nX
, (LONG
)(nY
)); 
 602 } // end of wxWindowOS2::WarpPointer 
 605 // --------------------------------------------------------------------------- 
 607 // --------------------------------------------------------------------------- 
 609 int  wxWindowOS2::GetScrollPos( 
 613     if (nOrient 
== wxHORIZONTAL
) 
 614         return((int)::WinSendMsg(m_hWndScrollBarHorz
, SBM_QUERYPOS
, (MPARAM
)NULL
, (MPARAM
)NULL
)); 
 616         return((int)::WinSendMsg(m_hWndScrollBarVert
, SBM_QUERYPOS
, (MPARAM
)NULL
, (MPARAM
)NULL
)); 
 617 } // end of wxWindowOS2::GetScrollPos 
 619 int wxWindowOS2::GetScrollRange( 
 625     if (nOrient 
== wxHORIZONTAL
) 
 626         mr 
= ::WinSendMsg(m_hWndScrollBarHorz
, SBM_QUERYRANGE
, (MPARAM
)NULL
, (MPARAM
)NULL
); 
 628         mr 
= ::WinSendMsg(m_hWndScrollBarVert
, SBM_QUERYRANGE
, (MPARAM
)NULL
, (MPARAM
)NULL
); 
 629     return((int)SHORT2FROMMR(mr
)); 
 630 } // end of wxWindowOS2::GetScrollRange 
 632 int wxWindowOS2::GetScrollThumb( 
 636     if (nOrient 
== wxHORIZONTAL 
) 
 637         return m_nXThumbSize
; 
 639         return m_nYThumbSize
; 
 640 } // end of wxWindowOS2::GetScrollThumb 
 642 void wxWindowOS2::SetScrollPos( 
 645 , bool                              WXUNUSED(bRefresh
) 
 648     if (nOrient 
== wxHORIZONTAL 
) 
 649         ::WinSendMsg(m_hWndScrollBarHorz
, SBM_SETPOS
, (MPARAM
)nPos
, (MPARAM
)NULL
); 
 651         ::WinSendMsg(m_hWndScrollBarVert
, SBM_SETPOS
, (MPARAM
)nPos
, (MPARAM
)NULL
); 
 652 } // end of wxWindowOS2::SetScrollPos 
 654 void wxWindowOS2::SetScrollbar( int  nOrient
, 
 658                                 bool WXUNUSED(bRefresh
) ) 
 660     HWND                            hWnd 
= GetHwnd(); 
 661     int                             nOldRange 
= nRange 
- nThumbVisible
; 
 662     int                             nRange1 
= nOldRange
; 
 663     int                             nPageSize 
= nThumbVisible
; 
 664     int         nVSBWidth  
= wxSystemSettingsNative::GetMetric(wxSYS_VSCROLL_X
, 
 666     int         nHSBHeight 
= wxSystemSettingsNative::GetMetric(wxSYS_HSCROLL_Y
, 
 670     ULONG                           ulStyle 
= WS_VISIBLE 
| WS_SYNCPAINT
; 
 675     wxWindow
*                       pParent 
= GetParent(); 
 677     if (pParent 
&& pParent
->IsKindOf(CLASSINFO(wxFrame
))) 
 681         pFrame 
= wxDynamicCast(pParent
, wxFrame
); 
 682         hWndParent 
= pFrame
->GetFrame(); 
 683         hWndClient 
= GetHwndOf(pParent
); 
 688             hWndParent 
= GetHwndOf(pParent
); 
 690             hWndParent 
= GetHwnd(); 
 691         hWndClient 
= hWndParent
; 
 693     ::WinQueryWindowPos(hWndClient
, &vSwp
); 
 694     ::WinQueryWindowPos(hWnd
, &vSwpOwner
); 
 696     if (nPageSize 
> 1 && nRange 
> 0) 
 698         nRange1 
+= (nPageSize 
- 1); 
 701     vInfo
.cb 
= sizeof(SBCDATA
); 
 703     vInfo
.posLast 
= (SHORT
)nRange1
; 
 704     vInfo
.posThumb 
= (SHORT
)nPos
; 
 706     if (nOrient 
== wxHORIZONTAL 
) 
 709         if (m_hWndScrollBarHorz 
== 0L) 
 712             // Since the scrollbars are usually created before the owner is 
 713             // sized either via an OnSize event directly or via sizers or 
 714             // layout constraints, we will initially just use the coords of 
 715             // the parent window (this is usually a frame client window). But 
 716             // the bars themselves, are children of the parent frame (i.e 
 717             // siblings of the frame client.  The owner, however is the actual 
 718             // window being scrolled (or at least the one responsible for 
 719             // handling the scroll events). The owner will be resized later, 
 720             // as it is usually a child of a top level window, and when that 
 721             // is done its scrollbars will be resized and repositioned as well. 
 723             m_hWndScrollBarHorz 
= ::WinCreateWindow( hWndParent
 
 741             // The owner (the scrolled window) is a child of the Frame's 
 742             // client window, usually.  The scrollbars are children of the 
 743             // frame, itself, and thus are positioned relative to the frame's 
 744             // origin, not the frame's client window origin. 
 745             // The starting x position is the same as the starting x position 
 746             // of the owner, but in terms of the parent frame. 
 747             // The starting y position is wxSYS_HSCROLL_Y pels below the 
 748             // origin of the owner in terms of the parent frame. 
 749             // The horz bar is the same width as the owner and wxSYS_HSCROLL_Y 
 752             if (nRange1 
>= nThumbVisible
) 
 754                 ::WinSetWindowPos( m_hWndScrollBarHorz
 
 756                                   ,vSwp
.x 
+ vSwpOwner
.x
 
 757                                   ,(vSwp
.y 
+ vSwpOwner
.y
) - nHSBHeight
 
 760                                   ,SWP_MOVE 
| SWP_SIZE 
| SWP_SHOW 
| SWP_ACTIVATE 
| SWP_ZORDER
 
 762                 ::WinSendMsg( m_hWndScrollBarHorz
 
 765                              ,MPFROM2SHORT(0, (SHORT
)nRange1
) 
 767                 ::WinSendMsg( m_hWndScrollBarHorz
 
 769                              ,MPFROM2SHORT( (SHORT
)nThumbVisible
 
 776                 ::WinShowWindow(m_hWndScrollBarHorz
, FALSE
); 
 782         if (m_hWndScrollBarVert 
== 0L) 
 785             // Since the scrollbars are usually created before the owner is 
 786             // sized either via an OnSize event directly or via sizers or 
 787             // layout constraints, we will initially just use the coords of 
 788             // the parent window (this is usually a frame client window). But 
 789             // the bars themselves, are children of the parent frame (i.e 
 790             // siblings of the frame client.  The owner, however is the actual 
 791             // window being scrolled (or at least the one responsible for 
 792             // handling the scroll events). The owner will be resized later, 
 793             // as it is usually a child of a top level window, and when that 
 794             // is done its scrollbars will be resized and repositioned as well. 
 796             m_hWndScrollBarVert 
= ::WinCreateWindow( hWndParent
 
 800                                                     ,vSwp
.x 
+ vSwp
.cx 
- nVSBWidth
 
 803                                                     ,vSwp
.cy 
- nHSBHeight
 
 814             // The owner (the scrolled window) is a child of the Frame's 
 815             // client window, usually.  The scrollbars are children of the 
 816             // frame, itself and thus are positioned relative to the frame's 
 817             // origin, not the frame's client window's origin. 
 818             // Thus, the x position will be frame client's x (usually a few 
 819             // pels inside the parent frame, plus the width of the owner. 
 820             // Since we may be using sizers or layout constraints for multiple 
 821             // child scrolled windows, the y position will be the frame client's 
 822             // y pos plus the scrolled windows y position, yielding the y 
 823             // position of the scrollbar relative to the parent frame (the vert 
 824             // scrollbar is on the right and starts at the bottom of the 
 826             // It is wxSYS_VSCROLL_X pels wide and the same height as the owner. 
 828             if (nRange1 
>= nThumbVisible
) 
 830                 ::WinSetWindowPos( m_hWndScrollBarVert
 
 832                                   ,vSwp
.x 
+ vSwpOwner
.x 
+ vSwpOwner
.cx
 
 833                                   ,vSwp
.y 
+ vSwpOwner
.y
 
 836                                   ,SWP_ACTIVATE 
| SWP_MOVE 
| SWP_SIZE 
| SWP_SHOW
 
 838                 ::WinSendMsg( m_hWndScrollBarVert
 
 841                              ,MPFROM2SHORT(0, (SHORT
)nRange1
) 
 843                 ::WinSendMsg( m_hWndScrollBarVert
 
 845                              ,MPFROM2SHORT( (SHORT
)nThumbVisible
 
 852                 ::WinShowWindow(m_hWndScrollBarVert
, FALSE
); 
 854         m_nYThumbSize 
= nThumbVisible
; 
 856 } // end of wxWindowOS2::SetScrollbar 
 859 void wxWindowOS2::ScrollWindow( int nDx
, 
 861                                 const wxRect
* pRect 
) 
 865     ::WinQueryWindowRect(GetHwnd(), &vRect
); 
 866     int height 
= vRect
.yTop
; 
 869         vRect
.xLeft   
= pRect
->x
; 
 870         vRect
.yTop    
= height 
- pRect
->y
; 
 871         vRect
.xRight  
= pRect
->x 
+ pRect
->width
; 
 872         vRect
.yBottom 
= vRect
.yTop 
- pRect
->height
; 
 874     nDy 
*= -1; // flip the sign of Dy as OS/2 is opposite Windows. 
 875     ::WinScrollWindow( GetHwnd() 
 882                       ,SW_SCROLLCHILDREN 
| SW_INVALIDATERGN
 
 884 } // end of wxWindowOS2::ScrollWindow 
 886 // --------------------------------------------------------------------------- 
 888 // --------------------------------------------------------------------------- 
 890 void wxWindowOS2::SubclassWin( 
 894     HWND                            hwnd 
= (HWND
)hWnd
; 
 896     wxCHECK_RET(::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in SubclassWin") ); 
 897     wxAssociateWinWithHandle( hWnd
 
 900     if (!wxCheckWindowWndProc( hWnd
 
 901                               ,(WXFARPROC
)wxWndProc
 
 904         m_fnOldWndProc 
= (WXFARPROC
) ::WinSubclassWindow(hwnd
, (PFNWP
)wxWndProc
); 
 908         m_fnOldWndProc 
= (WXFARPROC
)NULL
; 
 910 } // end of wxWindowOS2::SubclassWin 
 912 void wxWindowOS2::UnsubclassWin() 
 915     // Restore old Window proc 
 917     HWND                            hwnd 
= GetHWND(); 
 921         wxCHECK_RET( ::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in UnsubclassWin") ); 
 923         PFNWP                       fnProc 
= (PFNWP
)::WinQueryWindowPtr(hwnd
, QWP_PFNWP
); 
 925         if ( (m_fnOldWndProc 
!= 0) && (fnProc 
!= (PFNWP
) m_fnOldWndProc
)) 
 927             WinSubclassWindow(hwnd
, (PFNWP
)m_fnOldWndProc
); 
 931 } // end of wxWindowOS2::UnsubclassWin 
 933 bool wxCheckWindowWndProc( 
 935 , WXFARPROC                         fnWndProc
 
 938     static char                     zBuffer
[512]; 
 941     ::WinQueryClassName((HWND
)hWnd
, (LONG
)512, (PCH
)zBuffer
); 
 942     ::WinQueryClassInfo(wxGetInstance(), (PSZ
)zBuffer
, &vCls
); 
 943     return(fnWndProc 
== (WXFARPROC
)vCls
.pfnWindowProc
); 
 944 } // end of WinGuiBase_CheckWindowWndProc 
 946 void wxWindowOS2::SetWindowStyleFlag( 
 950     long                            lFlagsOld 
= GetWindowStyleFlag(); 
 952     if (lFlags 
== lFlagsOld
) 
 956     // Update the internal variable 
 958     wxWindowBase::SetWindowStyleFlag(lFlags
); 
 961     // Now update the Windows style as well if needed - and if the window had 
 962     // been already created 
 968     WXDWORD                         dwExstyleOld
; 
 969     long                            lStyle 
= OS2GetStyle( lFlags
 
 972     long                            lStyleOld 
= OS2GetStyle( lFlagsOld
 
 976     if (lStyle 
!= lStyleOld
) 
 979         // Some flags (e.g. WS_VISIBLE or WS_DISABLED) should not be changed by 
 980         // this function so instead of simply setting the style to the new 
 981         // value we clear the bits which were set in styleOld but are set in 
 982         // the new one and set the ones which were not set before 
 984         long                        lStyleReal 
= ::WinQueryWindowULong(GetHwnd(), QWL_STYLE
); 
 986         lStyleReal 
&= ~lStyleOld
; 
 987         lStyleReal 
|= lStyle
; 
 989         ::WinSetWindowULong(GetHwnd(), QWL_STYLE
, lStyleReal
); 
 991 } // end of wxWindowOS2::SetWindowStyleFlag 
 993 WXDWORD 
wxWindowOS2::OS2GetStyle( long     lFlags
, 
 994                                   WXDWORD
* WXUNUSED(pdwExstyle
) ) const 
 996     WXDWORD                         dwStyle 
= 0L; 
 998     if (lFlags 
& wxCLIP_CHILDREN 
) 
 999         dwStyle 
|= WS_CLIPCHILDREN
; 
1001     if (lFlags 
& wxCLIP_SIBLINGS 
) 
1002         dwStyle 
|= WS_CLIPSIBLINGS
; 
1005 } // end of wxWindowOS2::OS2GetStyle 
1008 // Make a Windows extended style from the given wxWidgets window style 
1010 WXDWORD 
wxWindowOS2::MakeExtendedStyle( 
1012 , bool                              bEliminateBorders
 
1016    // Simply fill out with wxWindow extended styles.  We'll conjure 
1017    // something up in OS2Create and all window redrawing pieces later 
1019     WXDWORD                         dwStyle 
= 0; 
1021     if (lStyle 
& wxTRANSPARENT_WINDOW 
) 
1022         dwStyle 
|= wxTRANSPARENT_WINDOW
; 
1024     if (!bEliminateBorders
) 
1026         if (lStyle 
& wxSUNKEN_BORDER
) 
1027             dwStyle 
|= wxSUNKEN_BORDER
; 
1028         if (lStyle 
& wxDOUBLE_BORDER
) 
1029             dwStyle 
|= wxDOUBLE_BORDER
; 
1030         if (lStyle 
& wxRAISED_BORDER 
) 
1031             dwStyle 
|= wxRAISED_BORDER
; 
1032         if (lStyle 
& wxSTATIC_BORDER
) 
1033             dwStyle 
|= wxSTATIC_BORDER
; 
1036 } // end of wxWindowOS2::MakeExtendedStyle 
1039 // Setup background and foreground colours correctly 
1041 void wxWindowOS2::SetupColours() 
1044         SetBackgroundColour(GetParent()->GetBackgroundColour()); 
1045 } // end of wxWindowOS2::SetupColours 
1047 void wxWindowOS2::OnIdle( 
1048   wxIdleEvent
&                      WXUNUSED(rEvent
) 
1052     // Check if we need to send a LEAVE event 
1054     if (m_bMouseInWindow
) 
1058         ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
1059         if (::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, FALSE
) != (HWND
)GetHwnd()) 
1062             // Generate a LEAVE event 
1064             m_bMouseInWindow 
= false; 
1067             // Unfortunately the mouse button and keyboard state may have changed 
1068             // by the time the OnIdle function is called, so 'state' may be 
1078             wxMouseEvent            
rEvent(wxEVT_LEAVE_WINDOW
); 
1080             InitMouseEvent( rEvent
 
1085             (void)GetEventHandler()->ProcessEvent(rEvent
); 
1088     if (wxUpdateUIEvent::CanUpdate(this)) 
1089         UpdateWindowUI(wxUPDATE_UI_FROMIDLE
); 
1090 } // end of wxWindowOS2::OnIdle 
1093 // Set this window to be the child of 'parent'. 
1095 bool wxWindowOS2::Reparent( wxWindow
* pParent
) 
1097     if (!wxWindowBase::Reparent(pParent
)) 
1100     HWND hWndChild 
= GetHwnd(); 
1101     HWND hWndParent 
= GetParent() ? GetWinHwnd(GetParent()) : (HWND
)0; 
1103     ::WinSetParent(hWndChild
, hWndParent
, TRUE
); 
1105 } // end of wxWindowOS2::Reparent 
1107 void wxWindowOS2::Update() 
1109     ::WinUpdateWindow(GetHwnd()); 
1110 } // end of wxWindowOS2::Update 
1112 void wxWindowOS2::Freeze() 
1114    ::WinSendMsg(GetHwnd(), WM_VRNDISABLED
, (MPARAM
)0, (MPARAM
)0); 
1115 } // end of wxWindowOS2::Freeze 
1117 void wxWindowOS2::Thaw() 
1119    ::WinSendMsg(GetHwnd(), WM_VRNENABLED
, (MPARAM
)TRUE
, (MPARAM
)0); 
1122     // We need to refresh everything or otherwise he invalidated area is not 
1126 } // end of wxWindowOS2::Thaw 
1128 void wxWindowOS2::Refresh( bool bEraseBack
, 
1129                            const wxRect
* pRect 
) 
1131     HWND hWnd 
= GetHwnd(); 
1140             ::WinQueryWindowRect(GetHwnd(), &vOs2Rect
); 
1141             height 
= vOs2Rect
.yTop
; 
1142             vOs2Rect
.xLeft   
= pRect
->x
; 
1143             vOs2Rect
.yTop    
= height 
- pRect
->y
; 
1144             vOs2Rect
.xRight  
= pRect
->x 
+ pRect
->width
; 
1145             vOs2Rect
.yBottom 
= vOs2Rect
.yTop 
- pRect
->height
; 
1147             ::WinInvalidateRect(hWnd
, &vOs2Rect
, bEraseBack
); 
1150             ::WinInvalidateRect(hWnd
, NULL
, bEraseBack
); 
1151         if (m_hWndScrollBarHorz 
!= NULLHANDLE
) 
1152             ::WinInvalidateRect(m_hWndScrollBarHorz
, NULL
, TRUE
); 
1153         if (m_hWndScrollBarVert 
!= NULLHANDLE
) 
1154             ::WinInvalidateRect(m_hWndScrollBarVert
, NULL
, TRUE
); 
1156 } // end of wxWindowOS2::Refresh 
1158 // --------------------------------------------------------------------------- 
1160 // --------------------------------------------------------------------------- 
1162 #if wxUSE_DRAG_AND_DROP 
1163 void wxWindowOS2::SetDropTarget( 
1164   wxDropTarget
*                     pDropTarget
 
1167     m_dropTarget 
= pDropTarget
; 
1168 } // end of wxWindowOS2::SetDropTarget 
1172 // old style file-manager drag&drop support: we retain the old-style 
1173 // DragAcceptFiles in parallel with SetDropTarget. 
1175 void wxWindowOS2::DragAcceptFiles( 
1179     HWND                            hWnd 
= GetHwnd(); 
1181     if (hWnd 
&& bAccept
) 
1182         ::DrgAcceptDroppedFiles(hWnd
, NULL
, NULL
, DO_COPY
, 0L); 
1183 } // end of wxWindowOS2::DragAcceptFiles 
1185 // ---------------------------------------------------------------------------- 
1187 // ---------------------------------------------------------------------------- 
1191 void wxWindowOS2::DoSetToolTip( 
1195     wxWindowBase::DoSetToolTip(pTooltip
); 
1198         m_tooltip
->SetWindow(this); 
1199 } // end of wxWindowOS2::DoSetToolTip 
1201 #endif // wxUSE_TOOLTIPS 
1203 // --------------------------------------------------------------------------- 
1204 // moving and resizing 
1205 // --------------------------------------------------------------------------- 
1208 void wxWindowOS2::DoGetSize( 
1216     if (IsKindOf(CLASSINFO(wxFrame
))) 
1218         wxFrame
*                    pFrame 
= wxDynamicCast(this, wxFrame
); 
1219         hWnd 
= pFrame
->GetFrame(); 
1224     ::WinQueryWindowRect(hWnd
, &vRect
); 
1227         *pWidth 
= vRect
.xRight 
- vRect
.xLeft
; 
1229         // OS/2 PM is backwards from windows 
1230         *pHeight 
= vRect
.yTop 
- vRect
.yBottom
; 
1231 } // end of wxWindowOS2::DoGetSize 
1233 void wxWindowOS2::DoGetPosition( 
1239     // Return parameters assume wxWidgets coordinate system 
1244     wxWindow
*                       pParent 
= GetParent(); 
1247     // It would seem that WinQueryWindowRect would be the correlary to 
1248     // the WIN32 WinGetRect, but unlike WinGetRect which returns the window 
1249     // origin position in screen coordinates, WinQueryWindowRect returns it 
1250     // relative to itself, i.e. (0,0).  To get the same under PM we must 
1251     // use WinQueryWindowPos.  This call, unlike the WIN32 call, however, 
1252     // returns a position relative to it's parent, so no parent adujstments 
1253     // are needed under OS/2.  Also, windows should be created using 
1254     // wxWindow coordinates, i.e 0,0 is the TOP left. 
1256     if (IsKindOf(CLASSINFO(wxFrame
))) 
1258         wxFrame
*                    pFrame 
= wxDynamicCast(this, wxFrame
); 
1259         hWnd 
= pFrame
->GetFrame(); 
1264     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1269     // We need to convert to wxWidgets coordinates 
1271     DoGetSize(NULL
,&vHeight
); 
1272     wxWindow
* pWindow 
= wxDynamicCast(this,wxWindow
); 
1273     vPoint
.y 
= pWindow
->GetOS2ParentHeight(pParent
) - vPoint
.y 
- vHeight
; 
1276     // We may be faking the client origin. So a window that's really at (0, 
1277     // 30) may appear (to wxWin apps) to be at (0, 0). 
1281         wxPoint                     
vPt(pParent
->GetClientAreaOrigin()); 
1291 } // end of wxWindowOS2::DoGetPosition 
1293 void wxWindowOS2::DoScreenToClient( 
1298     HWND                            hWnd 
= GetHwnd(); 
1301     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1307 } // end of wxWindowOS2::DoScreenToClient 
1309 void wxWindowOS2::DoClientToScreen( 
1314     HWND                            hWnd 
= GetHwnd(); 
1317     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1323 } // end of wxWindowOS2::DoClientToScreen 
1326 // Get size *available for subwindows* i.e. excluding menu bar etc. 
1327 // Must be a frame type window 
1329 void wxWindowOS2::DoGetClientSize( 
1334     HWND                            hWnd 
= GetHwnd(); 
1337    ::WinQueryWindowRect(hWnd
, &vRect
); 
1338     if (IsKindOf(CLASSINFO(wxDialog
))) 
1343         // For a Dialog we have to explicitly request the client portion. 
1344         // For a Frame the hWnd IS the client window 
1346         hWndTitle 
= ::WinWindowFromID(hWnd
, FID_TITLEBAR
); 
1347         if (::WinQueryWindowRect(hWndTitle
, &vTitle
)) 
1349             if (vTitle
.yTop 
- vTitle
.yBottom 
== 0) 
1352                 // Dialog has not been created yet, use a default 
1356             vRect
.yTop 
-= (vTitle
.yTop 
- vTitle
.yBottom
); 
1359         ULONG                       uStyle 
= ::WinQueryWindowULong(hWnd
, QWL_STYLE
); 
1362         // Deal with borders 
1364         if (uStyle 
& FCF_DLGBORDER
) 
1371         else if (uStyle 
& FCF_SIZEBORDER
) 
1378         else if (uStyle 
& FCF_BORDER
) 
1385         else // make some kind of adjustment or top sizers ram into the titlebar! 
1394         *pWidth  
= vRect
.xRight 
- vRect
.xLeft
; 
1396         *pHeight 
= vRect
.yTop 
- vRect
.yBottom
; 
1397 } // end of wxWindowOS2::DoGetClientSize 
1399 void wxWindowOS2::DoMoveWindow( 
1407     // Input parameters assume wxWidgets coordinate system 
1410     wxWindow
*                       pParent 
= GetParent(); 
1411     HWND                            hWnd 
= GetHwnd(); 
1413     if (pParent 
&& !IsKindOf(CLASSINFO(wxDialog
))) 
1415         int                         nOS2Height 
= GetOS2ParentHeight(pParent
); 
1417         nY 
= nOS2Height 
- (nY 
+ nHeight
); 
1423         ::WinQueryWindowRect(HWND_DESKTOP
, &vRect
); 
1424         nY 
= vRect
.yTop 
- (nY 
+ nHeight
); 
1428     // In the case of a frame whose client is sized, the client cannot be 
1429     // large than its parent frame minus its borders! This usually happens 
1430     // when using an autosizer to size a frame to precisely hold client 
1431     // controls as in the notebook sample. 
1433     // In this case, we may need to resize both a frame and its client so we 
1434     // need a quick calc of the frame border size, then if the frame 
1435     // (less its borders) is smaller than the client, size the frame to 
1436     // encompass the client with the appropriate border size. 
1438     if (IsKindOf(CLASSINFO(wxFrame
))) 
1441         int                         nWidthFrameDelta 
= 0; 
1442         int                         nHeightFrameDelta 
= 0; 
1445         pFrame 
= wxDynamicCast(this, wxFrame
); 
1446         hWnd 
= pFrame
->GetFrame(); 
1447         ::WinQueryWindowRect(hWnd
, &vRect
); 
1448         ::WinMapWindowPoints(hWnd
, HWND_DESKTOP
, (PPOINTL
)&vRect
, 2); 
1450         ::WinCalcFrameRect(hWnd
, &vRect
, TRUE
); 
1451         nWidthFrameDelta 
= ((vRect
.xLeft 
- vFRect
.xLeft
) + (vFRect
.xRight 
- vRect
.xRight
)); 
1452         nHeightFrameDelta 
= ((vRect
.yBottom 
- vFRect
.yBottom
) + (vFRect
.yTop 
- vRect
.yTop
)); 
1453         // Input values refer to the window position relative to its parent 
1454         // which may be the Desktop so we need to calculate 
1455         // the new frame values to keep the wxWidgets frame origin constant 
1456         nY 
-= nHeightFrameDelta
; 
1457         nWidth 
+= nWidthFrameDelta
; 
1458         nHeight 
+= nHeightFrameDelta
; 
1460     ::WinSetWindowPos( hWnd
 
1466                       ,SWP_SIZE 
| SWP_MOVE
 
1468     if (m_vWinSwp
.cx 
== 0 && m_vWinSwp
.cy 
== 0 && m_vWinSwp
.fl 
== 0) 
1472         ::WinQueryWindowPos(hWnd
, &m_vWinSwp
); 
1476         // Handle resizing of scrolled windows.  The target or window to 
1477         // be scrolled is the owner (gets the scroll notifications).  The 
1478         // parent is usually the parent frame of the scrolled panel window. 
1479         // In order to show the scrollbars the target window will be shrunk 
1480         // by the size of the scroll bar widths and moved in the X and Y 
1481         // directon.  That value will be computed as part of the diff for 
1482         // moving the children.  Everytime the window is sized the 
1483         // toplevel OnSize is going to resize the panel to fit the client 
1484         // or the whole sizer and will need to me resized. This will send 
1485         // a WM_SIZE out which will be intercepted by the ScrollHelper 
1486         // which will cause the scrollbars to be displayed via the SetScrollbar 
1489         if (IsKindOf(CLASSINFO(wxScrolledWindow
))) 
1491             int                     nAdjustWidth  
= 0; 
1492             int                     nAdjustHeight 
= 0; 
1493             int nHSBHeight 
= wxSystemSettingsNative::GetMetric(wxSYS_HSCROLL_Y
, 
1495             int nVSBWidth  
= wxSystemSettingsNative::GetMetric(wxSYS_VSCROLL_X
, 
1499             if (GetScrollBarHorz() == NULLHANDLE 
|| 
1500                 !WinIsWindowShowing(GetScrollBarHorz())) 
1503                 nAdjustHeight 
= nHSBHeight
; 
1504             if (GetScrollBarVert() == NULLHANDLE 
|| 
1505                 !WinIsWindowShowing(GetScrollBarVert())) 
1508                 nAdjustWidth 
= nVSBWidth
; 
1509             ::WinQueryWindowPos(hWnd
, &vSwpScroll
); 
1510             ::WinSetWindowPos( hWnd
 
1513                               ,vSwpScroll
.y 
+ nAdjustHeight
 
1514                               ,vSwpScroll
.cx 
- nAdjustWidth
 
1515                               ,vSwpScroll
.cy 
- nAdjustHeight
 
1516                               ,SWP_MOVE 
| SWP_SIZE
 
1519         ::WinQueryWindowPos(hWnd
, &m_vWinSwp
); 
1521 } // end of wxWindowOS2::DoMoveWindow 
1524 // Set the size of the window: if the dimensions are positive, just use them, 
1525 // but if any of them is equal to -1, it means that we must find the value for 
1526 // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in 
1527 // which case -1 is a valid value for x and y) 
1529 // If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate 
1530 // the width/height to best suit our contents, otherwise we reuse the current 
1533 void wxWindowOS2::DoSetSize( int nX
, 
1540     // Input & output parameters assume wxWidgets coordinate system 
1544     // Get the current size and position... 
1550     wxSize vSize 
= wxDefaultSize
; 
1552     GetPosition(&nCurrentX
, &nCurrentY
); 
1553     GetSize(&nCurrentWidth
, &nCurrentHeight
); 
1556     // ... and don't do anything (avoiding flicker) if it's already ok 
1558     if (nX 
== nCurrentX 
&& nY 
== nCurrentY 
&& 
1559         nWidth 
== nCurrentWidth 
&& nHeight 
== nCurrentHeight
) 
1564     if (nX 
== wxDefaultCoord 
&& !(nSizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
)) 
1566     if (nY 
== wxDefaultCoord 
&& !(nSizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
)) 
1569     AdjustForParentClientOrigin(nX
, nY
, nSizeFlags
); 
1571     if (nWidth 
== wxDefaultCoord
) 
1573         if (nSizeFlags 
& wxSIZE_AUTO_WIDTH
) 
1575             vSize  
= DoGetBestSize(); 
1581             // Just take the current one 
1583             nWidth 
= nCurrentWidth
; 
1587     if (nHeight 
== wxDefaultCoord
) 
1589         if (nSizeFlags 
& wxSIZE_AUTO_HEIGHT
) 
1591             if (vSize
.x 
== wxDefaultCoord
) 
1593                 vSize 
= DoGetBestSize(); 
1599             // just take the current one 
1600             nHeight 
= nCurrentHeight
; 
1604     DoMoveWindow( nX
, nY
, nWidth
, nHeight 
); 
1605 } // end of wxWindowOS2::DoSetSize 
1607 void wxWindowOS2::DoSetClientSize( int nWidth
, 
1611     // nX & nY assume wxWidgets coordinate system 
1616     GetPosition(&nX
, &nY
); 
1618     DoMoveWindow( nX
, nY
, nWidth
, nHeight 
); 
1620     wxSize 
size( nWidth
, nHeight 
); 
1621     wxSizeEvent 
vEvent( size
, m_windowId 
); 
1622     vEvent
.SetEventObject(this); 
1623     GetEventHandler()->ProcessEvent(vEvent
); 
1624 } // end of wxWindowOS2::DoSetClientSize 
1626 // --------------------------------------------------------------------------- 
1628 // --------------------------------------------------------------------------- 
1630 int wxWindowOS2::GetCharHeight() const 
1633     FONTMETRICS                     vFontMetrics
; 
1635     hPs 
= ::WinGetPS(GetHwnd()); 
1637     if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
)) 
1639         ::WinReleasePS(hPs
); 
1642     ::WinReleasePS(hPs
); 
1643     return(vFontMetrics
.lMaxAscender 
+ vFontMetrics
.lMaxDescender
); 
1644 } // end of wxWindowOS2::GetCharHeight 
1646 int wxWindowOS2::GetCharWidth() const 
1649     FONTMETRICS                     vFontMetrics
; 
1651     hPs 
= ::WinGetPS(GetHwnd()); 
1653     if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
)) 
1655         ::WinReleasePS(hPs
); 
1658     ::WinReleasePS(hPs
); 
1659     return(vFontMetrics
.lAveCharWidth
); 
1660 } // end of wxWindowOS2::GetCharWidth 
1662 void wxWindowOS2::GetTextExtent( const wxString
& rString
, 
1666                                  int* pExternalLeading
, 
1667                                  const wxFont
* WXUNUSED(pTheFont
) ) const 
1669     POINTL      avPoint
[TXTBOX_COUNT
]; 
1674     FONTMETRICS vFM
; // metrics structure 
1678     hPS 
= ::WinGetPS(GetHwnd()); 
1680     l 
= rString
.length(); 
1684         // In world coordinates. 
1686         bRc 
= ::GpiQueryTextBox( hPS
, 
1688                                  (char*) rString
.wx_str(), 
1689                                  TXTBOX_COUNT
,// return maximum information 
1690                                  avPoint      
// array of coordinates points 
1694             vPtMin
.x 
= avPoint
[0].x
; 
1695             vPtMax
.x 
= avPoint
[0].x
; 
1696             vPtMin
.y 
= avPoint
[0].y
; 
1697             vPtMax
.y 
= avPoint
[0].y
; 
1698             for (i 
= 1; i 
< 4; i
++) 
1700                 if(vPtMin
.x 
> avPoint
[i
].x
) vPtMin
.x 
= avPoint
[i
].x
; 
1701                 if(vPtMin
.y 
> avPoint
[i
].y
) vPtMin
.y 
= avPoint
[i
].y
; 
1702                 if(vPtMax
.x 
< avPoint
[i
].x
) vPtMax
.x 
= avPoint
[i
].x
; 
1703                 if(vPtMax
.y 
< avPoint
[i
].y
) vPtMax
.y 
= avPoint
[i
].y
; 
1705             bRc 
= ::GpiQueryFontMetrics( hPS
 
1706                                         ,sizeof(FONTMETRICS
) 
1733         *pX 
= (vPtMax
.x 
- vPtMin
.x 
+ 1); 
1735         *pY 
= (vPtMax
.y 
- vPtMin
.y 
+ 1); 
1739             *pDescent 
= vFM
.lMaxDescender
; 
1743     if (pExternalLeading
) 
1746             *pExternalLeading 
= vFM
.lExternalLeading
; 
1748             *pExternalLeading 
= 0; 
1750     ::WinReleasePS(hPS
); 
1751 } // end of wxWindow::GetTextExtent 
1753 bool wxWindowOS2::IsMouseInWindow() const 
1756     // Get the mouse position 
1759     ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
); 
1762     // Find the window which currently has the cursor and go up the window 
1763     // chain until we find this window - or exhaust it 
1765     HWND hWnd 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt
, TRUE
); 
1767     while (hWnd 
&& (hWnd 
!= GetHwnd())) 
1768         hWnd 
= ::WinQueryWindow(hWnd
, QW_PARENT
); 
1770     return hWnd 
!= NULL
; 
1771 } // end of wxWindowOS2::IsMouseInWindow 
1774 // --------------------------------------------------------------------------- 
1776 // --------------------------------------------------------------------------- 
1778 #if wxUSE_MENUS_NATIVE 
1779 bool wxWindowOS2::DoPopupMenu( wxMenu
* pMenu
, int nX
, int nY 
) 
1781     HWND hWndOwner 
= GetHwnd(); 
1782     HWND hWndParent 
= GetHwnd(); 
1783     HWND hMenu 
= GetHmenuOf(pMenu
); 
1784     bool bIsWaiting 
= true; 
1787     // Protect against recursion 
1788     if (wxCurrentPopupMenu
) 
1791     pMenu
->SetInvokingWindow(this); 
1794     if ( nX 
== -1 && nY 
== -1 ) 
1796         wxPoint mouse 
= wxGetMousePosition(); 
1797         nX 
= mouse
.x
; nY 
= mouse
.y
; 
1801         DoClientToScreen( &nX
 
1804         DoGetSize(0,&nHeight
); 
1807     wxCurrentPopupMenu 
= pMenu
; 
1809     ::WinPopupMenu( hWndParent
 
1815                    ,PU_HCONSTRAIN 
| PU_VCONSTRAIN 
| PU_MOUSEBUTTON1 
| PU_KEYBOARD
 
1822         ::WinGetMsg(vHabmain
,&vMsg
, (HWND
)0, 0, 0); 
1823         if (vMsg
.msg 
== WM_COMMAND
) 
1825         ::WinDispatchMsg(vHabmain
, (PQMSG
)&vMsg
); 
1828     wxCurrentPopupMenu 
= NULL
; 
1829     pMenu
->SetInvokingWindow(NULL
); 
1831 } // end of wxWindowOS2::DoPopupMenu 
1832 #endif // wxUSE_MENUS_NATIVE 
1834 // =========================================================================== 
1835 // pre/post message processing 
1836 // =========================================================================== 
1838 MRESULT 
wxWindowOS2::OS2DefWindowProc( WXUINT uMsg
, 
1843         return (MRESULT
)m_fnOldWndProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
); 
1845         return ::WinDefWindowProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
); 
1846 } // end of wxWindowOS2::OS2DefWindowProc 
1848 bool wxWindowOS2::OS2ProcessMessage( WXMSG
* pMsg 
) 
1850 // wxUniversal implements tab traversal itself 
1851 #ifndef __WXUNIVERSAL__ 
1852     QMSG
*                           pQMsg 
= (QMSG
*)pMsg
; 
1854     if (m_hWnd 
!= 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL
)) 
1857         // Intercept dialog navigation keys 
1859         bool   bProcess 
= true; 
1860         USHORT uKeyFlags 
= SHORT1FROMMP(pQMsg
->mp1
); 
1862         if (uKeyFlags 
& KC_KEYUP
) 
1865         if (uKeyFlags 
& KC_ALT
) 
1868         if (!(uKeyFlags 
& KC_VIRTUALKEY
)) 
1873             bool                    bCtrlDown 
= IsCtrlDown(); 
1874             bool                    bShiftDown 
= IsShiftDown(); 
1877             // WM_QUERYDLGCODE: ask the control if it wants the key for itself, 
1878             // don't process it if it's the case (except for Ctrl-Tab/Enter 
1879             // combinations which are always processed) 
1881             ULONG                   ulDlgCode 
= 0; 
1885                 ulDlgCode 
= (ULONG
)::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0); 
1888             bool bForward 
= true; 
1889             bool bWindowChange 
= false; 
1891             switch (SHORT2FROMMP(pQMsg
->mp2
)) 
1894                 // Going to make certain assumptions about specific types of controls 
1895                 // here, so we may have to alter some things later if they prove invalid 
1899                     // Shift tabl will always be a nav-key but tabs may be wanted 
1908                         // Entry Fields want tabs for themselve usually 
1912                             case DLGC_ENTRYFIELD
: 
1922                         // Ctrl-Tab cycles thru notebook pages 
1924                         bWindowChange 
= bCtrlDown
; 
1925                         bForward 
= !bShiftDown
; 
1948                             // ctrl-enter is not processed 
1952                         else if (ulDlgCode 
& DLGC_BUTTON
) 
1955                             // buttons want process Enter themselevs 
1961                             wxTopLevelWindow 
*tlw 
= wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow
); 
1962                             wxButton
*   pBtn 
= NULL
; 
1966                                 pBtn 
= wxDynamicCast(tlw
->GetDefaultItem(), wxButton
); 
1969                             if (pBtn 
&& pBtn
->IsEnabled()) 
1972                                 // If we do have a default button, do press it 
1974                                 pBtn
->OS2Command(BN_CLICKED
, 0 /* unused */); 
1977                             else if (!IsTopLevel()) 
1980                                 // if not a top level window, let parent 
1985                             // else: but if it does not it makes sense to make 
1986                             //       it work like a TAB - and that's what we do. 
1987                             //       Note that Ctrl-Enter always works this way. 
1998                 wxNavigationKeyEvent    vEvent
; 
2000                 vEvent
.SetDirection(bForward
); 
2001                 vEvent
.SetWindowChange(bWindowChange
); 
2002                 vEvent
.SetEventObject(this); 
2004                 if (GetEventHandler()->ProcessEvent(vEvent
)) 
2006                     wxButton
*       pBtn 
= wxDynamicCast(FindFocus(), wxButton
); 
2011                         // The button which has focus should be default 
2020         // Let Dialogs process 
2022         if (::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0)); 
2026     pMsg 
= pMsg
; // just shut up the compiler 
2027 #endif // __WXUNIVERSAL__ 
2030 } // end of wxWindowOS2::OS2ProcessMessage 
2032 bool wxWindowOS2::OS2TranslateMessage( WXMSG
* pMsg 
) 
2034 #if wxUSE_ACCEL && !defined(__WXUNIVERSAL__) 
2035     return m_acceleratorTable
.Translate(m_hWnd
, pMsg
); 
2039 #endif //wxUSE_ACCEL 
2040 } // end of wxWindowOS2::OS2TranslateMessage 
2042 bool wxWindowOS2::OS2ShouldPreProcessMessage( WXMSG
* WXUNUSED(pMsg
) ) 
2044     // preprocess all messages by default 
2046 } // end of wxWindowOS2::OS2ShouldPreProcessMessage 
2048 // --------------------------------------------------------------------------- 
2049 // message params unpackers 
2050 // --------------------------------------------------------------------------- 
2052 void wxWindowOS2::UnpackCommand( 
2060     *pId 
= LOWORD(wParam
); 
2061     *phWnd 
= NULL
;  // or may be GetHWND() ? 
2062     *pCmd 
= LOWORD(lParam
); 
2063 } // end of wxWindowOS2::UnpackCommand 
2065 void wxWindowOS2::UnpackActivate( 
2072     *pState     
= LOWORD(wParam
); 
2073     *phWnd      
= (WXHWND
)lParam
; 
2074 } // end of wxWindowOS2::UnpackActivate 
2076 void wxWindowOS2::UnpackScroll( 
2087     ulId    
= (ULONG
)LONGFROMMP(wParam
); 
2088     hWnd 
= ::WinWindowFromID(GetHwnd(), ulId
); 
2089     if (hWnd 
== m_hWndScrollBarHorz 
|| hWnd 
== m_hWndScrollBarVert
) 
2090         *phWnd 
= NULLHANDLE
; 
2094     *pPos  
= SHORT1FROMMP(lParam
); 
2095     *pCode 
= SHORT2FROMMP(lParam
); 
2096 } // end of wxWindowOS2::UnpackScroll 
2098 void wxWindowOS2::UnpackMenuSelect( 
2106     *pItem 
= (WXWORD
)LOWORD(wParam
); 
2107     *pFlags 
= HIWORD(wParam
); 
2108     *phMenu 
= (WXHMENU
)lParam
; 
2109 } // end of wxWindowOS2::UnpackMenuSelect 
2111 // --------------------------------------------------------------------------- 
2112 // Main wxWidgets window proc and the window proc for wxWindow 
2113 // --------------------------------------------------------------------------- 
2116 // Hook for new window just as it's being created, when the window isn't yet 
2117 // associated with the handle 
2119 wxWindowOS2
*                         wxWndHook 
= NULL
; 
2124 MRESULT EXPENTRY 
wxWndProc( 
2131     wxWindowOS2
*                    pWnd 
= wxFindWinFromHandle((WXHWND
)hWnd
); 
2134     // When we get the first message for the HWND we just created, we associate 
2135     // it with wxWindow stored in wxWndHook 
2137     if (!pWnd 
&& wxWndHook
) 
2139         wxAssociateWinWithHandle(hWnd
, wxWndHook
); 
2142         pWnd
->SetHWND((WXHWND
)hWnd
); 
2145     MRESULT                         rc 
= (MRESULT
)0; 
2149     // Stop right here if we don't have a valid handle in our wxWindow object. 
2151     if (pWnd 
&& !pWnd
->GetHWND()) 
2153         pWnd
->SetHWND((WXHWND
) hWnd
); 
2154         rc 
= pWnd
->OS2DefWindowProc(ulMsg
, wParam
, lParam 
); 
2161             rc 
= pWnd
->OS2WindowProc(ulMsg
, wParam
, lParam
); 
2162             if ( (pWnd
->GetScrollBarHorz() != NULLHANDLE 
|| 
2163                   pWnd
->GetScrollBarVert() != NULLHANDLE
) && 
2166                 if (pWnd
->GetScrollBarHorz() != NULLHANDLE
) 
2167                     ::WinInvalidateRect(pWnd
->GetScrollBarHorz(), NULL
, TRUE
); 
2168                 if (pWnd
->GetScrollBarVert() != NULLHANDLE
) 
2169                     ::WinInvalidateRect(pWnd
->GetScrollBarVert(), NULL
, TRUE
); 
2173             rc 
= ::WinDefWindowProc(hWnd
, ulMsg
, wParam
, lParam
); 
2177 } // end of wxWndProc 
2180 // We will add (or delete) messages we need to handle at this default 
2183 MRESULT 
wxWindowOS2::OS2WindowProc( WXUINT uMsg
, 
2188     // Did we process the uMsg? 
2190     bool bProcessed 
= false; 
2194     // For most messages we should return 0 when we do process the message 
2196     mResult 
= (MRESULT
)0; 
2204                 bProcessed 
= HandleCreate( (WXLPCREATESTRUCT
)lParam
 
2210                     // Return 0 to bAllow window creation 
2212                     mResult 
= (MRESULT
)(bMayCreate 
? 0 : -1); 
2223             bProcessed 
= HandleMove( LOWORD(lParam
) 
2229             bProcessed 
= HandleSize( LOWORD(lParam
) 
2235         case WM_WINDOWPOSCHANGED
: 
2238             // Dialogs under OS/2 do not get WM_SIZE events at all. 
2239             // Instead they get this, which can function much like WM_SIZE 
2240             // PSWP contains the new sizes and positioning, PSWP+1 the old 
2241             // We use this because ADJUSTWINDOWPOS comes BEFORE the new 
2242             // position is added and our auto layout does a WinQueryWindowRect 
2243             // to get the CURRENT client size.  That is the size used to position 
2244             // child controls, so we need to already be sized 
2245             // in order to get the child controls positoned properly. 
2247             if (IsKindOf(CLASSINFO(wxDialog
)) || IsKindOf(CLASSINFO(wxFrame
))) 
2249                 PSWP                pSwp 
= (PSWP
)PVOIDFROMMP(wParam
); 
2250                 PSWP                pSwp2 
= pSwp
++; 
2252                 if (!(pSwp
->cx 
== pSwp2
->cx 
&& 
2253                       pSwp
->cy 
== pSwp2
->cy
)) 
2254                     bProcessed 
= HandleSize( pSwp
->cx
 
2258                 if (IsKindOf(CLASSINFO(wxFrame
))) 
2260                     wxFrame
*            pFrame 
= wxDynamicCast(this, wxFrame
); 
2264                         if (pFrame
->GetStatusBar()) 
2265                             pFrame
->PositionStatusBar(); 
2266                         if (pFrame
->GetToolBar()) 
2267                             pFrame
->PositionToolBar(); 
2278                 UnpackActivate( wParam
 
2284                 bProcessed 
= HandleActivate( wState
 
2292             if (SHORT1FROMMP((MPARAM
)lParam
) == TRUE
) 
2293                 bProcessed 
= HandleSetFocus((WXHWND
)(HWND
)wParam
); 
2295                 bProcessed 
= HandleKillFocus((WXHWND
)(HWND
)wParam
); 
2299             bProcessed 
= HandlePaint(); 
2304             // Don't let the DefWindowProc() destroy our window - we'll do it 
2305             // ourselves in ~wxWindow 
2308             mResult 
= (MRESULT
)TRUE
; 
2312             bProcessed 
= HandleShow(wParam 
!= 0, (int)lParam
); 
2316         // Under OS2 PM Joysticks are treated just like mouse events 
2317         // The "Motion" events will be prevelent in joysticks 
2320         case WM_BUTTON1DOWN
: 
2322         case WM_BUTTON1DBLCLK
: 
2323         case WM_BUTTON1MOTIONEND
: 
2324         case WM_BUTTON1MOTIONSTART
: 
2325         case WM_BUTTON2DOWN
: 
2327         case WM_BUTTON2DBLCLK
: 
2328         case WM_BUTTON2MOTIONEND
: 
2329         case WM_BUTTON2MOTIONSTART
: 
2330         case WM_BUTTON3DOWN
: 
2332         case WM_BUTTON3DBLCLK
: 
2333         case WM_BUTTON3MOTIONEND
: 
2334         case WM_BUTTON3MOTIONSTART
: 
2336                 short               nX 
= LOWORD(wParam
); 
2337                 short               nY 
= HIWORD(wParam
); 
2340                 // Redirect the event to a static control if necessary 
2342                 if (this == GetCapture()) 
2344                     bProcessed 
= HandleMouseEvent( uMsg
 
2347                                                   ,(WXUINT
)SHORT2FROMMP(lParam
) 
2352                     wxWindow
*       pWin 
= FindWindowForMouseEvent( this 
2356                     if (!pWin
->IsOfStandardClass()) 
2358                         if (uMsg 
== WM_BUTTON1DOWN 
&& pWin
->CanAcceptFocus() ) 
2361                     bProcessed 
= pWin
->HandleMouseEvent( uMsg
 
2364                                                         ,(WXUINT
)SHORT2FROMMP(lParam
) 
2371             bProcessed 
= HandleSysCommand(wParam
, lParam
); 
2378                 UnpackCommand(wParam
, lParam
, &id
, &hwnd
, &cmd
); 
2380                 bProcessed 
= HandleCommand(id
, cmd
, hwnd
); 
2385             // For these messages we must return TRUE if process the message 
2388         case WM_MEASUREITEM
: 
2390                 int                 nIdCtrl 
= (UINT
)wParam
; 
2392                 if ( uMsg 
== WM_DRAWITEM 
) 
2394                     bProcessed 
= OS2OnDrawItem(nIdCtrl
, 
2395                                               (WXDRAWITEMSTRUCT 
*)lParam
); 
2399                     return MRFROMLONG(OS2OnMeasureItem( nIdCtrl
 
2400                                                        ,(WXMEASUREITEMSTRUCT 
*)lParam
 
2405                     mResult 
= (MRESULT
)TRUE
; 
2409         case WM_QUERYDLGCODE
: 
2410             if (!IsOfStandardClass()) 
2414                     mResult 
= (MRESULT
)m_lDlgCode
; 
2419             //else: get the dlg code from the DefWindowProc() 
2424         // In OS/2 PM all keyboard events are of the WM_CHAR type.  Virtual key and key-up 
2425         // and key-down events are obtained from the WM_CHAR params. 
2429                 USHORT                  uKeyFlags 
= SHORT1FROMMP((MPARAM
)wParam
); 
2431                 if (uKeyFlags 
& KC_KEYUP
) 
2433                     //TODO: check if the cast to WXWORD isn't causing trouble 
2434                     bProcessed 
= HandleKeyUp(wParam
, lParam
); 
2437                 else // keydown event 
2439                     m_bLastKeydownProcessed 
= false; 
2441                     // If this has been processed by an event handler, 
2442                     // return 0 now (we've handled it). DON't RETURN 
2443                     // we still need to process further 
2445                     m_bLastKeydownProcessed 
= HandleKeyDown(wParam
, lParam
); 
2446                     if (uKeyFlags 
& KC_VIRTUALKEY
) 
2448                         USHORT          uVk 
= SHORT2FROMMP((MPARAM
)lParam
); 
2451                         // We consider these message "not interesting" to OnChar 
2464                             // Avoid duplicate messages to OnChar for these ASCII keys: they 
2465                             // will be translated by TranslateMessage() and received in WM_CHAR 
2470                                 // But set processed to false, not true to still pass them to 
2471                                 // the control's default window proc - otherwise built-in 
2472                                 // keyboard handling won't work 
2477                                 bProcessed 
= HandleChar(wParam
, lParam
); 
2481                     else // WM_CHAR -- Always an ASCII character 
2483                         if (m_bLastKeydownProcessed
) 
2486                             // The key was handled in the EVT_KEY_DOWN and handling 
2487                             // a key in an EVT_KEY_DOWN handler is meant, by 
2488                             // design, to prevent EVT_CHARs from happening 
2490                             m_bLastKeydownProcessed 
= false; 
2493                         else // do generate a CHAR event 
2495                             bProcessed 
= HandleChar(wParam
, lParam
, true); 
2508                 UnpackScroll( wParam
 
2515                 bProcessed 
= OS2OnScroll( uMsg 
== WM_HSCROLL 
? wxHORIZONTAL
 
2525             switch(SHORT2FROMMP(wParam
)) 
2529                         HWND                hWnd 
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
)); 
2530                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2537                         if (pWin
->IsKindOf(CLASSINFO(wxBitmapButton
))) 
2539                             wxBitmapButton
*     pBitmapButton 
= wxDynamicCast(pWin
, wxBitmapButton
); 
2541                             pBitmapButton
->OS2OnDraw((WXDRAWITEMSTRUCT 
*)lParam
); 
2547                 case BKN_PAGESELECTEDPENDING
: 
2549                         PPAGESELECTNOTIFY  pPage 
= (PPAGESELECTNOTIFY
)lParam
; 
2551                         if ((pPage
->ulPageIdNew 
!= pPage
->ulPageIdCur
) && 
2552                             (pPage
->ulPageIdNew 
> 0L && pPage
->ulPageIdCur 
> 0L)) 
2554                             wxWindowOS2
*        pWin 
= wxFindWinFromHandle(pPage
->hwndBook
); 
2555                             wxNotebookEvent     
vEvent( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
 
2556                                                        ,(int)SHORT1FROMMP(wParam
) 
2557                                                        ,(int)pPage
->ulPageIdNew
 
2558                                                        ,(int)pPage
->ulPageIdCur
 
2565                             if (pWin
->IsKindOf(CLASSINFO(wxNotebook
))) 
2567                                 wxNotebook
*         pNotebook 
= wxDynamicCast(pWin
, wxNotebook
); 
2569                                 vEvent
.SetEventObject(pWin
); 
2570                                 pNotebook
->OnSelChange(vEvent
); 
2582                 case BN_CLICKED
: // Dups as LN_SELECT and CBN_LBSELECT 
2584                         HWND                hWnd 
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
)); 
2585                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2593                         // Simulate a WM_COMMAND here, as wxWidgets expects all control 
2594                         // button clicks to generate WM_COMMAND msgs, not WM_CONTROL 
2596                         if (pWin
->IsKindOf(CLASSINFO(wxRadioBox
))) 
2598                             wxRadioBox
*         pRadioBox 
= wxDynamicCast(pWin
, wxRadioBox
); 
2600                             pRadioBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2601                                                   ,(WXWORD
)SHORT1FROMMP(wParam
) 
2604                         if (pWin
->IsKindOf(CLASSINFO(wxRadioButton
))) 
2606                             wxRadioButton
*      pRadioButton 
= wxDynamicCast(pWin
, wxRadioButton
); 
2608                             pRadioButton
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2609                                                      ,(WXWORD
)SHORT1FROMMP(wParam
) 
2612                         if (pWin
->IsKindOf(CLASSINFO(wxCheckBox
))) 
2614                             wxCheckBox
*         pCheckBox 
= wxDynamicCast(pWin
, wxCheckBox
); 
2616                             pCheckBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2617                                                   ,(WXWORD
)SHORT1FROMMP(wParam
) 
2620                         if (pWin
->IsKindOf(CLASSINFO(wxListBox
))) 
2622                             wxListBox
*          pListBox 
= wxDynamicCast(pWin
, wxListBox
); 
2624                             pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2625                                                  ,(WXWORD
)SHORT1FROMMP(wParam
) 
2627                             if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
) 
2630                         if (pWin
->IsKindOf(CLASSINFO(wxComboBox
))) 
2632                             wxComboBox
*          pComboBox 
= wxDynamicCast(pWin
, wxComboBox
); 
2634                             pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2635                                                   ,(WXWORD
)SHORT1FROMMP(wParam
) 
2638                         if (pWin
->IsKindOf(CLASSINFO(wxChoice
))) 
2640                             wxChoice
*           pChoice 
= wxDynamicCast(pWin
, wxChoice
); 
2642                             pChoice
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2643                                                 ,(WXWORD
)SHORT1FROMMP(wParam
) 
2652                         HWND                hWnd 
= HWNDFROMMP(lParam
); 
2653                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2661                         // Simulate a WM_COMMAND here, as wxWidgets expects all control 
2662                         // button clicks to generate WM_COMMAND msgs, not WM_CONTROL 
2664                         if (pWin
->IsKindOf(CLASSINFO(wxListBox
))) 
2666                             wxListBox
*          pListBox 
= wxDynamicCast(pWin
, wxListBox
); 
2668                             pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2669                                                  ,(WXWORD
)SHORT1FROMMP(wParam
) 
2671                             if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
) 
2675                         if (pWin
->IsKindOf(CLASSINFO(wxComboBox
))) 
2677                             wxComboBox
*          pComboBox 
= wxDynamicCast(pWin
, wxComboBox
); 
2679                             pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2680                                                   ,(WXWORD
)SHORT1FROMMP(wParam
) 
2688                 case SPBN_DOWNARROW
: 
2694                         ::WinSendMsg( HWNDFROMMP(lParam
) 
2697                                      ,MPFROM2SHORT( (USHORT
)10 
2698                                                    ,(USHORT
)SPBQ_UPDATEIFVALID
 
2702                         bProcessed 
= OS2OnScroll( wxVERTICAL
 
2703                                                  ,(WXWORD
)SHORT2FROMMP(wParam
) 
2710                 case SLN_SLIDERTRACK
: 
2712                         HWND         hWnd 
= ::WinWindowFromID(GetHWND(), SHORT1FROMMP(wParam
)); 
2713                         wxWindowOS2
* pChild 
= wxFindWinFromHandle(hWnd
); 
2720                         if (pChild
->IsKindOf(CLASSINFO(wxSlider
))) 
2721                             bProcessed 
= OS2OnScroll( wxVERTICAL
 
2722                                                      ,(WXWORD
)SHORT2FROMMP(wParam
) 
2723                                                      ,(WXWORD
)LONGFROMMP(lParam
) 
2731 #if defined(__VISAGECPP__) && (__IBMCPP__ >= 400) 
2732         case WM_CTLCOLORCHANGE
: 
2734                 bProcessed 
= HandleCtlColor(&hBrush
); 
2738         case WM_ERASEBACKGROUND
: 
2740             // Returning TRUE to requestw PM to paint the window background 
2741             // in SYSCLR_WINDOW. We don't really want that 
2743             bProcessed 
= HandleEraseBkgnd((WXHDC
)(HPS
)wParam
); 
2744             mResult 
= (MRESULT
)(FALSE
); 
2747             // the return value for this message is ignored 
2748         case WM_SYSCOLORCHANGE
: 
2749             bProcessed 
= HandleSysColorChange(); 
2752         case WM_REALIZEPALETTE
: 
2753             bProcessed 
= HandlePaletteChanged(); 
2756         // move all drag and drops to wxDrg 
2758             bProcessed 
= HandleEndDrag(wParam
); 
2762             bProcessed 
= HandleInitDialog((WXHWND
)(HWND
)wParam
); 
2766                 // we never set focus from here 
2767                 mResult 
= (MRESULT
)FALSE
; 
2771         // wxFrame specific message 
2772         case WM_MINMAXFRAME
: 
2773             bProcessed 
= HandleGetMinMaxInfo((PSWP
)wParam
); 
2776         case WM_SYSVALUECHANGED
: 
2777             // TODO: do something 
2778             mResult 
= (MRESULT
)TRUE
; 
2782         // Comparable to WM_SETPOINTER for windows, only for just controls 
2784         case WM_CONTROLPOINTER
: 
2785             bProcessed 
= HandleSetCursor( SHORT1FROMMP(wParam
) // Control ID 
2786                                          ,(HWND
)lParam         
// Cursor Handle 
2791                 // Returning TRUE stops the DefWindowProc() from further 
2792                 // processing this message - exactly what we need because we've 
2793                 // just set the cursor. 
2795                 mResult 
= (MRESULT
)TRUE
; 
2799 #if wxUSE_MENUS_NATIVE 
2801             if (wxCurrentPopupMenu
) 
2803                 if (GetHmenuOf(wxCurrentPopupMenu
) == (HWND
)lParam
) 
2805                     // Break out of msg loop in DoPopupMenu 
2806                     ::WinPostMsg((HWND
)lParam
,WM_COMMAND
,wParam
,0); 
2810 #endif // wxUSE_MENUS_NATIVE 
2816         wxLogTrace(wxTraceMessages
, wxT("Forwarding %s to DefWindowProc."), 
2817                    wxGetMessageName(uMsg
)); 
2818 #endif // __WXDEBUG__ 
2819         if (IsKindOf(CLASSINFO(wxFrame
))) 
2820             mResult 
= ::WinDefWindowProc(m_hWnd
, uMsg
, wParam
, lParam
); 
2821         else if (IsKindOf(CLASSINFO(wxDialog
))) 
2822             mResult 
= ::WinDefDlgProc( m_hWnd
, uMsg
, wParam
, lParam
); 
2824             mResult 
= OS2DefWindowProc(uMsg
, wParam
, lParam
); 
2827 } // end of wxWindowOS2::OS2WindowProc 
2829 // ---------------------------------------------------------------------------- 
2830 // wxWindow <-> HWND map 
2831 // ---------------------------------------------------------------------------- 
2833 wxWinHashTable 
*wxWinHandleHash 
= NULL
; 
2835 wxWindow
* wxFindWinFromHandle( 
2839     return (wxWindow 
*)wxWinHandleHash
->Get((long)hWnd
); 
2840 } // end of wxFindWinFromHandle 
2842 void wxAssociateWinWithHandle( 
2848     // Adding NULL hWnd is (first) surely a result of an error and 
2849     // (secondly) breaks menu command processing 
2851     wxCHECK_RET( hWnd 
!= (HWND
)NULL
, 
2852                  wxT("attempt to add a NULL hWnd to window list ignored") ); 
2854     wxWindow
*                       pOldWin 
= wxFindWinFromHandle((WXHWND
) hWnd
); 
2856     if (pOldWin 
&& (pOldWin 
!= pWin
)) 
2858         wxString  
Newstr(pWin
->GetClassInfo()->GetClassName()); 
2859         wxString 
Oldstr(pOldWin
->GetClassInfo()->GetClassName()); 
2860         wxLogError( _T("Bug! New window of class %s has same HWND %X as old window of class %s"), 
2868         wxWinHandleHash
->Put( (long)hWnd
 
2872 } // end of wxAssociateWinWithHandle 
2874 void wxRemoveHandleAssociation( wxWindowOS2
* pWin 
) 
2876     wxWinHandleHash
->Delete((long)pWin
->GetHWND()); 
2877 } // end of wxRemoveHandleAssociation 
2880 // Default destroyer - override if you destroy it in some other way 
2881 // (e.g. with MDI child windows) 
2883 void wxWindowOS2::OS2DestroyWindow() 
2887 bool wxWindowOS2::OS2GetCreateWindowCoords( const wxPoint
& rPos
, 
2888                                             const wxSize
&  rSize
, 
2892                                             int& rnHeight 
) const 
2894     bool bNonDefault 
= false; 
2895     static const int DEFAULT_Y 
= 200; 
2896     static const int DEFAULT_H 
= 250; 
2898     if (rPos
.x 
== wxDefaultCoord
) 
2900         rnX 
= rnY 
= CW_USEDEFAULT
; 
2905         rnY 
= rPos
.y 
== wxDefaultCoord 
? DEFAULT_Y 
: rPos
.y
; 
2908     if (rSize
.x 
== wxDefaultCoord
) 
2910         rnWidth 
= rnHeight 
= CW_USEDEFAULT
; 
2915         rnHeight 
= rSize
.y 
== wxDefaultCoord 
? DEFAULT_H 
: rSize
.y
; 
2919 } // end of wxWindowOS2::OS2GetCreateWindowCoords 
2921 WXHWND 
wxWindowOS2::OS2GetParent() const 
2923     return m_parent 
? m_parent
->GetHWND() : NULL
; 
2926 bool wxWindowOS2::OS2Create( PSZ            zClass
, 
2927                              const wxChar
*  zTitle
, 
2929                              const wxPoint
& rPos
, 
2930                              const wxSize
&  rSize
, 
2932                              WXDWORD        
WXUNUSED(dwExStyle
), 
2941     long                 lControlId 
= 0L; 
2942     wxWindowCreationHook 
vHook(this); 
2943     wxString             
sClassName((wxChar
*)zClass
); 
2944     wxString             
sTitle(zTitle 
? zTitle 
: wxEmptyString
); 
2946     OS2GetCreateWindowCoords( rPos
 
2956         lControlId 
= GetId(); 
2957         if (GetWindowStyleFlag() & wxCLIP_SIBLINGS
) 
2959             dwStyle 
|= WS_CLIPSIBLINGS
; 
2963     // For each class "Foo" we have we also have "FooNR" ("no repaint") class 
2964     // which is the same but without CS_[HV]REDRAW class styles so using it 
2965     // ensures that the window is not fully repainted on each resize 
2967     if (!HasFlag(wxFULL_REPAINT_ON_RESIZE
)) 
2969         sClassName 
+= wxT("NR"); 
2971     m_hWnd 
= (WXHWND
)::WinCreateWindow( (HWND
)OS2GetParent() 
2987         vError 
= ::WinGetLastError(wxGetInstance()); 
2988         sError 
= wxPMErrorToStr(vError
); 
2991     SubclassWin(m_hWnd
); 
2992     SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
)); 
2994     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE
)); 
2996     LONG lColor 
= (LONG
)m_backgroundColour
.GetPixel(); 
2998     if (!::WinSetPresParam( m_hWnd
 
3004         vError 
= ::WinGetLastError(vHabmain
); 
3005         sError 
= wxPMErrorToStr(vError
); 
3006         wxLogError(_T("Error creating frame. Error: %s\n"), sError
.c_str()); 
3015 } // end of wxWindowOS2::OS2Create 
3017 // =========================================================================== 
3018 // OS2 PM message handlers 
3019 // =========================================================================== 
3021 // --------------------------------------------------------------------------- 
3022 // window creation/destruction 
3023 // --------------------------------------------------------------------------- 
3025 bool wxWindowOS2::HandleCreate( WXLPCREATESTRUCT 
WXUNUSED(vCs
), 
3028     wxWindowCreateEvent             
vEvent((wxWindow
*)this); 
3030     (void)GetEventHandler()->ProcessEvent(vEvent
); 
3031     *pbMayCreate 
= true; 
3033 } // end of wxWindowOS2::HandleCreate 
3035 bool wxWindowOS2::HandleDestroy() 
3037     wxWindowDestroyEvent            
vEvent((wxWindow
*)this); 
3038     vEvent
.SetId(GetId()); 
3039     (void)GetEventHandler()->ProcessEvent(vEvent
); 
3042     // Delete our drop target if we've got one 
3044 #if wxUSE_DRAG_AND_DROP 
3045     if (m_dropTarget 
!= NULL
) 
3047         delete m_dropTarget
; 
3048         m_dropTarget 
= NULL
; 
3050 #endif // wxUSE_DRAG_AND_DROP 
3053     // WM_DESTROY handled 
3056 } // end of wxWindowOS2::HandleDestroy 
3058 // --------------------------------------------------------------------------- 
3060 // --------------------------------------------------------------------------- 
3061 void wxWindowOS2::OnSetFocus( 
3062   wxFocusEvent
&                     rEvent
 
3066 } // end of wxWindowOS2::OnSetFocus 
3068 bool wxWindowOS2::HandleActivate( 
3070 , WXHWND                            
WXUNUSED(hActivate
) 
3073     wxActivateEvent                 
vEvent( wxEVT_ACTIVATE
 
3077     vEvent
.SetEventObject(this); 
3078     return GetEventHandler()->ProcessEvent(vEvent
); 
3079 } // end of wxWindowOS2::HandleActivate 
3081 bool wxWindowOS2::HandleSetFocus( WXHWND 
WXUNUSED(hWnd
) ) 
3084     // Notify the parent keeping track of focus for the kbd navigation 
3085     // purposes that we got it 
3087     wxChildFocusEvent               
vEventFocus((wxWindow 
*)this); 
3088     (void)GetEventHandler()->ProcessEvent(vEventFocus
); 
3096         m_caret
->OnSetFocus(); 
3098 #endif // wxUSE_CARET 
3101     // If it's a wxTextCtrl don't send the event as it will be done 
3102     // after the control gets to process it from EN_FOCUS handler 
3103     if ( wxDynamicCastThis(wxTextCtrl
) ) 
3107 #endif // wxUSE_TEXTCTRL 
3109     wxFocusEvent                    
vEvent(wxEVT_SET_FOCUS
, m_windowId
); 
3111     vEvent
.SetEventObject(this); 
3112     return GetEventHandler()->ProcessEvent(vEvent
); 
3113 } // end of wxWindowOS2::HandleSetFocus 
3115 bool wxWindowOS2::HandleKillFocus( WXHWND hWnd 
) 
3123         m_caret
->OnKillFocus(); 
3125 #endif // wxUSE_CARET 
3129     // If it's a wxTextCtrl don't send the event as it will be done 
3130     // after the control gets to process it. 
3132     wxTextCtrl
*                     pCtrl 
= wxDynamicCastThis(wxTextCtrl
); 
3141     // Don't send the event when in the process of being deleted.  This can 
3142     // only cause problems if the event handler tries to access the object. 
3144     if ( m_isBeingDeleted 
) 
3149     wxFocusEvent                    
vEvent( wxEVT_KILL_FOCUS
 
3153     vEvent
.SetEventObject(this); 
3156     // wxFindWinFromHandle() may return NULL, it is ok 
3158     vEvent
.SetWindow(wxFindWinFromHandle(hWnd
)); 
3159     return GetEventHandler()->ProcessEvent(vEvent
); 
3160 } // end of wxWindowOS2::HandleKillFocus 
3162 // --------------------------------------------------------------------------- 
3164 // --------------------------------------------------------------------------- 
3166 bool wxWindowOS2::HandleShow( 
3168 , int                               WXUNUSED(nStatus
) 
3171     wxShowEvent                     
vEvent(GetId(), bShow
); 
3173     vEvent
.SetEventObject(this); 
3174     return GetEventHandler()->ProcessEvent(vEvent
); 
3175 } // end of wxWindowOS2::HandleShow 
3177 bool wxWindowOS2::HandleInitDialog( WXHWND 
WXUNUSED(hWndFocus
) ) 
3179     wxInitDialogEvent               
vEvent(GetId()); 
3181     vEvent
.SetEventObject(this); 
3182     return GetEventHandler()->ProcessEvent(vEvent
); 
3183 } // end of wxWindowOS2::HandleInitDialog 
3185 bool wxWindowOS2::HandleEndDrag(WXWPARAM 
WXUNUSED(wParam
)) 
3187    // TODO: We'll handle drag and drop later 
3191 bool wxWindowOS2::HandleSetCursor( USHORT 
WXUNUSED(vId
), 
3195     // Under OS/2 PM this allows the pointer to be changed 
3196     // as it passes over a control 
3198     ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)hPointer
); 
3200 } // end of wxWindowOS2::HandleSetCursor 
3202 // --------------------------------------------------------------------------- 
3203 // owner drawn stuff 
3204 // --------------------------------------------------------------------------- 
3205 bool wxWindowOS2::OS2OnDrawItem( int vId
, 
3206                                  WXDRAWITEMSTRUCT
* pItemStruct 
) 
3208 #if wxUSE_OWNER_DRAWN 
3211 #if wxUSE_MENUS_NATIVE 
3213     // Is it a menu item? 
3219         POWNERITEM                  pMeasureStruct 
= (POWNERITEM
)pItemStruct
; 
3220         wxFrame
*                    pFrame 
= (wxFrame
*)this; 
3221         wxMenuItem
*                 pMenuItem 
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
); 
3222         HDC                         hDC 
= ::GpiQueryDevice(pMeasureStruct
->hps
); 
3223         wxRect                      
vRect( pMeasureStruct
->rclItem
.xLeft
 
3224                                           ,pMeasureStruct
->rclItem
.yBottom
 
3225                                           ,pMeasureStruct
->rclItem
.xRight 
- pMeasureStruct
->rclItem
.xLeft
 
3226                                           ,pMeasureStruct
->rclItem
.yTop 
- pMeasureStruct
->rclItem
.yBottom
 
3228         vDc
.SetHDC( hDC
, false ); 
3229         vDc
.SetHPS( pMeasureStruct
->hps 
); 
3231         // Load the wxWidgets Pallete and set to RGB mode 
3233         if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
 
3237                                       ,(LONG
)wxTheColourDatabase
->m_nSize
 
3238                                       ,(PLONG
)wxTheColourDatabase
->m_palTable
 
3241             vError 
= ::WinGetLastError(vHabmain
); 
3242             sError 
= wxPMErrorToStr(vError
); 
3243             wxLogError(_T("Unable to set current color table (1). Error: %s\n"), sError
.c_str()); 
3246         // Set the color table to RGB mode 
3248         if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
 
3256             vError 
= ::WinGetLastError(vHabmain
); 
3257             sError 
= wxPMErrorToStr(vError
); 
3258             wxLogError(_T("Unable to set current color table (2). Error: %s\n"), sError
.c_str()); 
3261         wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE 
); 
3266         if (pMeasureStruct
->fsAttribute 
== pMeasureStruct
->fsAttributeOld
) 
3269             // Entire Item needs to be redrawn (either it has reappeared from 
3270             // behind another window or is being displayed for the first time 
3272             eAction 
= wxOwnerDrawn::wxODDrawAll
; 
3274             if (pMeasureStruct
->fsAttribute 
& MIA_HILITED
) 
3277                 // If it is currently selected we let the system handle it 
3279                 eStatus 
|= wxOwnerDrawn::wxODSelected
; 
3281             if (pMeasureStruct
->fsAttribute 
& MIA_CHECKED
) 
3284                 // If it is currently checked we draw our own 
3286                 eStatus 
|= wxOwnerDrawn::wxODChecked
; 
3287                 pMeasureStruct
->fsAttributeOld 
= pMeasureStruct
->fsAttribute 
&= ~MIA_CHECKED
; 
3289             if (pMeasureStruct
->fsAttribute 
& MIA_DISABLED
) 
3292                 // If it is currently disabled we let the system handle it 
3294                 eStatus 
|= wxOwnerDrawn::wxODDisabled
; 
3297             // Don't really care about framed (indicationg focus) or NoDismiss 
3302             if (pMeasureStruct
->fsAttribute 
& MIA_HILITED
) 
3304                 eAction 
= wxOwnerDrawn::wxODDrawAll
; 
3305                 eStatus 
|= wxOwnerDrawn::wxODSelected
; 
3307                 // Keep the system from trying to highlight with its bogus colors 
3309                 pMeasureStruct
->fsAttributeOld 
= pMeasureStruct
->fsAttribute 
&= ~MIA_HILITED
; 
3311             else if (!(pMeasureStruct
->fsAttribute 
& MIA_HILITED
)) 
3313                 eAction 
= wxOwnerDrawn::wxODDrawAll
; 
3316                 // Keep the system from trying to highlight with its bogus colors 
3318                 pMeasureStruct
->fsAttribute 
= pMeasureStruct
->fsAttributeOld 
&= ~MIA_HILITED
; 
3323                 // For now we don't care about anything else 
3324                 // just ignore the entire message! 
3330         // Now redraw the item 
3332         return(pMenuItem
->OnDrawItem( vDc
 
3334                                      ,(wxOwnerDrawn::wxODAction
)eAction
 
3335                                      ,(wxOwnerDrawn::wxODStatus
)eStatus
 
3338         // leave the fsAttribute and fsOldAttribute unchanged.  If different, 
3339         // the system will do the highlight or fraeming or disabling for us, 
3340         // otherwise, we'd have to do it ourselves. 
3343 #endif // wxUSE_MENUS_NATIVE 
3345     wxWindow
*                       pItem 
= FindItem(vId
); 
3347     if (pItem 
&& pItem
->IsKindOf(CLASSINFO(wxControl
))) 
3349         return ((wxControl 
*)pItem
)->OS2OnDraw(pItemStruct
); 
3353     pItemStruct 
= pItemStruct
; 
3356 } // end of wxWindowOS2::OS2OnDrawItem 
3358 long wxWindowOS2::OS2OnMeasureItem( int lId
, 
3359                                     WXMEASUREITEMSTRUCT
* pItemStruct 
) 
3361 #if wxUSE_OWNER_DRAWN 
3363     // Is it a menu item? 
3365     if (lId 
== 65536) // I really don't like this...has to be a better indicator 
3367         if (IsKindOf(CLASSINFO(wxFrame
))) // we'll assume if Frame then a menu 
3371             POWNERITEM              pMeasureStruct 
= (POWNERITEM
)pItemStruct
; 
3372             wxFrame
*                pFrame 
= (wxFrame
*)this; 
3373             wxMenuItem
*             pMenuItem 
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
); 
3375             wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE 
); 
3378             if (pMenuItem
->OnMeasureItem( &nWidth
 
3384                 pMeasureStruct
->rclItem
.xRight  
= nWidth
; 
3385                 pMeasureStruct
->rclItem
.xLeft   
= 0L; 
3386                 pMeasureStruct
->rclItem
.yTop    
= nHeight
; 
3387                 pMeasureStruct
->rclItem
.yBottom 
= 0L; 
3388                 mRc 
= MRFROM2SHORT(nHeight
, nWidth
); 
3389                 return LONGFROMMR(mRc
); 
3394     wxWindow
*                      pItem 
= FindItem(lId
); 
3396     if (pItem 
&& pItem
->IsKindOf(CLASSINFO(wxControl
))) 
3400         vItem
.idItem 
= (LONG
)pItemStruct
; 
3401         return ((wxControl 
*)pItem
)->OS2OnMeasure((WXMEASUREITEMSTRUCT
*)&vItem
); 
3405     pItemStruct 
= pItemStruct
; 
3406 #endif // wxUSE_OWNER_DRAWN 
3410 // --------------------------------------------------------------------------- 
3411 // colours and palettes 
3412 // --------------------------------------------------------------------------- 
3414 bool wxWindowOS2::HandleSysColorChange() 
3416     wxSysColourChangedEvent         vEvent
; 
3418     vEvent
.SetEventObject(this); 
3419     return GetEventHandler()->ProcessEvent(vEvent
); 
3420 } // end of wxWindowOS2::HandleSysColorChange 
3422 bool wxWindowOS2::HandleCtlColor( WXHBRUSH
* WXUNUSED(phBrush
) ) 
3425     // Not much provided with message. So not sure I can do anything with it 
3428 } // end of wxWindowOS2::HandleCtlColor 
3431 // Define for each class of dialog and control 
3432 WXHBRUSH 
wxWindowOS2::OnCtlColor(WXHDC 
WXUNUSED(hDC
), 
3433                                  WXHWND 
WXUNUSED(hWnd
), 
3434                                  WXUINT 
WXUNUSED(nCtlColor
), 
3435                                  WXUINT 
WXUNUSED(message
), 
3436                                  WXWPARAM 
WXUNUSED(wParam
), 
3437                                  WXLPARAM 
WXUNUSED(lParam
)) 
3442 bool wxWindowOS2::HandlePaletteChanged() 
3444     // need to set this to something first 
3445     WXHWND                          hWndPalChange 
= NULLHANDLE
; 
3447     wxPaletteChangedEvent           
vEvent(GetId()); 
3449     vEvent
.SetEventObject(this); 
3450     vEvent
.SetChangedWindow(wxFindWinFromHandle(hWndPalChange
)); 
3452     return GetEventHandler()->ProcessEvent(vEvent
); 
3453 } // end of wxWindowOS2::HandlePaletteChanged 
3456 // Responds to colour changes: passes event on to children. 
3458 void wxWindowOS2::OnSysColourChanged( 
3459   wxSysColourChangedEvent
&          rEvent
 
3462     wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); 
3467         // Only propagate to non-top-level windows 
3469         wxWindow
*                   pWin 
= (wxWindow 
*)node
->GetData(); 
3471         if (pWin
->GetParent()) 
3473             wxSysColourChangedEvent vEvent
; 
3475             rEvent
.SetEventObject(pWin
); 
3476             pWin
->GetEventHandler()->ProcessEvent(vEvent
); 
3478         node 
= node
->GetNext(); 
3480 } // end of wxWindowOS2::OnSysColourChanged 
3482 // --------------------------------------------------------------------------- 
3484 // --------------------------------------------------------------------------- 
3486 void wxWindow::OnPaint ( 
3487   wxPaintEvent
&                     rEvent
 
3490     HDC                             hDC 
= (HDC
)wxPaintDC::FindDCInCache((wxWindow
*) rEvent
.GetEventObject()); 
3494         OS2DefWindowProc( (WXUINT
)WM_PAINT
 
3499 } // end of wxWindow::OnPaint 
3501 bool wxWindowOS2::HandlePaint() 
3504     wxPaintEvent                    
vEvent(m_windowId
); 
3508     // Create empty region 
3509     // TODO: get HPS somewhere else if possible 
3510     hPS  
= ::WinGetPS(GetHwnd()); 
3511     hRgn 
= ::GpiCreateRegion(hPS
, 0, NULL
); 
3513     if (::WinQueryUpdateRegion(GetHwnd(), hRgn
) == RGN_ERROR
) 
3515          wxLogLastError(wxT("CreateRectRgn")); 
3518     // Get all the rectangles from the region, convert the individual 
3519     // rectangles to "the other" coordinate system and reassemble a 
3520     // region from the rectangles, to be feed into m_updateRegion. 
3523     PRECTL                      pUpdateRects 
= NULL
; 
3524     vRgnData
.ulDirection 
= RECTDIR_LFRT_TOPBOT
; 
3525     if (::GpiQueryRegionRects( hPS          
// Pres space 
3526                               ,hRgn         
// Handle of region to query 
3527                               ,NULL         
// Return all RECTs 
3528                               ,&vRgnData    
// Will contain number or RECTs in region 
3529                               ,NULL         
// NULL to return number of RECTs 
3532         pUpdateRects 
= new RECTL
[vRgnData
.crcReturned
]; 
3533         vRgnData
.crc 
= vRgnData
.crcReturned
; 
3534         vRgnData
.ircStart 
= 1; 
3535         if (::GpiQueryRegionRects( hPS      
// Pres space of source 
3536                                   ,hRgn     
// Handle of source region 
3537                                   ,NULL     
// Return all RECTs 
3538                                   ,&vRgnData 
// Operations set to return rects 
3539                                   ,pUpdateRects 
// Will contain the actual RECTS 
3544             ::WinQueryWindowRect(GetHwnd(), &vRect
); 
3545             height 
= vRect
.yTop
; 
3547             for(size_t i 
= 0; i 
< vRgnData
.crc
; i
++) 
3550                 rectHeight 
= pUpdateRects
[i
].yTop 
- pUpdateRects
[i
].yBottom
; 
3551                 pUpdateRects
[i
].yBottom 
= height 
- pUpdateRects
[i
].yTop
; 
3552                 pUpdateRects
[i
].yTop 
= pUpdateRects
[i
].yBottom 
+ rectHeight
; 
3554             ::GpiSetRegion(hPS
, hRgn
, vRgnData
.crc
, pUpdateRects
); 
3555             delete [] pUpdateRects
; 
3558     m_updateRegion 
= wxRegion(hRgn
, hPS
); 
3560     vEvent
.SetEventObject(this); 
3561     bProcessed 
= GetEventHandler()->ProcessEvent(vEvent
); 
3564          IsKindOf(CLASSINFO(wxPanel
)) && 
3565          GetChildren().GetCount() == 0 
3569         // OS/2 needs to process this right here, not by the default proc 
3570         // Window's default proc correctly paints everything, OS/2 does not. 
3571         // For decorative panels that typically have no children, we draw 
3577         hPS 
= ::WinBeginPaint( GetHwnd() 
3583             ::GpiCreateLogColorTable( hPS
 
3587                                      ,(LONG
)wxTheColourDatabase
->m_nSize
 
3588                                      ,(PLONG
)wxTheColourDatabase
->m_palTable
 
3590             ::GpiCreateLogColorTable( hPS
 
3597             if (::WinIsWindowVisible(GetHWND())) 
3598                 ::WinFillRect(hPS
, &vRect
,  GetBackgroundColour().GetPixel()); 
3601                 LINEBUNDLE      vLineBundle
; 
3603                 vLineBundle
.lColor     
= 0x00000000; // Black 
3604                 vLineBundle
.usMixMode  
= FM_OVERPAINT
; 
3605                 vLineBundle
.fxWidth    
= 1; 
3606                 vLineBundle
.lGeomWidth 
= 1; 
3607                 vLineBundle
.usType     
= LINETYPE_SOLID
; 
3608                 vLineBundle
.usEnd      
= 0; 
3609                 vLineBundle
.usJoin     
= 0; 
3612                               ,LBB_COLOR 
| LBB_MIX_MODE 
| LBB_WIDTH 
| LBB_GEOM_WIDTH 
| LBB_TYPE
 
3616                 ::WinQueryWindowRect(GetHwnd(), &vRect
); 
3626     else if (!bProcessed 
&& 
3627              IsKindOf(CLASSINFO(wxPanel
)) 
3631         // Panel with children, usually fills a frame client so no borders. 
3636         hPS 
= ::WinBeginPaint( GetHwnd() 
3642             ::GpiCreateLogColorTable( hPS
 
3646                                      ,(LONG
)wxTheColourDatabase
->m_nSize
 
3647                                      ,(PLONG
)wxTheColourDatabase
->m_palTable
 
3649             ::GpiCreateLogColorTable( hPS
 
3657             if (::WinIsWindowVisible(GetHWND())) 
3658                 ::WinFillRect(hPS
, &vRect
,  GetBackgroundColour().GetPixel()); 
3664 } // end of wxWindowOS2::HandlePaint 
3666 bool wxWindowOS2::HandleEraseBkgnd( WXHDC hDC 
) 
3671     ::WinQueryWindowPos(GetHwnd(), &vSwp
); 
3672     if (vSwp
.fl 
& SWP_MINIMIZE
) 
3677     vDC
.m_hPS 
= (HPS
)hDC
; // this is really a PS 
3678     vDC
.SetWindow((wxWindow
*)this); 
3680     wxEraseEvent 
vEvent(m_windowId
, &vDC
); 
3682     vEvent
.SetEventObject(this); 
3684     rc 
= GetEventHandler()->ProcessEvent(vEvent
); 
3686     vDC
.m_hPS 
= NULLHANDLE
; 
3688 } // end of wxWindowOS2::HandleEraseBkgnd 
3690 void wxWindowOS2::OnEraseBackground(wxEraseEvent
& rEvent
) 
3693     HPS     hPS 
= rEvent
.GetDC()->GetHPS(); 
3695     LONG    lColor 
= m_backgroundColour
.GetPixel(); 
3697     rc 
= ::WinQueryWindowRect(GetHwnd(), &vRect
); 
3698     rc 
= ::WinFillRect(hPS
, &vRect
, lColor
); 
3699 }  // end of wxWindowOS2::OnEraseBackground 
3701 // --------------------------------------------------------------------------- 
3702 // moving and resizing 
3703 // --------------------------------------------------------------------------- 
3705 bool wxWindowOS2::HandleMinimize() 
3707     wxIconizeEvent                  
vEvent(m_windowId
); 
3709     vEvent
.SetEventObject(this); 
3710     return GetEventHandler()->ProcessEvent(vEvent
); 
3711 } // end of wxWindowOS2::HandleMinimize 
3713 bool wxWindowOS2::HandleMaximize() 
3715     wxMaximizeEvent                 
vEvent(m_windowId
); 
3717     vEvent
.SetEventObject(this); 
3718     return GetEventHandler()->ProcessEvent(vEvent
); 
3719 } // end of wxWindowOS2::HandleMaximize 
3721 bool wxWindowOS2::HandleMove( int nX
, int nY 
) 
3724     wxMoveEvent 
vEvent(pt
, m_windowId
); 
3726     vEvent
.SetEventObject(this); 
3727     return GetEventHandler()->ProcessEvent(vEvent
); 
3728 }  // end of wxWindowOS2::HandleMove 
3730 bool wxWindowOS2::HandleSize( int    nWidth
, 
3732                               WXUINT 
WXUNUSED(nFlag
) ) 
3734     wxSize 
sz(nWidth
, nHeight
); 
3735     wxSizeEvent 
vEvent(sz
, m_windowId
); 
3737     vEvent
.SetEventObject(this); 
3738     return GetEventHandler()->ProcessEvent(vEvent
); 
3739 } // end of wxWindowOS2::HandleSize 
3741 bool wxWindowOS2::HandleGetMinMaxInfo( PSWP pSwp 
) 
3748             ::WinGetMaxPosition(GetHwnd(), pSwp
); 
3749             m_maxWidth 
= pSwp
->cx
; 
3750             m_maxHeight 
= pSwp
->cy
; 
3754             ::WinGetMinPosition(GetHwnd(), pSwp
, &vPoint
); 
3755             m_minWidth 
= pSwp
->cx
; 
3756             m_minHeight 
= pSwp
->cy
; 
3763 } // end of wxWindowOS2::HandleGetMinMaxInfo 
3765 // --------------------------------------------------------------------------- 
3767 // --------------------------------------------------------------------------- 
3768 bool wxWindowOS2::HandleCommand( WXWORD wId
, 
3772 #if wxUSE_MENUS_NATIVE 
3773     if (wxCurrentPopupMenu
) 
3775         wxMenu
*                     pPopupMenu 
= wxCurrentPopupMenu
; 
3777         wxCurrentPopupMenu 
= NULL
; 
3778         return pPopupMenu
->OS2Command(wCmd
, wId
); 
3780 #endif // wxUSE_MENUS_NATIVE 
3782     wxWindow
*                       pWin 
= FindItem(wId
); 
3786         pWin 
= wxFindWinFromHandle(hControl
); 
3790         return pWin
->OS2Command(wCmd
, wId
); 
3793 } // end of wxWindowOS2::HandleCommand 
3795 bool wxWindowOS2::HandleSysCommand( WXWPARAM wParam
, 
3796                                     WXLPARAM 
WXUNUSED(lParam
) ) 
3799     // 4 bits are reserved 
3801     switch (SHORT1FROMMP(wParam
)) 
3804             return HandleMaximize(); 
3807             return HandleMinimize(); 
3810 } // end of wxWindowOS2::HandleSysCommand 
3812 // --------------------------------------------------------------------------- 
3814 // --------------------------------------------------------------------------- 
3815 //TODO: check against MSW 
3816 void wxWindowOS2::InitMouseEvent( 
3817   wxMouseEvent
&                     rEvent
 
3824     DoGetSize(0, &nHeight
); 
3826     // Convert to wxWidgets standard coordinate system! 
3827     rEvent
.m_y           
= nHeight 
- nY
; 
3828     rEvent
.m_shiftDown   
= ((uFlags 
& KC_SHIFT
) != 0); 
3829     rEvent
.m_controlDown 
= ((uFlags 
& KC_CTRL
) != 0); 
3830     rEvent
.m_altDown     
= ((uFlags 
& KC_ALT
) != 0); 
3831     rEvent
.m_leftDown    
= IsKeyDown(VK_BUTTON1
); 
3832     rEvent
.m_middleDown  
= IsKeyDown(VK_BUTTON3
); 
3833     rEvent
.m_rightDown   
= IsKeyDown(VK_BUTTON2
); 
3834     rEvent
.SetTimestamp(s_currentMsg
.time
); 
3835     rEvent
.SetEventObject(this); 
3836     rEvent
.SetId(GetId()); 
3838 #if wxUSE_MOUSEEVENT_HACK 
3841     m_lastMouseEvent 
= rEvent
.GetEventType(); 
3842 #endif // wxUSE_MOUSEEVENT_HACK 
3843 } // end of wxWindowOS2::InitMouseEvent 
3845 bool wxWindowOS2::HandleMouseEvent( WXUINT uMsg
, 
3850     bool bProcessed 
= false; 
3853     // The mouse events take consecutive IDs from WM_MOUSEFIRST to 
3854     // WM_MOUSELAST, so it's enough to subtract WM_MOUSEMOVE == WM_MOUSEFIRST 
3855     // from the message id and take the value in the table to get wxWin event 
3858     static const wxEventType eventsMouse
[] = 
3873     if ((uMsg 
>= WM_MOUSEMOVE
) && (uMsg 
<= WM_BUTTON3DBLCLK
)) 
3875         wxMouseEvent 
vEvent(eventsMouse
[uMsg 
- WM_MOUSEMOVE
]); 
3877         InitMouseEvent( vEvent
 
3883         bProcessed 
= GetEventHandler()->ProcessEvent(vEvent
); 
3886             HPOINTER hCursor 
= (HPOINTER
)GetCursor().GetHCURSOR(); 
3888             if (hCursor 
!= NULLHANDLE
) 
3890                 ::WinSetPointer(HWND_DESKTOP
, hCursor
); 
3896 } // end of wxWindowOS2::HandleMouseEvent 
3898 bool wxWindowOS2::HandleMouseMove( int nX
, 
3902     if (!m_bMouseInWindow
) 
3905         // Generate an ENTER event 
3907         m_bMouseInWindow 
= true; 
3909         wxMouseEvent 
vEvent(wxEVT_ENTER_WINDOW
); 
3911         InitMouseEvent( vEvent
 
3917         (void)GetEventHandler()->ProcessEvent(vEvent
); 
3919     return HandleMouseEvent( WM_MOUSEMOVE
 
3924 } // end of wxWindowOS2::HandleMouseMove 
3926 // --------------------------------------------------------------------------- 
3927 // keyboard handling 
3928 // --------------------------------------------------------------------------- 
3931 // Create the key event of the given type for the given key - used by 
3932 // HandleChar and HandleKeyDown/Up 
3934 wxKeyEvent 
wxWindowOS2::CreateKeyEvent( 
3941     wxKeyEvent                      
vEvent(eType
); 
3943     vEvent
.SetId(GetId()); 
3944     vEvent
.m_shiftDown   
= IsShiftDown(); 
3945     vEvent
.m_controlDown 
= IsCtrlDown(); 
3946     vEvent
.m_altDown     
= (HIWORD(lParam
) & KC_ALT
) == KC_ALT
; 
3948     vEvent
.SetEventObject((wxWindow 
*)this); // const_cast 
3949     vEvent
.m_keyCode     
= nId
; 
3950     vEvent
.m_rawCode 
= (wxUint32
)wParam
; 
3951     vEvent
.m_rawFlags 
= (wxUint32
)lParam
; 
3952     vEvent
.SetTimestamp(s_currentMsg
.time
); 
3955     // Translate the position to client coords 
3960     ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
3961     ::WinQueryWindowRect( GetHwnd() 
3965     vPoint
.x 
-= vRect
.xLeft
; 
3966     vPoint
.y 
-= vRect
.yBottom
; 
3968     vEvent
.m_x 
= vPoint
.x
; 
3969     vEvent
.m_y 
= vPoint
.y
; 
3972 } // end of wxWindowOS2::CreateKeyEvent 
3975 // isASCII is true only when we're called from WM_CHAR handler and not from 
3978 bool wxWindowOS2::HandleChar( WXWPARAM 
WXUNUSED(wParam
), 
3982     bool bCtrlDown 
= false; 
3985     if (m_bLastKeydownProcessed
) 
3988         // The key was handled in the EVT_KEY_DOWN.  Handling a key in an 
3989         // EVT_KEY_DOWN handler is meant, by design, to prevent EVT_CHARs 
3990         // from happening, so just bail out at this point. 
3992         m_bLastKeydownProcessed 
= false; 
3998         // If 1 -> 26, translate to either special keycode or just set 
3999         // ctrlDown.  IOW, Ctrl-C should result in keycode == 3 and 
4000         // ControlDown() == true. 
4002         vId 
= SHORT1FROMMP(lParam
); 
4003         if ((vId 
> 0) && (vId 
< 27)) 
4025     else  // we're called from WM_KEYDOWN 
4027         vId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4032     wxKeyEvent 
vEvent(CreateKeyEvent( wxEVT_CHAR
, vId
, lParam 
)); 
4036         vEvent
.m_controlDown 
= true; 
4039     return (GetEventHandler()->ProcessEvent(vEvent
)); 
4042 bool wxWindowOS2::HandleKeyDown( WXWPARAM wParam
, 
4045     int nId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4050         // Normal ASCII char 
4052         nId 
= SHORT1FROMMP(lParam
); 
4057         wxKeyEvent  
vEvent(CreateKeyEvent( wxEVT_KEY_DOWN
 
4063         if (GetEventHandler()->ProcessEvent(vEvent
)) 
4069 } // end of wxWindowOS2::HandleKeyDown 
4071 bool wxWindowOS2::HandleKeyUp( WXWPARAM wParam
, 
4074     int nId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4079         // Normal ASCII char 
4081         nId 
= CHAR1FROMMP(lParam
); 
4086         wxKeyEvent 
vEvent(CreateKeyEvent( wxEVT_KEY_UP
 
4092         if (GetEventHandler()->ProcessEvent(vEvent
)) 
4096 } // end of wxWindowOS2::HandleKeyUp 
4098 // --------------------------------------------------------------------------- 
4100 // --------------------------------------------------------------------------- 
4102 // --------------------------------------------------------------------------- 
4104 // --------------------------------------------------------------------------- 
4106 bool wxWindowOS2::OS2OnScroll( int nOrientation
, 
4113         wxWindow
*                   pChild 
= wxFindWinFromHandle(hControl
); 
4116             return pChild
->OS2OnScroll( nOrientation
 
4123     wxScrollWinEvent                vEvent
; 
4125     vEvent
.SetPosition(wPos
); 
4126     vEvent
.SetOrientation(nOrientation
); 
4127     vEvent
.SetEventObject(this); 
4132             vEvent
.SetEventType(wxEVT_SCROLLWIN_LINEUP
); 
4136             vEvent
.SetEventType(wxEVT_SCROLLWIN_LINEDOWN
); 
4140             vEvent
.SetEventType(wxEVT_SCROLLWIN_PAGEUP
); 
4144             vEvent
.SetEventType(wxEVT_SCROLLWIN_PAGEDOWN
); 
4147         case SB_SLIDERPOSITION
: 
4148             vEvent
.SetEventType(wxEVT_SCROLLWIN_THUMBRELEASE
); 
4151         case SB_SLIDERTRACK
: 
4152             vEvent
.SetEventType(wxEVT_SCROLLWIN_THUMBTRACK
); 
4158     return GetEventHandler()->ProcessEvent(vEvent
); 
4159 } // end of wxWindowOS2::OS2OnScroll 
4162 //  Getting the Y position for a window, like a control, is a real 
4163 //  pain.  There are three situations we must deal with in determining 
4164 //  the OS2 to wxWidgets Y coordinate. 
4166 //  1)  The controls are created in a dialog. 
4167 //      This is the easiest since a dialog is created with its original 
4168 //      size so the standard: Y = ParentHeight - (Y + ControlHeight); 
4170 //  2)  The controls are direct children of a frame 
4171 //      In this instance the controls are actually children of the Frame's 
4172 //      client.  During creation the frame's client resizes several times 
4173 //      during creation of the status bar and toolbars.  The CFrame class 
4174 //      will take care of this using its AlterChildPos proc. 
4176 //  3)  The controls are children of a panel, which in turn is a child of 
4178 //      The panel may be one of many, in which case the same treatment 
4179 //      as 1 applies. It may be the only child, though. 
4180 //      This is the nastiest case.  A panel is created as the only child of 
4181 //      the frame and as such, when a frame has only one child, the child is 
4182 //      expanded to fit the entire client area of the frame.  Because the 
4183 //      controls are created BEFORE this occurs their positions are totally 
4184 //      whacked and any call to WinQueryWindowPos will return invalid 
4185 //      coordinates.  So for this situation we have to compare the size of 
4186 //      the panel at control creation time with that of the frame client.  If 
4187 //      they are the same we can use the standard Y position equation.  If 
4188 //      not, then we must use the Frame Client's dimensions to position them 
4189 //      as that will be the eventual size of the panel after the frame resizes 
4192 int wxWindowOS2::GetOS2ParentHeight( wxWindowOS2
* pParent 
) 
4199         if (pParent
->IsKindOf(CLASSINFO(wxDialog
))) 
4200             return(pParent
->GetClientSize().y
); 
4203     // Case 2 -- if we are one of the separately built standard Frame 
4204     //           children, like a statusbar, menubar, or toolbar we want to 
4205     //           use the frame, itself, for positioning.  Otherwise we are 
4206     //           child window and want to use the Frame's client. 
4208         else if (pParent
->IsKindOf(CLASSINFO(wxFrame
))) 
4210             if (IsKindOf(CLASSINFO(wxStatusBar
)) || 
4211                 IsKindOf(CLASSINFO(wxMenuBar
))   || 
4212                 IsKindOf(CLASSINFO(wxToolBar
)) 
4215                 if (IsKindOf(CLASSINFO(wxToolBar
))) 
4217                     wxFrame
*        pFrame 
= wxDynamicCast(GetParent(), wxFrame
); 
4219                     if (pFrame
->GetToolBar() == this) 
4220                         return(pParent
->GetSize().y
); 
4222                         return(pParent
->GetClientSize().y
); 
4225                     return(pParent
->GetSize().y
); 
4228                 return(pParent
->GetClientSize().y
); 
4231         // Case -- this is for any window that is the sole child of a Frame. 
4232         //         The grandparent must exist and it must be of type CFrame 
4233         //         and it's height must be different. Otherwise the standard 
4237             return(pParent
->GetClientSize().y
); 
4239     else // We must be a child of the screen 
4242         wxDisplaySize(NULL
,&nHeight
); 
4245 } // end of wxWindowOS2::GetOS2ParentHeight 
4248 // OS/2 needs a lot extra manipulation to deal with layouts 
4249 // for canvas windows, particularly scrolled ones. 
4251 wxWindowCreationHook::wxWindowCreationHook( 
4252   wxWindow
*                         pWinBeingCreated
 
4255     gpWinBeingCreated 
= pWinBeingCreated
; 
4256 } // end of wxWindowCreationHook::wxWindowCreationHook 
4258 wxWindowCreationHook::~wxWindowCreationHook() 
4260     gpWinBeingCreated 
= NULL
; 
4261 } // end of wxWindowCreationHook::~wxWindowCreationHook 
4263 // =========================================================================== 
4265 // =========================================================================== 
4271 ,wxFont
*                            WXUNUSED(pTheFont
) 
4278     hPS 
=::WinGetPS(hWnd
); 
4280     rc 
= ::GpiQueryFontMetrics(hPS
, sizeof(FONTMETRICS
), &vFM
); 
4284             *pX 
= vFM
.lAveCharWidth
; 
4286             *pY 
= vFM
.lEmHeight 
+ vFM
.lExternalLeading
; 
4295     ::WinReleasePS(hPS
); 
4296 } // end of wxGetCharSize 
4299 // Returns 0 if was a normal ASCII value, not a special key. This indicates that 
4300 // the key should be ignored by WM_KEYDOWN and processed by WM_CHAR instead. 
4302 int wxCharCodeOS2ToWX( 
4310         case VK_BACKTAB
:    nId 
= WXK_BACK
; break; 
4311         case VK_TAB
:        nId 
= WXK_TAB
; break; 
4312         case VK_CLEAR
:      nId 
= WXK_CLEAR
; break; 
4313         case VK_ENTER
:      nId 
= WXK_RETURN
; break; 
4314         case VK_SHIFT
:      nId 
= WXK_SHIFT
; break; 
4315         case VK_CTRL
:       nId 
= WXK_CONTROL
; break; 
4316         case VK_PAUSE
:      nId 
= WXK_PAUSE
; break; 
4317         case VK_SPACE
:      nId 
= WXK_SPACE
; break; 
4318         case VK_PAGEUP
:     nId 
= WXK_PAGEUP
; break; 
4319         case VK_PAGEDOWN
:   nId 
= WXK_PAGEDOWN
; break; 
4320         case VK_ESC
:        nId 
= WXK_ESCAPE
; break; 
4321         case VK_END
:        nId 
= WXK_END
; break; 
4322         case VK_HOME 
:      nId 
= WXK_HOME
; break; 
4323         case VK_LEFT 
:      nId 
= WXK_LEFT
; break; 
4324         case VK_UP
:         nId 
= WXK_UP
; break; 
4325         case VK_RIGHT
:      nId 
= WXK_RIGHT
; break; 
4326         case VK_DOWN 
:      nId 
= WXK_DOWN
; break; 
4327         case VK_PRINTSCRN
:  nId 
= WXK_PRINT
; break; 
4328         case VK_INSERT
:     nId 
= WXK_INSERT
; break; 
4329         case VK_DELETE
:     nId 
= WXK_DELETE
; break; 
4330         case VK_CAPSLOCK
:   nId 
= WXK_CAPITAL
; break; 
4331         case VK_F1
:         nId 
= WXK_F1
; break; 
4332         case VK_F2
:         nId 
= WXK_F2
; break; 
4333         case VK_F3
:         nId 
= WXK_F3
; break; 
4334         case VK_F4
:         nId 
= WXK_F4
; break; 
4335         case VK_F5
:         nId 
= WXK_F5
; break; 
4336         case VK_F6
:         nId 
= WXK_F6
; break; 
4337         case VK_F7
:         nId 
= WXK_F7
; break; 
4338         case VK_F8
:         nId 
= WXK_F8
; break; 
4339         case VK_F9
:         nId 
= WXK_F9
; break; 
4340         case VK_F10
:        nId 
= WXK_F10
; break; 
4341         case VK_F11
:        nId 
= WXK_F11
; break; 
4342         case VK_F12
:        nId 
= WXK_F12
; break; 
4343         case VK_F13
:        nId 
= WXK_F13
; break; 
4344         case VK_F14
:        nId 
= WXK_F14
; break; 
4345         case VK_F15
:        nId 
= WXK_F15
; break; 
4346         case VK_F16
:        nId 
= WXK_F16
; break; 
4347         case VK_F17
:        nId 
= WXK_F17
; break; 
4348         case VK_F18
:        nId 
= WXK_F18
; break; 
4349         case VK_F19
:        nId 
= WXK_F19
; break; 
4350         case VK_F20
:        nId 
= WXK_F20
; break; 
4351         case VK_F21
:        nId 
= WXK_F21
; break; 
4352         case VK_F22
:        nId 
= WXK_F22
; break; 
4353         case VK_F23
:        nId 
= WXK_F23
; break; 
4354         case VK_F24
:        nId 
= WXK_F24
; break; 
4355         case VK_OEM_1
:      nId 
= ';'; break; 
4356         case VK_OEM_PLUS
:   nId 
= '+'; break; 
4357         case VK_OEM_COMMA
:  nId 
= ','; break; 
4358         case VK_OEM_MINUS
:  nId 
= '-'; break; 
4359         case VK_OEM_PERIOD
: nId 
= '.'; break; 
4360         case VK_OEM_2
:      nId 
= '/'; break; 
4361         case VK_OEM_3
:      nId 
= '~'; break; 
4362         case VK_OEM_4
:      nId 
= '['; break; 
4363         case VK_OEM_5
:      nId 
= '\\'; break; 
4364         case VK_OEM_6
:      nId 
= ']'; break; 
4365         case VK_OEM_7
:      nId 
= '\''; break; 
4366         case VK_NUMLOCK
:    nId 
= WXK_NUMLOCK
; break; 
4367         case VK_SCRLLOCK
:   nId 
= WXK_SCROLL
; break; 
4374 } // end of wxCharCodeOS2ToWX 
4376 int wxCharCodeWXToOS2( int nId
, 
4385         case WXK_CLEAR
:     nKeySym 
= VK_CLEAR
; break; 
4386         case WXK_SHIFT
:     nKeySym 
= VK_SHIFT
; break; 
4387         case WXK_CONTROL
:   nKeySym 
= VK_CTRL
; break; 
4388         case WXK_PAUSE
:     nKeySym 
= VK_PAUSE
; break; 
4389         case WXK_PAGEUP
:    nKeySym 
= VK_PAGEUP
; break; 
4390         case WXK_PAGEDOWN
:  nKeySym 
= VK_PAGEDOWN
; break; 
4391         case WXK_END
:       nKeySym 
= VK_END
; break; 
4392         case WXK_HOME 
:     nKeySym 
= VK_HOME
; break; 
4393         case WXK_LEFT 
:     nKeySym 
= VK_LEFT
; break; 
4394         case WXK_UP
:        nKeySym 
= VK_UP
; break; 
4395         case WXK_RIGHT
:     nKeySym 
= VK_RIGHT
; break; 
4396         case WXK_DOWN 
:     nKeySym 
= VK_DOWN
; break; 
4397         case WXK_PRINT
:     nKeySym 
= VK_PRINTSCRN
; break; 
4398         case WXK_INSERT
:    nKeySym 
= VK_INSERT
; break; 
4399         case WXK_DELETE
:    nKeySym 
= VK_DELETE
; break; 
4400         case WXK_F1
:        nKeySym 
= VK_F1
; break; 
4401         case WXK_F2
:        nKeySym 
= VK_F2
; break; 
4402         case WXK_F3
:        nKeySym 
= VK_F3
; break; 
4403         case WXK_F4
:        nKeySym 
= VK_F4
; break; 
4404         case WXK_F5
:        nKeySym 
= VK_F5
; break; 
4405         case WXK_F6
:        nKeySym 
= VK_F6
; break; 
4406         case WXK_F7
:        nKeySym 
= VK_F7
; break; 
4407         case WXK_F8
:        nKeySym 
= VK_F8
; break; 
4408         case WXK_F9
:        nKeySym 
= VK_F9
; break; 
4409         case WXK_F10
:       nKeySym 
= VK_F10
; break; 
4410         case WXK_F11
:       nKeySym 
= VK_F11
; break; 
4411         case WXK_F12
:       nKeySym 
= VK_F12
; break; 
4412         case WXK_F13
:       nKeySym 
= VK_F13
; break; 
4413         case WXK_F14
:       nKeySym 
= VK_F14
; break; 
4414         case WXK_F15
:       nKeySym 
= VK_F15
; break; 
4415         case WXK_F16
:       nKeySym 
= VK_F16
; break; 
4416         case WXK_F17
:       nKeySym 
= VK_F17
; break; 
4417         case WXK_F18
:       nKeySym 
= VK_F18
; break; 
4418         case WXK_F19
:       nKeySym 
= VK_F19
; break; 
4419         case WXK_F20
:       nKeySym 
= VK_F20
; break; 
4420         case WXK_F21
:       nKeySym 
= VK_F21
; break; 
4421         case WXK_F22
:       nKeySym 
= VK_F22
; break; 
4422         case WXK_F23
:       nKeySym 
= VK_F23
; break; 
4423         case WXK_F24
:       nKeySym 
= VK_F24
; break; 
4424         case WXK_NUMLOCK
:   nKeySym 
= VK_NUMLOCK
; break; 
4425         case WXK_SCROLL
:    nKeySym 
= VK_SCRLLOCK
; break; 
4429                 *bIsVirtual 
= false; 
4435 } // end of wxCharCodeWXToOS2 
4438 bool wxGetKeyState(wxKeyCode key
) 
4440     wxASSERT_MSG(key 
!= WXK_LBUTTON 
&& key 
!= WXK_RBUTTON 
&& key 
!= 
4441         WXK_MBUTTON
, wxT("can't use wxGetKeyState() for mouse buttons")); 
4443     const LONG vk 
= wxCharCodeWXToOS2(key
); 
4444     // if the requested key is a LED key, return true if the led is pressed 
4445     if ( key 
== WXK_NUMLOCK 
|| key 
== WXK_CAPITAL 
|| key 
== WXK_SCROLL 
) 
4447         // low order bit means LED is highlighted and high order one means the 
4448         // key is down; for compatibility with the other ports return true if 
4449         // either one is set 
4450         return ::WinGetKeyState(HWND_DESKTOP
, vk
) != 0; 
4455         return IsKeyDown(vk
); 
4460 wxWindow
* wxGetActiveWindow() 
4462     HWND                            hWnd 
= ::WinQueryActiveWindow(HWND_DESKTOP
); 
4466         return wxFindWinFromHandle((WXHWND
)hWnd
); 
4469 } // end of wxGetActiveWindow 
4472 const wxChar
* wxGetMessageName( int nMessage 
) 
4476         case 0x0000: return wxT("WM_NULL"); 
4477         case 0x0001: return wxT("WM_CREATE"); 
4478         case 0x0002: return wxT("WM_DESTROY"); 
4479         case 0x0004: return wxT("WM_ENABLE"); 
4480         case 0x0005: return wxT("WM_SHOW"); 
4481         case 0x0006: return wxT("WM_MOVE"); 
4482         case 0x0007: return wxT("WM_SIZE"); 
4483         case 0x0008: return wxT("WM_ADJUSTWINDOWPOS"); 
4484         case 0x0009: return wxT("WM_CALCVALIDRECTS"); 
4485         case 0x000A: return wxT("WM_SETWINDOWPARAMS"); 
4486         case 0x000B: return wxT("WM_QUERYWINDOWPARAMS"); 
4487         case 0x000C: return wxT("WM_HITTEST"); 
4488         case 0x000D: return wxT("WM_ACTIVATE"); 
4489         case 0x000F: return wxT("WM_SETFOCUS"); 
4490         case 0x0010: return wxT("WM_SETSELECTION"); 
4491         case 0x0011: return wxT("WM_PPAINT"); 
4492         case 0x0012: return wxT("WM_PSETFOCUS"); 
4493         case 0x0013: return wxT("WM_PSYSCOLORCHANGE"); 
4494         case 0x0014: return wxT("WM_PSIZE"); 
4495         case 0x0015: return wxT("WM_PACTIVATE"); 
4496         case 0x0016: return wxT("WM_PCONTROL"); 
4497         case 0x0020: return wxT("WM_COMMAND"); 
4498         case 0x0021: return wxT("WM_SYSCOMMAND"); 
4499         case 0x0022: return wxT("WM_HELP"); 
4500         case 0x0023: return wxT("WM_PAINT"); 
4501         case 0x0024: return wxT("WM_TIMER"); 
4502         case 0x0025: return wxT("WM_SEM1"); 
4503         case 0x0026: return wxT("WM_SEM2"); 
4504         case 0x0027: return wxT("WM_SEM3"); 
4505         case 0x0028: return wxT("WM_SEM4"); 
4506         case 0x0029: return wxT("WM_CLOSE"); 
4507         case 0x002A: return wxT("WM_QUIT"); 
4508         case 0x002B: return wxT("WM_SYSCOLORCHANGE"); 
4509         case 0x002D: return wxT("WM_SYSVALUECHANGE"); 
4510         case 0x002E: return wxT("WM_APPTERMINATENOTIFY"); 
4511         case 0x002F: return wxT("WM_PRESPARAMCHANGED"); 
4512         // Control notification messages 
4513         case 0x0030: return wxT("WM_CONTROL"); 
4514         case 0x0031: return wxT("WM_VSCROLL"); 
4515         case 0x0032: return wxT("WM_HSCROLL"); 
4516         case 0x0033: return wxT("WM_INITMENU"); 
4517         case 0x0034: return wxT("WM_MENUSELECT"); 
4518         case 0x0035: return wxT("WM_MENUSEND"); 
4519         case 0x0036: return wxT("WM_DRAWITEM"); 
4520         case 0x0037: return wxT("WM_MEASUREITEM"); 
4521         case 0x0038: return wxT("WM_CONTROLPOINTER"); 
4522         case 0x003A: return wxT("WM_QUERYDLGCODE"); 
4523         case 0x003B: return wxT("WM_INITDLG"); 
4524         case 0x003C: return wxT("WM_SUBSTITUTESTRING"); 
4525         case 0x003D: return wxT("WM_MATCHMNEMONIC"); 
4526         case 0x003E: return wxT("WM_SAVEAPPLICATION"); 
4527         case 0x0129: return wxT("WM_CTLCOLORCHANGE"); 
4528         case 0x0130: return wxT("WM_QUERYCTLTYPE"); 
4530         case 0x0040: return wxT("WM_FLASHWINDOW"); 
4531         case 0x0041: return wxT("WM_FORMATFRAME"); 
4532         case 0x0042: return wxT("WM_UPDATEFRAME"); 
4533         case 0x0043: return wxT("WM_FOCUSCHANGE"); 
4534         case 0x0044: return wxT("WM_SETBORDERSIZE"); 
4535         case 0x0045: return wxT("WM_TRACKFRAME"); 
4536         case 0x0046: return wxT("WM_MINMAXFRAME"); 
4537         case 0x0047: return wxT("WM_SETICON"); 
4538         case 0x0048: return wxT("WM_QUERYICON"); 
4539         case 0x0049: return wxT("WM_SETACCELTABLE"); 
4540         case 0x004A: return wxT("WM_QUERYACCELTABLE"); 
4541         case 0x004B: return wxT("WM_TRANSLATEACCEL"); 
4542         case 0x004C: return wxT("WM_QUERYTRACKINFO"); 
4543         case 0x004D: return wxT("WM_QUERYBORDERSIZE"); 
4544         case 0x004E: return wxT("WM_NEXTMENU"); 
4545         case 0x004F: return wxT("WM_ERASEBACKGROUND"); 
4546         case 0x0050: return wxT("WM_QUERYFRAMEINFO"); 
4547         case 0x0051: return wxT("WM_QUERYFOCUSCHAIN"); 
4548         case 0x0052: return wxT("WM_OWNERPOSCHANGE"); 
4549         case 0x0053: return wxT("WM_CACLFRAMERECT"); 
4550         case 0x0055: return wxT("WM_WINDOWPOSCHANGED"); 
4551         case 0x0056: return wxT("WM_ADJUSTFRAMEPOS"); 
4552         case 0x0059: return wxT("WM_QUERYFRAMECTLCOUNT"); 
4553         case 0x005B: return wxT("WM_QUERYHELPINFO"); 
4554         case 0x005C: return wxT("WM_SETHELPINFO"); 
4555         case 0x005D: return wxT("WM_ERROR"); 
4556         case 0x005E: return wxT("WM_REALIZEPALETTE"); 
4557         // Clipboard messages 
4558         case 0x0060: return wxT("WM_RENDERFMT"); 
4559         case 0x0061: return wxT("WM_RENDERALLFMTS"); 
4560         case 0x0062: return wxT("WM_DESTROYCLIPBOARD"); 
4561         case 0x0063: return wxT("WM_PAINTCLIPBOARD"); 
4562         case 0x0064: return wxT("WM_SIZECLIPBOARD"); 
4563         case 0x0065: return wxT("WM_HSCROLLCLIPBOARD"); 
4564         case 0x0066: return wxT("WM_VSCROLLCLIPBOARD"); 
4565         case 0x0067: return wxT("WM_DRAWCLIPBOARD"); 
4567         case 0x0070: return wxT("WM_MOUSEMOVE"); 
4568         case 0x0071: return wxT("WM_BUTTON1DOWN"); 
4569         case 0x0072: return wxT("WM_BUTTON1UP"); 
4570         case 0x0073: return wxT("WM_BUTTON1DBLCLK"); 
4571         case 0x0074: return wxT("WM_BUTTON2DOWN"); 
4572         case 0x0075: return wxT("WM_BUTTON2UP"); 
4573         case 0x0076: return wxT("WM_BUTTON2DBLCLK"); 
4574         case 0x0077: return wxT("WM_BUTTON3DOWN"); 
4575         case 0x0078: return wxT("WM_BUTTON3UP"); 
4576         case 0x0079: return wxT("WM_BUTTON3DBLCLK"); 
4577         case 0x007D: return wxT("WM_MOUSEMAP"); 
4578         case 0x007E: return wxT("WM_VRNDISABLED"); 
4579         case 0x007F: return wxT("WM_VRNENABLED"); 
4580         case 0x0410: return wxT("WM_CHORD"); 
4581         case 0x0411: return wxT("WM_BUTTON1MOTIONSTART"); 
4582         case 0x0412: return wxT("WM_BUTTON1MOTIONEND"); 
4583         case 0x0413: return wxT("WM_BUTTON1CLICK"); 
4584         case 0x0414: return wxT("WM_BUTTON2MOTIONSTART"); 
4585         case 0x0415: return wxT("WM_BUTTON2MOTIONEND"); 
4586         case 0x0416: return wxT("WM_BUTTON2CLICK"); 
4587         case 0x0417: return wxT("WM_BUTTON3MOTIONSTART"); 
4588         case 0x0418: return wxT("WM_BUTTON3MOTIONEND"); 
4589         case 0x0419: return wxT("WM_BUTTON3CLICK"); 
4590         case 0x0420: return wxT("WM_BEGINDRAG"); 
4591         case 0x0421: return wxT("WM_ENDDRAG"); 
4592         case 0x0422: return wxT("WM_SINGLESELECT"); 
4593         case 0x0423: return wxT("WM_OPEN"); 
4594         case 0x0424: return wxT("WM_CONTEXTMENU"); 
4595         case 0x0425: return wxT("WM_CONTEXTHELP"); 
4596         case 0x0426: return wxT("WM_TEXTEDIT"); 
4597         case 0x0427: return wxT("WM_BEGINSELECT"); 
4598         case 0x0228: return wxT("WM_ENDSELECT"); 
4599         case 0x0429: return wxT("WM_PICKUP"); 
4600         case 0x04C0: return wxT("WM_PENFIRST"); 
4601         case 0x04FF: return wxT("WM_PENLAST"); 
4602         case 0x0500: return wxT("WM_MMPMFIRST"); 
4603         case 0x05FF: return wxT("WM_MMPMLAST"); 
4604         case 0x0600: return wxT("WM_STDDLGFIRST"); 
4605         case 0x06FF: return wxT("WM_STDDLGLAST"); 
4606         case 0x0BD0: return wxT("WM_BIDI_FIRST"); 
4607         case 0x0BFF: return wxT("WM_BIDI_LAST"); 
4609         case 0x007A: return wxT("WM_CHAR"); 
4610         case 0x007B: return wxT("WM_VIOCHAR"); 
4612         case 0x00A0: return wxT("WM_DDE_INITIATE"); 
4613         case 0x00A1: return wxT("WM_DDE_REQUEST"); 
4614         case 0x00A2: return wxT("WM_DDE_ACK"); 
4615         case 0x00A3: return wxT("WM_DDE_DATA"); 
4616         case 0x00A4: return wxT("WM_DDE_ADVISE"); 
4617         case 0x00A5: return wxT("WM_DDE_UNADVISE"); 
4618         case 0x00A6: return wxT("WM_DDE_POKE"); 
4619         case 0x00A7: return wxT("WM_DDE_EXECUTE"); 
4620         case 0x00A8: return wxT("WM_DDE_TERMINATE"); 
4621         case 0x00A9: return wxT("WM_DDE_INITIATEACK"); 
4622         case 0x00AF: return wxT("WM_DDE_LAST"); 
4624         case 0x0120: return wxT("BM_CLICK"); 
4625         case 0x0121: return wxT("BM_QUERYCHECKINDEX"); 
4626         case 0x0122: return wxT("BM_QUERYHILITE"); 
4627         case 0x0123: return wxT("BM_SETHILITE"); 
4628         case 0x0124: return wxT("BM_QUERYCHECK"); 
4629         case 0x0125: return wxT("BM_SETCHECK"); 
4630         case 0x0126: return wxT("BM_SETDEFAULT"); 
4631         case 0x0128: return wxT("BM_AUTOSIZE"); 
4633         case 0x029A: return wxT("CBID_LIST"); 
4634         case 0x029B: return wxT("CBID_EDIT"); 
4635         case 0x0170: return wxT("CBM_SHOWLIST"); 
4636         case 0x0171: return wxT("CBM_HILITE"); 
4637         case 0x0172: return wxT("CBM_ISLISTSHOWING"); 
4639         case 0x0140: return wxT("EM_QUERYCHANGED"); 
4640         case 0x0141: return wxT("EM_QUERYSEL"); 
4641         case 0x0142: return wxT("EM_SETSEL"); 
4642         case 0x0143: return wxT("EM_SETTEXTLIMIT"); 
4643         case 0x0144: return wxT("EM_CUT"); 
4644         case 0x0145: return wxT("EM_COPY"); 
4645         case 0x0146: return wxT("EM_CLEAR"); 
4646         case 0x0147: return wxT("EM_PASTE"); 
4647         case 0x0148: return wxT("EM_QUERYFIRSTCHAR"); 
4648         case 0x0149: return wxT("EM_SETFIRSTCHAR"); 
4649         case 0x014A: return wxT("EM_QUERYREADONLY"); 
4650         case 0x014B: return wxT("EM_SETREADONLY"); 
4651         case 0x014C: return wxT("EM_SETINSERTMODE"); 
4653         case 0x0160: return wxT("LM_QUERYITEMCOUNT"); 
4654         case 0x0161: return wxT("LM_INSERTITEM"); 
4655         case 0x0162: return wxT("LM_SETOPENINDEX"); 
4656         case 0x0163: return wxT("LM_DELETEITEM"); 
4657         case 0x0164: return wxT("LM_SELECTITEM"); 
4658         case 0x0165: return wxT("LM_QUERYSELECTION"); 
4659         case 0x0166: return wxT("LM_SETITEMTEXT"); 
4660         case 0x0167: return wxT("LM_QUERYITEMTEXTLENGTH"); 
4661         case 0x0168: return wxT("LM_QUERYITEMTEXT"); 
4662         case 0x0169: return wxT("LM_SETITEMHANDLE"); 
4663         case 0x016A: return wxT("LM_QUERYITEMHANDLE"); 
4664         case 0x016B: return wxT("LM_SEARCHSTRING"); 
4665         case 0x016C: return wxT("LM_SETITEMHEIGHT"); 
4666         case 0x016D: return wxT("LM_QUERYTOPINDEX"); 
4667         case 0x016E: return wxT("LM_DELETEALL"); 
4668         case 0x016F: return wxT("LM_INSERTMULITEMS"); 
4669         case 0x0660: return wxT("LM_SETITEMWIDTH"); 
4671         case 0x0180: return wxT("MM_INSERTITEM"); 
4672         case 0x0181: return wxT("MM_DELETEITEM"); 
4673         case 0x0182: return wxT("MM_QUERYITEM"); 
4674         case 0x0183: return wxT("MM_SETITEM"); 
4675         case 0x0184: return wxT("MM_QUERYITEMCOUNT"); 
4676         case 0x0185: return wxT("MM_STARTMENUMODE"); 
4677         case 0x0186: return wxT("MM_ENDMENUMODE"); 
4678         case 0x0188: return wxT("MM_REMOVEITEM"); 
4679         case 0x0189: return wxT("MM_SELECTITEM"); 
4680         case 0x018A: return wxT("MM_QUERYSELITEMID"); 
4681         case 0x018B: return wxT("MM_QUERYITEMTEXT"); 
4682         case 0x018C: return wxT("MM_QUERYITEMTEXTLENGTH"); 
4683         case 0x018D: return wxT("MM_SETITEMHANDLE"); 
4684         case 0x018E: return wxT("MM_SETITEMTEXT"); 
4685         case 0x018F: return wxT("MM_ITEMPOSITIONFROMID"); 
4686         case 0x0190: return wxT("MM_ITEMIDFROMPOSITION"); 
4687         case 0x0191: return wxT("MM_QUERYITEMATTR"); 
4688         case 0x0192: return wxT("MM_SETITEMATTR"); 
4689         case 0x0193: return wxT("MM_ISITEMVALID"); 
4690         case 0x0194: return wxT("MM_QUERYITEMRECT"); 
4691         case 0x0431: return wxT("MM_QUERYDEFAULTITEMID"); 
4692         case 0x0432: return wxT("MM_SETDEFAULTITEMID"); 
4694         case 0x01A0: return wxT("SBM_SETSCROLLBAR"); 
4695         case 0x01A1: return wxT("SBM_SETPOS"); 
4696         case 0x01A2: return wxT("SBM_QUERYPOS"); 
4697         case 0x01A3: return wxT("SBM_QUERYRANGE"); 
4698         case 0x01A6: return wxT("SBM_SETTHUMBSIZE"); 
4701         case 0x0F00: return wxT("WM_HELPBASE"); 
4702         case 0x0FFF: return wxT("WM_HELPTOP"); 
4703         // Beginning of user defined messages 
4704         case 0x1000: return wxT("WM_USER"); 
4706         // wxWidgets user defined types 
4709         // case 0x1000 + 0: return wxT("LVM_GETBKCOLOR"); 
4710         case 0x1000 + 1: return wxT("LVM_SETBKCOLOR"); 
4711         case 0x1000 + 2: return wxT("LVM_GETIMAGELIST"); 
4712         case 0x1000 + 3: return wxT("LVM_SETIMAGELIST"); 
4713         case 0x1000 + 4: return wxT("LVM_GETITEMCOUNT"); 
4714         case 0x1000 + 5: return wxT("LVM_GETITEMA"); 
4715         case 0x1000 + 75: return wxT("LVM_GETITEMW"); 
4716         case 0x1000 + 6: return wxT("LVM_SETITEMA"); 
4717         case 0x1000 + 76: return wxT("LVM_SETITEMW"); 
4718         case 0x1000 + 7: return wxT("LVM_INSERTITEMA"); 
4719         case 0x1000 + 77: return wxT("LVM_INSERTITEMW"); 
4720         case 0x1000 + 8: return wxT("LVM_DELETEITEM"); 
4721         case 0x1000 + 9: return wxT("LVM_DELETEALLITEMS"); 
4722         case 0x1000 + 10: return wxT("LVM_GETCALLBACKMASK"); 
4723         case 0x1000 + 11: return wxT("LVM_SETCALLBACKMASK"); 
4724         case 0x1000 + 12: return wxT("LVM_GETNEXTITEM"); 
4725         case 0x1000 + 13: return wxT("LVM_FINDITEMA"); 
4726         case 0x1000 + 83: return wxT("LVM_FINDITEMW"); 
4727         case 0x1000 + 14: return wxT("LVM_GETITEMRECT"); 
4728         case 0x1000 + 15: return wxT("LVM_SETITEMPOSITION"); 
4729         case 0x1000 + 16: return wxT("LVM_GETITEMPOSITION"); 
4730         case 0x1000 + 17: return wxT("LVM_GETSTRINGWIDTHA"); 
4731         case 0x1000 + 87: return wxT("LVM_GETSTRINGWIDTHW"); 
4732         case 0x1000 + 18: return wxT("LVM_HITTEST"); 
4733         case 0x1000 + 19: return wxT("LVM_ENSUREVISIBLE"); 
4734         case 0x1000 + 20: return wxT("LVM_SCROLL"); 
4735         case 0x1000 + 21: return wxT("LVM_REDRAWITEMS"); 
4736         case 0x1000 + 22: return wxT("LVM_ARRANGE"); 
4737         case 0x1000 + 23: return wxT("LVM_EDITLABELA"); 
4738         case 0x1000 + 118: return wxT("LVM_EDITLABELW"); 
4739         case 0x1000 + 24: return wxT("LVM_GETEDITCONTROL"); 
4740         case 0x1000 + 25: return wxT("LVM_GETCOLUMNA"); 
4741         case 0x1000 + 95: return wxT("LVM_GETCOLUMNW"); 
4742         case 0x1000 + 26: return wxT("LVM_SETCOLUMNA"); 
4743         case 0x1000 + 96: return wxT("LVM_SETCOLUMNW"); 
4744         case 0x1000 + 27: return wxT("LVM_INSERTCOLUMNA"); 
4745         case 0x1000 + 97: return wxT("LVM_INSERTCOLUMNW"); 
4746         case 0x1000 + 28: return wxT("LVM_DELETECOLUMN"); 
4747         case 0x1000 + 29: return wxT("LVM_GETCOLUMNWIDTH"); 
4748         case 0x1000 + 30: return wxT("LVM_SETCOLUMNWIDTH"); 
4749         case 0x1000 + 31: return wxT("LVM_GETHEADER"); 
4750         case 0x1000 + 33: return wxT("LVM_CREATEDRAGIMAGE"); 
4751         case 0x1000 + 34: return wxT("LVM_GETVIEWRECT"); 
4752         case 0x1000 + 35: return wxT("LVM_GETTEXTCOLOR"); 
4753         case 0x1000 + 36: return wxT("LVM_SETTEXTCOLOR"); 
4754         case 0x1000 + 37: return wxT("LVM_GETTEXTBKCOLOR"); 
4755         case 0x1000 + 38: return wxT("LVM_SETTEXTBKCOLOR"); 
4756         case 0x1000 + 39: return wxT("LVM_GETTOPINDEX"); 
4757         case 0x1000 + 40: return wxT("LVM_GETCOUNTPERPAGE"); 
4758         case 0x1000 + 41: return wxT("LVM_GETORIGIN"); 
4759         case 0x1000 + 42: return wxT("LVM_UPDATE"); 
4760         case 0x1000 + 43: return wxT("LVM_SETITEMSTATE"); 
4761         case 0x1000 + 44: return wxT("LVM_GETITEMSTATE"); 
4762         case 0x1000 + 45: return wxT("LVM_GETITEMTEXTA"); 
4763         case 0x1000 + 115: return wxT("LVM_GETITEMTEXTW"); 
4764         case 0x1000 + 46: return wxT("LVM_SETITEMTEXTA"); 
4765         case 0x1000 + 116: return wxT("LVM_SETITEMTEXTW"); 
4766         case 0x1000 + 47: return wxT("LVM_SETITEMCOUNT"); 
4767         case 0x1000 + 48: return wxT("LVM_SORTITEMS"); 
4768         case 0x1000 + 49: return wxT("LVM_SETITEMPOSITION32"); 
4769         case 0x1000 + 50: return wxT("LVM_GETSELECTEDCOUNT"); 
4770         case 0x1000 + 51: return wxT("LVM_GETITEMSPACING"); 
4771         case 0x1000 + 52: return wxT("LVM_GETISEARCHSTRINGA"); 
4772         case 0x1000 + 117: return wxT("LVM_GETISEARCHSTRINGW"); 
4773         case 0x1000 + 53: return wxT("LVM_SETICONSPACING"); 
4774         case 0x1000 + 54: return wxT("LVM_SETEXTENDEDLISTVIEWSTYLE"); 
4775         case 0x1000 + 55: return wxT("LVM_GETEXTENDEDLISTVIEWSTYLE"); 
4776         case 0x1000 + 56: return wxT("LVM_GETSUBITEMRECT"); 
4777         case 0x1000 + 57: return wxT("LVM_SUBITEMHITTEST"); 
4778         case 0x1000 + 58: return wxT("LVM_SETCOLUMNORDERARRAY"); 
4779         case 0x1000 + 59: return wxT("LVM_GETCOLUMNORDERARRAY"); 
4780         case 0x1000 + 60: return wxT("LVM_SETHOTITEM"); 
4781         case 0x1000 + 61: return wxT("LVM_GETHOTITEM"); 
4782         case 0x1000 + 62: return wxT("LVM_SETHOTCURSOR"); 
4783         case 0x1000 + 63: return wxT("LVM_GETHOTCURSOR"); 
4784         case 0x1000 + 64: return wxT("LVM_APPROXIMATEVIEWRECT"); 
4785         case 0x1000 + 65: return wxT("LVM_SETWORKAREA"); 
4788         case 0x1100 + 0: return wxT("TVM_INSERTITEMA"); 
4789         case 0x1100 + 50: return wxT("TVM_INSERTITEMW"); 
4790         case 0x1100 + 1: return wxT("TVM_DELETEITEM"); 
4791         case 0x1100 + 2: return wxT("TVM_EXPAND"); 
4792         case 0x1100 + 4: return wxT("TVM_GETITEMRECT"); 
4793         case 0x1100 + 5: return wxT("TVM_GETCOUNT"); 
4794         case 0x1100 + 6: return wxT("TVM_GETINDENT"); 
4795         case 0x1100 + 7: return wxT("TVM_SETINDENT"); 
4796         case 0x1100 + 8: return wxT("TVM_GETIMAGELIST"); 
4797         case 0x1100 + 9: return wxT("TVM_SETIMAGELIST"); 
4798         case 0x1100 + 10: return wxT("TVM_GETNEXTITEM"); 
4799         case 0x1100 + 11: return wxT("TVM_SELECTITEM"); 
4800         case 0x1100 + 12: return wxT("TVM_GETITEMA"); 
4801         case 0x1100 + 62: return wxT("TVM_GETITEMW"); 
4802         case 0x1100 + 13: return wxT("TVM_SETITEMA"); 
4803         case 0x1100 + 63: return wxT("TVM_SETITEMW"); 
4804         case 0x1100 + 14: return wxT("TVM_EDITLABELA"); 
4805         case 0x1100 + 65: return wxT("TVM_EDITLABELW"); 
4806         case 0x1100 + 15: return wxT("TVM_GETEDITCONTROL"); 
4807         case 0x1100 + 16: return wxT("TVM_GETVISIBLECOUNT"); 
4808         case 0x1100 + 17: return wxT("TVM_HITTEST"); 
4809         case 0x1100 + 18: return wxT("TVM_CREATEDRAGIMAGE"); 
4810         case 0x1100 + 19: return wxT("TVM_SORTCHILDREN"); 
4811         case 0x1100 + 20: return wxT("TVM_ENSUREVISIBLE"); 
4812         case 0x1100 + 21: return wxT("TVM_SORTCHILDRENCB"); 
4813         case 0x1100 + 22: return wxT("TVM_ENDEDITLABELNOW"); 
4814         case 0x1100 + 23: return wxT("TVM_GETISEARCHSTRINGA"); 
4815         case 0x1100 + 64: return wxT("TVM_GETISEARCHSTRINGW"); 
4816         case 0x1100 + 24: return wxT("TVM_SETTOOLTIPS"); 
4817         case 0x1100 + 25: return wxT("TVM_GETTOOLTIPS"); 
4820         case 0x1200 + 0: return wxT("HDM_GETITEMCOUNT"); 
4821         case 0x1200 + 1: return wxT("HDM_INSERTITEMA"); 
4822         case 0x1200 + 10: return wxT("HDM_INSERTITEMW"); 
4823         case 0x1200 + 2: return wxT("HDM_DELETEITEM"); 
4824         case 0x1200 + 3: return wxT("HDM_GETITEMA"); 
4825         case 0x1200 + 11: return wxT("HDM_GETITEMW"); 
4826         case 0x1200 + 4: return wxT("HDM_SETITEMA"); 
4827         case 0x1200 + 12: return wxT("HDM_SETITEMW"); 
4828         case 0x1200 + 5: return wxT("HDM_LAYOUT"); 
4829         case 0x1200 + 6: return wxT("HDM_HITTEST"); 
4830         case 0x1200 + 7: return wxT("HDM_GETITEMRECT"); 
4831         case 0x1200 + 8: return wxT("HDM_SETIMAGELIST"); 
4832         case 0x1200 + 9: return wxT("HDM_GETIMAGELIST"); 
4833         case 0x1200 + 15: return wxT("HDM_ORDERTOINDEX"); 
4834         case 0x1200 + 16: return wxT("HDM_CREATEDRAGIMAGE"); 
4835         case 0x1200 + 17: return wxT("HDM_GETORDERARRAY"); 
4836         case 0x1200 + 18: return wxT("HDM_SETORDERARRAY"); 
4837         case 0x1200 + 19: return wxT("HDM_SETHOTDIVIDER"); 
4840         case 0x1300 + 2: return wxT("TCM_GETIMAGELIST"); 
4841         case 0x1300 + 3: return wxT("TCM_SETIMAGELIST"); 
4842         case 0x1300 + 4: return wxT("TCM_GETITEMCOUNT"); 
4843         case 0x1300 + 5: return wxT("TCM_GETITEMA"); 
4844         case 0x1300 + 60: return wxT("TCM_GETITEMW"); 
4845         case 0x1300 + 6: return wxT("TCM_SETITEMA"); 
4846         case 0x1300 + 61: return wxT("TCM_SETITEMW"); 
4847         case 0x1300 + 7: return wxT("TCM_INSERTITEMA"); 
4848         case 0x1300 + 62: return wxT("TCM_INSERTITEMW"); 
4849         case 0x1300 + 8: return wxT("TCM_DELETEITEM"); 
4850         case 0x1300 + 9: return wxT("TCM_DELETEALLITEMS"); 
4851         case 0x1300 + 10: return wxT("TCM_GETITEMRECT"); 
4852         case 0x1300 + 11: return wxT("TCM_GETCURSEL"); 
4853         case 0x1300 + 12: return wxT("TCM_SETCURSEL"); 
4854         case 0x1300 + 13: return wxT("TCM_HITTEST"); 
4855         case 0x1300 + 14: return wxT("TCM_SETITEMEXTRA"); 
4856         case 0x1300 + 40: return wxT("TCM_ADJUSTRECT"); 
4857         case 0x1300 + 41: return wxT("TCM_SETITEMSIZE"); 
4858         case 0x1300 + 42: return wxT("TCM_REMOVEIMAGE"); 
4859         case 0x1300 + 43: return wxT("TCM_SETPADDING"); 
4860         case 0x1300 + 44: return wxT("TCM_GETROWCOUNT"); 
4861         case 0x1300 + 45: return wxT("TCM_GETTOOLTIPS"); 
4862         case 0x1300 + 46: return wxT("TCM_SETTOOLTIPS"); 
4863         case 0x1300 + 47: return wxT("TCM_GETCURFOCUS"); 
4864         case 0x1300 + 48: return wxT("TCM_SETCURFOCUS"); 
4865         case 0x1300 + 49: return wxT("TCM_SETMINTABWIDTH"); 
4866         case 0x1300 + 50: return wxT("TCM_DESELECTALL"); 
4869         case WM_USER
+1000+1: return wxT("TB_ENABLEBUTTON"); 
4870         case WM_USER
+1000+2: return wxT("TB_CHECKBUTTON"); 
4871         case WM_USER
+1000+3: return wxT("TB_PRESSBUTTON"); 
4872         case WM_USER
+1000+4: return wxT("TB_HIDEBUTTON"); 
4873         case WM_USER
+1000+5: return wxT("TB_INDETERMINATE"); 
4874         case WM_USER
+1000+9: return wxT("TB_ISBUTTONENABLED"); 
4875         case WM_USER
+1000+10: return wxT("TB_ISBUTTONCHECKED"); 
4876         case WM_USER
+1000+11: return wxT("TB_ISBUTTONPRESSED"); 
4877         case WM_USER
+1000+12: return wxT("TB_ISBUTTONHIDDEN"); 
4878         case WM_USER
+1000+13: return wxT("TB_ISBUTTONINDETERMINATE"); 
4879         case WM_USER
+1000+17: return wxT("TB_SETSTATE"); 
4880         case WM_USER
+1000+18: return wxT("TB_GETSTATE"); 
4881         case WM_USER
+1000+19: return wxT("TB_ADDBITMAP"); 
4882         case WM_USER
+1000+20: return wxT("TB_ADDBUTTONS"); 
4883         case WM_USER
+1000+21: return wxT("TB_INSERTBUTTON"); 
4884         case WM_USER
+1000+22: return wxT("TB_DELETEBUTTON"); 
4885         case WM_USER
+1000+23: return wxT("TB_GETBUTTON"); 
4886         case WM_USER
+1000+24: return wxT("TB_BUTTONCOUNT"); 
4887         case WM_USER
+1000+25: return wxT("TB_COMMANDTOINDEX"); 
4888         case WM_USER
+1000+26: return wxT("TB_SAVERESTOREA"); 
4889         case WM_USER
+1000+76: return wxT("TB_SAVERESTOREW"); 
4890         case WM_USER
+1000+27: return wxT("TB_CUSTOMIZE"); 
4891         case WM_USER
+1000+28: return wxT("TB_ADDSTRINGA"); 
4892         case WM_USER
+1000+77: return wxT("TB_ADDSTRINGW"); 
4893         case WM_USER
+1000+29: return wxT("TB_GETITEMRECT"); 
4894         case WM_USER
+1000+30: return wxT("TB_BUTTONSTRUCTSIZE"); 
4895         case WM_USER
+1000+31: return wxT("TB_SETBUTTONSIZE"); 
4896         case WM_USER
+1000+32: return wxT("TB_SETBITMAPSIZE"); 
4897         case WM_USER
+1000+33: return wxT("TB_AUTOSIZE"); 
4898         case WM_USER
+1000+35: return wxT("TB_GETTOOLTIPS"); 
4899         case WM_USER
+1000+36: return wxT("TB_SETTOOLTIPS"); 
4900         case WM_USER
+1000+37: return wxT("TB_SETPARENT"); 
4901         case WM_USER
+1000+39: return wxT("TB_SETROWS"); 
4902         case WM_USER
+1000+40: return wxT("TB_GETROWS"); 
4903         case WM_USER
+1000+42: return wxT("TB_SETCMDID"); 
4904         case WM_USER
+1000+43: return wxT("TB_CHANGEBITMAP"); 
4905         case WM_USER
+1000+44: return wxT("TB_GETBITMAP"); 
4906         case WM_USER
+1000+45: return wxT("TB_GETBUTTONTEXTA"); 
4907         case WM_USER
+1000+75: return wxT("TB_GETBUTTONTEXTW"); 
4908         case WM_USER
+1000+46: return wxT("TB_REPLACEBITMAP"); 
4909         case WM_USER
+1000+47: return wxT("TB_SETINDENT"); 
4910         case WM_USER
+1000+48: return wxT("TB_SETIMAGELIST"); 
4911         case WM_USER
+1000+49: return wxT("TB_GETIMAGELIST"); 
4912         case WM_USER
+1000+50: return wxT("TB_LOADIMAGES"); 
4913         case WM_USER
+1000+51: return wxT("TB_GETRECT"); 
4914         case WM_USER
+1000+52: return wxT("TB_SETHOTIMAGELIST"); 
4915         case WM_USER
+1000+53: return wxT("TB_GETHOTIMAGELIST"); 
4916         case WM_USER
+1000+54: return wxT("TB_SETDISABLEDIMAGELIST"); 
4917         case WM_USER
+1000+55: return wxT("TB_GETDISABLEDIMAGELIST"); 
4918         case WM_USER
+1000+56: return wxT("TB_SETSTYLE"); 
4919         case WM_USER
+1000+57: return wxT("TB_GETSTYLE"); 
4920         case WM_USER
+1000+58: return wxT("TB_GETBUTTONSIZE"); 
4921         case WM_USER
+1000+59: return wxT("TB_SETBUTTONWIDTH"); 
4922         case WM_USER
+1000+60: return wxT("TB_SETMAXTEXTROWS"); 
4923         case WM_USER
+1000+61: return wxT("TB_GETTEXTROWS"); 
4924         case WM_USER
+1000+41: return wxT("TB_GETBITMAPFLAGS"); 
4927     static wxString s_szBuf
; 
4928     s_szBuf
.Printf(wxT("<unknown message = %d>"), nMessage
); 
4929     return s_szBuf
.c_str(); 
4931 } // end of wxGetMessageName 
4933 #endif // __WXDEBUG__ 
4937 static void TranslateKbdEventToMouse( 
4945     // Construct the key mask 
4946     ULONG
&                          fwKeys 
= *pFlags
; 
4948     fwKeys 
= VK_BUTTON2
; 
4949     if ((::WinGetKeyState(HWND_DESKTOP
, VK_CTRL
) & 0x100) != 0) 
4951     if ((::WinGetKeyState(HWND_DESKTOP
, VK_SHIFT
) & 0x100) != 0) 
4955     // Simulate right mouse button click 
4959     ::WinQueryMsgPos(vHabmain
, &vPoint
); 
4963     pWin
->ScreenToClient(pX
, pY
); 
4964 } // end of TranslateKbdEventToMouse 
4967 // Find the wxWindow at the current mouse position, returning the mouse 
4969 wxWindow
* wxFindWindowAtPointer(wxPoint
& WXUNUSED(rPt
)) 
4971     return wxFindWindowAtPoint(wxGetMousePosition()); 
4974 wxWindow
* wxFindWindowAtPoint(const wxPoint
& rPt
) 
4981     HWND      hWndHit 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt2
, FALSE
); 
4982     wxWindow
* pWin 
= wxFindWinFromHandle((WXHWND
)hWndHit
) ; 
4983     HWND      hWnd 
= hWndHit
; 
4986     // Try to find a window with a wxWindow associated with it 
4988     while (!pWin 
&& (hWnd 
!= 0)) 
4990         hWnd 
= ::WinQueryWindow(hWnd
, QW_PARENT
); 
4991         pWin 
= wxFindWinFromHandle((WXHWND
)hWnd
) ; 
4996 // Get the current mouse position. 
4997 wxPoint 
wxGetMousePosition() 
5001     ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
); 
5002     return wxPoint(vPt
.x
, vPt
.y
); 
5005 wxMouseState 
wxGetMouseState() 
5008     wxPoint pt 
= wxGetMousePosition(); 
5011     ms
.SetLeftDown(IsKeyDown(VK_BUTTON1
)); 
5012     ms
.SetMiddleDown(IsKeyDown(VK_BUTTON3
)); 
5013     ms
.SetRightDown(IsKeyDown(VK_BUTTON2
)); 
5014     ms
.SetControlDown(IsCtrlDown()); 
5015     ms
.SetShiftDown(IsShiftDown()); 
5016     ms
.SetAltDown(IsKeyDown(VK_ALT
)|IsKeyDown(VK_ALTGRAF
)); 
5017     ms
.SetMetaDown(IsKeyDown(VK_ALTGRAF
)); 
5022 wxWindowOS2
* FindWindowForMouseEvent( wxWindow
* pWin
, 
5023                                       short*    WXUNUSED(pnX
), 
5024                                       short*    WXUNUSED(pnY
) ) 
5026     HWND   hWnd 
= GetHwndOf(pWin
); 
5027     HWND   hWndUnderMouse
; 
5029     BOOL   rcEnabled 
= FALSE
; 
5030     BOOL   rcVisible 
= FALSE
; 
5032     ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
5033     hWndUnderMouse 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, TRUE
); 
5034     if (hWndUnderMouse 
!= HWND_DESKTOP
) 
5036         wxWindow
*                   pWinUnderMouse 
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
); 
5040             wxWindowList::compatibility_iterator current 
= pWinUnderMouse
->GetChildren().GetFirst(); 
5041             wxWindow
*               pGrandChild 
= NULL
; 
5045             ::WinMapWindowPoints(HWND_DESKTOP
, hWndUnderMouse
, &vPoint
, 1); 
5047             // Find a child window mouse might be under 
5051                 wxWindow
*                   pChild 
= current
->GetData(); 
5053                 vPoint2
.x 
= vPoint
.x
; 
5054                 vPoint2
.y 
= vPoint
.y
; 
5055                 ::WinMapWindowPoints(hWndUnderMouse
, pChild
->GetHWND(), &vPoint2
, 1); 
5056                 ::WinQueryWindowRect(pChild
->GetHWND(), &vRect
); 
5057                 if (::WinPtInRect(vHabmain
, &vRect
, &vPoint2
)) 
5059                     if (pChild
->IsTopLevel()) 
5062                         wxWindowList::compatibility_iterator current2 
=pChild
->GetChildren().GetFirst(); 
5066                             wxWindow
*           pGrandChild 
= current2
->GetData(); 
5068                             vPoint3
.x 
= vPoint2
.x
; 
5069                             vPoint3
.y 
= vPoint2
.y
; 
5070                             ::WinMapWindowPoints( pChild
->GetHWND() 
5071                                                  ,pGrandChild
->GetHWND() 
5075                             ::WinQueryWindowRect(pGrandChild
->GetHWND(), &vRect
); 
5076                             if (::WinPtInRect(vHabmain
, &vRect
, &vPoint3
)) 
5078                                 hWndUnderMouse 
= GetHwndOf(pGrandChild
); 
5079                                 pWinUnderMouse 
= pGrandChild
; 
5082                             current2 
= current2
->GetNext(); 
5087                     hWndUnderMouse 
= GetHwndOf(pChild
); 
5088                     pWinUnderMouse 
= pChild
; 
5089                     rcVisible 
= ::WinIsWindowVisible(hWndUnderMouse
); 
5090                     rcEnabled 
= ::WinIsWindowEnabled(hWndUnderMouse
); 
5091                     if (rcVisible 
&& rcEnabled
) 
5094                 current 
= current
->GetNext(); 
5098     rcVisible 
= ::WinIsWindowVisible(hWndUnderMouse
); 
5099     rcEnabled 
= ::WinIsWindowEnabled(hWndUnderMouse
); 
5103     // Check that we have a child window which is susceptible to receive mouse 
5104     // events: for this it must be shown and enabled 
5106     if ( hWndUnderMouse 
&& 
5107          hWndUnderMouse 
!= hWnd 
&& 
5108          rcVisible 
&& rcEnabled
) 
5110         wxWindow
*                       pWinUnderMouse 
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
); 
5115             // Translate the mouse coords to the other window coords 
5117             pWin 
= pWinUnderMouse
; 
5121 } // end of FindWindowForMouseEvent