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" 
  54 #include "wx/os2/dcclient.h" 
  57     #include "wx/ownerdrw.h" 
  60 #if     wxUSE_DRAG_AND_DROP 
  64 #include "wx/os2/private.h" 
  67     #include "wx/tooltip.h" 
  71     #include "wx/notebook.h" 
  81 // Place compiler, OS specific includes here 
  85 // Standard macros -- these are for OS/2 PM, but most GUI's have something similar 
  89 //  SHORT1FROMMP -- LOWORD 
  91     #define GET_X_LPARAM(mp) ((unsigned short)(unsigned long)(mp)) 
  93 //  SHORT2FROMMP -- HIWORD 
  95     #define GET_Y_LPARAM(mp) ((unsigned short)(unsigned long)(mp >> 16)) 
  96 #endif // GET_X_LPARAM 
  99 #  define CW_USEDEFAULT    ((int)0x80000000) 
 103     #define VK_OEM_1        0xBA 
 104     #define VK_OEM_PLUS     0xBB 
 105     #define VK_OEM_COMMA    0xBC 
 106     #define VK_OEM_MINUS    0xBD 
 107     #define VK_OEM_PERIOD   0xBE 
 108     #define VK_OEM_2        0xBF 
 109     #define VK_OEM_3        0xC0 
 110     #define VK_OEM_4        0xDB 
 111     #define VK_OEM_5        0xDC 
 112     #define VK_OEM_6        0xDD 
 113     #define VK_OEM_7        0xDE 
 116 // --------------------------------------------------------------------------- 
 118 // --------------------------------------------------------------------------- 
 121 // The last PM message we got (MT-UNSAFE) 
 125 #if wxUSE_MENUS_NATIVE 
 126 extern wxMenu
*            wxCurrentPopupMenu
; 
 127 #endif // wxUSE_MENUS_NATIVE 
 129 // --------------------------------------------------------------------------- 
 131 // --------------------------------------------------------------------------- 
 134 // the window proc for all our windows; most gui's have something similar 
 136 MRESULT EXPENTRY 
wxWndProc( HWND hWnd
 
 143     const wxChar 
*wxGetMessageName(int message
); 
 146 wxWindowOS2
* FindWindowForMouseEvent( wxWindow
* pWin
 
 150 void         wxRemoveHandleAssociation(wxWindowOS2
* pWin
); 
 151 void         wxAssociateWinWithHandle( HWND         hWnd
 
 154 wxWindow
* wxFindWinFromHandle(WXHWND hWnd
); 
 157 // get the current state of SHIFT/CTRL keys 
 159 static inline bool IsKeyDown(LONG key
) {return (::WinGetKeyState(HWND_DESKTOP
, key
) & 0x8000) != 0; } 
 160 static inline bool IsShiftDown() { return IsKeyDown(VK_SHIFT
); } 
 161 static inline bool IsCtrlDown() { return IsKeyDown(VK_CTRL
); } 
 163 static wxWindow
*                    gpWinBeingCreated 
= NULL
; 
 165 // --------------------------------------------------------------------------- 
 167 // --------------------------------------------------------------------------- 
 169 // in wxUniv-OS/2 this class is abstract because it doesn't have DoPopupMenu() 
 171 #ifdef __WXUNIVERSAL__ 
 172     IMPLEMENT_ABSTRACT_CLASS(wxWindowOS2
, wxWindowBase
) 
 174     IMPLEMENT_DYNAMIC_CLASS(wxWindow
, wxWindowBase
) 
 175 #endif // __WXUNIVERSAL__/__WXPM__ 
 177 BEGIN_EVENT_TABLE(wxWindowOS2
, wxWindowBase
) 
 178     EVT_ERASE_BACKGROUND(wxWindowOS2::OnEraseBackground
) 
 179     EVT_SYS_COLOUR_CHANGED(wxWindowOS2::OnSysColourChanged
) 
 180     EVT_IDLE(wxWindowOS2::OnIdle
) 
 181     EVT_SET_FOCUS(wxWindowOS2::OnSetFocus
) 
 184 // =========================================================================== 
 186 // =========================================================================== 
 188 // --------------------------------------------------------------------------- 
 189 // wxWindow utility functions 
 190 // --------------------------------------------------------------------------- 
 193 // Find an item given the PM Window id 
 195 wxWindow
* wxWindowOS2::FindItem( 
 200     wxControl
*                      pItem 
= wxDynamicCast(this, wxControl
); 
 205         // I it we or one of our "internal" children? 
 207         if (pItem
->GetId() == lId
 
 208 #ifndef __WXUNIVERSAL__ 
 209             || (pItem
->GetSubcontrols().Index(lId
) != wxNOT_FOUND
) 
 216 #endif // wxUSE_CONTROLS 
 218     wxWindowList::compatibility_iterator  current 
= GetChildren().GetFirst(); 
 222         wxWindow
*                   pChildWin 
= current
->GetData(); 
 223         wxWindow
*                   pWnd 
= pChildWin
->FindItem(lId
); 
 228         current 
= current
->GetNext(); 
 231 } // end of wxWindowOS2::FindItem 
 234 // Find an item given the PM Window handle 
 236 wxWindow
* wxWindowOS2::FindItemByHWND( 
 241     wxWindowList::compatibility_iterator current 
= GetChildren().GetFirst(); 
 245         wxWindow
*                   pParent 
= current
->GetData(); 
 248         // Do a recursive search. 
 250         wxWindow
*                   pWnd 
= pParent
->FindItemByHWND(hWnd
); 
 257             || pParent
->IsKindOf(CLASSINFO(wxControl
)) 
 258 #endif // wxUSE_CONTROLS 
 261             wxWindow
*               pItem 
= current
->GetData(); 
 263             if (pItem
->GetHWND() == hWnd
) 
 267                 if (pItem
->ContainsHWND(hWnd
)) 
 271         current 
= current
->GetNext(); 
 274 } // end of wxWindowOS2::FindItemByHWND 
 277 // Default command handler 
 279 bool wxWindowOS2::OS2Command( WXUINT 
WXUNUSED(uParam
), 
 280                               WXWORD 
WXUNUSED(uId
) ) 
 285 // ---------------------------------------------------------------------------- 
 286 // constructors and such 
 287 // ---------------------------------------------------------------------------- 
 289 void wxWindowOS2::Init() 
 294     m_bWinCaptured 
= false; 
 296     m_fnOldWndProc          
= NULL
; 
 298     m_bMouseInWindow        
= false; 
 299     m_bLastKeydownProcessed 
= false; 
 306     m_hWndScrollBarHorz 
= 0L; 
 307     m_hWndScrollBarVert 
= 0L; 
 309     memset(&m_vWinSwp
, '\0', sizeof (SWP
)); 
 312     // Pass WM_GETDLGCODE to DefWindowProc() 
 318     m_bBackgroundTransparent 
= false; 
 321     // As all windows are created with WS_VISIBLE style... 
 325 #if wxUSE_MOUSEEVENT_HACK 
 328     m_nLastMouseEvent 
= -1; 
 329 #endif // wxUSE_MOUSEEVENT_HACK 
 330 } // wxWindowOS2::Init 
 335 wxWindowOS2::~wxWindowOS2() 
 339     for (wxWindow
* pWin 
= GetParent(); pWin
; pWin 
= pWin
->GetParent()) 
 341         wxTopLevelWindow
*           pFrame 
= wxDynamicCast(pWin
, wxTopLevelWindow
); 
 345             if (pFrame
->GetLastFocus() == this) 
 346                 pFrame
->SetLastFocus(NULL
); 
 354         if(!::WinDestroyWindow(GetHWND())) 
 356             wxLogLastError(wxT("DestroyWindow")); 
 359         // remove hWnd <-> wxWindow association 
 361         wxRemoveHandleAssociation(this); 
 363 } // end of wxWindowOS2::~wxWindowOS2 
 365 // real construction (Init() must have been called before!) 
 366 bool wxWindowOS2::Create( wxWindow
*       pParent
, 
 371                           const wxString
& rName 
) 
 373     HWND hParent 
= NULLHANDLE
; 
 374     ULONG ulCreateFlags 
= 0; 
 375     WXDWORD dwExStyle 
= 0; 
 377     wxCHECK_MSG(pParent
, false, wxT("can't create wxWindow without parent")); 
 381     // wxGTK doesn't allow to create controls with static box as the parent so 
 382     // this will result in a crash when the program is ported to wxGTK - warn 
 385     // the correct solution is to create the controls as siblings of the 
 388     wxASSERT_MSG( !wxDynamicCast(pParent
, wxStaticBox
), 
 389                   wxT("wxStaticBox can't be used as a window parent!") ); 
 390 #endif // wxUSE_STATBOX 
 392      // Ensure groupbox backgrounds are painted 
 393      if (IsKindOf(CLASSINFO(wxPanel
))) 
 394          lStyle 
&= ~wxCLIP_CHILDREN
; 
 396     if ( !CreateBase( pParent
 
 408         pParent
->AddChild(this); 
 409         hParent 
= GetWinHwnd(pParent
); 
 411         if (pParent
->IsKindOf(CLASSINFO(wxScrolledWindow
))) 
 412             ulCreateFlags 
|= WS_CLIPSIBLINGS
; 
 416     // Most wxSTYLES are really PM Class specific styles and will be 
 417     // set in those class create procs.  PM's basic windows styles are 
 420     ulCreateFlags 
|=  OS2GetCreateWindowFlags(&dwExStyle
); 
 423 #ifdef __WXUNIVERSAL__ 
 424     // no 3d effects, we draw them ourselves 
 426 #endif // !wxUniversal 
 427     if (lStyle 
& wxPOPUP_WINDOW
) 
 429         ulCreateFlags 
&= ~WS_VISIBLE
; 
 434         ulCreateFlags 
|= WS_VISIBLE
; 
 438     // Generic OS/2 Windows have no Control Data but other classes 
 439     // that call OS2Create may have some. 
 441     return(OS2Create( (PSZ
)wxCanvasClassName
 
 446                      ,NULL         
// Control Data 
 450 } // end of wxWindowOS2::Create 
 452 // --------------------------------------------------------------------------- 
 454 // --------------------------------------------------------------------------- 
 456 void wxWindowOS2::SetFocus() 
 458     HWND                            hWnd 
= GetHwnd(); 
 459     wxCHECK_RET( hWnd
, wxT("can't set focus to invalid window") ); 
 462         ::WinSetFocus(HWND_DESKTOP
, hWnd
); 
 463 } // end of wxWindowOS2::SetFocus 
 465 void wxWindowOS2::SetFocusFromKbd() 
 468     // Nothing else to do under OS/2 
 470     wxWindowBase::SetFocusFromKbd(); 
 471 } // end of wxWindowOS2::SetFocus 
 473 wxWindow
* wxWindowBase::DoFindFocus() 
 475     HWND                            hWnd 
= ::WinQueryFocus(HWND_DESKTOP
); 
 479         return wxFindWinFromHandle((WXHWND
)hWnd
); 
 482 } // wxWindowBase::DoFindFocus 
 484 void wxWindowOS2::DoEnable( bool bEnable 
) 
 486     HWND                            hWnd 
= GetHwnd(); 
 488         ::WinEnableWindow(hWnd
, (BOOL
)bEnable
); 
 491 bool wxWindowOS2::Show( bool bShow 
) 
 493     if (!wxWindowBase::Show(bShow
)) 
 496     HWND                            hWnd 
= GetHwnd(); 
 498     ::WinShowWindow(hWnd
, bShow
); 
 502         ::WinSetWindowPos(hWnd
, HWND_TOP
, 0, 0, 0, 0, SWP_ACTIVATE 
| SWP_ZORDER
); 
 505 } // end of wxWindowOS2::Show 
 507 void wxWindowOS2::Raise() 
 509     ::WinSetWindowPos(GetHwnd(), HWND_TOP
, 0, 0, 0, 0, SWP_ZORDER 
| SWP_ACTIVATE
); 
 510 } // end of wxWindowOS2::Raise 
 512 void wxWindowOS2::Lower() 
 514     ::WinSetWindowPos(GetHwnd(), HWND_BOTTOM
, 0, 0, 0, 0, SWP_ZORDER 
| SWP_DEACTIVATE
); 
 515 } // end of wxWindowOS2::Lower 
 517 void wxWindowOS2::SetLabel( const wxString
& label 
) 
 519     ::WinSetWindowText(GetHwnd(), label
.c_str()); 
 520 } // end of wxWindowOS2::SetLabel 
 522 wxString 
wxWindowOS2::GetLabel() const 
 524     return wxGetWindowText(GetHWND()); 
 525 } // end of wxWindowOS2::GetLabel 
 527 void wxWindowOS2::DoCaptureMouse() 
 529     HWND hWnd 
= GetHwnd(); 
 531     if (hWnd 
&& !m_bWinCaptured
) 
 533         ::WinSetCapture(HWND_DESKTOP
, hWnd
); 
 534         m_bWinCaptured 
= true; 
 536 } // end of wxWindowOS2::DoCaptureMouse 
 538 void wxWindowOS2::DoReleaseMouse() 
 542         ::WinSetCapture(HWND_DESKTOP
, NULLHANDLE
); 
 543         m_bWinCaptured 
= false; 
 545 } // end of wxWindowOS2::ReleaseMouse 
 547 /* static */ wxWindow
* wxWindowBase::GetCapture() 
 549     HWND hwnd 
= ::WinQueryCapture(HWND_DESKTOP
); 
 550     return hwnd 
? wxFindWinFromHandle((WXHWND
)hwnd
) : NULL
; 
 551 } // end of wxWindowBase::GetCapture 
 553 bool wxWindowOS2::SetFont( const wxFont
& rFont 
) 
 555     if (!wxWindowBase::SetFont(rFont
)) 
 561     HWND hWnd 
= GetHwnd(); 
 563     wxOS2SetFont( hWnd
, rFont 
); 
 565 } // end of wxWindowOS2::SetFont 
 567 // check if base implementation is OK 
 568 bool wxWindowOS2::SetCursor( const wxCursor
& rCursor
) 
 570     if ( !wxWindowBase::SetCursor(rCursor
)) 
 576     if ( m_cursor
.Ok() ) { 
 577         HWND                            hWnd 
= GetHwnd(); 
 581         ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
 582         ::WinQueryWindowRect(hWnd
, &vRect
); 
 584         if (::WinPtInRect(vHabmain
, &vRect
, &vPoint
) && !wxIsBusy()) 
 586             ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)m_cursor
.GetHCURSOR()); 
 590 } // end of wxWindowOS2::SetCursor 
 592 void wxWindowOS2::WarpPointer( 
 601     ::WinQueryWindowRect(GetHwnd(), &vRect
); 
 605     ::WinSetPointerPos(HWND_DESKTOP
, (LONG
)nX
, (LONG
)(nY
)); 
 606 } // end of wxWindowOS2::WarpPointer 
 609 // --------------------------------------------------------------------------- 
 611 // --------------------------------------------------------------------------- 
 613 int  wxWindowOS2::GetScrollPos( 
 617     if (nOrient 
== wxHORIZONTAL
) 
 618         return((int)::WinSendMsg(m_hWndScrollBarHorz
, SBM_QUERYPOS
, (MPARAM
)NULL
, (MPARAM
)NULL
)); 
 620         return((int)::WinSendMsg(m_hWndScrollBarVert
, SBM_QUERYPOS
, (MPARAM
)NULL
, (MPARAM
)NULL
)); 
 621 } // end of wxWindowOS2::GetScrollPos 
 623 int wxWindowOS2::GetScrollRange( 
 629     if (nOrient 
== wxHORIZONTAL
) 
 630         mr 
= ::WinSendMsg(m_hWndScrollBarHorz
, SBM_QUERYRANGE
, (MPARAM
)NULL
, (MPARAM
)NULL
); 
 632         mr 
= ::WinSendMsg(m_hWndScrollBarVert
, SBM_QUERYRANGE
, (MPARAM
)NULL
, (MPARAM
)NULL
); 
 633     return((int)SHORT2FROMMR(mr
)); 
 634 } // end of wxWindowOS2::GetScrollRange 
 636 int wxWindowOS2::GetScrollThumb( 
 640     if (nOrient 
== wxHORIZONTAL 
) 
 641         return m_nXThumbSize
; 
 643         return m_nYThumbSize
; 
 644 } // end of wxWindowOS2::GetScrollThumb 
 646 void wxWindowOS2::SetScrollPos( 
 649 , bool                              WXUNUSED(bRefresh
) 
 652     if (nOrient 
== wxHORIZONTAL 
) 
 653         ::WinSendMsg(m_hWndScrollBarHorz
, SBM_SETPOS
, (MPARAM
)nPos
, (MPARAM
)NULL
); 
 655         ::WinSendMsg(m_hWndScrollBarVert
, SBM_SETPOS
, (MPARAM
)nPos
, (MPARAM
)NULL
); 
 656 } // end of wxWindowOS2::SetScrollPos 
 658 void wxWindowOS2::SetScrollbar( int  nOrient
, 
 662                                 bool WXUNUSED(bRefresh
) ) 
 664     HWND                            hWnd 
= GetHwnd(); 
 665     int                             nOldRange 
= nRange 
- nThumbVisible
; 
 666     int                             nRange1 
= nOldRange
; 
 667     int                             nPageSize 
= nThumbVisible
; 
 668     int         nVSBWidth  
= wxSystemSettingsNative::GetMetric(wxSYS_VSCROLL_X
, 
 670     int         nHSBHeight 
= wxSystemSettingsNative::GetMetric(wxSYS_HSCROLL_Y
, 
 674     ULONG                           ulStyle 
= WS_VISIBLE 
| WS_SYNCPAINT
; 
 679     wxWindow
*                       pParent 
= GetParent(); 
 681     if (pParent 
&& pParent
->IsKindOf(CLASSINFO(wxFrame
))) 
 685         pFrame 
= wxDynamicCast(pParent
, wxFrame
); 
 686         hWndParent 
= pFrame
->GetFrame(); 
 687         hWndClient 
= GetHwndOf(pParent
); 
 692             hWndParent 
= GetHwndOf(pParent
); 
 694             hWndParent 
= GetHwnd(); 
 695         hWndClient 
= hWndParent
; 
 697     ::WinQueryWindowPos(hWndClient
, &vSwp
); 
 698     ::WinQueryWindowPos(hWnd
, &vSwpOwner
); 
 700     if (nPageSize 
> 1 && nRange 
> 0) 
 702         nRange1 
+= (nPageSize 
- 1); 
 705     vInfo
.cb 
= sizeof(SBCDATA
); 
 707     vInfo
.posLast 
= (SHORT
)nRange1
; 
 708     vInfo
.posThumb 
= (SHORT
)nPos
; 
 710     if (nOrient 
== wxHORIZONTAL 
) 
 713         if (m_hWndScrollBarHorz 
== 0L) 
 716             // Since the scrollbars are usually created before the owner is 
 717             // sized either via an OnSize event directly or via sizers or 
 718             // layout constraints, we will initially just use the coords of 
 719             // the parent window (this is usually a frame client window). But 
 720             // the bars themselves, are children of the parent frame (i.e 
 721             // siblings of the frame client.  The owner, however is the actual 
 722             // window being scrolled (or at least the one responsible for 
 723             // handling the scroll events). The owner will be resized later, 
 724             // as it is usually a child of a top level window, and when that 
 725             // is done its scrollbars will be resized and repositioned as well. 
 727             m_hWndScrollBarHorz 
= ::WinCreateWindow( hWndParent
 
 745             // The owner (the scrolled window) is a child of the Frame's 
 746             // client window, usually.  The scrollbars are children of the 
 747             // frame, itself, and thus are positioned relative to the frame's 
 748             // origin, not the frame's client window origin. 
 749             // The starting x position is the same as the starting x position 
 750             // of the owner, but in terms of the parent frame. 
 751             // The starting y position is wxSYS_HSCROLL_Y pels below the 
 752             // origin of the owner in terms of the parent frame. 
 753             // The horz bar is the same width as the owner and wxSYS_HSCROLL_Y 
 756             if (nRange1 
>= nThumbVisible
) 
 758                 ::WinSetWindowPos( m_hWndScrollBarHorz
 
 760                                   ,vSwp
.x 
+ vSwpOwner
.x
 
 761                                   ,(vSwp
.y 
+ vSwpOwner
.y
) - nHSBHeight
 
 764                                   ,SWP_MOVE 
| SWP_SIZE 
| SWP_SHOW 
| SWP_ACTIVATE 
| SWP_ZORDER
 
 766                 ::WinSendMsg( m_hWndScrollBarHorz
 
 769                              ,MPFROM2SHORT(0, (SHORT
)nRange1
) 
 771                 ::WinSendMsg( m_hWndScrollBarHorz
 
 773                              ,MPFROM2SHORT( (SHORT
)nThumbVisible
 
 780                 ::WinShowWindow(m_hWndScrollBarHorz
, FALSE
); 
 786         if (m_hWndScrollBarVert 
== 0L) 
 789             // Since the scrollbars are usually created before the owner is 
 790             // sized either via an OnSize event directly or via sizers or 
 791             // layout constraints, we will initially just use the coords of 
 792             // the parent window (this is usually a frame client window). But 
 793             // the bars themselves, are children of the parent frame (i.e 
 794             // siblings of the frame client.  The owner, however is the actual 
 795             // window being scrolled (or at least the one responsible for 
 796             // handling the scroll events). The owner will be resized later, 
 797             // as it is usually a child of a top level window, and when that 
 798             // is done its scrollbars will be resized and repositioned as well. 
 800             m_hWndScrollBarVert 
= ::WinCreateWindow( hWndParent
 
 804                                                     ,vSwp
.x 
+ vSwp
.cx 
- nVSBWidth
 
 807                                                     ,vSwp
.cy 
- nHSBHeight
 
 818             // The owner (the scrolled window) is a child of the Frame's 
 819             // client window, usually.  The scrollbars are children of the 
 820             // frame, itself and thus are positioned relative to the frame's 
 821             // origin, not the frame's client window's origin. 
 822             // Thus, the x position will be frame client's x (usually a few 
 823             // pels inside the parent frame, plus the width of the owner. 
 824             // Since we may be using sizers or layout constraints for multiple 
 825             // child scrolled windows, the y position will be the frame client's 
 826             // y pos plus the scrolled windows y position, yielding the y 
 827             // position of the scrollbar relative to the parent frame (the vert 
 828             // scrollbar is on the right and starts at the bottom of the 
 830             // It is wxSYS_VSCROLL_X pels wide and the same height as the owner. 
 832             if (nRange1 
>= nThumbVisible
) 
 834                 ::WinSetWindowPos( m_hWndScrollBarVert
 
 836                                   ,vSwp
.x 
+ vSwpOwner
.x 
+ vSwpOwner
.cx
 
 837                                   ,vSwp
.y 
+ vSwpOwner
.y
 
 840                                   ,SWP_ACTIVATE 
| SWP_MOVE 
| SWP_SIZE 
| SWP_SHOW
 
 842                 ::WinSendMsg( m_hWndScrollBarVert
 
 845                              ,MPFROM2SHORT(0, (SHORT
)nRange1
) 
 847                 ::WinSendMsg( m_hWndScrollBarVert
 
 849                              ,MPFROM2SHORT( (SHORT
)nThumbVisible
 
 856                 ::WinShowWindow(m_hWndScrollBarVert
, FALSE
); 
 858         m_nYThumbSize 
= nThumbVisible
; 
 860 } // end of wxWindowOS2::SetScrollbar 
 863 void wxWindowOS2::ScrollWindow( int nDx
, 
 865                                 const wxRect
* pRect 
) 
 869     ::WinQueryWindowRect(GetHwnd(), &vRect
); 
 870     int height 
= vRect
.yTop
; 
 873         vRect
.xLeft   
= pRect
->x
; 
 874         vRect
.yTop    
= height 
- pRect
->y
; 
 875         vRect
.xRight  
= pRect
->x 
+ pRect
->width
; 
 876         vRect
.yBottom 
= vRect
.yTop 
- pRect
->height
; 
 878     nDy 
*= -1; // flip the sign of Dy as OS/2 is opposite Windows. 
 879     ::WinScrollWindow( GetHwnd() 
 886                       ,SW_SCROLLCHILDREN 
| SW_INVALIDATERGN
 
 888 } // end of wxWindowOS2::ScrollWindow 
 890 // --------------------------------------------------------------------------- 
 892 // --------------------------------------------------------------------------- 
 894 void wxWindowOS2::SubclassWin( 
 898     HWND                            hwnd 
= (HWND
)hWnd
; 
 900     wxCHECK_RET(::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in SubclassWin") ); 
 901     wxAssociateWinWithHandle( hWnd
 
 904     if (!wxCheckWindowWndProc( hWnd
 
 905                               ,(WXFARPROC
)wxWndProc
 
 908         m_fnOldWndProc 
= (WXFARPROC
) ::WinSubclassWindow(hwnd
, (PFNWP
)wxWndProc
); 
 912         m_fnOldWndProc 
= (WXFARPROC
)NULL
; 
 914 } // end of wxWindowOS2::SubclassWin 
 916 void wxWindowOS2::UnsubclassWin() 
 919     // Restore old Window proc 
 921     HWND                            hwnd 
= GetHWND(); 
 925         wxCHECK_RET( ::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in UnsubclassWin") ); 
 927         PFNWP                       fnProc 
= (PFNWP
)::WinQueryWindowPtr(hwnd
, QWP_PFNWP
); 
 929         if ( (m_fnOldWndProc 
!= 0) && (fnProc 
!= (PFNWP
) m_fnOldWndProc
)) 
 931             WinSubclassWindow(hwnd
, (PFNWP
)m_fnOldWndProc
); 
 935 } // end of wxWindowOS2::UnsubclassWin 
 937 bool wxCheckWindowWndProc( 
 939 , WXFARPROC                         fnWndProc
 
 942     static char                     zBuffer
[512]; 
 945     ::WinQueryClassName((HWND
)hWnd
, (LONG
)512, (PCH
)zBuffer
); 
 946     ::WinQueryClassInfo(wxGetInstance(), (PSZ
)zBuffer
, &vCls
); 
 947     return(fnWndProc 
== (WXFARPROC
)vCls
.pfnWindowProc
); 
 948 } // end of WinGuiBase_CheckWindowWndProc 
 950 void wxWindowOS2::SetWindowStyleFlag( 
 954     long                            lFlagsOld 
= GetWindowStyleFlag(); 
 956     if (lFlags 
== lFlagsOld
) 
 960     // Update the internal variable 
 962     wxWindowBase::SetWindowStyleFlag(lFlags
); 
 965     // Now update the Windows style as well if needed - and if the window had 
 966     // been already created 
 972     WXDWORD                         dwExstyleOld
; 
 973     long                            lStyle 
= OS2GetStyle( lFlags
 
 976     long                            lStyleOld 
= OS2GetStyle( lFlagsOld
 
 980     if (lStyle 
!= lStyleOld
) 
 983         // Some flags (e.g. WS_VISIBLE or WS_DISABLED) should not be changed by 
 984         // this function so instead of simply setting the style to the new 
 985         // value we clear the bits which were set in styleOld but are set in 
 986         // the new one and set the ones which were not set before 
 988         long                        lStyleReal 
= ::WinQueryWindowULong(GetHwnd(), QWL_STYLE
); 
 990         lStyleReal 
&= ~lStyleOld
; 
 991         lStyleReal 
|= lStyle
; 
 993         ::WinSetWindowULong(GetHwnd(), QWL_STYLE
, lStyleReal
); 
 995 } // end of wxWindowOS2::SetWindowStyleFlag 
 997 WXDWORD 
wxWindowOS2::OS2GetStyle( long     lFlags
, 
 998                                   WXDWORD
* WXUNUSED(pdwExstyle
) ) const 
1000     WXDWORD                         dwStyle 
= 0L; 
1002     if (lFlags 
& wxCLIP_CHILDREN 
) 
1003         dwStyle 
|= WS_CLIPCHILDREN
; 
1005     if (lFlags 
& wxCLIP_SIBLINGS 
) 
1006         dwStyle 
|= WS_CLIPSIBLINGS
; 
1009 } // end of wxWindowOS2::OS2GetStyle 
1012 // Make a Windows extended style from the given wxWidgets window style 
1014 WXDWORD 
wxWindowOS2::MakeExtendedStyle( 
1016 , bool                              bEliminateBorders
 
1020    // Simply fill out with wxWindow extended styles.  We'll conjure 
1021    // something up in OS2Create and all window redrawing pieces later 
1023     WXDWORD                         dwStyle 
= 0; 
1025     if (lStyle 
& wxTRANSPARENT_WINDOW 
) 
1026         dwStyle 
|= wxTRANSPARENT_WINDOW
; 
1028     if (!bEliminateBorders
) 
1030         if (lStyle 
& wxSUNKEN_BORDER
) 
1031             dwStyle 
|= wxSUNKEN_BORDER
; 
1032         if (lStyle 
& wxDOUBLE_BORDER
) 
1033             dwStyle 
|= wxDOUBLE_BORDER
; 
1034         if (lStyle 
& wxRAISED_BORDER 
) 
1035             dwStyle 
|= wxRAISED_BORDER
; 
1036         if (lStyle 
& wxSTATIC_BORDER
) 
1037             dwStyle 
|= wxSTATIC_BORDER
; 
1040 } // end of wxWindowOS2::MakeExtendedStyle 
1043 // Setup background and foreground colours correctly 
1045 void wxWindowOS2::SetupColours() 
1048         SetBackgroundColour(GetParent()->GetBackgroundColour()); 
1049 } // end of wxWindowOS2::SetupColours 
1051 void wxWindowOS2::OnIdle( 
1052   wxIdleEvent
&                      WXUNUSED(rEvent
) 
1056     // Check if we need to send a LEAVE event 
1058     if (m_bMouseInWindow
) 
1062         ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
1063         if (::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, FALSE
) != (HWND
)GetHwnd()) 
1066             // Generate a LEAVE event 
1068             m_bMouseInWindow 
= false; 
1071             // Unfortunately the mouse button and keyboard state may have changed 
1072             // by the time the OnIdle function is called, so 'state' may be 
1082             wxMouseEvent            
rEvent(wxEVT_LEAVE_WINDOW
); 
1084             InitMouseEvent( rEvent
 
1089             (void)HandleWindowEvent(rEvent
); 
1092     if (wxUpdateUIEvent::CanUpdate(this)) 
1093         UpdateWindowUI(wxUPDATE_UI_FROMIDLE
); 
1094 } // end of wxWindowOS2::OnIdle 
1097 // Set this window to be the child of 'parent'. 
1099 bool wxWindowOS2::Reparent( wxWindowBase
* pParent
) 
1101     if (!wxWindowBase::Reparent(pParent
)) 
1104     HWND hWndChild 
= GetHwnd(); 
1105     HWND hWndParent 
= GetParent() ? GetWinHwnd(GetParent()) : (HWND
)0; 
1107     ::WinSetParent(hWndChild
, hWndParent
, TRUE
); 
1109 } // end of wxWindowOS2::Reparent 
1111 void wxWindowOS2::Update() 
1113     ::WinUpdateWindow(GetHwnd()); 
1114 } // end of wxWindowOS2::Update 
1116 void wxWindowOS2::DoFreeze() 
1118    ::WinSendMsg(GetHwnd(), WM_VRNDISABLED
, (MPARAM
)0, (MPARAM
)0); 
1119 } // end of wxWindowOS2::Freeze 
1121 void wxWindowOS2::DoThaw() 
1123    ::WinSendMsg(GetHwnd(), WM_VRNENABLED
, (MPARAM
)TRUE
, (MPARAM
)0); 
1126     // We need to refresh everything or otherwise he invalidated area is not 
1130 } // end of wxWindowOS2::Thaw 
1132 void wxWindowOS2::Refresh( bool bEraseBack
, 
1133                            const wxRect
* pRect 
) 
1135     HWND hWnd 
= GetHwnd(); 
1144             ::WinQueryWindowRect(GetHwnd(), &vOs2Rect
); 
1145             height 
= vOs2Rect
.yTop
; 
1146             vOs2Rect
.xLeft   
= pRect
->x
; 
1147             vOs2Rect
.yTop    
= height 
- pRect
->y
; 
1148             vOs2Rect
.xRight  
= pRect
->x 
+ pRect
->width
; 
1149             vOs2Rect
.yBottom 
= vOs2Rect
.yTop 
- pRect
->height
; 
1151             ::WinInvalidateRect(hWnd
, &vOs2Rect
, bEraseBack
); 
1154             ::WinInvalidateRect(hWnd
, NULL
, bEraseBack
); 
1155         if (m_hWndScrollBarHorz 
!= NULLHANDLE
) 
1156             ::WinInvalidateRect(m_hWndScrollBarHorz
, NULL
, TRUE
); 
1157         if (m_hWndScrollBarVert 
!= NULLHANDLE
) 
1158             ::WinInvalidateRect(m_hWndScrollBarVert
, NULL
, TRUE
); 
1160 } // end of wxWindowOS2::Refresh 
1162 // --------------------------------------------------------------------------- 
1164 // --------------------------------------------------------------------------- 
1166 #if wxUSE_DRAG_AND_DROP 
1167 void wxWindowOS2::SetDropTarget( 
1168   wxDropTarget
*                     pDropTarget
 
1171     m_dropTarget 
= pDropTarget
; 
1172 } // end of wxWindowOS2::SetDropTarget 
1176 // old style file-manager drag&drop support: we retain the old-style 
1177 // DragAcceptFiles in parallel with SetDropTarget. 
1179 void wxWindowOS2::DragAcceptFiles( 
1183     HWND                            hWnd 
= GetHwnd(); 
1185     if (hWnd 
&& bAccept
) 
1186         ::DrgAcceptDroppedFiles(hWnd
, NULL
, NULL
, DO_COPY
, 0L); 
1187 } // end of wxWindowOS2::DragAcceptFiles 
1189 // ---------------------------------------------------------------------------- 
1191 // ---------------------------------------------------------------------------- 
1195 void wxWindowOS2::DoSetToolTip( 
1199     wxWindowBase::DoSetToolTip(pTooltip
); 
1202         m_tooltip
->SetWindow(this); 
1203 } // end of wxWindowOS2::DoSetToolTip 
1205 #endif // wxUSE_TOOLTIPS 
1207 // --------------------------------------------------------------------------- 
1208 // moving and resizing 
1209 // --------------------------------------------------------------------------- 
1212 void wxWindowOS2::DoGetSize( 
1220     if (IsKindOf(CLASSINFO(wxFrame
))) 
1222         wxFrame
*                    pFrame 
= wxDynamicCast(this, wxFrame
); 
1223         hWnd 
= pFrame
->GetFrame(); 
1228     ::WinQueryWindowRect(hWnd
, &vRect
); 
1231         *pWidth 
= vRect
.xRight 
- vRect
.xLeft
; 
1233         // OS/2 PM is backwards from windows 
1234         *pHeight 
= vRect
.yTop 
- vRect
.yBottom
; 
1235 } // end of wxWindowOS2::DoGetSize 
1237 void wxWindowOS2::DoGetPosition( 
1243     // Return parameters assume wxWidgets coordinate system 
1248     wxWindow
*                       pParent 
= GetParent(); 
1251     // It would seem that WinQueryWindowRect would be the correlary to 
1252     // the WIN32 WinGetRect, but unlike WinGetRect which returns the window 
1253     // origin position in screen coordinates, WinQueryWindowRect returns it 
1254     // relative to itself, i.e. (0,0).  To get the same under PM we must 
1255     // use WinQueryWindowPos.  This call, unlike the WIN32 call, however, 
1256     // returns a position relative to it's parent, so no parent adujstments 
1257     // are needed under OS/2.  Also, windows should be created using 
1258     // wxWindow coordinates, i.e 0,0 is the TOP left. 
1260     if (IsKindOf(CLASSINFO(wxFrame
))) 
1262         wxFrame
*                    pFrame 
= wxDynamicCast(this, wxFrame
); 
1263         hWnd 
= pFrame
->GetFrame(); 
1268     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1273     // We need to convert to wxWidgets coordinates 
1275     DoGetSize(NULL
,&vHeight
); 
1276     wxWindow
* pWindow 
= wxDynamicCast(this,wxWindow
); 
1277     vPoint
.y 
= pWindow
->GetOS2ParentHeight(pParent
) - vPoint
.y 
- vHeight
; 
1280     // We may be faking the client origin. So a window that's really at (0, 
1281     // 30) may appear (to wxWin apps) to be at (0, 0). 
1285         wxPoint                     
vPt(pParent
->GetClientAreaOrigin()); 
1295 } // end of wxWindowOS2::DoGetPosition 
1297 void wxWindowOS2::DoScreenToClient( 
1302     HWND                            hWnd 
= GetHwnd(); 
1305     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1311 } // end of wxWindowOS2::DoScreenToClient 
1313 void wxWindowOS2::DoClientToScreen( 
1318     HWND                            hWnd 
= GetHwnd(); 
1321     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1327 } // end of wxWindowOS2::DoClientToScreen 
1330 // Get size *available for subwindows* i.e. excluding menu bar etc. 
1331 // Must be a frame type window 
1333 void wxWindowOS2::DoGetClientSize( 
1338     HWND                            hWnd 
= GetHwnd(); 
1341    ::WinQueryWindowRect(hWnd
, &vRect
); 
1342     if (IsKindOf(CLASSINFO(wxDialog
))) 
1347         // For a Dialog we have to explicitly request the client portion. 
1348         // For a Frame the hWnd IS the client window 
1350         hWndTitle 
= ::WinWindowFromID(hWnd
, FID_TITLEBAR
); 
1351         if (::WinQueryWindowRect(hWndTitle
, &vTitle
)) 
1353             if (vTitle
.yTop 
- vTitle
.yBottom 
== 0) 
1356                 // Dialog has not been created yet, use a default 
1360             vRect
.yTop 
-= (vTitle
.yTop 
- vTitle
.yBottom
); 
1363         ULONG                       uStyle 
= ::WinQueryWindowULong(hWnd
, QWL_STYLE
); 
1366         // Deal with borders 
1368         if (uStyle 
& FCF_DLGBORDER
) 
1375         else if (uStyle 
& FCF_SIZEBORDER
) 
1382         else if (uStyle 
& FCF_BORDER
) 
1389         else // make some kind of adjustment or top sizers ram into the titlebar! 
1398         *pWidth  
= vRect
.xRight 
- vRect
.xLeft
; 
1400         *pHeight 
= vRect
.yTop 
- vRect
.yBottom
; 
1401 } // end of wxWindowOS2::DoGetClientSize 
1403 void wxWindowOS2::DoMoveWindow( 
1411     // Input parameters assume wxWidgets coordinate system 
1414     wxWindow
*                       pParent 
= GetParent(); 
1415     HWND                            hWnd 
= GetHwnd(); 
1417     if (pParent 
&& !IsKindOf(CLASSINFO(wxDialog
))) 
1419         int                         nOS2Height 
= GetOS2ParentHeight(pParent
); 
1421         nY 
= nOS2Height 
- (nY 
+ nHeight
); 
1427         ::WinQueryWindowRect(HWND_DESKTOP
, &vRect
); 
1428         nY 
= vRect
.yTop 
- (nY 
+ nHeight
); 
1432     // In the case of a frame whose client is sized, the client cannot be 
1433     // large than its parent frame minus its borders! This usually happens 
1434     // when using an autosizer to size a frame to precisely hold client 
1435     // controls as in the notebook sample. 
1437     // In this case, we may need to resize both a frame and its client so we 
1438     // need a quick calc of the frame border size, then if the frame 
1439     // (less its borders) is smaller than the client, size the frame to 
1440     // encompass the client with the appropriate border size. 
1442     if (IsKindOf(CLASSINFO(wxFrame
))) 
1445         int                         nWidthFrameDelta 
= 0; 
1446         int                         nHeightFrameDelta 
= 0; 
1449         pFrame 
= wxDynamicCast(this, wxFrame
); 
1450         hWnd 
= pFrame
->GetFrame(); 
1451         ::WinQueryWindowRect(hWnd
, &vRect
); 
1452         ::WinMapWindowPoints(hWnd
, HWND_DESKTOP
, (PPOINTL
)&vRect
, 2); 
1454         ::WinCalcFrameRect(hWnd
, &vRect
, TRUE
); 
1455         nWidthFrameDelta 
= ((vRect
.xLeft 
- vFRect
.xLeft
) + (vFRect
.xRight 
- vRect
.xRight
)); 
1456         nHeightFrameDelta 
= ((vRect
.yBottom 
- vFRect
.yBottom
) + (vFRect
.yTop 
- vRect
.yTop
)); 
1457         // Input values refer to the window position relative to its parent 
1458         // which may be the Desktop so we need to calculate 
1459         // the new frame values to keep the wxWidgets frame origin constant 
1460         nY 
-= nHeightFrameDelta
; 
1461         nWidth 
+= nWidthFrameDelta
; 
1462         nHeight 
+= nHeightFrameDelta
; 
1464     ::WinSetWindowPos( hWnd
 
1470                       ,SWP_SIZE 
| SWP_MOVE
 
1472     if (m_vWinSwp
.cx 
== 0 && m_vWinSwp
.cy 
== 0 && m_vWinSwp
.fl 
== 0) 
1476         ::WinQueryWindowPos(hWnd
, &m_vWinSwp
); 
1480         // Handle resizing of scrolled windows.  The target or window to 
1481         // be scrolled is the owner (gets the scroll notifications).  The 
1482         // parent is usually the parent frame of the scrolled panel window. 
1483         // In order to show the scrollbars the target window will be shrunk 
1484         // by the size of the scroll bar widths and moved in the X and Y 
1485         // directon.  That value will be computed as part of the diff for 
1486         // moving the children.  Everytime the window is sized the 
1487         // toplevel OnSize is going to resize the panel to fit the client 
1488         // or the whole sizer and will need to me resized. This will send 
1489         // a WM_SIZE out which will be intercepted by the ScrollHelper 
1490         // which will cause the scrollbars to be displayed via the SetScrollbar 
1493         if (IsKindOf(CLASSINFO(wxScrolledWindow
))) 
1495             int                     nAdjustWidth  
= 0; 
1496             int                     nAdjustHeight 
= 0; 
1497             int nHSBHeight 
= wxSystemSettingsNative::GetMetric(wxSYS_HSCROLL_Y
, 
1499             int nVSBWidth  
= wxSystemSettingsNative::GetMetric(wxSYS_VSCROLL_X
, 
1503             if (GetScrollBarHorz() == NULLHANDLE 
|| 
1504                 !WinIsWindowShowing(GetScrollBarHorz())) 
1507                 nAdjustHeight 
= nHSBHeight
; 
1508             if (GetScrollBarVert() == NULLHANDLE 
|| 
1509                 !WinIsWindowShowing(GetScrollBarVert())) 
1512                 nAdjustWidth 
= nVSBWidth
; 
1513             ::WinQueryWindowPos(hWnd
, &vSwpScroll
); 
1514             ::WinSetWindowPos( hWnd
 
1517                               ,vSwpScroll
.y 
+ nAdjustHeight
 
1518                               ,vSwpScroll
.cx 
- nAdjustWidth
 
1519                               ,vSwpScroll
.cy 
- nAdjustHeight
 
1520                               ,SWP_MOVE 
| SWP_SIZE
 
1523         ::WinQueryWindowPos(hWnd
, &m_vWinSwp
); 
1525 } // end of wxWindowOS2::DoMoveWindow 
1528 // Set the size of the window: if the dimensions are positive, just use them, 
1529 // but if any of them is equal to -1, it means that we must find the value for 
1530 // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in 
1531 // which case -1 is a valid value for x and y) 
1533 // If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate 
1534 // the width/height to best suit our contents, otherwise we reuse the current 
1537 void wxWindowOS2::DoSetSize( int nX
, 
1544     // Input & output parameters assume wxWidgets coordinate system 
1548     // Get the current size and position... 
1554     wxSize vSize 
= wxDefaultSize
; 
1556     GetPosition(&nCurrentX
, &nCurrentY
); 
1557     GetSize(&nCurrentWidth
, &nCurrentHeight
); 
1560     // ... and don't do anything (avoiding flicker) if it's already ok 
1562     if (nX 
== nCurrentX 
&& nY 
== nCurrentY 
&& 
1563         nWidth 
== nCurrentWidth 
&& nHeight 
== nCurrentHeight
) 
1568     if (nX 
== wxDefaultCoord 
&& !(nSizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
)) 
1570     if (nY 
== wxDefaultCoord 
&& !(nSizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
)) 
1573     AdjustForParentClientOrigin(nX
, nY
, nSizeFlags
); 
1575     if (nWidth 
== wxDefaultCoord
) 
1577         if (nSizeFlags 
& wxSIZE_AUTO_WIDTH
) 
1579             vSize  
= DoGetBestSize(); 
1585             // Just take the current one 
1587             nWidth 
= nCurrentWidth
; 
1591     if (nHeight 
== wxDefaultCoord
) 
1593         if (nSizeFlags 
& wxSIZE_AUTO_HEIGHT
) 
1595             if (vSize
.x 
== wxDefaultCoord
) 
1597                 vSize 
= DoGetBestSize(); 
1603             // just take the current one 
1604             nHeight 
= nCurrentHeight
; 
1608     DoMoveWindow( nX
, nY
, nWidth
, nHeight 
); 
1609 } // end of wxWindowOS2::DoSetSize 
1611 void wxWindowOS2::DoSetClientSize( int nWidth
, 
1615     // nX & nY assume wxWidgets coordinate system 
1620     GetPosition(&nX
, &nY
); 
1622     DoMoveWindow( nX
, nY
, nWidth
, nHeight 
); 
1624     wxSize 
size( nWidth
, nHeight 
); 
1625     wxSizeEvent 
vEvent( size
, m_windowId 
); 
1626     vEvent
.SetEventObject(this); 
1627     HandleWindowEvent(vEvent
); 
1628 } // end of wxWindowOS2::DoSetClientSize 
1630 // --------------------------------------------------------------------------- 
1632 // --------------------------------------------------------------------------- 
1634 int wxWindowOS2::GetCharHeight() const 
1637     FONTMETRICS                     vFontMetrics
; 
1639     hPs 
= ::WinGetPS(GetHwnd()); 
1641     if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
)) 
1643         ::WinReleasePS(hPs
); 
1646     ::WinReleasePS(hPs
); 
1647     return(vFontMetrics
.lMaxAscender 
+ vFontMetrics
.lMaxDescender
); 
1648 } // end of wxWindowOS2::GetCharHeight 
1650 int wxWindowOS2::GetCharWidth() const 
1653     FONTMETRICS                     vFontMetrics
; 
1655     hPs 
= ::WinGetPS(GetHwnd()); 
1657     if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
)) 
1659         ::WinReleasePS(hPs
); 
1662     ::WinReleasePS(hPs
); 
1663     return(vFontMetrics
.lAveCharWidth
); 
1664 } // end of wxWindowOS2::GetCharWidth 
1666 void wxWindowOS2::DoGetTextExtent( const wxString
& rString
, 
1670                                    int* pExternalLeading
, 
1671                                    const wxFont
* WXUNUSED(pTheFont
) ) const 
1673     POINTL      avPoint
[TXTBOX_COUNT
]; 
1678     FONTMETRICS vFM
; // metrics structure 
1682     hPS 
= ::WinGetPS(GetHwnd()); 
1684     l 
= rString
.length(); 
1688         // In world coordinates. 
1690         bRc 
= ::GpiQueryTextBox( hPS
, 
1692                                  (char*) rString
.wx_str(), 
1693                                  TXTBOX_COUNT
,// return maximum information 
1694                                  avPoint      
// array of coordinates points 
1698             vPtMin
.x 
= avPoint
[0].x
; 
1699             vPtMax
.x 
= avPoint
[0].x
; 
1700             vPtMin
.y 
= avPoint
[0].y
; 
1701             vPtMax
.y 
= avPoint
[0].y
; 
1702             for (i 
= 1; i 
< 4; i
++) 
1704                 if(vPtMin
.x 
> avPoint
[i
].x
) vPtMin
.x 
= avPoint
[i
].x
; 
1705                 if(vPtMin
.y 
> avPoint
[i
].y
) vPtMin
.y 
= avPoint
[i
].y
; 
1706                 if(vPtMax
.x 
< avPoint
[i
].x
) vPtMax
.x 
= avPoint
[i
].x
; 
1707                 if(vPtMax
.y 
< avPoint
[i
].y
) vPtMax
.y 
= avPoint
[i
].y
; 
1709             bRc 
= ::GpiQueryFontMetrics( hPS
 
1710                                         ,sizeof(FONTMETRICS
) 
1737         *pX 
= (vPtMax
.x 
- vPtMin
.x 
+ 1); 
1739         *pY 
= (vPtMax
.y 
- vPtMin
.y 
+ 1); 
1743             *pDescent 
= vFM
.lMaxDescender
; 
1747     if (pExternalLeading
) 
1750             *pExternalLeading 
= vFM
.lExternalLeading
; 
1752             *pExternalLeading 
= 0; 
1754     ::WinReleasePS(hPS
); 
1755 } // end of wxWindow::DoGetTextExtent 
1757 bool wxWindowOS2::IsMouseInWindow() const 
1760     // Get the mouse position 
1763     ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
); 
1766     // Find the window which currently has the cursor and go up the window 
1767     // chain until we find this window - or exhaust it 
1769     HWND hWnd 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt
, TRUE
); 
1771     while (hWnd 
&& (hWnd 
!= GetHwnd())) 
1772         hWnd 
= ::WinQueryWindow(hWnd
, QW_PARENT
); 
1774     return hWnd 
!= NULL
; 
1775 } // end of wxWindowOS2::IsMouseInWindow 
1778 // --------------------------------------------------------------------------- 
1780 // --------------------------------------------------------------------------- 
1782 #if wxUSE_MENUS_NATIVE 
1783 bool wxWindowOS2::DoPopupMenu( wxMenu
* pMenu
, int nX
, int nY 
) 
1785     HWND hWndOwner 
= GetHwnd(); 
1786     HWND hWndParent 
= GetHwnd(); 
1787     HWND hMenu 
= GetHmenuOf(pMenu
); 
1788     bool bIsWaiting 
= true; 
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
); 
1808     ::WinPopupMenu( hWndParent
 
1814                    ,PU_HCONSTRAIN 
| PU_VCONSTRAIN 
| PU_MOUSEBUTTON1 
| PU_KEYBOARD
 
1821         ::WinGetMsg(vHabmain
,&vMsg
, (HWND
)0, 0, 0); 
1822         if (vMsg
.msg 
== WM_COMMAND
) 
1824         ::WinDispatchMsg(vHabmain
, (PQMSG
)&vMsg
); 
1827     pMenu
->SetInvokingWindow(NULL
); 
1829 } // end of wxWindowOS2::DoPopupMenu 
1830 #endif // wxUSE_MENUS_NATIVE 
1832 // =========================================================================== 
1833 // pre/post message processing 
1834 // =========================================================================== 
1836 MRESULT 
wxWindowOS2::OS2DefWindowProc( WXUINT uMsg
, 
1841         return (MRESULT
)m_fnOldWndProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
); 
1843         return ::WinDefWindowProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
); 
1844 } // end of wxWindowOS2::OS2DefWindowProc 
1846 bool wxWindowOS2::OS2ProcessMessage( WXMSG
* pMsg 
) 
1848 // wxUniversal implements tab traversal itself 
1849 #ifndef __WXUNIVERSAL__ 
1850     QMSG
*                           pQMsg 
= (QMSG
*)pMsg
; 
1852     if (m_hWnd 
!= 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL
)) 
1855         // Intercept dialog navigation keys 
1857         bool   bProcess 
= true; 
1858         USHORT uKeyFlags 
= SHORT1FROMMP(pQMsg
->mp1
); 
1860         if (uKeyFlags 
& KC_KEYUP
) 
1863         if (uKeyFlags 
& KC_ALT
) 
1866         if (!(uKeyFlags 
& KC_VIRTUALKEY
)) 
1871             bool                    bCtrlDown 
= IsCtrlDown(); 
1872             bool                    bShiftDown 
= IsShiftDown(); 
1875             // WM_QUERYDLGCODE: ask the control if it wants the key for itself, 
1876             // don't process it if it's the case (except for Ctrl-Tab/Enter 
1877             // combinations which are always processed) 
1879             ULONG                   ulDlgCode 
= 0; 
1883                 ulDlgCode 
= (ULONG
)::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0); 
1886             bool bForward 
= true; 
1887             bool bWindowChange 
= false; 
1889             switch (SHORT2FROMMP(pQMsg
->mp2
)) 
1892                 // Going to make certain assumptions about specific types of controls 
1893                 // here, so we may have to alter some things later if they prove invalid 
1897                     // Shift tabl will always be a nav-key but tabs may be wanted 
1906                         // Entry Fields want tabs for themselve usually 
1910                             case DLGC_ENTRYFIELD
: 
1920                         // Ctrl-Tab cycles thru notebook pages 
1922                         bWindowChange 
= bCtrlDown
; 
1923                         bForward 
= !bShiftDown
; 
1946                             // ctrl-enter is not processed 
1950                         else if (ulDlgCode 
& DLGC_BUTTON
) 
1953                             // buttons want process Enter themselevs 
1959                             wxTopLevelWindow 
*tlw 
= wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow
); 
1960                             wxButton
*   pBtn 
= NULL
; 
1964                                 pBtn 
= wxDynamicCast(tlw
->GetDefaultItem(), wxButton
); 
1967                             if (pBtn 
&& pBtn
->IsEnabled()) 
1970                                 // If we do have a default button, do press it 
1972                                 pBtn
->OS2Command(BN_CLICKED
, 0 /* unused */); 
1975                             else if (!IsTopLevel()) 
1978                                 // if not a top level window, let parent 
1983                             // else: but if it does not it makes sense to make 
1984                             //       it work like a TAB - and that's what we do. 
1985                             //       Note that Ctrl-Enter always works this way. 
1996                 wxNavigationKeyEvent    vEvent
; 
1998                 vEvent
.SetDirection(bForward
); 
1999                 vEvent
.SetWindowChange(bWindowChange
); 
2000                 vEvent
.SetEventObject(this); 
2002                 if (HandleWindowEvent(vEvent
)) 
2004                     wxButton
*       pBtn 
= wxDynamicCast(FindFocus(), wxButton
); 
2009                         // The button which has focus should be default 
2018         // Let Dialogs process 
2020         if (::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0)); 
2024     pMsg 
= pMsg
; // just shut up the compiler 
2025 #endif // __WXUNIVERSAL__ 
2028 } // end of wxWindowOS2::OS2ProcessMessage 
2030 bool wxWindowOS2::OS2TranslateMessage( WXMSG
* pMsg 
) 
2032 #if wxUSE_ACCEL && !defined(__WXUNIVERSAL__) 
2033     return m_acceleratorTable
.Translate(m_hWnd
, pMsg
); 
2037 #endif //wxUSE_ACCEL 
2038 } // end of wxWindowOS2::OS2TranslateMessage 
2040 bool wxWindowOS2::OS2ShouldPreProcessMessage( WXMSG
* WXUNUSED(pMsg
) ) 
2042     // preprocess all messages by default 
2044 } // end of wxWindowOS2::OS2ShouldPreProcessMessage 
2046 // --------------------------------------------------------------------------- 
2047 // message params unpackers 
2048 // --------------------------------------------------------------------------- 
2050 void wxWindowOS2::UnpackCommand( 
2058     *pId 
= LOWORD(wParam
); 
2059     *phWnd 
= NULL
;  // or may be GetHWND() ? 
2060     *pCmd 
= LOWORD(lParam
); 
2061 } // end of wxWindowOS2::UnpackCommand 
2063 void wxWindowOS2::UnpackActivate( 
2070     *pState     
= LOWORD(wParam
); 
2071     *phWnd      
= (WXHWND
)lParam
; 
2072 } // end of wxWindowOS2::UnpackActivate 
2074 void wxWindowOS2::UnpackScroll( 
2085     ulId    
= (ULONG
)LONGFROMMP(wParam
); 
2086     hWnd 
= ::WinWindowFromID(GetHwnd(), ulId
); 
2087     if (hWnd 
== m_hWndScrollBarHorz 
|| hWnd 
== m_hWndScrollBarVert
) 
2088         *phWnd 
= NULLHANDLE
; 
2092     *pPos  
= SHORT1FROMMP(lParam
); 
2093     *pCode 
= SHORT2FROMMP(lParam
); 
2094 } // end of wxWindowOS2::UnpackScroll 
2096 void wxWindowOS2::UnpackMenuSelect( 
2104     *pItem 
= (WXWORD
)LOWORD(wParam
); 
2105     *pFlags 
= HIWORD(wParam
); 
2106     *phMenu 
= (WXHMENU
)lParam
; 
2107 } // end of wxWindowOS2::UnpackMenuSelect 
2109 // --------------------------------------------------------------------------- 
2110 // Main wxWidgets window proc and the window proc for wxWindow 
2111 // --------------------------------------------------------------------------- 
2114 // Hook for new window just as it's being created, when the window isn't yet 
2115 // associated with the handle 
2117 wxWindowOS2
*                         wxWndHook 
= NULL
; 
2122 MRESULT EXPENTRY 
wxWndProc( 
2129     wxWindowOS2
*                    pWnd 
= wxFindWinFromHandle((WXHWND
)hWnd
); 
2132     // When we get the first message for the HWND we just created, we associate 
2133     // it with wxWindow stored in wxWndHook 
2135     if (!pWnd 
&& wxWndHook
) 
2137         wxAssociateWinWithHandle(hWnd
, wxWndHook
); 
2140         pWnd
->SetHWND((WXHWND
)hWnd
); 
2143     MRESULT                         rc 
= (MRESULT
)0; 
2147     // Stop right here if we don't have a valid handle in our wxWindow object. 
2149     if (pWnd 
&& !pWnd
->GetHWND()) 
2151         pWnd
->SetHWND((WXHWND
) hWnd
); 
2152         rc 
= pWnd
->OS2DefWindowProc(ulMsg
, wParam
, lParam 
); 
2159             rc 
= pWnd
->OS2WindowProc(ulMsg
, wParam
, lParam
); 
2160             if ( (pWnd
->GetScrollBarHorz() != NULLHANDLE 
|| 
2161                   pWnd
->GetScrollBarVert() != NULLHANDLE
) && 
2164                 if (pWnd
->GetScrollBarHorz() != NULLHANDLE
) 
2165                     ::WinInvalidateRect(pWnd
->GetScrollBarHorz(), NULL
, TRUE
); 
2166                 if (pWnd
->GetScrollBarVert() != NULLHANDLE
) 
2167                     ::WinInvalidateRect(pWnd
->GetScrollBarVert(), NULL
, TRUE
); 
2171             rc 
= ::WinDefWindowProc(hWnd
, ulMsg
, wParam
, lParam
); 
2175 } // end of wxWndProc 
2178 // We will add (or delete) messages we need to handle at this default 
2181 MRESULT 
wxWindowOS2::OS2WindowProc( WXUINT uMsg
, 
2186     // Did we process the uMsg? 
2188     bool bProcessed 
= false; 
2192     // For most messages we should return 0 when we do process the message 
2194     mResult 
= (MRESULT
)0; 
2202                 bProcessed 
= HandleCreate( (WXLPCREATESTRUCT
)lParam
 
2208                     // Return 0 to bAllow window creation 
2210                     mResult 
= (MRESULT
)(bMayCreate 
? 0 : -1); 
2221             bProcessed 
= HandleMove( LOWORD(lParam
) 
2227             bProcessed 
= HandleSize( LOWORD(lParam
) 
2233         case WM_WINDOWPOSCHANGED
: 
2236             // Dialogs under OS/2 do not get WM_SIZE events at all. 
2237             // Instead they get this, which can function much like WM_SIZE 
2238             // PSWP contains the new sizes and positioning, PSWP+1 the old 
2239             // We use this because ADJUSTWINDOWPOS comes BEFORE the new 
2240             // position is added and our auto layout does a WinQueryWindowRect 
2241             // to get the CURRENT client size.  That is the size used to position 
2242             // child controls, so we need to already be sized 
2243             // in order to get the child controls positoned properly. 
2245             if (IsKindOf(CLASSINFO(wxDialog
)) || IsKindOf(CLASSINFO(wxFrame
))) 
2247                 PSWP                pSwp 
= (PSWP
)PVOIDFROMMP(wParam
); 
2248                 PSWP                pSwp2 
= pSwp
++; 
2250                 if (!(pSwp
->cx 
== pSwp2
->cx 
&& 
2251                       pSwp
->cy 
== pSwp2
->cy
)) 
2252                     bProcessed 
= HandleSize( pSwp
->cx
 
2256                 if (IsKindOf(CLASSINFO(wxFrame
))) 
2258                     wxFrame
*            pFrame 
= wxDynamicCast(this, wxFrame
); 
2262                         if (pFrame
->GetStatusBar()) 
2263                             pFrame
->PositionStatusBar(); 
2264                         if (pFrame
->GetToolBar()) 
2265                             pFrame
->PositionToolBar(); 
2276                 UnpackActivate( wParam
 
2282                 bProcessed 
= HandleActivate( wState
 
2290             if (SHORT1FROMMP((MPARAM
)lParam
) == TRUE
) 
2291                 bProcessed 
= HandleSetFocus((WXHWND
)(HWND
)wParam
); 
2293                 bProcessed 
= HandleKillFocus((WXHWND
)(HWND
)wParam
); 
2297             bProcessed 
= HandlePaint(); 
2302             // Don't let the DefWindowProc() destroy our window - we'll do it 
2303             // ourselves in ~wxWindow 
2306             mResult 
= (MRESULT
)TRUE
; 
2310             bProcessed 
= HandleShow(wParam 
!= 0, (int)lParam
); 
2314         // Under OS2 PM Joysticks are treated just like mouse events 
2315         // The "Motion" events will be prevelent in joysticks 
2318         case WM_BUTTON1DOWN
: 
2320         case WM_BUTTON1DBLCLK
: 
2321         case WM_BUTTON1MOTIONEND
: 
2322         case WM_BUTTON1MOTIONSTART
: 
2323         case WM_BUTTON2DOWN
: 
2325         case WM_BUTTON2DBLCLK
: 
2326         case WM_BUTTON2MOTIONEND
: 
2327         case WM_BUTTON2MOTIONSTART
: 
2328         case WM_BUTTON3DOWN
: 
2330         case WM_BUTTON3DBLCLK
: 
2331         case WM_BUTTON3MOTIONEND
: 
2332         case WM_BUTTON3MOTIONSTART
: 
2334                 short               nX 
= LOWORD(wParam
); 
2335                 short               nY 
= HIWORD(wParam
); 
2338                 // Redirect the event to a static control if necessary 
2340                 if (this == GetCapture()) 
2342                     bProcessed 
= HandleMouseEvent( uMsg
 
2345                                                   ,(WXUINT
)SHORT2FROMMP(lParam
) 
2350                     wxWindow
*       pWin 
= FindWindowForMouseEvent( this 
2354                     if (!pWin
->IsOfStandardClass()) 
2356                         if (uMsg 
== WM_BUTTON1DOWN 
&& pWin
->CanAcceptFocus() ) 
2359                     bProcessed 
= pWin
->HandleMouseEvent( uMsg
 
2362                                                         ,(WXUINT
)SHORT2FROMMP(lParam
) 
2369             bProcessed 
= HandleSysCommand(wParam
, lParam
); 
2376                 UnpackCommand(wParam
, lParam
, &id
, &hwnd
, &cmd
); 
2378                 bProcessed 
= HandleCommand(id
, cmd
, hwnd
); 
2383             // For these messages we must return TRUE if process the message 
2386         case WM_MEASUREITEM
: 
2388                 int                 nIdCtrl 
= (UINT
)wParam
; 
2390                 if ( uMsg 
== WM_DRAWITEM 
) 
2392                     bProcessed 
= OS2OnDrawItem(nIdCtrl
, 
2393                                               (WXDRAWITEMSTRUCT 
*)lParam
); 
2397                     return MRFROMLONG(OS2OnMeasureItem( nIdCtrl
 
2398                                                        ,(WXMEASUREITEMSTRUCT 
*)lParam
 
2403                     mResult 
= (MRESULT
)TRUE
; 
2407         case WM_QUERYDLGCODE
: 
2408             if (!IsOfStandardClass()) 
2412                     mResult 
= (MRESULT
)m_lDlgCode
; 
2417             //else: get the dlg code from the DefWindowProc() 
2422         // In OS/2 PM all keyboard events are of the WM_CHAR type.  Virtual key and key-up 
2423         // and key-down events are obtained from the WM_CHAR params. 
2427                 USHORT                  uKeyFlags 
= SHORT1FROMMP((MPARAM
)wParam
); 
2429                 if (uKeyFlags 
& KC_KEYUP
) 
2431                     //TODO: check if the cast to WXWORD isn't causing trouble 
2432                     bProcessed 
= HandleKeyUp(wParam
, lParam
); 
2435                 else // keydown event 
2437                     m_bLastKeydownProcessed 
= false; 
2439                     // If this has been processed by an event handler, 
2440                     // return 0 now (we've handled it). DON't RETURN 
2441                     // we still need to process further 
2443                     m_bLastKeydownProcessed 
= HandleKeyDown(wParam
, lParam
); 
2444                     if (uKeyFlags 
& KC_VIRTUALKEY
) 
2446                         USHORT          uVk 
= SHORT2FROMMP((MPARAM
)lParam
); 
2449                         // We consider these message "not interesting" to OnChar 
2462                             // Avoid duplicate messages to OnChar for these ASCII keys: they 
2463                             // will be translated by TranslateMessage() and received in WM_CHAR 
2468                                 // But set processed to false, not true to still pass them to 
2469                                 // the control's default window proc - otherwise built-in 
2470                                 // keyboard handling won't work 
2475                                 bProcessed 
= HandleChar(wParam
, lParam
); 
2479                     else // WM_CHAR -- Always an ASCII character 
2481                         if (m_bLastKeydownProcessed
) 
2484                             // The key was handled in the EVT_KEY_DOWN and handling 
2485                             // a key in an EVT_KEY_DOWN handler is meant, by 
2486                             // design, to prevent EVT_CHARs from happening 
2488                             m_bLastKeydownProcessed 
= false; 
2491                         else // do generate a CHAR event 
2493                             bProcessed 
= HandleChar(wParam
, lParam
, true); 
2506                 UnpackScroll( wParam
 
2513                 bProcessed 
= OS2OnScroll( uMsg 
== WM_HSCROLL 
? wxHORIZONTAL
 
2523             switch(SHORT2FROMMP(wParam
)) 
2527                         HWND                hWnd 
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
)); 
2528                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2535                         if (pWin
->IsKindOf(CLASSINFO(wxBitmapButton
))) 
2537                             wxBitmapButton
*     pBitmapButton 
= wxDynamicCast(pWin
, wxBitmapButton
); 
2539                             pBitmapButton
->OS2OnDraw((WXDRAWITEMSTRUCT 
*)lParam
); 
2545                 case BKN_PAGESELECTEDPENDING
: 
2547                         PPAGESELECTNOTIFY  pPage 
= (PPAGESELECTNOTIFY
)lParam
; 
2549                         if ((pPage
->ulPageIdNew 
!= pPage
->ulPageIdCur
) && 
2550                             (pPage
->ulPageIdNew 
> 0L && pPage
->ulPageIdCur 
> 0L)) 
2552                             wxWindowOS2
*        pWin 
= wxFindWinFromHandle(pPage
->hwndBook
); 
2553                             wxBookCtrlEvent     
vEvent( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
 
2554                                                        ,(int)SHORT1FROMMP(wParam
) 
2555                                                        ,(int)pPage
->ulPageIdNew
 
2556                                                        ,(int)pPage
->ulPageIdCur
 
2563                             if (pWin
->IsKindOf(CLASSINFO(wxNotebook
))) 
2565                                 wxNotebook
*         pNotebook 
= wxDynamicCast(pWin
, wxNotebook
); 
2567                                 vEvent
.SetEventObject(pWin
); 
2568                                 pNotebook
->OnSelChange(vEvent
); 
2580                 case BN_CLICKED
: // Dups as LN_SELECT and CBN_LBSELECT 
2582                         HWND                hWnd 
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
)); 
2583                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2591                         // Simulate a WM_COMMAND here, as wxWidgets expects all control 
2592                         // button clicks to generate WM_COMMAND msgs, not WM_CONTROL 
2594                         if (pWin
->IsKindOf(CLASSINFO(wxRadioBox
))) 
2596                             wxRadioBox
*         pRadioBox 
= wxDynamicCast(pWin
, wxRadioBox
); 
2598                             pRadioBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2599                                                   ,(WXWORD
)SHORT1FROMMP(wParam
) 
2602                         if (pWin
->IsKindOf(CLASSINFO(wxRadioButton
))) 
2604                             wxRadioButton
*      pRadioButton 
= wxDynamicCast(pWin
, wxRadioButton
); 
2606                             pRadioButton
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2607                                                      ,(WXWORD
)SHORT1FROMMP(wParam
) 
2610                         if (pWin
->IsKindOf(CLASSINFO(wxCheckBox
))) 
2612                             wxCheckBox
*         pCheckBox 
= wxDynamicCast(pWin
, wxCheckBox
); 
2614                             pCheckBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2615                                                   ,(WXWORD
)SHORT1FROMMP(wParam
) 
2618                         if (pWin
->IsKindOf(CLASSINFO(wxListBox
))) 
2620                             wxListBox
*          pListBox 
= wxDynamicCast(pWin
, wxListBox
); 
2622                             pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2623                                                  ,(WXWORD
)SHORT1FROMMP(wParam
) 
2625                             if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
) 
2628                         if (pWin
->IsKindOf(CLASSINFO(wxComboBox
))) 
2630                             wxComboBox
*          pComboBox 
= wxDynamicCast(pWin
, wxComboBox
); 
2632                             pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2633                                                   ,(WXWORD
)SHORT1FROMMP(wParam
) 
2636                         if (pWin
->IsKindOf(CLASSINFO(wxChoice
))) 
2638                             wxChoice
*           pChoice 
= wxDynamicCast(pWin
, wxChoice
); 
2640                             pChoice
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2641                                                 ,(WXWORD
)SHORT1FROMMP(wParam
) 
2650                         HWND                hWnd 
= HWNDFROMMP(lParam
); 
2651                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2659                         // Simulate a WM_COMMAND here, as wxWidgets expects all control 
2660                         // button clicks to generate WM_COMMAND msgs, not WM_CONTROL 
2662                         if (pWin
->IsKindOf(CLASSINFO(wxListBox
))) 
2664                             wxListBox
*          pListBox 
= wxDynamicCast(pWin
, wxListBox
); 
2666                             pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2667                                                  ,(WXWORD
)SHORT1FROMMP(wParam
) 
2669                             if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
) 
2673                         if (pWin
->IsKindOf(CLASSINFO(wxComboBox
))) 
2675                             wxComboBox
*          pComboBox 
= wxDynamicCast(pWin
, wxComboBox
); 
2677                             pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2678                                                   ,(WXWORD
)SHORT1FROMMP(wParam
) 
2686                 case SPBN_DOWNARROW
: 
2692                         ::WinSendMsg( HWNDFROMMP(lParam
) 
2695                                      ,MPFROM2SHORT( (USHORT
)10 
2696                                                    ,(USHORT
)SPBQ_UPDATEIFVALID
 
2700                         bProcessed 
= OS2OnScroll( wxVERTICAL
 
2701                                                  ,(WXWORD
)SHORT2FROMMP(wParam
) 
2708                 case SLN_SLIDERTRACK
: 
2710                         HWND         hWnd 
= ::WinWindowFromID(GetHWND(), SHORT1FROMMP(wParam
)); 
2711                         wxWindowOS2
* pChild 
= wxFindWinFromHandle(hWnd
); 
2718                         if (pChild
->IsKindOf(CLASSINFO(wxSlider
))) 
2719                             bProcessed 
= OS2OnScroll( wxVERTICAL
 
2720                                                      ,(WXWORD
)SHORT2FROMMP(wParam
) 
2721                                                      ,(WXWORD
)LONGFROMMP(lParam
) 
2729 #if defined(__VISAGECPP__) && (__IBMCPP__ >= 400) 
2730         case WM_CTLCOLORCHANGE
: 
2732                 bProcessed 
= HandleCtlColor(&hBrush
); 
2736         case WM_ERASEBACKGROUND
: 
2738             // Returning TRUE to requestw PM to paint the window background 
2739             // in SYSCLR_WINDOW. We don't really want that 
2741             bProcessed 
= HandleEraseBkgnd((WXHDC
)(HPS
)wParam
); 
2742             mResult 
= (MRESULT
)(FALSE
); 
2745             // the return value for this message is ignored 
2746         case WM_SYSCOLORCHANGE
: 
2747             bProcessed 
= HandleSysColorChange(); 
2750         case WM_REALIZEPALETTE
: 
2751             bProcessed 
= HandlePaletteChanged(); 
2754         // move all drag and drops to wxDrg 
2756             bProcessed 
= HandleEndDrag(wParam
); 
2760             bProcessed 
= HandleInitDialog((WXHWND
)(HWND
)wParam
); 
2764                 // we never set focus from here 
2765                 mResult 
= (MRESULT
)FALSE
; 
2769         // wxFrame specific message 
2770         case WM_MINMAXFRAME
: 
2771             bProcessed 
= HandleGetMinMaxInfo((PSWP
)wParam
); 
2774         case WM_SYSVALUECHANGED
: 
2775             // TODO: do something 
2776             mResult 
= (MRESULT
)TRUE
; 
2780         // Comparable to WM_SETPOINTER for windows, only for just controls 
2782         case WM_CONTROLPOINTER
: 
2783             bProcessed 
= HandleSetCursor( SHORT1FROMMP(wParam
) // Control ID 
2784                                          ,(HWND
)lParam         
// Cursor Handle 
2789                 // Returning TRUE stops the DefWindowProc() from further 
2790                 // processing this message - exactly what we need because we've 
2791                 // just set the cursor. 
2793                 mResult 
= (MRESULT
)TRUE
; 
2797 #if wxUSE_MENUS_NATIVE 
2799             if (wxCurrentPopupMenu
) 
2801                 if (GetHmenuOf(wxCurrentPopupMenu
) == (HWND
)lParam
) 
2803                     // Break out of msg loop in DoPopupMenu 
2804                     ::WinPostMsg((HWND
)lParam
,WM_COMMAND
,wParam
,0); 
2808 #endif // wxUSE_MENUS_NATIVE 
2814         wxLogTrace(wxTraceMessages
, wxT("Forwarding %s to DefWindowProc."), 
2815                    wxGetMessageName(uMsg
)); 
2816 #endif // __WXDEBUG__ 
2817         if (IsKindOf(CLASSINFO(wxFrame
))) 
2818             mResult 
= ::WinDefWindowProc(m_hWnd
, uMsg
, wParam
, lParam
); 
2819         else if (IsKindOf(CLASSINFO(wxDialog
))) 
2820             mResult 
= ::WinDefDlgProc( m_hWnd
, uMsg
, wParam
, lParam
); 
2822             mResult 
= OS2DefWindowProc(uMsg
, wParam
, lParam
); 
2825 } // end of wxWindowOS2::OS2WindowProc 
2827 // ---------------------------------------------------------------------------- 
2828 // wxWindow <-> HWND map 
2829 // ---------------------------------------------------------------------------- 
2831 wxWinHashTable 
*wxWinHandleHash 
= NULL
; 
2833 wxWindow
* wxFindWinFromHandle( 
2837     return (wxWindow 
*)wxWinHandleHash
->Get((long)hWnd
); 
2838 } // end of wxFindWinFromHandle 
2840 void wxAssociateWinWithHandle( 
2846     // Adding NULL hWnd is (first) surely a result of an error and 
2847     // (secondly) breaks menu command processing 
2849     wxCHECK_RET( hWnd 
!= (HWND
)NULL
, 
2850                  wxT("attempt to add a NULL hWnd to window list ignored") ); 
2852     wxWindow
*                       pOldWin 
= wxFindWinFromHandle((WXHWND
) hWnd
); 
2854     if (pOldWin 
&& (pOldWin 
!= pWin
)) 
2856         wxString  
Newstr(pWin
->GetClassInfo()->GetClassName()); 
2857         wxString 
Oldstr(pOldWin
->GetClassInfo()->GetClassName()); 
2858         wxLogError( wxT("Bug! New window of class %s has same HWND %X as old window of class %s"), 
2866         wxWinHandleHash
->Put( (long)hWnd
 
2870 } // end of wxAssociateWinWithHandle 
2872 void wxRemoveHandleAssociation( wxWindowOS2
* pWin 
) 
2874     wxWinHandleHash
->Delete((long)pWin
->GetHWND()); 
2875 } // end of wxRemoveHandleAssociation 
2878 // Default destroyer - override if you destroy it in some other way 
2879 // (e.g. with MDI child windows) 
2881 void wxWindowOS2::OS2DestroyWindow() 
2885 bool wxWindowOS2::OS2GetCreateWindowCoords( const wxPoint
& rPos
, 
2886                                             const wxSize
&  rSize
, 
2890                                             int& rnHeight 
) const 
2892     bool bNonDefault 
= false; 
2893     static const int DEFAULT_Y 
= 200; 
2894     static const int DEFAULT_H 
= 250; 
2896     if (rPos
.x 
== wxDefaultCoord
) 
2898         rnX 
= rnY 
= CW_USEDEFAULT
; 
2903         rnY 
= rPos
.y 
== wxDefaultCoord 
? DEFAULT_Y 
: rPos
.y
; 
2906     if (rSize
.x 
== wxDefaultCoord
) 
2908         rnWidth 
= rnHeight 
= CW_USEDEFAULT
; 
2913         rnHeight 
= rSize
.y 
== wxDefaultCoord 
? DEFAULT_H 
: rSize
.y
; 
2917 } // end of wxWindowOS2::OS2GetCreateWindowCoords 
2919 WXHWND 
wxWindowOS2::OS2GetParent() const 
2921     return m_parent 
? m_parent
->GetHWND() : NULL
; 
2924 bool wxWindowOS2::OS2Create( PSZ            zClass
, 
2925                              const wxChar
*  zTitle
, 
2927                              const wxPoint
& rPos
, 
2928                              const wxSize
&  rSize
, 
2930                              WXDWORD        
WXUNUSED(dwExStyle
), 
2939     long                 lControlId 
= 0L; 
2940     wxWindowCreationHook 
vHook(this); 
2941     wxString             
sClassName((wxChar
*)zClass
); 
2942     wxString             
sTitle(zTitle 
? zTitle 
: wxEmptyString
); 
2944     OS2GetCreateWindowCoords( rPos
 
2954         lControlId 
= GetId(); 
2955         if (GetWindowStyleFlag() & wxCLIP_SIBLINGS
) 
2957             dwStyle 
|= WS_CLIPSIBLINGS
; 
2961     // For each class "Foo" we have we also have "FooNR" ("no repaint") class 
2962     // which is the same but without CS_[HV]REDRAW class styles so using it 
2963     // ensures that the window is not fully repainted on each resize 
2965     if (!HasFlag(wxFULL_REPAINT_ON_RESIZE
)) 
2967         sClassName 
+= wxT("NR"); 
2969     m_hWnd 
= (WXHWND
)::WinCreateWindow( (HWND
)OS2GetParent() 
2985         vError 
= ::WinGetLastError(wxGetInstance()); 
2986         sError 
= wxPMErrorToStr(vError
); 
2989     SubclassWin(m_hWnd
); 
2990     SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
)); 
2992     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE
)); 
2994     LONG lColor 
= (LONG
)m_backgroundColour
.GetPixel(); 
2996     if (!::WinSetPresParam( m_hWnd
 
3002         vError 
= ::WinGetLastError(vHabmain
); 
3003         sError 
= wxPMErrorToStr(vError
); 
3004         wxLogError(wxT("Error creating frame. Error: %s\n"), sError
.c_str()); 
3013 } // end of wxWindowOS2::OS2Create 
3015 // =========================================================================== 
3016 // OS2 PM message handlers 
3017 // =========================================================================== 
3019 // --------------------------------------------------------------------------- 
3020 // window creation/destruction 
3021 // --------------------------------------------------------------------------- 
3023 bool wxWindowOS2::HandleCreate( WXLPCREATESTRUCT 
WXUNUSED(vCs
), 
3026     wxWindowCreateEvent             
vEvent((wxWindow
*)this); 
3028     (void)HandleWindowEvent(vEvent
); 
3029     *pbMayCreate 
= true; 
3031 } // end of wxWindowOS2::HandleCreate 
3033 bool wxWindowOS2::HandleDestroy() 
3035     wxWindowDestroyEvent            
vEvent((wxWindow
*)this); 
3036     vEvent
.SetId(GetId()); 
3037     (void)HandleWindowEvent(vEvent
); 
3040     // Delete our drop target if we've got one 
3042 #if wxUSE_DRAG_AND_DROP 
3043     if (m_dropTarget 
!= NULL
) 
3045         delete m_dropTarget
; 
3046         m_dropTarget 
= NULL
; 
3048 #endif // wxUSE_DRAG_AND_DROP 
3051     // WM_DESTROY handled 
3054 } // end of wxWindowOS2::HandleDestroy 
3056 // --------------------------------------------------------------------------- 
3058 // --------------------------------------------------------------------------- 
3059 void wxWindowOS2::OnSetFocus( 
3060   wxFocusEvent
&                     rEvent
 
3064 } // end of wxWindowOS2::OnSetFocus 
3066 bool wxWindowOS2::HandleActivate( 
3068 , WXHWND                            
WXUNUSED(hActivate
) 
3071     wxActivateEvent                 
vEvent( wxEVT_ACTIVATE
 
3075     vEvent
.SetEventObject(this); 
3076     return HandleWindowEvent(vEvent
); 
3077 } // end of wxWindowOS2::HandleActivate 
3079 bool wxWindowOS2::HandleSetFocus( WXHWND 
WXUNUSED(hWnd
) ) 
3082     // Notify the parent keeping track of focus for the kbd navigation 
3083     // purposes that we got it 
3085     wxChildFocusEvent               
vEventFocus((wxWindow 
*)this); 
3086     (void)HandleWindowEvent(vEventFocus
); 
3094         m_caret
->OnSetFocus(); 
3096 #endif // wxUSE_CARET 
3099     // If it's a wxTextCtrl don't send the event as it will be done 
3100     // after the control gets to process it from EN_FOCUS handler 
3101     if ( wxDynamicCastThis(wxTextCtrl
) ) 
3105 #endif // wxUSE_TEXTCTRL 
3107     wxFocusEvent                    
vEvent(wxEVT_SET_FOCUS
, m_windowId
); 
3109     vEvent
.SetEventObject(this); 
3110     return HandleWindowEvent(vEvent
); 
3111 } // end of wxWindowOS2::HandleSetFocus 
3113 bool wxWindowOS2::HandleKillFocus( WXHWND hWnd 
) 
3121         m_caret
->OnKillFocus(); 
3123 #endif // wxUSE_CARET 
3127     // If it's a wxTextCtrl don't send the event as it will be done 
3128     // after the control gets to process it. 
3130     wxTextCtrl
*                     pCtrl 
= wxDynamicCastThis(wxTextCtrl
); 
3139     // Don't send the event when in the process of being deleted.  This can 
3140     // only cause problems if the event handler tries to access the object. 
3142     if ( m_isBeingDeleted 
) 
3147     wxFocusEvent                    
vEvent( wxEVT_KILL_FOCUS
 
3151     vEvent
.SetEventObject(this); 
3154     // wxFindWinFromHandle() may return NULL, it is ok 
3156     vEvent
.SetWindow(wxFindWinFromHandle(hWnd
)); 
3157     return HandleWindowEvent(vEvent
); 
3158 } // end of wxWindowOS2::HandleKillFocus 
3160 // --------------------------------------------------------------------------- 
3162 // --------------------------------------------------------------------------- 
3164 bool wxWindowOS2::HandleShow( 
3166 , int                               WXUNUSED(nStatus
) 
3169     wxShowEvent                     
vEvent(GetId(), bShow
); 
3171     vEvent
.SetEventObject(this); 
3172     return HandleWindowEvent(vEvent
); 
3173 } // end of wxWindowOS2::HandleShow 
3175 bool wxWindowOS2::HandleInitDialog( WXHWND 
WXUNUSED(hWndFocus
) ) 
3177     wxInitDialogEvent               
vEvent(GetId()); 
3179     vEvent
.SetEventObject(this); 
3180     return HandleWindowEvent(vEvent
); 
3181 } // end of wxWindowOS2::HandleInitDialog 
3183 bool wxWindowOS2::HandleEndDrag(WXWPARAM 
WXUNUSED(wParam
)) 
3185    // TODO: We'll handle drag and drop later 
3189 bool wxWindowOS2::HandleSetCursor( USHORT 
WXUNUSED(vId
), 
3193     // Under OS/2 PM this allows the pointer to be changed 
3194     // as it passes over a control 
3196     ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)hPointer
); 
3198 } // end of wxWindowOS2::HandleSetCursor 
3200 // --------------------------------------------------------------------------- 
3201 // owner drawn stuff 
3202 // --------------------------------------------------------------------------- 
3203 bool wxWindowOS2::OS2OnDrawItem( int vId
, 
3204                                  WXDRAWITEMSTRUCT
* pItemStruct 
) 
3206 #if wxUSE_OWNER_DRAWN 
3207     wxClientDC                      
vDc(this); 
3209 #if wxUSE_MENUS_NATIVE 
3211     // Is it a menu item? 
3217         POWNERITEM                  pMeasureStruct 
= (POWNERITEM
)pItemStruct
; 
3218         wxFrame
*                    pFrame 
= (wxFrame
*)this; 
3219         wxMenuItem
*                 pMenuItem 
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
); 
3220         HDC                         hDC 
= ::GpiQueryDevice(pMeasureStruct
->hps
); 
3221         wxRect                      
vRect( pMeasureStruct
->rclItem
.xLeft
 
3222                                           ,pMeasureStruct
->rclItem
.yBottom
 
3223                                           ,pMeasureStruct
->rclItem
.xRight 
- pMeasureStruct
->rclItem
.xLeft
 
3224                                           ,pMeasureStruct
->rclItem
.yTop 
- pMeasureStruct
->rclItem
.yBottom
 
3227         wxPMDCImpl 
*impl 
= (wxPMDCImpl
*) vDc
.GetImpl(); 
3228         impl
->SetHDC( hDC
, false ); 
3229         impl
->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(wxT("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(wxT("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 HandleWindowEvent(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 HandleWindowEvent(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
->HandleWindowEvent(vEvent
); 
3478         node 
= node
->GetNext(); 
3480 } // end of wxWindowOS2::OnSysColourChanged 
3482 // --------------------------------------------------------------------------- 
3484 // --------------------------------------------------------------------------- 
3486 void wxWindow::OnPaint ( 
3487   wxPaintEvent
&                     rEvent
 
3490     HDC                             hDC 
= (HDC
)wxPaintDCImpl::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 
= HandleWindowEvent(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
) 
3675     wxClientDC 
vDC(this); 
3676     wxPMDCImpl 
*impl 
= (wxPMDCImpl
*) vDC
.GetImpl(); 
3678     impl
->SetHPS((HPS
)hDC
); // this is really a PS 
3680     wxEraseEvent 
vEvent(m_windowId
, &vDC
); 
3682     vEvent
.SetEventObject(this); 
3684     rc 
= HandleWindowEvent(vEvent
); 
3686     impl
->SetHPS(NULLHANDLE
); 
3688 } // end of wxWindowOS2::HandleEraseBkgnd 
3690 void wxWindowOS2::OnEraseBackground(wxEraseEvent
& rEvent
) 
3693     wxPMDCImpl 
*impl 
= (wxPMDCImpl
*) rEvent
.GetDC()->GetImpl(); 
3694     HPS     hPS 
= impl
->GetHPS(); 
3696     LONG    lColor 
= m_backgroundColour
.GetPixel(); 
3698     rc 
= ::WinQueryWindowRect(GetHwnd(), &vRect
); 
3699     rc 
= ::WinFillRect(hPS
, &vRect
, lColor
); 
3700 }  // end of wxWindowOS2::OnEraseBackground 
3702 // --------------------------------------------------------------------------- 
3703 // moving and resizing 
3704 // --------------------------------------------------------------------------- 
3706 bool wxWindowOS2::HandleMinimize() 
3708     wxIconizeEvent                  
vEvent(m_windowId
); 
3710     vEvent
.SetEventObject(this); 
3711     return HandleWindowEvent(vEvent
); 
3712 } // end of wxWindowOS2::HandleMinimize 
3714 bool wxWindowOS2::HandleMaximize() 
3716     wxMaximizeEvent                 
vEvent(m_windowId
); 
3718     vEvent
.SetEventObject(this); 
3719     return HandleWindowEvent(vEvent
); 
3720 } // end of wxWindowOS2::HandleMaximize 
3722 bool wxWindowOS2::HandleMove( int nX
, int nY 
) 
3725     wxMoveEvent 
vEvent(pt
, m_windowId
); 
3727     vEvent
.SetEventObject(this); 
3728     return HandleWindowEvent(vEvent
); 
3729 }  // end of wxWindowOS2::HandleMove 
3731 bool wxWindowOS2::HandleSize( int    nWidth
, 
3733                               WXUINT 
WXUNUSED(nFlag
) ) 
3735     wxSize 
sz(nWidth
, nHeight
); 
3736     wxSizeEvent 
vEvent(sz
, m_windowId
); 
3738     vEvent
.SetEventObject(this); 
3739     return HandleWindowEvent(vEvent
); 
3740 } // end of wxWindowOS2::HandleSize 
3742 bool wxWindowOS2::HandleGetMinMaxInfo( PSWP pSwp 
) 
3749             ::WinGetMaxPosition(GetHwnd(), pSwp
); 
3750             m_maxWidth 
= pSwp
->cx
; 
3751             m_maxHeight 
= pSwp
->cy
; 
3755             ::WinGetMinPosition(GetHwnd(), pSwp
, &vPoint
); 
3756             m_minWidth 
= pSwp
->cx
; 
3757             m_minHeight 
= pSwp
->cy
; 
3764 } // end of wxWindowOS2::HandleGetMinMaxInfo 
3766 // --------------------------------------------------------------------------- 
3768 // --------------------------------------------------------------------------- 
3769 bool wxWindowOS2::HandleCommand( WXWORD wId
, 
3773 #if wxUSE_MENUS_NATIVE 
3774     if (wxCurrentPopupMenu
) 
3776         wxMenu
*                     pPopupMenu 
= wxCurrentPopupMenu
; 
3778         wxCurrentPopupMenu 
= NULL
; 
3779         return pPopupMenu
->OS2Command(wCmd
, wId
); 
3781 #endif // wxUSE_MENUS_NATIVE 
3783     wxWindow
*                       pWin 
= FindItem(wId
); 
3787         pWin 
= wxFindWinFromHandle(hControl
); 
3791         return pWin
->OS2Command(wCmd
, wId
); 
3794 } // end of wxWindowOS2::HandleCommand 
3796 bool wxWindowOS2::HandleSysCommand( WXWPARAM wParam
, 
3797                                     WXLPARAM 
WXUNUSED(lParam
) ) 
3800     // 4 bits are reserved 
3802     switch (SHORT1FROMMP(wParam
)) 
3805             return HandleMaximize(); 
3808             return HandleMinimize(); 
3811 } // end of wxWindowOS2::HandleSysCommand 
3813 // --------------------------------------------------------------------------- 
3815 // --------------------------------------------------------------------------- 
3816 //TODO: check against MSW 
3817 void wxWindowOS2::InitMouseEvent( 
3818   wxMouseEvent
&                     rEvent
 
3825     DoGetSize(0, &nHeight
); 
3827     // Convert to wxWidgets standard coordinate system! 
3828     rEvent
.m_y           
= nHeight 
- nY
; 
3829     rEvent
.m_shiftDown   
= ((uFlags 
& KC_SHIFT
) != 0); 
3830     rEvent
.m_controlDown 
= ((uFlags 
& KC_CTRL
) != 0); 
3831     rEvent
.m_altDown     
= ((uFlags 
& KC_ALT
) != 0); 
3832     rEvent
.m_leftDown    
= IsKeyDown(VK_BUTTON1
); 
3833     rEvent
.m_middleDown  
= IsKeyDown(VK_BUTTON3
); 
3834     rEvent
.m_rightDown   
= IsKeyDown(VK_BUTTON2
); 
3835     rEvent
.SetTimestamp(s_currentMsg
.time
); 
3836     rEvent
.SetEventObject(this); 
3837     rEvent
.SetId(GetId()); 
3839 #if wxUSE_MOUSEEVENT_HACK 
3842     m_lastMouseEvent 
= rEvent
.GetEventType(); 
3843 #endif // wxUSE_MOUSEEVENT_HACK 
3844 } // end of wxWindowOS2::InitMouseEvent 
3846 bool wxWindowOS2::HandleMouseEvent( WXUINT uMsg
, 
3851     bool bProcessed 
= false; 
3854     // The mouse events take consecutive IDs from WM_MOUSEFIRST to 
3855     // WM_MOUSELAST, so it's enough to subtract WM_MOUSEMOVE == WM_MOUSEFIRST 
3856     // from the message id and take the value in the table to get wxWin event 
3859     static const wxEventType eventsMouse
[] = 
3874     if ((uMsg 
>= WM_MOUSEMOVE
) && (uMsg 
<= WM_BUTTON3DBLCLK
)) 
3876         wxMouseEvent 
vEvent(eventsMouse
[uMsg 
- WM_MOUSEMOVE
]); 
3878         InitMouseEvent( vEvent
 
3884         bProcessed 
= HandleWindowEvent(vEvent
); 
3887             HPOINTER hCursor 
= (HPOINTER
)GetCursor().GetHCURSOR(); 
3889             if (hCursor 
!= NULLHANDLE
) 
3891                 ::WinSetPointer(HWND_DESKTOP
, hCursor
); 
3897 } // end of wxWindowOS2::HandleMouseEvent 
3899 bool wxWindowOS2::HandleMouseMove( int nX
, 
3903     if (!m_bMouseInWindow
) 
3906         // Generate an ENTER event 
3908         m_bMouseInWindow 
= true; 
3910         wxMouseEvent 
vEvent(wxEVT_ENTER_WINDOW
); 
3912         InitMouseEvent( vEvent
 
3918         (void)HandleWindowEvent(vEvent
); 
3920     return HandleMouseEvent( WM_MOUSEMOVE
 
3925 } // end of wxWindowOS2::HandleMouseMove 
3927 // --------------------------------------------------------------------------- 
3928 // keyboard handling 
3929 // --------------------------------------------------------------------------- 
3932 // Create the key event of the given type for the given key - used by 
3933 // HandleChar and HandleKeyDown/Up 
3935 wxKeyEvent 
wxWindowOS2::CreateKeyEvent( 
3942     wxKeyEvent                      
vEvent(eType
); 
3944     vEvent
.SetId(GetId()); 
3945     vEvent
.m_shiftDown   
= IsShiftDown(); 
3946     vEvent
.m_controlDown 
= IsCtrlDown(); 
3947     vEvent
.m_altDown     
= (HIWORD(lParam
) & KC_ALT
) == KC_ALT
; 
3949     vEvent
.SetEventObject((wxWindow 
*)this); // const_cast 
3950     vEvent
.m_keyCode     
= nId
; 
3951     vEvent
.m_rawCode 
= (wxUint32
)wParam
; 
3952     vEvent
.m_rawFlags 
= (wxUint32
)lParam
; 
3953     vEvent
.SetTimestamp(s_currentMsg
.time
); 
3956     // Translate the position to client coords 
3961     ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
3962     ::WinQueryWindowRect( GetHwnd() 
3966     vPoint
.x 
-= vRect
.xLeft
; 
3967     vPoint
.y 
-= vRect
.yBottom
; 
3969     vEvent
.m_x 
= vPoint
.x
; 
3970     vEvent
.m_y 
= vPoint
.y
; 
3973 } // end of wxWindowOS2::CreateKeyEvent 
3976 // isASCII is true only when we're called from WM_CHAR handler and not from 
3979 bool wxWindowOS2::HandleChar( WXWPARAM 
WXUNUSED(wParam
), 
3983     bool bCtrlDown 
= false; 
3986     if (m_bLastKeydownProcessed
) 
3989         // The key was handled in the EVT_KEY_DOWN.  Handling a key in an 
3990         // EVT_KEY_DOWN handler is meant, by design, to prevent EVT_CHARs 
3991         // from happening, so just bail out at this point. 
3993         m_bLastKeydownProcessed 
= false; 
3999         // If 1 -> 26, translate to either special keycode or just set 
4000         // ctrlDown.  IOW, Ctrl-C should result in keycode == 3 and 
4001         // ControlDown() == true. 
4003         vId 
= SHORT1FROMMP(lParam
); 
4004         if ((vId 
> 0) && (vId 
< 27)) 
4026     else  // we're called from WM_KEYDOWN 
4028         vId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4033     wxKeyEvent 
vEvent(CreateKeyEvent( wxEVT_CHAR
, vId
, lParam 
)); 
4037         vEvent
.m_controlDown 
= true; 
4040     return (HandleWindowEvent(vEvent
)); 
4043 bool wxWindowOS2::HandleKeyDown( WXWPARAM wParam
, 
4046     int nId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4051         // Normal ASCII char 
4053         nId 
= SHORT1FROMMP(lParam
); 
4058         wxKeyEvent  
vEvent(CreateKeyEvent( wxEVT_KEY_DOWN
 
4064         if (HandleWindowEvent(vEvent
)) 
4070 } // end of wxWindowOS2::HandleKeyDown 
4072 bool wxWindowOS2::HandleKeyUp( WXWPARAM wParam
, 
4075     int nId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4080         // Normal ASCII char 
4082         nId 
= CHAR1FROMMP(lParam
); 
4087         wxKeyEvent 
vEvent(CreateKeyEvent( wxEVT_KEY_UP
 
4093         if (HandleWindowEvent(vEvent
)) 
4097 } // end of wxWindowOS2::HandleKeyUp 
4099 // --------------------------------------------------------------------------- 
4101 // --------------------------------------------------------------------------- 
4103 // --------------------------------------------------------------------------- 
4105 // --------------------------------------------------------------------------- 
4107 bool wxWindowOS2::OS2OnScroll( int nOrientation
, 
4114         wxWindow
*                   pChild 
= wxFindWinFromHandle(hControl
); 
4117             return pChild
->OS2OnScroll( nOrientation
 
4124     wxScrollWinEvent                vEvent
; 
4126     vEvent
.SetPosition(wPos
); 
4127     vEvent
.SetOrientation(nOrientation
); 
4128     vEvent
.SetEventObject(this); 
4133             vEvent
.SetEventType(wxEVT_SCROLLWIN_LINEUP
); 
4137             vEvent
.SetEventType(wxEVT_SCROLLWIN_LINEDOWN
); 
4141             vEvent
.SetEventType(wxEVT_SCROLLWIN_PAGEUP
); 
4145             vEvent
.SetEventType(wxEVT_SCROLLWIN_PAGEDOWN
); 
4148         case SB_SLIDERPOSITION
: 
4149             vEvent
.SetEventType(wxEVT_SCROLLWIN_THUMBRELEASE
); 
4152         case SB_SLIDERTRACK
: 
4153             vEvent
.SetEventType(wxEVT_SCROLLWIN_THUMBTRACK
); 
4159     return HandleWindowEvent(vEvent
); 
4160 } // end of wxWindowOS2::OS2OnScroll 
4163 //  Getting the Y position for a window, like a control, is a real 
4164 //  pain.  There are three situations we must deal with in determining 
4165 //  the OS2 to wxWidgets Y coordinate. 
4167 //  1)  The controls are created in a dialog. 
4168 //      This is the easiest since a dialog is created with its original 
4169 //      size so the standard: Y = ParentHeight - (Y + ControlHeight); 
4171 //  2)  The controls are direct children of a frame 
4172 //      In this instance the controls are actually children of the Frame's 
4173 //      client.  During creation the frame's client resizes several times 
4174 //      during creation of the status bar and toolbars.  The CFrame class 
4175 //      will take care of this using its AlterChildPos proc. 
4177 //  3)  The controls are children of a panel, which in turn is a child of 
4179 //      The panel may be one of many, in which case the same treatment 
4180 //      as 1 applies. It may be the only child, though. 
4181 //      This is the nastiest case.  A panel is created as the only child of 
4182 //      the frame and as such, when a frame has only one child, the child is 
4183 //      expanded to fit the entire client area of the frame.  Because the 
4184 //      controls are created BEFORE this occurs their positions are totally 
4185 //      whacked and any call to WinQueryWindowPos will return invalid 
4186 //      coordinates.  So for this situation we have to compare the size of 
4187 //      the panel at control creation time with that of the frame client.  If 
4188 //      they are the same we can use the standard Y position equation.  If 
4189 //      not, then we must use the Frame Client's dimensions to position them 
4190 //      as that will be the eventual size of the panel after the frame resizes 
4193 int wxWindowOS2::GetOS2ParentHeight( wxWindowOS2
* pParent 
) 
4200         if (pParent
->IsKindOf(CLASSINFO(wxDialog
))) 
4201             return(pParent
->GetClientSize().y
); 
4204     // Case 2 -- if we are one of the separately built standard Frame 
4205     //           children, like a statusbar, menubar, or toolbar we want to 
4206     //           use the frame, itself, for positioning.  Otherwise we are 
4207     //           child window and want to use the Frame's client. 
4209         else if (pParent
->IsKindOf(CLASSINFO(wxFrame
))) 
4211             if (IsKindOf(CLASSINFO(wxStatusBar
)) || 
4212                 IsKindOf(CLASSINFO(wxMenuBar
))   || 
4213                 IsKindOf(CLASSINFO(wxToolBar
)) 
4216                 if (IsKindOf(CLASSINFO(wxToolBar
))) 
4218                     wxFrame
*        pFrame 
= wxDynamicCast(GetParent(), wxFrame
); 
4220                     if (pFrame
->GetToolBar() == this) 
4221                         return(pParent
->GetSize().y
); 
4223                         return(pParent
->GetClientSize().y
); 
4226                     return(pParent
->GetSize().y
); 
4229                 return(pParent
->GetClientSize().y
); 
4232         // Case -- this is for any window that is the sole child of a Frame. 
4233         //         The grandparent must exist and it must be of type CFrame 
4234         //         and it's height must be different. Otherwise the standard 
4238             return(pParent
->GetClientSize().y
); 
4240     else // We must be a child of the screen 
4243         wxDisplaySize(NULL
,&nHeight
); 
4246 } // end of wxWindowOS2::GetOS2ParentHeight 
4249 // OS/2 needs a lot extra manipulation to deal with layouts 
4250 // for canvas windows, particularly scrolled ones. 
4252 wxWindowCreationHook::wxWindowCreationHook( 
4253   wxWindow
*                         pWinBeingCreated
 
4256     gpWinBeingCreated 
= pWinBeingCreated
; 
4257 } // end of wxWindowCreationHook::wxWindowCreationHook 
4259 wxWindowCreationHook::~wxWindowCreationHook() 
4261     gpWinBeingCreated 
= NULL
; 
4262 } // end of wxWindowCreationHook::~wxWindowCreationHook 
4264 // =========================================================================== 
4266 // =========================================================================== 
4272 ,wxFont
*                            WXUNUSED(pTheFont
) 
4279     hPS 
=::WinGetPS(hWnd
); 
4281     rc 
= ::GpiQueryFontMetrics(hPS
, sizeof(FONTMETRICS
), &vFM
); 
4285             *pX 
= vFM
.lAveCharWidth
; 
4287             *pY 
= vFM
.lEmHeight 
+ vFM
.lExternalLeading
; 
4296     ::WinReleasePS(hPS
); 
4297 } // end of wxGetCharSize 
4300 // Returns 0 if was a normal ASCII value, not a special key. This indicates that 
4301 // the key should be ignored by WM_KEYDOWN and processed by WM_CHAR instead. 
4303 int wxCharCodeOS2ToWX( 
4311         case VK_BACKTAB
:    nId 
= WXK_BACK
; break; 
4312         case VK_TAB
:        nId 
= WXK_TAB
; break; 
4313         case VK_CLEAR
:      nId 
= WXK_CLEAR
; break; 
4314         case VK_ENTER
:      nId 
= WXK_RETURN
; break; 
4315         case VK_SHIFT
:      nId 
= WXK_SHIFT
; break; 
4316         case VK_CTRL
:       nId 
= WXK_CONTROL
; break; 
4317         case VK_PAUSE
:      nId 
= WXK_PAUSE
; break; 
4318         case VK_SPACE
:      nId 
= WXK_SPACE
; break; 
4319         case VK_PAGEUP
:     nId 
= WXK_PAGEUP
; break; 
4320         case VK_PAGEDOWN
:   nId 
= WXK_PAGEDOWN
; break; 
4321         case VK_ESC
:        nId 
= WXK_ESCAPE
; break; 
4322         case VK_END
:        nId 
= WXK_END
; break; 
4323         case VK_HOME 
:      nId 
= WXK_HOME
; break; 
4324         case VK_LEFT 
:      nId 
= WXK_LEFT
; break; 
4325         case VK_UP
:         nId 
= WXK_UP
; break; 
4326         case VK_RIGHT
:      nId 
= WXK_RIGHT
; break; 
4327         case VK_DOWN 
:      nId 
= WXK_DOWN
; break; 
4328         case VK_PRINTSCRN
:  nId 
= WXK_PRINT
; break; 
4329         case VK_INSERT
:     nId 
= WXK_INSERT
; break; 
4330         case VK_DELETE
:     nId 
= WXK_DELETE
; break; 
4331         case VK_CAPSLOCK
:   nId 
= WXK_CAPITAL
; break; 
4332         case VK_F1
:         nId 
= WXK_F1
; break; 
4333         case VK_F2
:         nId 
= WXK_F2
; break; 
4334         case VK_F3
:         nId 
= WXK_F3
; break; 
4335         case VK_F4
:         nId 
= WXK_F4
; break; 
4336         case VK_F5
:         nId 
= WXK_F5
; break; 
4337         case VK_F6
:         nId 
= WXK_F6
; break; 
4338         case VK_F7
:         nId 
= WXK_F7
; break; 
4339         case VK_F8
:         nId 
= WXK_F8
; break; 
4340         case VK_F9
:         nId 
= WXK_F9
; break; 
4341         case VK_F10
:        nId 
= WXK_F10
; break; 
4342         case VK_F11
:        nId 
= WXK_F11
; break; 
4343         case VK_F12
:        nId 
= WXK_F12
; break; 
4344         case VK_F13
:        nId 
= WXK_F13
; break; 
4345         case VK_F14
:        nId 
= WXK_F14
; break; 
4346         case VK_F15
:        nId 
= WXK_F15
; break; 
4347         case VK_F16
:        nId 
= WXK_F16
; break; 
4348         case VK_F17
:        nId 
= WXK_F17
; break; 
4349         case VK_F18
:        nId 
= WXK_F18
; break; 
4350         case VK_F19
:        nId 
= WXK_F19
; break; 
4351         case VK_F20
:        nId 
= WXK_F20
; break; 
4352         case VK_F21
:        nId 
= WXK_F21
; break; 
4353         case VK_F22
:        nId 
= WXK_F22
; break; 
4354         case VK_F23
:        nId 
= WXK_F23
; break; 
4355         case VK_F24
:        nId 
= WXK_F24
; break; 
4356         case VK_OEM_1
:      nId 
= ';'; break; 
4357         case VK_OEM_PLUS
:   nId 
= '+'; break; 
4358         case VK_OEM_COMMA
:  nId 
= ','; break; 
4359         case VK_OEM_MINUS
:  nId 
= '-'; break; 
4360         case VK_OEM_PERIOD
: nId 
= '.'; break; 
4361         case VK_OEM_2
:      nId 
= '/'; break; 
4362         case VK_OEM_3
:      nId 
= '~'; break; 
4363         case VK_OEM_4
:      nId 
= '['; break; 
4364         case VK_OEM_5
:      nId 
= '\\'; break; 
4365         case VK_OEM_6
:      nId 
= ']'; break; 
4366         case VK_OEM_7
:      nId 
= '\''; break; 
4367         case VK_NUMLOCK
:    nId 
= WXK_NUMLOCK
; break; 
4368         case VK_SCRLLOCK
:   nId 
= WXK_SCROLL
; break; 
4375 } // end of wxCharCodeOS2ToWX 
4377 int wxCharCodeWXToOS2( int nId
, 
4386         case WXK_CLEAR
:     nKeySym 
= VK_CLEAR
; break; 
4387         case WXK_SHIFT
:     nKeySym 
= VK_SHIFT
; break; 
4388         case WXK_CONTROL
:   nKeySym 
= VK_CTRL
; break; 
4389         case WXK_PAUSE
:     nKeySym 
= VK_PAUSE
; break; 
4390         case WXK_PAGEUP
:    nKeySym 
= VK_PAGEUP
; break; 
4391         case WXK_PAGEDOWN
:  nKeySym 
= VK_PAGEDOWN
; break; 
4392         case WXK_END
:       nKeySym 
= VK_END
; break; 
4393         case WXK_HOME 
:     nKeySym 
= VK_HOME
; break; 
4394         case WXK_LEFT 
:     nKeySym 
= VK_LEFT
; break; 
4395         case WXK_UP
:        nKeySym 
= VK_UP
; break; 
4396         case WXK_RIGHT
:     nKeySym 
= VK_RIGHT
; break; 
4397         case WXK_DOWN 
:     nKeySym 
= VK_DOWN
; break; 
4398         case WXK_PRINT
:     nKeySym 
= VK_PRINTSCRN
; break; 
4399         case WXK_INSERT
:    nKeySym 
= VK_INSERT
; break; 
4400         case WXK_DELETE
:    nKeySym 
= VK_DELETE
; break; 
4401         case WXK_F1
:        nKeySym 
= VK_F1
; break; 
4402         case WXK_F2
:        nKeySym 
= VK_F2
; break; 
4403         case WXK_F3
:        nKeySym 
= VK_F3
; break; 
4404         case WXK_F4
:        nKeySym 
= VK_F4
; break; 
4405         case WXK_F5
:        nKeySym 
= VK_F5
; break; 
4406         case WXK_F6
:        nKeySym 
= VK_F6
; break; 
4407         case WXK_F7
:        nKeySym 
= VK_F7
; break; 
4408         case WXK_F8
:        nKeySym 
= VK_F8
; break; 
4409         case WXK_F9
:        nKeySym 
= VK_F9
; break; 
4410         case WXK_F10
:       nKeySym 
= VK_F10
; break; 
4411         case WXK_F11
:       nKeySym 
= VK_F11
; break; 
4412         case WXK_F12
:       nKeySym 
= VK_F12
; break; 
4413         case WXK_F13
:       nKeySym 
= VK_F13
; break; 
4414         case WXK_F14
:       nKeySym 
= VK_F14
; break; 
4415         case WXK_F15
:       nKeySym 
= VK_F15
; break; 
4416         case WXK_F16
:       nKeySym 
= VK_F16
; break; 
4417         case WXK_F17
:       nKeySym 
= VK_F17
; break; 
4418         case WXK_F18
:       nKeySym 
= VK_F18
; break; 
4419         case WXK_F19
:       nKeySym 
= VK_F19
; break; 
4420         case WXK_F20
:       nKeySym 
= VK_F20
; break; 
4421         case WXK_F21
:       nKeySym 
= VK_F21
; break; 
4422         case WXK_F22
:       nKeySym 
= VK_F22
; break; 
4423         case WXK_F23
:       nKeySym 
= VK_F23
; break; 
4424         case WXK_F24
:       nKeySym 
= VK_F24
; break; 
4425         case WXK_NUMLOCK
:   nKeySym 
= VK_NUMLOCK
; break; 
4426         case WXK_SCROLL
:    nKeySym 
= VK_SCRLLOCK
; break; 
4430                 *bIsVirtual 
= false; 
4436 } // end of wxCharCodeWXToOS2 
4439 bool wxGetKeyState(wxKeyCode key
) 
4441     wxASSERT_MSG(key 
!= WXK_LBUTTON 
&& key 
!= WXK_RBUTTON 
&& key 
!= 
4442         WXK_MBUTTON
, wxT("can't use wxGetKeyState() for mouse buttons")); 
4444     const LONG vk 
= wxCharCodeWXToOS2(key
); 
4445     // if the requested key is a LED key, return true if the led is pressed 
4446     if ( key 
== WXK_NUMLOCK 
|| key 
== WXK_CAPITAL 
|| key 
== WXK_SCROLL 
) 
4448         // low order bit means LED is highlighted and high order one means the 
4449         // key is down; for compatibility with the other ports return true if 
4450         // either one is set 
4451         return ::WinGetKeyState(HWND_DESKTOP
, vk
) != 0; 
4456         return IsKeyDown(vk
); 
4461 wxWindow
* wxGetActiveWindow() 
4463     HWND                            hWnd 
= ::WinQueryActiveWindow(HWND_DESKTOP
); 
4467         return wxFindWinFromHandle((WXHWND
)hWnd
); 
4470 } // end of wxGetActiveWindow 
4473 const wxChar
* wxGetMessageName( int nMessage 
) 
4477         case 0x0000: return wxT("WM_NULL"); 
4478         case 0x0001: return wxT("WM_CREATE"); 
4479         case 0x0002: return wxT("WM_DESTROY"); 
4480         case 0x0004: return wxT("WM_ENABLE"); 
4481         case 0x0005: return wxT("WM_SHOW"); 
4482         case 0x0006: return wxT("WM_MOVE"); 
4483         case 0x0007: return wxT("WM_SIZE"); 
4484         case 0x0008: return wxT("WM_ADJUSTWINDOWPOS"); 
4485         case 0x0009: return wxT("WM_CALCVALIDRECTS"); 
4486         case 0x000A: return wxT("WM_SETWINDOWPARAMS"); 
4487         case 0x000B: return wxT("WM_QUERYWINDOWPARAMS"); 
4488         case 0x000C: return wxT("WM_HITTEST"); 
4489         case 0x000D: return wxT("WM_ACTIVATE"); 
4490         case 0x000F: return wxT("WM_SETFOCUS"); 
4491         case 0x0010: return wxT("WM_SETSELECTION"); 
4492         case 0x0011: return wxT("WM_PPAINT"); 
4493         case 0x0012: return wxT("WM_PSETFOCUS"); 
4494         case 0x0013: return wxT("WM_PSYSCOLORCHANGE"); 
4495         case 0x0014: return wxT("WM_PSIZE"); 
4496         case 0x0015: return wxT("WM_PACTIVATE"); 
4497         case 0x0016: return wxT("WM_PCONTROL"); 
4498         case 0x0020: return wxT("WM_COMMAND"); 
4499         case 0x0021: return wxT("WM_SYSCOMMAND"); 
4500         case 0x0022: return wxT("WM_HELP"); 
4501         case 0x0023: return wxT("WM_PAINT"); 
4502         case 0x0024: return wxT("WM_TIMER"); 
4503         case 0x0025: return wxT("WM_SEM1"); 
4504         case 0x0026: return wxT("WM_SEM2"); 
4505         case 0x0027: return wxT("WM_SEM3"); 
4506         case 0x0028: return wxT("WM_SEM4"); 
4507         case 0x0029: return wxT("WM_CLOSE"); 
4508         case 0x002A: return wxT("WM_QUIT"); 
4509         case 0x002B: return wxT("WM_SYSCOLORCHANGE"); 
4510         case 0x002D: return wxT("WM_SYSVALUECHANGE"); 
4511         case 0x002E: return wxT("WM_APPTERMINATENOTIFY"); 
4512         case 0x002F: return wxT("WM_PRESPARAMCHANGED"); 
4513         // Control notification messages 
4514         case 0x0030: return wxT("WM_CONTROL"); 
4515         case 0x0031: return wxT("WM_VSCROLL"); 
4516         case 0x0032: return wxT("WM_HSCROLL"); 
4517         case 0x0033: return wxT("WM_INITMENU"); 
4518         case 0x0034: return wxT("WM_MENUSELECT"); 
4519         case 0x0035: return wxT("WM_MENUSEND"); 
4520         case 0x0036: return wxT("WM_DRAWITEM"); 
4521         case 0x0037: return wxT("WM_MEASUREITEM"); 
4522         case 0x0038: return wxT("WM_CONTROLPOINTER"); 
4523         case 0x003A: return wxT("WM_QUERYDLGCODE"); 
4524         case 0x003B: return wxT("WM_INITDLG"); 
4525         case 0x003C: return wxT("WM_SUBSTITUTESTRING"); 
4526         case 0x003D: return wxT("WM_MATCHMNEMONIC"); 
4527         case 0x003E: return wxT("WM_SAVEAPPLICATION"); 
4528         case 0x0129: return wxT("WM_CTLCOLORCHANGE"); 
4529         case 0x0130: return wxT("WM_QUERYCTLTYPE"); 
4531         case 0x0040: return wxT("WM_FLASHWINDOW"); 
4532         case 0x0041: return wxT("WM_FORMATFRAME"); 
4533         case 0x0042: return wxT("WM_UPDATEFRAME"); 
4534         case 0x0043: return wxT("WM_FOCUSCHANGE"); 
4535         case 0x0044: return wxT("WM_SETBORDERSIZE"); 
4536         case 0x0045: return wxT("WM_TRACKFRAME"); 
4537         case 0x0046: return wxT("WM_MINMAXFRAME"); 
4538         case 0x0047: return wxT("WM_SETICON"); 
4539         case 0x0048: return wxT("WM_QUERYICON"); 
4540         case 0x0049: return wxT("WM_SETACCELTABLE"); 
4541         case 0x004A: return wxT("WM_QUERYACCELTABLE"); 
4542         case 0x004B: return wxT("WM_TRANSLATEACCEL"); 
4543         case 0x004C: return wxT("WM_QUERYTRACKINFO"); 
4544         case 0x004D: return wxT("WM_QUERYBORDERSIZE"); 
4545         case 0x004E: return wxT("WM_NEXTMENU"); 
4546         case 0x004F: return wxT("WM_ERASEBACKGROUND"); 
4547         case 0x0050: return wxT("WM_QUERYFRAMEINFO"); 
4548         case 0x0051: return wxT("WM_QUERYFOCUSCHAIN"); 
4549         case 0x0052: return wxT("WM_OWNERPOSCHANGE"); 
4550         case 0x0053: return wxT("WM_CACLFRAMERECT"); 
4551         case 0x0055: return wxT("WM_WINDOWPOSCHANGED"); 
4552         case 0x0056: return wxT("WM_ADJUSTFRAMEPOS"); 
4553         case 0x0059: return wxT("WM_QUERYFRAMECTLCOUNT"); 
4554         case 0x005B: return wxT("WM_QUERYHELPINFO"); 
4555         case 0x005C: return wxT("WM_SETHELPINFO"); 
4556         case 0x005D: return wxT("WM_ERROR"); 
4557         case 0x005E: return wxT("WM_REALIZEPALETTE"); 
4558         // Clipboard messages 
4559         case 0x0060: return wxT("WM_RENDERFMT"); 
4560         case 0x0061: return wxT("WM_RENDERALLFMTS"); 
4561         case 0x0062: return wxT("WM_DESTROYCLIPBOARD"); 
4562         case 0x0063: return wxT("WM_PAINTCLIPBOARD"); 
4563         case 0x0064: return wxT("WM_SIZECLIPBOARD"); 
4564         case 0x0065: return wxT("WM_HSCROLLCLIPBOARD"); 
4565         case 0x0066: return wxT("WM_VSCROLLCLIPBOARD"); 
4566         case 0x0067: return wxT("WM_DRAWCLIPBOARD"); 
4568         case 0x0070: return wxT("WM_MOUSEMOVE"); 
4569         case 0x0071: return wxT("WM_BUTTON1DOWN"); 
4570         case 0x0072: return wxT("WM_BUTTON1UP"); 
4571         case 0x0073: return wxT("WM_BUTTON1DBLCLK"); 
4572         case 0x0074: return wxT("WM_BUTTON2DOWN"); 
4573         case 0x0075: return wxT("WM_BUTTON2UP"); 
4574         case 0x0076: return wxT("WM_BUTTON2DBLCLK"); 
4575         case 0x0077: return wxT("WM_BUTTON3DOWN"); 
4576         case 0x0078: return wxT("WM_BUTTON3UP"); 
4577         case 0x0079: return wxT("WM_BUTTON3DBLCLK"); 
4578         case 0x007D: return wxT("WM_MOUSEMAP"); 
4579         case 0x007E: return wxT("WM_VRNDISABLED"); 
4580         case 0x007F: return wxT("WM_VRNENABLED"); 
4581         case 0x0410: return wxT("WM_CHORD"); 
4582         case 0x0411: return wxT("WM_BUTTON1MOTIONSTART"); 
4583         case 0x0412: return wxT("WM_BUTTON1MOTIONEND"); 
4584         case 0x0413: return wxT("WM_BUTTON1CLICK"); 
4585         case 0x0414: return wxT("WM_BUTTON2MOTIONSTART"); 
4586         case 0x0415: return wxT("WM_BUTTON2MOTIONEND"); 
4587         case 0x0416: return wxT("WM_BUTTON2CLICK"); 
4588         case 0x0417: return wxT("WM_BUTTON3MOTIONSTART"); 
4589         case 0x0418: return wxT("WM_BUTTON3MOTIONEND"); 
4590         case 0x0419: return wxT("WM_BUTTON3CLICK"); 
4591         case 0x0420: return wxT("WM_BEGINDRAG"); 
4592         case 0x0421: return wxT("WM_ENDDRAG"); 
4593         case 0x0422: return wxT("WM_SINGLESELECT"); 
4594         case 0x0423: return wxT("WM_OPEN"); 
4595         case 0x0424: return wxT("WM_CONTEXTMENU"); 
4596         case 0x0425: return wxT("WM_CONTEXTHELP"); 
4597         case 0x0426: return wxT("WM_TEXTEDIT"); 
4598         case 0x0427: return wxT("WM_BEGINSELECT"); 
4599         case 0x0228: return wxT("WM_ENDSELECT"); 
4600         case 0x0429: return wxT("WM_PICKUP"); 
4601         case 0x04C0: return wxT("WM_PENFIRST"); 
4602         case 0x04FF: return wxT("WM_PENLAST"); 
4603         case 0x0500: return wxT("WM_MMPMFIRST"); 
4604         case 0x05FF: return wxT("WM_MMPMLAST"); 
4605         case 0x0600: return wxT("WM_STDDLGFIRST"); 
4606         case 0x06FF: return wxT("WM_STDDLGLAST"); 
4607         case 0x0BD0: return wxT("WM_BIDI_FIRST"); 
4608         case 0x0BFF: return wxT("WM_BIDI_LAST"); 
4610         case 0x007A: return wxT("WM_CHAR"); 
4611         case 0x007B: return wxT("WM_VIOCHAR"); 
4613         case 0x00A0: return wxT("WM_DDE_INITIATE"); 
4614         case 0x00A1: return wxT("WM_DDE_REQUEST"); 
4615         case 0x00A2: return wxT("WM_DDE_ACK"); 
4616         case 0x00A3: return wxT("WM_DDE_DATA"); 
4617         case 0x00A4: return wxT("WM_DDE_ADVISE"); 
4618         case 0x00A5: return wxT("WM_DDE_UNADVISE"); 
4619         case 0x00A6: return wxT("WM_DDE_POKE"); 
4620         case 0x00A7: return wxT("WM_DDE_EXECUTE"); 
4621         case 0x00A8: return wxT("WM_DDE_TERMINATE"); 
4622         case 0x00A9: return wxT("WM_DDE_INITIATEACK"); 
4623         case 0x00AF: return wxT("WM_DDE_LAST"); 
4625         case 0x0120: return wxT("BM_CLICK"); 
4626         case 0x0121: return wxT("BM_QUERYCHECKINDEX"); 
4627         case 0x0122: return wxT("BM_QUERYHILITE"); 
4628         case 0x0123: return wxT("BM_SETHILITE"); 
4629         case 0x0124: return wxT("BM_QUERYCHECK"); 
4630         case 0x0125: return wxT("BM_SETCHECK"); 
4631         case 0x0126: return wxT("BM_SETDEFAULT"); 
4632         case 0x0128: return wxT("BM_AUTOSIZE"); 
4634         case 0x029A: return wxT("CBID_LIST"); 
4635         case 0x029B: return wxT("CBID_EDIT"); 
4636         case 0x0170: return wxT("CBM_SHOWLIST"); 
4637         case 0x0171: return wxT("CBM_HILITE"); 
4638         case 0x0172: return wxT("CBM_ISLISTSHOWING"); 
4640         case 0x0140: return wxT("EM_QUERYCHANGED"); 
4641         case 0x0141: return wxT("EM_QUERYSEL"); 
4642         case 0x0142: return wxT("EM_SETSEL"); 
4643         case 0x0143: return wxT("EM_SETTEXTLIMIT"); 
4644         case 0x0144: return wxT("EM_CUT"); 
4645         case 0x0145: return wxT("EM_COPY"); 
4646         case 0x0146: return wxT("EM_CLEAR"); 
4647         case 0x0147: return wxT("EM_PASTE"); 
4648         case 0x0148: return wxT("EM_QUERYFIRSTCHAR"); 
4649         case 0x0149: return wxT("EM_SETFIRSTCHAR"); 
4650         case 0x014A: return wxT("EM_QUERYREADONLY"); 
4651         case 0x014B: return wxT("EM_SETREADONLY"); 
4652         case 0x014C: return wxT("EM_SETINSERTMODE"); 
4654         case 0x0160: return wxT("LM_QUERYITEMCOUNT"); 
4655         case 0x0161: return wxT("LM_INSERTITEM"); 
4656         case 0x0162: return wxT("LM_SETOPENINDEX"); 
4657         case 0x0163: return wxT("LM_DELETEITEM"); 
4658         case 0x0164: return wxT("LM_SELECTITEM"); 
4659         case 0x0165: return wxT("LM_QUERYSELECTION"); 
4660         case 0x0166: return wxT("LM_SETITEMTEXT"); 
4661         case 0x0167: return wxT("LM_QUERYITEMTEXTLENGTH"); 
4662         case 0x0168: return wxT("LM_QUERYITEMTEXT"); 
4663         case 0x0169: return wxT("LM_SETITEMHANDLE"); 
4664         case 0x016A: return wxT("LM_QUERYITEMHANDLE"); 
4665         case 0x016B: return wxT("LM_SEARCHSTRING"); 
4666         case 0x016C: return wxT("LM_SETITEMHEIGHT"); 
4667         case 0x016D: return wxT("LM_QUERYTOPINDEX"); 
4668         case 0x016E: return wxT("LM_DELETEALL"); 
4669         case 0x016F: return wxT("LM_INSERTMULITEMS"); 
4670         case 0x0660: return wxT("LM_SETITEMWIDTH"); 
4672         case 0x0180: return wxT("MM_INSERTITEM"); 
4673         case 0x0181: return wxT("MM_DELETEITEM"); 
4674         case 0x0182: return wxT("MM_QUERYITEM"); 
4675         case 0x0183: return wxT("MM_SETITEM"); 
4676         case 0x0184: return wxT("MM_QUERYITEMCOUNT"); 
4677         case 0x0185: return wxT("MM_STARTMENUMODE"); 
4678         case 0x0186: return wxT("MM_ENDMENUMODE"); 
4679         case 0x0188: return wxT("MM_REMOVEITEM"); 
4680         case 0x0189: return wxT("MM_SELECTITEM"); 
4681         case 0x018A: return wxT("MM_QUERYSELITEMID"); 
4682         case 0x018B: return wxT("MM_QUERYITEMTEXT"); 
4683         case 0x018C: return wxT("MM_QUERYITEMTEXTLENGTH"); 
4684         case 0x018D: return wxT("MM_SETITEMHANDLE"); 
4685         case 0x018E: return wxT("MM_SETITEMTEXT"); 
4686         case 0x018F: return wxT("MM_ITEMPOSITIONFROMID"); 
4687         case 0x0190: return wxT("MM_ITEMIDFROMPOSITION"); 
4688         case 0x0191: return wxT("MM_QUERYITEMATTR"); 
4689         case 0x0192: return wxT("MM_SETITEMATTR"); 
4690         case 0x0193: return wxT("MM_ISITEMVALID"); 
4691         case 0x0194: return wxT("MM_QUERYITEMRECT"); 
4692         case 0x0431: return wxT("MM_QUERYDEFAULTITEMID"); 
4693         case 0x0432: return wxT("MM_SETDEFAULTITEMID"); 
4695         case 0x01A0: return wxT("SBM_SETSCROLLBAR"); 
4696         case 0x01A1: return wxT("SBM_SETPOS"); 
4697         case 0x01A2: return wxT("SBM_QUERYPOS"); 
4698         case 0x01A3: return wxT("SBM_QUERYRANGE"); 
4699         case 0x01A6: return wxT("SBM_SETTHUMBSIZE"); 
4702         case 0x0F00: return wxT("WM_HELPBASE"); 
4703         case 0x0FFF: return wxT("WM_HELPTOP"); 
4704         // Beginning of user defined messages 
4705         case 0x1000: return wxT("WM_USER"); 
4707         // wxWidgets user defined types 
4710         // case 0x1000 + 0: return wxT("LVM_GETBKCOLOR"); 
4711         case 0x1000 + 1: return wxT("LVM_SETBKCOLOR"); 
4712         case 0x1000 + 2: return wxT("LVM_GETIMAGELIST"); 
4713         case 0x1000 + 3: return wxT("LVM_SETIMAGELIST"); 
4714         case 0x1000 + 4: return wxT("LVM_GETITEMCOUNT"); 
4715         case 0x1000 + 5: return wxT("LVM_GETITEMA"); 
4716         case 0x1000 + 75: return wxT("LVM_GETITEMW"); 
4717         case 0x1000 + 6: return wxT("LVM_SETITEMA"); 
4718         case 0x1000 + 76: return wxT("LVM_SETITEMW"); 
4719         case 0x1000 + 7: return wxT("LVM_INSERTITEMA"); 
4720         case 0x1000 + 77: return wxT("LVM_INSERTITEMW"); 
4721         case 0x1000 + 8: return wxT("LVM_DELETEITEM"); 
4722         case 0x1000 + 9: return wxT("LVM_DELETEALLITEMS"); 
4723         case 0x1000 + 10: return wxT("LVM_GETCALLBACKMASK"); 
4724         case 0x1000 + 11: return wxT("LVM_SETCALLBACKMASK"); 
4725         case 0x1000 + 12: return wxT("LVM_GETNEXTITEM"); 
4726         case 0x1000 + 13: return wxT("LVM_FINDITEMA"); 
4727         case 0x1000 + 83: return wxT("LVM_FINDITEMW"); 
4728         case 0x1000 + 14: return wxT("LVM_GETITEMRECT"); 
4729         case 0x1000 + 15: return wxT("LVM_SETITEMPOSITION"); 
4730         case 0x1000 + 16: return wxT("LVM_GETITEMPOSITION"); 
4731         case 0x1000 + 17: return wxT("LVM_GETSTRINGWIDTHA"); 
4732         case 0x1000 + 87: return wxT("LVM_GETSTRINGWIDTHW"); 
4733         case 0x1000 + 18: return wxT("LVM_HITTEST"); 
4734         case 0x1000 + 19: return wxT("LVM_ENSUREVISIBLE"); 
4735         case 0x1000 + 20: return wxT("LVM_SCROLL"); 
4736         case 0x1000 + 21: return wxT("LVM_REDRAWITEMS"); 
4737         case 0x1000 + 22: return wxT("LVM_ARRANGE"); 
4738         case 0x1000 + 23: return wxT("LVM_EDITLABELA"); 
4739         case 0x1000 + 118: return wxT("LVM_EDITLABELW"); 
4740         case 0x1000 + 24: return wxT("LVM_GETEDITCONTROL"); 
4741         case 0x1000 + 25: return wxT("LVM_GETCOLUMNA"); 
4742         case 0x1000 + 95: return wxT("LVM_GETCOLUMNW"); 
4743         case 0x1000 + 26: return wxT("LVM_SETCOLUMNA"); 
4744         case 0x1000 + 96: return wxT("LVM_SETCOLUMNW"); 
4745         case 0x1000 + 27: return wxT("LVM_INSERTCOLUMNA"); 
4746         case 0x1000 + 97: return wxT("LVM_INSERTCOLUMNW"); 
4747         case 0x1000 + 28: return wxT("LVM_DELETECOLUMN"); 
4748         case 0x1000 + 29: return wxT("LVM_GETCOLUMNWIDTH"); 
4749         case 0x1000 + 30: return wxT("LVM_SETCOLUMNWIDTH"); 
4750         case 0x1000 + 31: return wxT("LVM_GETHEADER"); 
4751         case 0x1000 + 33: return wxT("LVM_CREATEDRAGIMAGE"); 
4752         case 0x1000 + 34: return wxT("LVM_GETVIEWRECT"); 
4753         case 0x1000 + 35: return wxT("LVM_GETTEXTCOLOR"); 
4754         case 0x1000 + 36: return wxT("LVM_SETTEXTCOLOR"); 
4755         case 0x1000 + 37: return wxT("LVM_GETTEXTBKCOLOR"); 
4756         case 0x1000 + 38: return wxT("LVM_SETTEXTBKCOLOR"); 
4757         case 0x1000 + 39: return wxT("LVM_GETTOPINDEX"); 
4758         case 0x1000 + 40: return wxT("LVM_GETCOUNTPERPAGE"); 
4759         case 0x1000 + 41: return wxT("LVM_GETORIGIN"); 
4760         case 0x1000 + 42: return wxT("LVM_UPDATE"); 
4761         case 0x1000 + 43: return wxT("LVM_SETITEMSTATE"); 
4762         case 0x1000 + 44: return wxT("LVM_GETITEMSTATE"); 
4763         case 0x1000 + 45: return wxT("LVM_GETITEMTEXTA"); 
4764         case 0x1000 + 115: return wxT("LVM_GETITEMTEXTW"); 
4765         case 0x1000 + 46: return wxT("LVM_SETITEMTEXTA"); 
4766         case 0x1000 + 116: return wxT("LVM_SETITEMTEXTW"); 
4767         case 0x1000 + 47: return wxT("LVM_SETITEMCOUNT"); 
4768         case 0x1000 + 48: return wxT("LVM_SORTITEMS"); 
4769         case 0x1000 + 49: return wxT("LVM_SETITEMPOSITION32"); 
4770         case 0x1000 + 50: return wxT("LVM_GETSELECTEDCOUNT"); 
4771         case 0x1000 + 51: return wxT("LVM_GETITEMSPACING"); 
4772         case 0x1000 + 52: return wxT("LVM_GETISEARCHSTRINGA"); 
4773         case 0x1000 + 117: return wxT("LVM_GETISEARCHSTRINGW"); 
4774         case 0x1000 + 53: return wxT("LVM_SETICONSPACING"); 
4775         case 0x1000 + 54: return wxT("LVM_SETEXTENDEDLISTVIEWSTYLE"); 
4776         case 0x1000 + 55: return wxT("LVM_GETEXTENDEDLISTVIEWSTYLE"); 
4777         case 0x1000 + 56: return wxT("LVM_GETSUBITEMRECT"); 
4778         case 0x1000 + 57: return wxT("LVM_SUBITEMHITTEST"); 
4779         case 0x1000 + 58: return wxT("LVM_SETCOLUMNORDERARRAY"); 
4780         case 0x1000 + 59: return wxT("LVM_GETCOLUMNORDERARRAY"); 
4781         case 0x1000 + 60: return wxT("LVM_SETHOTITEM"); 
4782         case 0x1000 + 61: return wxT("LVM_GETHOTITEM"); 
4783         case 0x1000 + 62: return wxT("LVM_SETHOTCURSOR"); 
4784         case 0x1000 + 63: return wxT("LVM_GETHOTCURSOR"); 
4785         case 0x1000 + 64: return wxT("LVM_APPROXIMATEVIEWRECT"); 
4786         case 0x1000 + 65: return wxT("LVM_SETWORKAREA"); 
4789         case 0x1100 + 0: return wxT("TVM_INSERTITEMA"); 
4790         case 0x1100 + 50: return wxT("TVM_INSERTITEMW"); 
4791         case 0x1100 + 1: return wxT("TVM_DELETEITEM"); 
4792         case 0x1100 + 2: return wxT("TVM_EXPAND"); 
4793         case 0x1100 + 4: return wxT("TVM_GETITEMRECT"); 
4794         case 0x1100 + 5: return wxT("TVM_GETCOUNT"); 
4795         case 0x1100 + 6: return wxT("TVM_GETINDENT"); 
4796         case 0x1100 + 7: return wxT("TVM_SETINDENT"); 
4797         case 0x1100 + 8: return wxT("TVM_GETIMAGELIST"); 
4798         case 0x1100 + 9: return wxT("TVM_SETIMAGELIST"); 
4799         case 0x1100 + 10: return wxT("TVM_GETNEXTITEM"); 
4800         case 0x1100 + 11: return wxT("TVM_SELECTITEM"); 
4801         case 0x1100 + 12: return wxT("TVM_GETITEMA"); 
4802         case 0x1100 + 62: return wxT("TVM_GETITEMW"); 
4803         case 0x1100 + 13: return wxT("TVM_SETITEMA"); 
4804         case 0x1100 + 63: return wxT("TVM_SETITEMW"); 
4805         case 0x1100 + 14: return wxT("TVM_EDITLABELA"); 
4806         case 0x1100 + 65: return wxT("TVM_EDITLABELW"); 
4807         case 0x1100 + 15: return wxT("TVM_GETEDITCONTROL"); 
4808         case 0x1100 + 16: return wxT("TVM_GETVISIBLECOUNT"); 
4809         case 0x1100 + 17: return wxT("TVM_HITTEST"); 
4810         case 0x1100 + 18: return wxT("TVM_CREATEDRAGIMAGE"); 
4811         case 0x1100 + 19: return wxT("TVM_SORTCHILDREN"); 
4812         case 0x1100 + 20: return wxT("TVM_ENSUREVISIBLE"); 
4813         case 0x1100 + 21: return wxT("TVM_SORTCHILDRENCB"); 
4814         case 0x1100 + 22: return wxT("TVM_ENDEDITLABELNOW"); 
4815         case 0x1100 + 23: return wxT("TVM_GETISEARCHSTRINGA"); 
4816         case 0x1100 + 64: return wxT("TVM_GETISEARCHSTRINGW"); 
4817         case 0x1100 + 24: return wxT("TVM_SETTOOLTIPS"); 
4818         case 0x1100 + 25: return wxT("TVM_GETTOOLTIPS"); 
4821         case 0x1200 + 0: return wxT("HDM_GETITEMCOUNT"); 
4822         case 0x1200 + 1: return wxT("HDM_INSERTITEMA"); 
4823         case 0x1200 + 10: return wxT("HDM_INSERTITEMW"); 
4824         case 0x1200 + 2: return wxT("HDM_DELETEITEM"); 
4825         case 0x1200 + 3: return wxT("HDM_GETITEMA"); 
4826         case 0x1200 + 11: return wxT("HDM_GETITEMW"); 
4827         case 0x1200 + 4: return wxT("HDM_SETITEMA"); 
4828         case 0x1200 + 12: return wxT("HDM_SETITEMW"); 
4829         case 0x1200 + 5: return wxT("HDM_LAYOUT"); 
4830         case 0x1200 + 6: return wxT("HDM_HITTEST"); 
4831         case 0x1200 + 7: return wxT("HDM_GETITEMRECT"); 
4832         case 0x1200 + 8: return wxT("HDM_SETIMAGELIST"); 
4833         case 0x1200 + 9: return wxT("HDM_GETIMAGELIST"); 
4834         case 0x1200 + 15: return wxT("HDM_ORDERTOINDEX"); 
4835         case 0x1200 + 16: return wxT("HDM_CREATEDRAGIMAGE"); 
4836         case 0x1200 + 17: return wxT("HDM_GETORDERARRAY"); 
4837         case 0x1200 + 18: return wxT("HDM_SETORDERARRAY"); 
4838         case 0x1200 + 19: return wxT("HDM_SETHOTDIVIDER"); 
4841         case 0x1300 + 2: return wxT("TCM_GETIMAGELIST"); 
4842         case 0x1300 + 3: return wxT("TCM_SETIMAGELIST"); 
4843         case 0x1300 + 4: return wxT("TCM_GETITEMCOUNT"); 
4844         case 0x1300 + 5: return wxT("TCM_GETITEMA"); 
4845         case 0x1300 + 60: return wxT("TCM_GETITEMW"); 
4846         case 0x1300 + 6: return wxT("TCM_SETITEMA"); 
4847         case 0x1300 + 61: return wxT("TCM_SETITEMW"); 
4848         case 0x1300 + 7: return wxT("TCM_INSERTITEMA"); 
4849         case 0x1300 + 62: return wxT("TCM_INSERTITEMW"); 
4850         case 0x1300 + 8: return wxT("TCM_DELETEITEM"); 
4851         case 0x1300 + 9: return wxT("TCM_DELETEALLITEMS"); 
4852         case 0x1300 + 10: return wxT("TCM_GETITEMRECT"); 
4853         case 0x1300 + 11: return wxT("TCM_GETCURSEL"); 
4854         case 0x1300 + 12: return wxT("TCM_SETCURSEL"); 
4855         case 0x1300 + 13: return wxT("TCM_HITTEST"); 
4856         case 0x1300 + 14: return wxT("TCM_SETITEMEXTRA"); 
4857         case 0x1300 + 40: return wxT("TCM_ADJUSTRECT"); 
4858         case 0x1300 + 41: return wxT("TCM_SETITEMSIZE"); 
4859         case 0x1300 + 42: return wxT("TCM_REMOVEIMAGE"); 
4860         case 0x1300 + 43: return wxT("TCM_SETPADDING"); 
4861         case 0x1300 + 44: return wxT("TCM_GETROWCOUNT"); 
4862         case 0x1300 + 45: return wxT("TCM_GETTOOLTIPS"); 
4863         case 0x1300 + 46: return wxT("TCM_SETTOOLTIPS"); 
4864         case 0x1300 + 47: return wxT("TCM_GETCURFOCUS"); 
4865         case 0x1300 + 48: return wxT("TCM_SETCURFOCUS"); 
4866         case 0x1300 + 49: return wxT("TCM_SETMINTABWIDTH"); 
4867         case 0x1300 + 50: return wxT("TCM_DESELECTALL"); 
4870         case WM_USER
+1000+1: return wxT("TB_ENABLEBUTTON"); 
4871         case WM_USER
+1000+2: return wxT("TB_CHECKBUTTON"); 
4872         case WM_USER
+1000+3: return wxT("TB_PRESSBUTTON"); 
4873         case WM_USER
+1000+4: return wxT("TB_HIDEBUTTON"); 
4874         case WM_USER
+1000+5: return wxT("TB_INDETERMINATE"); 
4875         case WM_USER
+1000+9: return wxT("TB_ISBUTTONENABLED"); 
4876         case WM_USER
+1000+10: return wxT("TB_ISBUTTONCHECKED"); 
4877         case WM_USER
+1000+11: return wxT("TB_ISBUTTONPRESSED"); 
4878         case WM_USER
+1000+12: return wxT("TB_ISBUTTONHIDDEN"); 
4879         case WM_USER
+1000+13: return wxT("TB_ISBUTTONINDETERMINATE"); 
4880         case WM_USER
+1000+17: return wxT("TB_SETSTATE"); 
4881         case WM_USER
+1000+18: return wxT("TB_GETSTATE"); 
4882         case WM_USER
+1000+19: return wxT("TB_ADDBITMAP"); 
4883         case WM_USER
+1000+20: return wxT("TB_ADDBUTTONS"); 
4884         case WM_USER
+1000+21: return wxT("TB_INSERTBUTTON"); 
4885         case WM_USER
+1000+22: return wxT("TB_DELETEBUTTON"); 
4886         case WM_USER
+1000+23: return wxT("TB_GETBUTTON"); 
4887         case WM_USER
+1000+24: return wxT("TB_BUTTONCOUNT"); 
4888         case WM_USER
+1000+25: return wxT("TB_COMMANDTOINDEX"); 
4889         case WM_USER
+1000+26: return wxT("TB_SAVERESTOREA"); 
4890         case WM_USER
+1000+76: return wxT("TB_SAVERESTOREW"); 
4891         case WM_USER
+1000+27: return wxT("TB_CUSTOMIZE"); 
4892         case WM_USER
+1000+28: return wxT("TB_ADDSTRINGA"); 
4893         case WM_USER
+1000+77: return wxT("TB_ADDSTRINGW"); 
4894         case WM_USER
+1000+29: return wxT("TB_GETITEMRECT"); 
4895         case WM_USER
+1000+30: return wxT("TB_BUTTONSTRUCTSIZE"); 
4896         case WM_USER
+1000+31: return wxT("TB_SETBUTTONSIZE"); 
4897         case WM_USER
+1000+32: return wxT("TB_SETBITMAPSIZE"); 
4898         case WM_USER
+1000+33: return wxT("TB_AUTOSIZE"); 
4899         case WM_USER
+1000+35: return wxT("TB_GETTOOLTIPS"); 
4900         case WM_USER
+1000+36: return wxT("TB_SETTOOLTIPS"); 
4901         case WM_USER
+1000+37: return wxT("TB_SETPARENT"); 
4902         case WM_USER
+1000+39: return wxT("TB_SETROWS"); 
4903         case WM_USER
+1000+40: return wxT("TB_GETROWS"); 
4904         case WM_USER
+1000+42: return wxT("TB_SETCMDID"); 
4905         case WM_USER
+1000+43: return wxT("TB_CHANGEBITMAP"); 
4906         case WM_USER
+1000+44: return wxT("TB_GETBITMAP"); 
4907         case WM_USER
+1000+45: return wxT("TB_GETBUTTONTEXTA"); 
4908         case WM_USER
+1000+75: return wxT("TB_GETBUTTONTEXTW"); 
4909         case WM_USER
+1000+46: return wxT("TB_REPLACEBITMAP"); 
4910         case WM_USER
+1000+47: return wxT("TB_SETINDENT"); 
4911         case WM_USER
+1000+48: return wxT("TB_SETIMAGELIST"); 
4912         case WM_USER
+1000+49: return wxT("TB_GETIMAGELIST"); 
4913         case WM_USER
+1000+50: return wxT("TB_LOADIMAGES"); 
4914         case WM_USER
+1000+51: return wxT("TB_GETRECT"); 
4915         case WM_USER
+1000+52: return wxT("TB_SETHOTIMAGELIST"); 
4916         case WM_USER
+1000+53: return wxT("TB_GETHOTIMAGELIST"); 
4917         case WM_USER
+1000+54: return wxT("TB_SETDISABLEDIMAGELIST"); 
4918         case WM_USER
+1000+55: return wxT("TB_GETDISABLEDIMAGELIST"); 
4919         case WM_USER
+1000+56: return wxT("TB_SETSTYLE"); 
4920         case WM_USER
+1000+57: return wxT("TB_GETSTYLE"); 
4921         case WM_USER
+1000+58: return wxT("TB_GETBUTTONSIZE"); 
4922         case WM_USER
+1000+59: return wxT("TB_SETBUTTONWIDTH"); 
4923         case WM_USER
+1000+60: return wxT("TB_SETMAXTEXTROWS"); 
4924         case WM_USER
+1000+61: return wxT("TB_GETTEXTROWS"); 
4925         case WM_USER
+1000+41: return wxT("TB_GETBITMAPFLAGS"); 
4928     static wxString s_szBuf
; 
4929     s_szBuf
.Printf(wxT("<unknown message = %d>"), nMessage
); 
4930     return s_szBuf
.c_str(); 
4932 } // end of wxGetMessageName 
4934 #endif // __WXDEBUG__ 
4938 static void TranslateKbdEventToMouse( 
4946     // Construct the key mask 
4947     ULONG
&                          fwKeys 
= *pFlags
; 
4949     fwKeys 
= VK_BUTTON2
; 
4950     if ((::WinGetKeyState(HWND_DESKTOP
, VK_CTRL
) & 0x100) != 0) 
4952     if ((::WinGetKeyState(HWND_DESKTOP
, VK_SHIFT
) & 0x100) != 0) 
4956     // Simulate right mouse button click 
4960     ::WinQueryMsgPos(vHabmain
, &vPoint
); 
4964     pWin
->ScreenToClient(pX
, pY
); 
4965 } // end of TranslateKbdEventToMouse 
4968 // Find the wxWindow at the current mouse position, returning the mouse 
4970 wxWindow
* wxFindWindowAtPointer(wxPoint
& WXUNUSED(rPt
)) 
4972     return wxFindWindowAtPoint(wxGetMousePosition()); 
4975 wxWindow
* wxFindWindowAtPoint(const wxPoint
& rPt
) 
4982     HWND      hWndHit 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt2
, FALSE
); 
4983     wxWindow
* pWin 
= wxFindWinFromHandle((WXHWND
)hWndHit
) ; 
4984     HWND      hWnd 
= hWndHit
; 
4987     // Try to find a window with a wxWindow associated with it 
4989     while (!pWin 
&& (hWnd 
!= 0)) 
4991         hWnd 
= ::WinQueryWindow(hWnd
, QW_PARENT
); 
4992         pWin 
= wxFindWinFromHandle((WXHWND
)hWnd
) ; 
4997 // Get the current mouse position. 
4998 wxPoint 
wxGetMousePosition() 
5002     ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
); 
5003     return wxPoint(vPt
.x
, vPt
.y
); 
5006 wxMouseState 
wxGetMouseState() 
5009     wxPoint pt 
= wxGetMousePosition(); 
5012     ms
.SetLeftDown(IsKeyDown(VK_BUTTON1
)); 
5013     ms
.SetMiddleDown(IsKeyDown(VK_BUTTON3
)); 
5014     ms
.SetRightDown(IsKeyDown(VK_BUTTON2
)); 
5015     ms
.SetControlDown(IsCtrlDown()); 
5016     ms
.SetShiftDown(IsShiftDown()); 
5017     ms
.SetAltDown(IsKeyDown(VK_ALT
)|IsKeyDown(VK_ALTGRAF
)); 
5018     ms
.SetMetaDown(IsKeyDown(VK_ALTGRAF
)); 
5023 wxWindowOS2
* FindWindowForMouseEvent( wxWindow
* pWin
, 
5024                                       short*    WXUNUSED(pnX
), 
5025                                       short*    WXUNUSED(pnY
) ) 
5027     HWND   hWnd 
= GetHwndOf(pWin
); 
5028     HWND   hWndUnderMouse
; 
5030     BOOL   rcEnabled 
= FALSE
; 
5031     BOOL   rcVisible 
= FALSE
; 
5033     ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
5034     hWndUnderMouse 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, TRUE
); 
5035     if (hWndUnderMouse 
!= HWND_DESKTOP
) 
5037         wxWindow
*                   pWinUnderMouse 
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
); 
5041             wxWindowList::compatibility_iterator current 
= pWinUnderMouse
->GetChildren().GetFirst(); 
5042             wxWindow
*               pGrandChild 
= NULL
; 
5046             ::WinMapWindowPoints(HWND_DESKTOP
, hWndUnderMouse
, &vPoint
, 1); 
5048             // Find a child window mouse might be under 
5052                 wxWindow
*                   pChild 
= current
->GetData(); 
5054                 vPoint2
.x 
= vPoint
.x
; 
5055                 vPoint2
.y 
= vPoint
.y
; 
5056                 ::WinMapWindowPoints(hWndUnderMouse
, pChild
->GetHWND(), &vPoint2
, 1); 
5057                 ::WinQueryWindowRect(pChild
->GetHWND(), &vRect
); 
5058                 if (::WinPtInRect(vHabmain
, &vRect
, &vPoint2
)) 
5060                     if (pChild
->IsTopLevel()) 
5063                         wxWindowList::compatibility_iterator current2 
=pChild
->GetChildren().GetFirst(); 
5067                             wxWindow
*           pGrandChild 
= current2
->GetData(); 
5069                             vPoint3
.x 
= vPoint2
.x
; 
5070                             vPoint3
.y 
= vPoint2
.y
; 
5071                             ::WinMapWindowPoints( pChild
->GetHWND() 
5072                                                  ,pGrandChild
->GetHWND() 
5076                             ::WinQueryWindowRect(pGrandChild
->GetHWND(), &vRect
); 
5077                             if (::WinPtInRect(vHabmain
, &vRect
, &vPoint3
)) 
5079                                 hWndUnderMouse 
= GetHwndOf(pGrandChild
); 
5080                                 pWinUnderMouse 
= pGrandChild
; 
5083                             current2 
= current2
->GetNext(); 
5088                     hWndUnderMouse 
= GetHwndOf(pChild
); 
5089                     pWinUnderMouse 
= pChild
; 
5090                     rcVisible 
= ::WinIsWindowVisible(hWndUnderMouse
); 
5091                     rcEnabled 
= ::WinIsWindowEnabled(hWndUnderMouse
); 
5092                     if (rcVisible 
&& rcEnabled
) 
5095                 current 
= current
->GetNext(); 
5099     rcVisible 
= ::WinIsWindowVisible(hWndUnderMouse
); 
5100     rcEnabled 
= ::WinIsWindowEnabled(hWndUnderMouse
); 
5104     // Check that we have a child window which is susceptible to receive mouse 
5105     // events: for this it must be shown and enabled 
5107     if ( hWndUnderMouse 
&& 
5108          hWndUnderMouse 
!= hWnd 
&& 
5109          rcVisible 
&& rcEnabled
) 
5111         wxWindow
*                       pWinUnderMouse 
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
); 
5116             // Translate the mouse coords to the other window coords 
5118             pWin 
= pWinUnderMouse
; 
5122 } // end of FindWindowForMouseEvent