1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/os2/window.cpp 
   4 // Author:      David Webster 
   8 // Copyright:   (c) David Webster 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  13 // For compilers that support precompilation, includes "wx.h". 
  15 #include "wx/wxprec.h" 
  17 #include "wx/window.h" 
  26     #include "wx/dcclient.h" 
  30     #include "wx/layout.h" 
  31     #include "wx/checkbox.h" 
  32     #include "wx/combobox.h" 
  33     #include "wx/dialog.h" 
  35     #include "wx/listbox.h" 
  36     #include "wx/button.h" 
  37     #include "wx/bmpbuttn.h" 
  38     #include "wx/msgdlg.h" 
  39     #include "wx/scrolwin.h" 
  40     #include "wx/radiobox.h" 
  41     #include "wx/radiobut.h" 
  42     #include "wx/slider.h" 
  43     #include "wx/statbox.h" 
  44     #include "wx/statusbr.h" 
  45     #include "wx/toolbar.h" 
  46     #include "wx/settings.h" 
  49     #include "wx/textctrl.h" 
  50     #include "wx/menuitem.h" 
  55     #include "wx/ownerdrw.h" 
  58 #if     wxUSE_DRAG_AND_DROP 
  62 #include "wx/os2/private.h" 
  65     #include "wx/tooltip.h" 
  69     #include "wx/notebook.h" 
  79 // Place compiler, OS specific includes here 
  83 // Standard macros -- these are for OS/2 PM, but most GUI's have something similar 
  87 //  SHORT1FROMMP -- LOWORD 
  89     #define GET_X_LPARAM(mp) ((unsigned short)(unsigned long)(mp)) 
  91 //  SHORT2FROMMP -- HIWORD 
  93     #define GET_Y_LPARAM(mp) ((unsigned short)(unsigned long)(mp >> 16)) 
  94 #endif // GET_X_LPARAM 
  97 #  define CW_USEDEFAULT    ((int)0x80000000) 
 101     #define VK_OEM_1        0xBA 
 102     #define VK_OEM_PLUS     0xBB 
 103     #define VK_OEM_COMMA    0xBC 
 104     #define VK_OEM_MINUS    0xBD 
 105     #define VK_OEM_PERIOD   0xBE 
 106     #define VK_OEM_2        0xBF 
 107     #define VK_OEM_3        0xC0 
 108     #define VK_OEM_4        0xDB 
 109     #define VK_OEM_5        0xDC 
 110     #define VK_OEM_6        0xDD 
 111     #define VK_OEM_7        0xDE 
 114 // --------------------------------------------------------------------------- 
 116 // --------------------------------------------------------------------------- 
 119 // The last PM message we got (MT-UNSAFE) 
 123 #if wxUSE_MENUS_NATIVE 
 124 wxMenu
*                   wxCurrentPopupMenu 
= NULL
; 
 125 #endif // wxUSE_MENUS_NATIVE 
 127 // --------------------------------------------------------------------------- 
 129 // --------------------------------------------------------------------------- 
 132 // the window proc for all our windows; most gui's have something similar 
 134 MRESULT EXPENTRY 
wxWndProc( HWND hWnd
 
 141     const wxChar 
*wxGetMessageName(int message
); 
 144 wxWindowOS2
* FindWindowForMouseEvent( wxWindow
* pWin
 
 148 void         wxRemoveHandleAssociation(wxWindowOS2
* pWin
); 
 149 void         wxAssociateWinWithHandle( HWND         hWnd
 
 152 wxWindow
* wxFindWinFromHandle(WXHWND hWnd
); 
 155 // get the current state of SHIFT/CTRL keys 
 157 static inline bool IsKeyDown(LONG key
) {return (::WinGetKeyState(HWND_DESKTOP
, key
) & 0x8000) != 0; } 
 158 static inline bool IsShiftDown() { return IsKeyDown(VK_SHIFT
); } 
 159 static inline bool IsCtrlDown() { return IsKeyDown(VK_CTRL
); } 
 161 static wxWindow
*                    gpWinBeingCreated 
= NULL
; 
 163 // --------------------------------------------------------------------------- 
 165 // --------------------------------------------------------------------------- 
 167 // in wxUniv-OS/2 this class is abstract because it doesn't have DoPopupMenu() 
 169 #ifdef __WXUNIVERSAL__ 
 170     IMPLEMENT_ABSTRACT_CLASS(wxWindowOS2
, wxWindowBase
) 
 172     IMPLEMENT_DYNAMIC_CLASS(wxWindow
, wxWindowBase
) 
 173 #endif // __WXUNIVERSAL__/__WXPM__ 
 175 BEGIN_EVENT_TABLE(wxWindowOS2
, wxWindowBase
) 
 176     EVT_ERASE_BACKGROUND(wxWindowOS2::OnEraseBackground
) 
 177     EVT_SYS_COLOUR_CHANGED(wxWindowOS2::OnSysColourChanged
) 
 178     EVT_IDLE(wxWindowOS2::OnIdle
) 
 179     EVT_SET_FOCUS(wxWindowOS2::OnSetFocus
) 
 182 // =========================================================================== 
 184 // =========================================================================== 
 186 // --------------------------------------------------------------------------- 
 187 // wxWindow utility functions 
 188 // --------------------------------------------------------------------------- 
 191 // Find an item given the PM Window id 
 193 wxWindow
* wxWindowOS2::FindItem( 
 198     wxControl
*                      pItem 
= wxDynamicCast(this, wxControl
); 
 203         // I it we or one of our "internal" children? 
 205         if (pItem
->GetId() == lId
 
 206 #ifndef __WXUNIVERSAL__ 
 207             || (pItem
->GetSubcontrols().Index(lId
) != wxNOT_FOUND
) 
 214 #endif // wxUSE_CONTROLS 
 216     wxWindowList::compatibility_iterator  current 
= GetChildren().GetFirst(); 
 220         wxWindow
*                   pChildWin 
= current
->GetData(); 
 221         wxWindow
*                   pWnd 
= pChildWin
->FindItem(lId
); 
 226         current 
= current
->GetNext(); 
 229 } // end of wxWindowOS2::FindItem 
 232 // Find an item given the PM Window handle 
 234 wxWindow
* wxWindowOS2::FindItemByHWND( 
 239     wxWindowList::compatibility_iterator current 
= GetChildren().GetFirst(); 
 243         wxWindow
*                   pParent 
= current
->GetData(); 
 246         // Do a recursive search. 
 248         wxWindow
*                   pWnd 
= pParent
->FindItemByHWND(hWnd
); 
 255             || pParent
->IsKindOf(CLASSINFO(wxControl
)) 
 256 #endif // wxUSE_CONTROLS 
 259             wxWindow
*               pItem 
= current
->GetData(); 
 261             if (pItem
->GetHWND() == hWnd
) 
 265                 if (pItem
->ContainsHWND(hWnd
)) 
 269         current 
= current
->GetNext(); 
 272 } // end of wxWindowOS2::FindItemByHWND 
 275 // Default command handler 
 277 bool wxWindowOS2::OS2Command( WXUINT 
WXUNUSED(uParam
), 
 278                               WXWORD 
WXUNUSED(uId
) ) 
 283 // ---------------------------------------------------------------------------- 
 284 // constructors and such 
 285 // ---------------------------------------------------------------------------- 
 287 void wxWindowOS2::Init() 
 292     m_bWinCaptured 
= false; 
 294     m_fnOldWndProc          
= NULL
; 
 296     m_bMouseInWindow        
= false; 
 297     m_bLastKeydownProcessed 
= false; 
 298     m_pChildrenDisabled     
= NULL
; 
 305     m_hWndScrollBarHorz 
= 0L; 
 306     m_hWndScrollBarVert 
= 0L; 
 308     memset(&m_vWinSwp
, '\0', sizeof (SWP
)); 
 311     // Pass WM_GETDLGCODE to DefWindowProc() 
 317     m_bBackgroundTransparent 
= false; 
 320     // As all windows are created with WS_VISIBLE style... 
 324 #if wxUSE_MOUSEEVENT_HACK 
 327     m_nLastMouseEvent 
= -1; 
 328 #endif // wxUSE_MOUSEEVENT_HACK 
 329 } // wxWindowOS2::Init 
 334 wxWindowOS2::~wxWindowOS2() 
 336     m_isBeingDeleted 
= true; 
 338     for (wxWindow
* pWin 
= GetParent(); pWin
; pWin 
= pWin
->GetParent()) 
 340         wxTopLevelWindow
*           pFrame 
= wxDynamicCast(pWin
, wxTopLevelWindow
); 
 344             if (pFrame
->GetLastFocus() == this) 
 345                 pFrame
->SetLastFocus(NULL
); 
 353         if(!::WinDestroyWindow(GetHWND())) 
 354             wxLogLastError(wxT("DestroyWindow")); 
 356         // remove hWnd <-> wxWindow association 
 358         wxRemoveHandleAssociation(this); 
 360     delete m_pChildrenDisabled
; 
 361 } // end of wxWindowOS2::~wxWindowOS2 
 363 // real construction (Init() must have been called before!) 
 364 bool wxWindowOS2::Create( wxWindow
*       pParent
, 
 369                           const wxString
& rName 
) 
 371     HWND hParent 
= NULLHANDLE
; 
 372     ULONG ulCreateFlags 
= 0; 
 373     WXDWORD dwExStyle 
= 0; 
 375     wxCHECK_MSG(pParent
, false, wxT("can't create wxWindow without parent")); 
 379     // wxGTK doesn't allow to create controls with static box as the parent so 
 380     // this will result in a crash when the program is ported to wxGTK - warn 
 383     // the correct solution is to create the controls as siblings of the 
 386     wxASSERT_MSG( !wxDynamicCast(pParent
, wxStaticBox
), 
 387                   _T("wxStaticBox can't be used as a window parent!") ); 
 388 #endif // wxUSE_STATBOX 
 390      // Ensure groupbox backgrounds are painted 
 391      if (IsKindOf(CLASSINFO(wxPanel
))) 
 392          lStyle 
&= ~wxCLIP_CHILDREN
; 
 394     if ( !CreateBase( pParent
 
 406         pParent
->AddChild(this); 
 407         hParent 
= GetWinHwnd(pParent
); 
 409         if (pParent
->IsKindOf(CLASSINFO(wxScrolledWindow
))) 
 410             ulCreateFlags 
|= WS_CLIPSIBLINGS
; 
 414     // Most wxSTYLES are really PM Class specific styles and will be 
 415     // set in those class create procs.  PM's basic windows styles are 
 418     ulCreateFlags 
|=  OS2GetCreateWindowFlags(&dwExStyle
); 
 421 #ifdef __WXUNIVERSAL__ 
 422     // no 3d effects, we draw them ourselves 
 424 #endif // !wxUniversal 
 425     if (lStyle 
& wxPOPUP_WINDOW
) 
 427         ulCreateFlags 
&= ~WS_VISIBLE
; 
 432         ulCreateFlags 
|= WS_VISIBLE
; 
 436     // Generic OS/2 Windows have no Control Data but other classes 
 437     // that call OS2Create may have some. 
 439     return(OS2Create( (PSZ
)wxCanvasClassName
 
 444                      ,NULL         
// Control Data 
 448 } // end of wxWindowOS2::Create 
 450 // --------------------------------------------------------------------------- 
 452 // --------------------------------------------------------------------------- 
 454 void wxWindowOS2::SetFocus() 
 456     HWND                            hWnd 
= GetHwnd(); 
 457     wxCHECK_RET( hWnd
, _T("can't set focus to invalid window") ); 
 460         ::WinSetFocus(HWND_DESKTOP
, hWnd
); 
 461 } // end of wxWindowOS2::SetFocus 
 463 void wxWindowOS2::SetFocusFromKbd() 
 466     // Nothing else to do under OS/2 
 468     wxWindowBase::SetFocusFromKbd(); 
 469 } // end of wxWindowOS2::SetFocus 
 471 wxWindow
* wxWindowBase::DoFindFocus() 
 473     HWND                            hWnd 
= ::WinQueryFocus(HWND_DESKTOP
); 
 477         return wxFindWinFromHandle((WXHWND
)hWnd
); 
 480 } // wxWindowBase::DoFindFocus 
 482 bool wxWindowOS2::Enable( bool bEnable 
) 
 484     if (!wxWindowBase::Enable(bEnable
)) 
 487     HWND                            hWnd 
= GetHwnd(); 
 490         ::WinEnableWindow(hWnd
, (BOOL
)bEnable
); 
 493     // The logic below doesn't apply to the top level windows -- otherwise 
 494     // showing a modal dialog would result in total greying out (and ungreying 
 495     // out later) of everything which would be really ugly 
 500     wxWindowList::compatibility_iterator     node 
= GetChildren().GetFirst(); 
 504         wxWindow
*                   pChild 
= node
->GetData(); 
 509             // Enable the child back unless it had been disabled before us 
 511             if (!m_pChildrenDisabled 
|| !m_pChildrenDisabled
->Find(pChild
)) 
 514         else // we're being disabled 
 516             if (pChild
->IsEnabled()) 
 519                 // Disable it as children shouldn't stay enabled while the 
 524             else // child already disabled, remember it 
 527                 // Have we created the list of disabled children already? 
 529                 if (!m_pChildrenDisabled
) 
 530                     m_pChildrenDisabled 
= new wxWindowList
; 
 531                 m_pChildrenDisabled
->Append(pChild
); 
 534         node 
= node
->GetNext(); 
 536     if (bEnable 
&& m_pChildrenDisabled
) 
 539         // We don't need this list any more, don't keep unused memory 
 541         delete m_pChildrenDisabled
; 
 542         m_pChildrenDisabled 
= NULL
; 
 545 } // end of wxWindowOS2::Enable 
 547 bool wxWindowOS2::Show( bool bShow 
) 
 549     if (!wxWindowBase::Show(bShow
)) 
 552     HWND                            hWnd 
= GetHwnd(); 
 554     ::WinShowWindow(hWnd
, bShow
); 
 558         ::WinSetWindowPos(hWnd
, HWND_TOP
, 0, 0, 0, 0, SWP_ACTIVATE 
| SWP_ZORDER
); 
 561 } // end of wxWindowOS2::Show 
 563 void wxWindowOS2::Raise() 
 565     ::WinSetWindowPos(GetHwnd(), HWND_TOP
, 0, 0, 0, 0, SWP_ZORDER 
| SWP_ACTIVATE
); 
 566 } // end of wxWindowOS2::Raise 
 568 void wxWindowOS2::Lower() 
 570     ::WinSetWindowPos(GetHwnd(), HWND_BOTTOM
, 0, 0, 0, 0, SWP_ZORDER 
| SWP_DEACTIVATE
); 
 571 } // end of wxWindowOS2::Lower 
 573 void wxWindowOS2::SetLabel( const wxString
& label 
) 
 575     ::WinSetWindowText(GetHwnd(), (PSZ
)label
.c_str()); 
 576 } // end of wxWindowOS2::SetLabel 
 578 wxString 
wxWindowOS2::GetLabel() const 
 580     return wxGetWindowText(GetHWND()); 
 581 } // end of wxWindowOS2::GetLabel 
 583 void wxWindowOS2::DoCaptureMouse() 
 585     HWND hWnd 
= GetHwnd(); 
 587     if (hWnd 
&& !m_bWinCaptured
) 
 589         ::WinSetCapture(HWND_DESKTOP
, hWnd
); 
 590         m_bWinCaptured 
= true; 
 592 } // end of wxWindowOS2::DoCaptureMouse 
 594 void wxWindowOS2::DoReleaseMouse() 
 598         ::WinSetCapture(HWND_DESKTOP
, NULLHANDLE
); 
 599         m_bWinCaptured 
= false; 
 601 } // end of wxWindowOS2::ReleaseMouse 
 603 /* static */ wxWindow
* wxWindowBase::GetCapture() 
 605     HWND hwnd 
= ::WinQueryCapture(HWND_DESKTOP
); 
 606     return hwnd 
? wxFindWinFromHandle((WXHWND
)hwnd
) : (wxWindow 
*)NULL
; 
 607 } // end of wxWindowBase::GetCapture 
 609 bool wxWindowOS2::SetFont( const wxFont
& rFont 
) 
 611     if (!wxWindowBase::SetFont(rFont
)) 
 617     HWND hWnd 
= GetHwnd(); 
 619     wxOS2SetFont( hWnd
, rFont 
); 
 621 } // end of wxWindowOS2::SetFont 
 623 // check if base implementation is OK 
 624 bool wxWindowOS2::SetCursor( const wxCursor
& rCursor
) 
 626     if ( !wxWindowBase::SetCursor(rCursor
)) 
 632     if ( m_cursor
.Ok() ) { 
 633         HWND                            hWnd 
= GetHwnd(); 
 637         ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
 638         ::WinQueryWindowRect(hWnd
, &vRect
); 
 640         if (::WinPtInRect(vHabmain
, &vRect
, &vPoint
) && !wxIsBusy()) 
 642             ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)m_cursor
.GetHCURSOR()); 
 646 } // end of wxWindowOS2::SetCursor 
 648 void wxWindowOS2::WarpPointer( 
 657     ::WinQueryWindowRect(GetHwnd(), &vRect
); 
 661     ::WinSetPointerPos(HWND_DESKTOP
, (LONG
)nX
, (LONG
)(nY
)); 
 662 } // end of wxWindowOS2::WarpPointer 
 665 // --------------------------------------------------------------------------- 
 667 // --------------------------------------------------------------------------- 
 669 int  wxWindowOS2::GetScrollPos( 
 673     if (nOrient 
== wxHORIZONTAL
) 
 674         return((int)::WinSendMsg(m_hWndScrollBarHorz
, SBM_QUERYPOS
, (MPARAM
)NULL
, (MPARAM
)NULL
)); 
 676         return((int)::WinSendMsg(m_hWndScrollBarVert
, SBM_QUERYPOS
, (MPARAM
)NULL
, (MPARAM
)NULL
)); 
 677 } // end of wxWindowOS2::GetScrollPos 
 679 int wxWindowOS2::GetScrollRange( 
 685     if (nOrient 
== wxHORIZONTAL
) 
 686         mr 
= ::WinSendMsg(m_hWndScrollBarHorz
, SBM_QUERYRANGE
, (MPARAM
)NULL
, (MPARAM
)NULL
); 
 688         mr 
= ::WinSendMsg(m_hWndScrollBarVert
, SBM_QUERYRANGE
, (MPARAM
)NULL
, (MPARAM
)NULL
); 
 689     return((int)SHORT2FROMMR(mr
)); 
 690 } // end of wxWindowOS2::GetScrollRange 
 692 int wxWindowOS2::GetScrollThumb( 
 696     if (nOrient 
== wxHORIZONTAL 
) 
 697         return m_nXThumbSize
; 
 699         return m_nYThumbSize
; 
 700 } // end of wxWindowOS2::GetScrollThumb 
 702 void wxWindowOS2::SetScrollPos( 
 705 , bool                              WXUNUSED(bRefresh
) 
 708     if (nOrient 
== wxHORIZONTAL 
) 
 709         ::WinSendMsg(m_hWndScrollBarHorz
, SBM_SETPOS
, (MPARAM
)nPos
, (MPARAM
)NULL
); 
 711         ::WinSendMsg(m_hWndScrollBarVert
, SBM_SETPOS
, (MPARAM
)nPos
, (MPARAM
)NULL
); 
 712 } // end of wxWindowOS2::SetScrollPos 
 714 void wxWindowOS2::SetScrollbar( int  nOrient
, 
 718                                 bool WXUNUSED(bRefresh
) ) 
 720     HWND                            hWnd 
= GetHwnd(); 
 721     int                             nOldRange 
= nRange 
- nThumbVisible
; 
 722     int                             nRange1 
= nOldRange
; 
 723     int                             nPageSize 
= nThumbVisible
; 
 724     int         nVSBWidth  
= wxSystemSettingsNative::GetMetric(wxSYS_VSCROLL_X
, 
 726     int         nHSBHeight 
= wxSystemSettingsNative::GetMetric(wxSYS_HSCROLL_Y
, 
 730     ULONG                           ulStyle 
= WS_VISIBLE 
| WS_SYNCPAINT
; 
 735     wxWindow
*                       pParent 
= GetParent(); 
 737     if (pParent 
&& pParent
->IsKindOf(CLASSINFO(wxFrame
))) 
 741         pFrame 
= wxDynamicCast(pParent
, wxFrame
); 
 742         hWndParent 
= pFrame
->GetFrame(); 
 743         hWndClient 
= GetHwndOf(pParent
); 
 748             hWndParent 
= GetHwndOf(pParent
); 
 750             hWndParent 
= GetHwnd(); 
 751         hWndClient 
= hWndParent
; 
 753     ::WinQueryWindowPos(hWndClient
, &vSwp
); 
 754     ::WinQueryWindowPos(hWnd
, &vSwpOwner
); 
 756     if (nPageSize 
> 1 && nRange 
> 0) 
 758         nRange1 
+= (nPageSize 
- 1); 
 761     vInfo
.cb 
= sizeof(SBCDATA
); 
 763     vInfo
.posLast 
= (SHORT
)nRange1
; 
 764     vInfo
.posThumb 
= (SHORT
)nPos
; 
 766     if (nOrient 
== wxHORIZONTAL 
) 
 769         if (m_hWndScrollBarHorz 
== 0L) 
 772             // Since the scrollbars are usually created before the owner is 
 773             // sized either via an OnSize event directly or via sizers or 
 774             // layout constraints, we will initially just use the coords of 
 775             // the parent window (this is usually a frame client window). But 
 776             // the bars themselves, are children of the parent frame (i.e 
 777             // siblings of the frame client.  The owner, however is the actual 
 778             // window being scrolled (or at least the one responsible for 
 779             // handling the scroll events). The owner will be resized later, 
 780             // as it is usually a child of a top level window, and when that 
 781             // is done its scrollbars will be resized and repositioned as well. 
 783             m_hWndScrollBarHorz 
= ::WinCreateWindow( hWndParent
 
 801             // The owner (the scrolled window) is a child of the Frame's 
 802             // client window, usually.  The scrollbars are children of the 
 803             // frame, itself, and thus are positioned relative to the frame's 
 804             // origin, not the frame's client window origin. 
 805             // The starting x position is the same as the starting x position 
 806             // of the owner, but in terms of the parent frame. 
 807             // The starting y position is wxSYS_HSCROLL_Y pels below the 
 808             // origin of the owner in terms of the parent frame. 
 809             // The horz bar is the same width as the owner and wxSYS_HSCROLL_Y 
 812             if (nRange1 
>= nThumbVisible
) 
 814                 ::WinSetWindowPos( m_hWndScrollBarHorz
 
 816                                   ,vSwp
.x 
+ vSwpOwner
.x
 
 817                                   ,(vSwp
.y 
+ vSwpOwner
.y
) - nHSBHeight
 
 820                                   ,SWP_MOVE 
| SWP_SIZE 
| SWP_SHOW 
| SWP_ACTIVATE 
| SWP_ZORDER
 
 822                 ::WinSendMsg( m_hWndScrollBarHorz
 
 825                              ,MPFROM2SHORT(0, (SHORT
)nRange1
) 
 827                 ::WinSendMsg( m_hWndScrollBarHorz
 
 829                              ,MPFROM2SHORT( (SHORT
)nThumbVisible
 
 836                 ::WinShowWindow(m_hWndScrollBarHorz
, FALSE
); 
 842         if (m_hWndScrollBarVert 
== 0L) 
 845             // Since the scrollbars are usually created before the owner is 
 846             // sized either via an OnSize event directly or via sizers or 
 847             // layout constraints, we will initially just use the coords of 
 848             // the parent window (this is usually a frame client window). But 
 849             // the bars themselves, are children of the parent frame (i.e 
 850             // siblings of the frame client.  The owner, however is the actual 
 851             // window being scrolled (or at least the one responsible for 
 852             // handling the scroll events). The owner will be resized later, 
 853             // as it is usually a child of a top level window, and when that 
 854             // is done its scrollbars will be resized and repositioned as well. 
 856             m_hWndScrollBarVert 
= ::WinCreateWindow( hWndParent
 
 860                                                     ,vSwp
.x 
+ vSwp
.cx 
- nVSBWidth
 
 863                                                     ,vSwp
.cy 
- nHSBHeight
 
 874             // The owner (the scrolled window) is a child of the Frame's 
 875             // client window, usually.  The scrollbars are children of the 
 876             // frame, itself and thus are positioned relative to the frame's 
 877             // origin, not the frame's client window's origin. 
 878             // Thus, the x position will be frame client's x (usually a few 
 879             // pels inside the parent frame, plus the width of the owner. 
 880             // Since we may be using sizers or layout constraints for multiple 
 881             // child scrolled windows, the y position will be the frame client's 
 882             // y pos plus the scrolled windows y position, yielding the y 
 883             // position of the scrollbar relative to the parent frame (the vert 
 884             // scrollbar is on the right and starts at the bottom of the 
 886             // It is wxSYS_VSCROLL_X pels wide and the same height as the owner. 
 888             if (nRange1 
>= nThumbVisible
) 
 890                 ::WinSetWindowPos( m_hWndScrollBarVert
 
 892                                   ,vSwp
.x 
+ vSwpOwner
.x 
+ vSwpOwner
.cx
 
 893                                   ,vSwp
.y 
+ vSwpOwner
.y
 
 896                                   ,SWP_ACTIVATE 
| SWP_MOVE 
| SWP_SIZE 
| SWP_SHOW
 
 898                 ::WinSendMsg( m_hWndScrollBarVert
 
 901                              ,MPFROM2SHORT(0, (SHORT
)nRange1
) 
 903                 ::WinSendMsg( m_hWndScrollBarVert
 
 905                              ,MPFROM2SHORT( (SHORT
)nThumbVisible
 
 912                 ::WinShowWindow(m_hWndScrollBarVert
, FALSE
); 
 914         m_nYThumbSize 
= nThumbVisible
; 
 916 } // end of wxWindowOS2::SetScrollbar 
 919 void wxWindowOS2::ScrollWindow( int nDx
, 
 921                                 const wxRect
* pRect 
) 
 925     ::WinQueryWindowRect(GetHwnd(), &vRect
); 
 926     int height 
= vRect
.yTop
; 
 929         vRect
.xLeft   
= pRect
->x
; 
 930         vRect
.yTop    
= height 
- pRect
->y
; 
 931         vRect
.xRight  
= pRect
->x 
+ pRect
->width
; 
 932         vRect
.yBottom 
= vRect
.yTop 
- pRect
->height
; 
 934     nDy 
*= -1; // flip the sign of Dy as OS/2 is opposite Windows. 
 935     ::WinScrollWindow( GetHwnd() 
 942                       ,SW_SCROLLCHILDREN 
| SW_INVALIDATERGN
 
 944 } // end of wxWindowOS2::ScrollWindow 
 946 // --------------------------------------------------------------------------- 
 948 // --------------------------------------------------------------------------- 
 950 void wxWindowOS2::SubclassWin( 
 954     HWND                            hwnd 
= (HWND
)hWnd
; 
 956     wxCHECK_RET(::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in SubclassWin") ); 
 957     wxAssociateWinWithHandle( hWnd
 
 960     if (!wxCheckWindowWndProc( hWnd
 
 961                               ,(WXFARPROC
)wxWndProc
 
 964         m_fnOldWndProc 
= (WXFARPROC
) ::WinSubclassWindow(hwnd
, (PFNWP
)wxWndProc
); 
 968         m_fnOldWndProc 
= (WXFARPROC
)NULL
; 
 970 } // end of wxWindowOS2::SubclassWin 
 972 void wxWindowOS2::UnsubclassWin() 
 975     // Restore old Window proc 
 977     HWND                            hwnd 
= GetHWND(); 
 981         wxCHECK_RET( ::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in UnsubclassWin") ); 
 983         PFNWP                       fnProc 
= (PFNWP
)::WinQueryWindowPtr(hwnd
, QWP_PFNWP
); 
 985         if ( (m_fnOldWndProc 
!= 0) && (fnProc 
!= (PFNWP
) m_fnOldWndProc
)) 
 987             WinSubclassWindow(hwnd
, (PFNWP
)m_fnOldWndProc
); 
 991 } // end of wxWindowOS2::UnsubclassWin 
 993 bool wxCheckWindowWndProc( 
 995 , WXFARPROC                         fnWndProc
 
 998     static char                     zBuffer
[512]; 
1001     ::WinQueryClassName((HWND
)hWnd
, (LONG
)512, (PCH
)zBuffer
); 
1002     ::WinQueryClassInfo(wxGetInstance(), (PSZ
)zBuffer
, &vCls
); 
1003     return(fnWndProc 
== (WXFARPROC
)vCls
.pfnWindowProc
); 
1004 } // end of WinGuiBase_CheckWindowWndProc 
1006 void wxWindowOS2::SetWindowStyleFlag( 
1010     long                            lFlagsOld 
= GetWindowStyleFlag(); 
1012     if (lFlags 
== lFlagsOld
) 
1016     // Update the internal variable 
1018     wxWindowBase::SetWindowStyleFlag(lFlags
); 
1021     // Now update the Windows style as well if needed - and if the window had 
1022     // been already created 
1028     WXDWORD                         dwExstyleOld
; 
1029     long                            lStyle 
= OS2GetStyle( lFlags
 
1032     long                            lStyleOld 
= OS2GetStyle( lFlagsOld
 
1036     if (lStyle 
!= lStyleOld
) 
1039         // Some flags (e.g. WS_VISIBLE or WS_DISABLED) should not be changed by 
1040         // this function so instead of simply setting the style to the new 
1041         // value we clear the bits which were set in styleOld but are set in 
1042         // the new one and set the ones which were not set before 
1044         long                        lStyleReal 
= ::WinQueryWindowULong(GetHwnd(), QWL_STYLE
); 
1046         lStyleReal 
&= ~lStyleOld
; 
1047         lStyleReal 
|= lStyle
; 
1049         ::WinSetWindowULong(GetHwnd(), QWL_STYLE
, lStyleReal
); 
1051 } // end of wxWindowOS2::SetWindowStyleFlag 
1053 WXDWORD 
wxWindowOS2::OS2GetStyle( long     lFlags
, 
1054                                   WXDWORD
* WXUNUSED(pdwExstyle
) ) const 
1056     WXDWORD                         dwStyle 
= 0L; 
1058     if (lFlags 
& wxCLIP_CHILDREN 
) 
1059         dwStyle 
|= WS_CLIPCHILDREN
; 
1061     if (lFlags 
& wxCLIP_SIBLINGS 
) 
1062         dwStyle 
|= WS_CLIPSIBLINGS
; 
1065 } // end of wxWindowOS2::OS2GetStyle 
1068 // Make a Windows extended style from the given wxWidgets window style 
1070 WXDWORD 
wxWindowOS2::MakeExtendedStyle( 
1072 , bool                              bEliminateBorders
 
1076    // Simply fill out with wxWindow extended styles.  We'll conjure 
1077    // something up in OS2Create and all window redrawing pieces later 
1079     WXDWORD                         dwStyle 
= 0; 
1081     if (lStyle 
& wxTRANSPARENT_WINDOW 
) 
1082         dwStyle 
|= wxTRANSPARENT_WINDOW
; 
1084     if (!bEliminateBorders
) 
1086         if (lStyle 
& wxSUNKEN_BORDER
) 
1087             dwStyle 
|= wxSUNKEN_BORDER
; 
1088         if (lStyle 
& wxDOUBLE_BORDER
) 
1089             dwStyle 
|= wxDOUBLE_BORDER
; 
1090         if (lStyle 
& wxRAISED_BORDER 
) 
1091             dwStyle 
|= wxRAISED_BORDER
; 
1092         if (lStyle 
& wxSTATIC_BORDER
) 
1093             dwStyle 
|= wxSTATIC_BORDER
; 
1096 } // end of wxWindowOS2::MakeExtendedStyle 
1099 // Setup background and foreground colours correctly 
1101 void wxWindowOS2::SetupColours() 
1104         SetBackgroundColour(GetParent()->GetBackgroundColour()); 
1105 } // end of wxWindowOS2::SetupColours 
1107 void wxWindowOS2::OnIdle( 
1108   wxIdleEvent
&                      WXUNUSED(rEvent
) 
1112     // Check if we need to send a LEAVE event 
1114     if (m_bMouseInWindow
) 
1118         ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
1119         if (::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, FALSE
) != (HWND
)GetHwnd()) 
1122             // Generate a LEAVE event 
1124             m_bMouseInWindow 
= false; 
1127             // Unfortunately the mouse button and keyboard state may have changed 
1128             // by the time the OnIdle function is called, so 'state' may be 
1138             wxMouseEvent            
rEvent(wxEVT_LEAVE_WINDOW
); 
1140             InitMouseEvent( rEvent
 
1145             (void)GetEventHandler()->ProcessEvent(rEvent
); 
1148     if (wxUpdateUIEvent::CanUpdate(this)) 
1149         UpdateWindowUI(wxUPDATE_UI_FROMIDLE
); 
1150 } // end of wxWindowOS2::OnIdle 
1153 // Set this window to be the child of 'parent'. 
1155 bool wxWindowOS2::Reparent( wxWindow
* pParent
) 
1157     if (!wxWindowBase::Reparent(pParent
)) 
1160     HWND hWndChild 
= GetHwnd(); 
1161     HWND hWndParent 
= GetParent() ? GetWinHwnd(GetParent()) : (HWND
)0; 
1163     ::WinSetParent(hWndChild
, hWndParent
, TRUE
); 
1165 } // end of wxWindowOS2::Reparent 
1167 void wxWindowOS2::Update() 
1169     ::WinUpdateWindow(GetHwnd()); 
1170 } // end of wxWindowOS2::Update 
1172 void wxWindowOS2::Freeze() 
1174    ::WinSendMsg(GetHwnd(), WM_VRNDISABLED
, (MPARAM
)0, (MPARAM
)0); 
1175 } // end of wxWindowOS2::Freeze 
1177 void wxWindowOS2::Thaw() 
1179    ::WinSendMsg(GetHwnd(), WM_VRNENABLED
, (MPARAM
)TRUE
, (MPARAM
)0); 
1182     // We need to refresh everything or otherwise he invalidated area is not 
1186 } // end of wxWindowOS2::Thaw 
1188 void wxWindowOS2::Refresh( bool bEraseBack
, 
1189                            const wxRect
* pRect 
) 
1191     HWND hWnd 
= GetHwnd(); 
1200             ::WinQueryWindowRect(GetHwnd(), &vOs2Rect
); 
1201             height 
= vOs2Rect
.yTop
; 
1202             vOs2Rect
.xLeft   
= pRect
->x
; 
1203             vOs2Rect
.yTop    
= height 
- pRect
->y
; 
1204             vOs2Rect
.xRight  
= pRect
->x 
+ pRect
->width
; 
1205             vOs2Rect
.yBottom 
= vOs2Rect
.yTop 
- pRect
->height
; 
1207             ::WinInvalidateRect(hWnd
, &vOs2Rect
, bEraseBack
); 
1210             ::WinInvalidateRect(hWnd
, NULL
, bEraseBack
); 
1211         if (m_hWndScrollBarHorz 
!= NULLHANDLE
) 
1212             ::WinInvalidateRect(m_hWndScrollBarHorz
, NULL
, TRUE
); 
1213         if (m_hWndScrollBarVert 
!= NULLHANDLE
) 
1214             ::WinInvalidateRect(m_hWndScrollBarVert
, NULL
, TRUE
); 
1216 } // end of wxWindowOS2::Refresh 
1218 // --------------------------------------------------------------------------- 
1220 // --------------------------------------------------------------------------- 
1222 #if wxUSE_DRAG_AND_DROP 
1223 void wxWindowOS2::SetDropTarget( 
1224   wxDropTarget
*                     pDropTarget
 
1227     m_dropTarget 
= pDropTarget
; 
1228 } // end of wxWindowOS2::SetDropTarget 
1232 // old style file-manager drag&drop support: we retain the old-style 
1233 // DragAcceptFiles in parallel with SetDropTarget. 
1235 void wxWindowOS2::DragAcceptFiles( 
1239     HWND                            hWnd 
= GetHwnd(); 
1241     if (hWnd 
&& bAccept
) 
1242         ::DrgAcceptDroppedFiles(hWnd
, NULL
, NULL
, DO_COPY
, 0L); 
1243 } // end of wxWindowOS2::DragAcceptFiles 
1245 // ---------------------------------------------------------------------------- 
1247 // ---------------------------------------------------------------------------- 
1251 void wxWindowOS2::DoSetToolTip( 
1255     wxWindowBase::DoSetToolTip(pTooltip
); 
1258         m_tooltip
->SetWindow(this); 
1259 } // end of wxWindowOS2::DoSetToolTip 
1261 #endif // wxUSE_TOOLTIPS 
1263 // --------------------------------------------------------------------------- 
1264 // moving and resizing 
1265 // --------------------------------------------------------------------------- 
1268 void wxWindowOS2::DoGetSize( 
1276     if (IsKindOf(CLASSINFO(wxFrame
))) 
1278         wxFrame
*                    pFrame 
= wxDynamicCast(this, wxFrame
); 
1279         hWnd 
= pFrame
->GetFrame(); 
1284     ::WinQueryWindowRect(hWnd
, &vRect
); 
1287         *pWidth 
= vRect
.xRight 
- vRect
.xLeft
; 
1289         // OS/2 PM is backwards from windows 
1290         *pHeight 
= vRect
.yTop 
- vRect
.yBottom
; 
1291 } // end of wxWindowOS2::DoGetSize 
1293 void wxWindowOS2::DoGetPosition( 
1299     // Return parameters assume wxWidgets coordinate system 
1304     wxWindow
*                       pParent 
= GetParent(); 
1307     // It would seem that WinQueryWindowRect would be the correlary to 
1308     // the WIN32 WinGetRect, but unlike WinGetRect which returns the window 
1309     // origin position in screen coordinates, WinQueryWindowRect returns it 
1310     // relative to itself, i.e. (0,0).  To get the same under PM we must 
1311     // use WinQueryWindowPos.  This call, unlike the WIN32 call, however, 
1312     // returns a position relative to it's parent, so no parent adujstments 
1313     // are needed under OS/2.  Also, windows should be created using 
1314     // wxWindow coordinates, i.e 0,0 is the TOP left. 
1316     if (IsKindOf(CLASSINFO(wxFrame
))) 
1318         wxFrame
*                    pFrame 
= wxDynamicCast(this, wxFrame
); 
1319         hWnd 
= pFrame
->GetFrame(); 
1324     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1329     // We need to convert to wxWidgets coordinates 
1331     DoGetSize(NULL
,&vHeight
); 
1332     wxWindow
* pWindow 
= wxDynamicCast(this,wxWindow
); 
1333     vPoint
.y 
= pWindow
->GetOS2ParentHeight(pParent
) - vPoint
.y 
- vHeight
; 
1336     // We may be faking the client origin. So a window that's really at (0, 
1337     // 30) may appear (to wxWin apps) to be at (0, 0). 
1341         wxPoint                     
vPt(pParent
->GetClientAreaOrigin()); 
1351 } // end of wxWindowOS2::DoGetPosition 
1353 void wxWindowOS2::DoScreenToClient( 
1358     HWND                            hWnd 
= GetHwnd(); 
1361     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1367 } // end of wxWindowOS2::DoScreenToClient 
1369 void wxWindowOS2::DoClientToScreen( 
1374     HWND                            hWnd 
= GetHwnd(); 
1377     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1383 } // end of wxWindowOS2::DoClientToScreen 
1386 // Get size *available for subwindows* i.e. excluding menu bar etc. 
1387 // Must be a frame type window 
1389 void wxWindowOS2::DoGetClientSize( 
1394     HWND                            hWnd 
= GetHwnd(); 
1397    ::WinQueryWindowRect(hWnd
, &vRect
); 
1398     if (IsKindOf(CLASSINFO(wxDialog
))) 
1403         // For a Dialog we have to explicitly request the client portion. 
1404         // For a Frame the hWnd IS the client window 
1406         hWndTitle 
= ::WinWindowFromID(hWnd
, FID_TITLEBAR
); 
1407         if (::WinQueryWindowRect(hWndTitle
, &vTitle
)) 
1409             if (vTitle
.yTop 
- vTitle
.yBottom 
== 0) 
1412                 // Dialog has not been created yet, use a default 
1416             vRect
.yTop 
-= (vTitle
.yTop 
- vTitle
.yBottom
); 
1419         ULONG                       uStyle 
= ::WinQueryWindowULong(hWnd
, QWL_STYLE
); 
1422         // Deal with borders 
1424         if (uStyle 
& FCF_DLGBORDER
) 
1431         else if (uStyle 
& FCF_SIZEBORDER
) 
1438         else if (uStyle 
& FCF_BORDER
) 
1445         else // make some kind of adjustment or top sizers ram into the titlebar! 
1454         *pWidth  
= vRect
.xRight 
- vRect
.xLeft
; 
1456         *pHeight 
= vRect
.yTop 
- vRect
.yBottom
; 
1457 } // end of wxWindowOS2::DoGetClientSize 
1459 void wxWindowOS2::DoMoveWindow( 
1467     // Input parameters assume wxWidgets coordinate system 
1470     wxWindow
*                       pParent 
= GetParent(); 
1471     HWND                            hWnd 
= GetHwnd(); 
1473     if (pParent 
&& !IsKindOf(CLASSINFO(wxDialog
))) 
1475         int                         nOS2Height 
= GetOS2ParentHeight(pParent
); 
1477         nY 
= nOS2Height 
- (nY 
+ nHeight
); 
1483         ::WinQueryWindowRect(HWND_DESKTOP
, &vRect
); 
1484         nY 
= vRect
.yTop 
- (nY 
+ nHeight
); 
1488     // In the case of a frame whose client is sized, the client cannot be 
1489     // large than its parent frame minus its borders! This usually happens 
1490     // when using an autosizer to size a frame to precisely hold client 
1491     // controls as in the notebook sample. 
1493     // In this case, we may need to resize both a frame and its client so we 
1494     // need a quick calc of the frame border size, then if the frame 
1495     // (less its borders) is smaller than the client, size the frame to 
1496     // encompass the client with the appropriate border size. 
1498     if (IsKindOf(CLASSINFO(wxFrame
))) 
1501         int                         nWidthFrameDelta 
= 0; 
1502         int                         nHeightFrameDelta 
= 0; 
1505         pFrame 
= wxDynamicCast(this, wxFrame
); 
1506         hWnd 
= pFrame
->GetFrame(); 
1507         ::WinQueryWindowRect(hWnd
, &vRect
); 
1508         ::WinMapWindowPoints(hWnd
, HWND_DESKTOP
, (PPOINTL
)&vRect
, 2); 
1510         ::WinCalcFrameRect(hWnd
, &vRect
, TRUE
); 
1511         nWidthFrameDelta 
= ((vRect
.xLeft 
- vFRect
.xLeft
) + (vFRect
.xRight 
- vRect
.xRight
)); 
1512         nHeightFrameDelta 
= ((vRect
.yBottom 
- vFRect
.yBottom
) + (vFRect
.yTop 
- vRect
.yTop
)); 
1513         // Input values refer to the window position relative to its parent 
1514         // which may be the Desktop so we need to calculate 
1515         // the new frame values to keep the wxWidgets frame origin constant 
1516         nY 
-= nHeightFrameDelta
; 
1517         nWidth 
+= nWidthFrameDelta
; 
1518         nHeight 
+= nHeightFrameDelta
; 
1520     ::WinSetWindowPos( hWnd
 
1526                       ,SWP_SIZE 
| SWP_MOVE
 
1528     if (m_vWinSwp
.cx 
== 0 && m_vWinSwp
.cy 
== 0 && m_vWinSwp
.fl 
== 0) 
1532         ::WinQueryWindowPos(hWnd
, &m_vWinSwp
); 
1536         // Handle resizing of scrolled windows.  The target or window to 
1537         // be scrolled is the owner (gets the scroll notifications).  The 
1538         // parent is usually the parent frame of the scrolled panel window. 
1539         // In order to show the scrollbars the target window will be shrunk 
1540         // by the size of the scroll bar widths and moved in the X and Y 
1541         // directon.  That value will be computed as part of the diff for 
1542         // moving the children.  Everytime the window is sized the 
1543         // toplevel OnSize is going to resize the panel to fit the client 
1544         // or the whole sizer and will need to me resized. This will send 
1545         // a WM_SIZE out which will be intercepted by the ScrollHelper 
1546         // which will cause the scrollbars to be displayed via the SetScrollbar 
1549         if (IsKindOf(CLASSINFO(wxScrolledWindow
))) 
1551             int                     nAdjustWidth  
= 0; 
1552             int                     nAdjustHeight 
= 0; 
1553             int nHSBHeight 
= wxSystemSettingsNative::GetMetric(wxSYS_HSCROLL_Y
, 
1555             int nVSBWidth  
= wxSystemSettingsNative::GetMetric(wxSYS_VSCROLL_X
, 
1559             if (GetScrollBarHorz() == NULLHANDLE 
|| 
1560                 !WinIsWindowShowing(GetScrollBarHorz())) 
1563                 nAdjustHeight 
= nHSBHeight
; 
1564             if (GetScrollBarVert() == NULLHANDLE 
|| 
1565                 !WinIsWindowShowing(GetScrollBarVert())) 
1568                 nAdjustWidth 
= nVSBWidth
; 
1569             ::WinQueryWindowPos(hWnd
, &vSwpScroll
); 
1570             ::WinSetWindowPos( hWnd
 
1573                               ,vSwpScroll
.y 
+ nAdjustHeight
 
1574                               ,vSwpScroll
.cx 
- nAdjustWidth
 
1575                               ,vSwpScroll
.cy 
- nAdjustHeight
 
1576                               ,SWP_MOVE 
| SWP_SIZE
 
1579         ::WinQueryWindowPos(hWnd
, &m_vWinSwp
); 
1581 } // end of wxWindowOS2::DoMoveWindow 
1584 // Set the size of the window: if the dimensions are positive, just use them, 
1585 // but if any of them is equal to -1, it means that we must find the value for 
1586 // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in 
1587 // which case -1 is a valid value for x and y) 
1589 // If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate 
1590 // the width/height to best suit our contents, otherwise we reuse the current 
1593 void wxWindowOS2::DoSetSize( int nX
, 
1600     // Input & output parameters assume wxWidgets coordinate system 
1604     // Get the current size and position... 
1610     wxSize vSize 
= wxDefaultSize
; 
1612     GetPosition(&nCurrentX
, &nCurrentY
); 
1613     GetSize(&nCurrentWidth
, &nCurrentHeight
); 
1616     // ... and don't do anything (avoiding flicker) if it's already ok 
1618     if (nX 
== nCurrentX 
&& nY 
== nCurrentY 
&& 
1619         nWidth 
== nCurrentWidth 
&& nHeight 
== nCurrentHeight
) 
1624     if (nX 
== wxDefaultCoord 
&& !(nSizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
)) 
1626     if (nY 
== wxDefaultCoord 
&& !(nSizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
)) 
1629     AdjustForParentClientOrigin(nX
, nY
, nSizeFlags
); 
1631     if (nWidth 
== wxDefaultCoord
) 
1633         if (nSizeFlags 
& wxSIZE_AUTO_WIDTH
) 
1635             vSize  
= DoGetBestSize(); 
1641             // Just take the current one 
1643             nWidth 
= nCurrentWidth
; 
1647     if (nHeight 
== wxDefaultCoord
) 
1649         if (nSizeFlags 
& wxSIZE_AUTO_HEIGHT
) 
1651             if (vSize
.x 
== wxDefaultCoord
) 
1653                 vSize 
= DoGetBestSize(); 
1659             // just take the current one 
1660             nHeight 
= nCurrentHeight
; 
1664     DoMoveWindow( nX
, nY
, nWidth
, nHeight 
); 
1665 } // end of wxWindowOS2::DoSetSize 
1667 void wxWindowOS2::DoSetClientSize( int nWidth
, 
1671     // nX & nY assume wxWidgets coordinate system 
1676     GetPosition(&nX
, &nY
); 
1678     DoMoveWindow( nX
, nY
, nWidth
, nHeight 
); 
1680     wxSize 
size( nWidth
, nHeight 
); 
1681     wxSizeEvent 
vEvent( size
, m_windowId 
); 
1682     vEvent
.SetEventObject(this); 
1683     GetEventHandler()->ProcessEvent(vEvent
); 
1684 } // end of wxWindowOS2::DoSetClientSize 
1686 // --------------------------------------------------------------------------- 
1688 // --------------------------------------------------------------------------- 
1690 int wxWindowOS2::GetCharHeight() const 
1693     FONTMETRICS                     vFontMetrics
; 
1695     hPs 
= ::WinGetPS(GetHwnd()); 
1697     if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
)) 
1699         ::WinReleasePS(hPs
); 
1702     ::WinReleasePS(hPs
); 
1703     return(vFontMetrics
.lMaxAscender 
+ vFontMetrics
.lMaxDescender
); 
1704 } // end of wxWindowOS2::GetCharHeight 
1706 int wxWindowOS2::GetCharWidth() const 
1709     FONTMETRICS                     vFontMetrics
; 
1711     hPs 
= ::WinGetPS(GetHwnd()); 
1713     if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
)) 
1715         ::WinReleasePS(hPs
); 
1718     ::WinReleasePS(hPs
); 
1719     return(vFontMetrics
.lAveCharWidth
); 
1720 } // end of wxWindowOS2::GetCharWidth 
1722 void wxWindowOS2::GetTextExtent( const wxString
& rString
, 
1726                                  int* pExternalLeading
, 
1727                                  const wxFont
* WXUNUSED(pTheFont
) ) const 
1729     POINTL      avPoint
[TXTBOX_COUNT
]; 
1734     FONTMETRICS vFM
; // metrics structure 
1739     hPS 
= ::WinGetPS(GetHwnd()); 
1741     l 
= rString
.length(); 
1744         pStr 
= (PCH
)rString
.c_str(); 
1747         // In world coordinates. 
1749         bRc 
= ::GpiQueryTextBox( hPS
, 
1752                                  TXTBOX_COUNT
,// return maximum information 
1753                                  avPoint      
// array of coordinates points 
1757             vPtMin
.x 
= avPoint
[0].x
; 
1758             vPtMax
.x 
= avPoint
[0].x
; 
1759             vPtMin
.y 
= avPoint
[0].y
; 
1760             vPtMax
.y 
= avPoint
[0].y
; 
1761             for (i 
= 1; i 
< 4; i
++) 
1763                 if(vPtMin
.x 
> avPoint
[i
].x
) vPtMin
.x 
= avPoint
[i
].x
; 
1764                 if(vPtMin
.y 
> avPoint
[i
].y
) vPtMin
.y 
= avPoint
[i
].y
; 
1765                 if(vPtMax
.x 
< avPoint
[i
].x
) vPtMax
.x 
= avPoint
[i
].x
; 
1766                 if(vPtMax
.y 
< avPoint
[i
].y
) vPtMax
.y 
= avPoint
[i
].y
; 
1768             bRc 
= ::GpiQueryFontMetrics( hPS
 
1769                                         ,sizeof(FONTMETRICS
) 
1796         *pX 
= (vPtMax
.x 
- vPtMin
.x 
+ 1); 
1798         *pY 
= (vPtMax
.y 
- vPtMin
.y 
+ 1); 
1802             *pDescent 
= vFM
.lMaxDescender
; 
1806     if (pExternalLeading
) 
1809             *pExternalLeading 
= vFM
.lExternalLeading
; 
1811             *pExternalLeading 
= 0; 
1813     ::WinReleasePS(hPS
); 
1814 } // end of wxWindow::GetTextExtent 
1816 bool wxWindowOS2::IsMouseInWindow() const 
1819     // Get the mouse position 
1822     ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
); 
1825     // Find the window which currently has the cursor and go up the window 
1826     // chain until we find this window - or exhaust it 
1828     HWND hWnd 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt
, TRUE
); 
1830     while (hWnd 
&& (hWnd 
!= GetHwnd())) 
1831         hWnd 
= ::WinQueryWindow(hWnd
, QW_PARENT
); 
1833     return hWnd 
!= NULL
; 
1834 } // end of wxWindowOS2::IsMouseInWindow 
1837 // --------------------------------------------------------------------------- 
1839 // --------------------------------------------------------------------------- 
1841 #if wxUSE_MENUS_NATIVE 
1842 bool wxWindowOS2::DoPopupMenu( wxMenu
* pMenu
, int nX
, int nY 
) 
1844     HWND hWndOwner 
= GetHwnd(); 
1845     HWND hWndParent 
= GetHwnd(); 
1846     HWND hMenu 
= GetHmenuOf(pMenu
); 
1847     bool bIsWaiting 
= true; 
1850     // Protect against recursion 
1851     if (wxCurrentPopupMenu
) 
1854     pMenu
->SetInvokingWindow(this); 
1857     if ( nX 
== -1 && nY 
== -1 ) 
1859         wxPoint mouse 
= wxGetMousePosition(); 
1860         nX 
= mouse
.x
; nY 
= mouse
.y
; 
1864         DoClientToScreen( &nX
 
1867         DoGetSize(0,&nHeight
); 
1870     wxCurrentPopupMenu 
= pMenu
; 
1872     ::WinPopupMenu( hWndParent
 
1878                    ,PU_HCONSTRAIN 
| PU_VCONSTRAIN 
| PU_MOUSEBUTTON1 
| PU_KEYBOARD
 
1885         ::WinGetMsg(vHabmain
,&vMsg
, (HWND
)0, 0, 0); 
1886         if (vMsg
.msg 
== WM_COMMAND
) 
1888         ::WinDispatchMsg(vHabmain
, (PQMSG
)&vMsg
); 
1891     wxCurrentPopupMenu 
= NULL
; 
1892     pMenu
->SetInvokingWindow(NULL
); 
1894 } // end of wxWindowOS2::DoPopupMenu 
1895 #endif // wxUSE_MENUS_NATIVE 
1897 // =========================================================================== 
1898 // pre/post message processing 
1899 // =========================================================================== 
1901 MRESULT 
wxWindowOS2::OS2DefWindowProc( WXUINT uMsg
, 
1906         return (MRESULT
)m_fnOldWndProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
); 
1908         return ::WinDefWindowProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
); 
1909 } // end of wxWindowOS2::OS2DefWindowProc 
1911 bool wxWindowOS2::OS2ProcessMessage( WXMSG
* pMsg 
) 
1913 // wxUniversal implements tab traversal itself 
1914 #ifndef __WXUNIVERSAL__ 
1915     QMSG
*                           pQMsg 
= (QMSG
*)pMsg
; 
1917     if (m_hWnd 
!= 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL
)) 
1920         // Intercept dialog navigation keys 
1922         bool   bProcess 
= true; 
1923         USHORT uKeyFlags 
= SHORT1FROMMP(pQMsg
->mp1
); 
1925         if (uKeyFlags 
& KC_KEYUP
) 
1928         if (uKeyFlags 
& KC_ALT
) 
1931         if (!(uKeyFlags 
& KC_VIRTUALKEY
)) 
1936             bool                    bCtrlDown 
= IsCtrlDown(); 
1937             bool                    bShiftDown 
= IsShiftDown(); 
1940             // WM_QUERYDLGCODE: ask the control if it wants the key for itself, 
1941             // don't process it if it's the case (except for Ctrl-Tab/Enter 
1942             // combinations which are always processed) 
1944             ULONG                   ulDlgCode 
= 0; 
1948                 ulDlgCode 
= (ULONG
)::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0); 
1951             bool bForward 
= true; 
1952             bool bWindowChange 
= false; 
1954             switch (SHORT2FROMMP(pQMsg
->mp2
)) 
1957                 // Going to make certain assumptions about specific types of controls 
1958                 // here, so we may have to alter some things later if they prove invalid 
1962                     // Shift tabl will always be a nav-key but tabs may be wanted 
1971                         // Entry Fields want tabs for themselve usually 
1975                             case DLGC_ENTRYFIELD
: 
1985                         // Ctrl-Tab cycles thru notebook pages 
1987                         bWindowChange 
= bCtrlDown
; 
1988                         bForward 
= !bShiftDown
; 
2011                             // ctrl-enter is not processed 
2015                         else if (ulDlgCode 
& DLGC_BUTTON
) 
2018                             // buttons want process Enter themselevs 
2024                             wxTopLevelWindow 
*tlw 
= wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow
); 
2025                             wxButton
*   pBtn 
= NULL
; 
2029                                 pBtn 
= wxDynamicCast(tlw
->GetDefaultItem(), wxButton
); 
2032                             if (pBtn 
&& pBtn
->IsEnabled()) 
2035                                 // If we do have a default button, do press it 
2037                                 pBtn
->OS2Command(BN_CLICKED
, 0 /* unused */); 
2040                             else if (!IsTopLevel()) 
2043                                 // if not a top level window, let parent 
2048                             // else: but if it does not it makes sense to make 
2049                             //       it work like a TAB - and that's what we do. 
2050                             //       Note that Ctrl-Enter always works this way. 
2061                 wxNavigationKeyEvent    vEvent
; 
2063                 vEvent
.SetDirection(bForward
); 
2064                 vEvent
.SetWindowChange(bWindowChange
); 
2065                 vEvent
.SetEventObject(this); 
2067                 if (GetEventHandler()->ProcessEvent(vEvent
)) 
2069                     wxButton
*       pBtn 
= wxDynamicCast(FindFocus(), wxButton
); 
2074                         // The button which has focus should be default 
2083         // Let Dialogs process 
2085         if (::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0)); 
2089     pMsg 
= pMsg
; // just shut up the compiler 
2090 #endif // __WXUNIVERSAL__ 
2093 } // end of wxWindowOS2::OS2ProcessMessage 
2095 bool wxWindowOS2::OS2TranslateMessage( WXMSG
* pMsg 
) 
2097 #if wxUSE_ACCEL && !defined(__WXUNIVERSAL__) 
2098     return m_acceleratorTable
.Translate(m_hWnd
, pMsg
); 
2102 #endif //wxUSE_ACCEL 
2103 } // end of wxWindowOS2::OS2TranslateMessage 
2105 bool wxWindowOS2::OS2ShouldPreProcessMessage( WXMSG
* WXUNUSED(pMsg
) ) 
2107     // preprocess all messages by default 
2109 } // end of wxWindowOS2::OS2ShouldPreProcessMessage 
2111 // --------------------------------------------------------------------------- 
2112 // message params unpackers 
2113 // --------------------------------------------------------------------------- 
2115 void wxWindowOS2::UnpackCommand( 
2123     *pId 
= LOWORD(wParam
); 
2124     *phWnd 
= NULL
;  // or may be GetHWND() ? 
2125     *pCmd 
= LOWORD(lParam
); 
2126 } // end of wxWindowOS2::UnpackCommand 
2128 void wxWindowOS2::UnpackActivate( 
2135     *pState     
= LOWORD(wParam
); 
2136     *phWnd      
= (WXHWND
)lParam
; 
2137 } // end of wxWindowOS2::UnpackActivate 
2139 void wxWindowOS2::UnpackScroll( 
2150     ulId    
= (ULONG
)LONGFROMMP(wParam
); 
2151     hWnd 
= ::WinWindowFromID(GetHwnd(), ulId
); 
2152     if (hWnd 
== m_hWndScrollBarHorz 
|| hWnd 
== m_hWndScrollBarVert
) 
2153         *phWnd 
= NULLHANDLE
; 
2157     *pPos  
= SHORT1FROMMP(lParam
); 
2158     *pCode 
= SHORT2FROMMP(lParam
); 
2159 } // end of wxWindowOS2::UnpackScroll 
2161 void wxWindowOS2::UnpackMenuSelect( 
2169     *pItem 
= (WXWORD
)LOWORD(wParam
); 
2170     *pFlags 
= HIWORD(wParam
); 
2171     *phMenu 
= (WXHMENU
)lParam
; 
2172 } // end of wxWindowOS2::UnpackMenuSelect 
2174 // --------------------------------------------------------------------------- 
2175 // Main wxWidgets window proc and the window proc for wxWindow 
2176 // --------------------------------------------------------------------------- 
2179 // Hook for new window just as it's being created, when the window isn't yet 
2180 // associated with the handle 
2182 wxWindowOS2
*                         wxWndHook 
= NULL
; 
2187 MRESULT EXPENTRY 
wxWndProc( 
2194     wxWindowOS2
*                    pWnd 
= wxFindWinFromHandle((WXHWND
)hWnd
); 
2197     // When we get the first message for the HWND we just created, we associate 
2198     // it with wxWindow stored in wxWndHook 
2200     if (!pWnd 
&& wxWndHook
) 
2202         wxAssociateWinWithHandle(hWnd
, wxWndHook
); 
2205         pWnd
->SetHWND((WXHWND
)hWnd
); 
2208     MRESULT                         rc 
= (MRESULT
)0; 
2212     // Stop right here if we don't have a valid handle in our wxWindow object. 
2214     if (pWnd 
&& !pWnd
->GetHWND()) 
2216         pWnd
->SetHWND((WXHWND
) hWnd
); 
2217         rc 
= pWnd
->OS2DefWindowProc(ulMsg
, wParam
, lParam 
); 
2224             rc 
= pWnd
->OS2WindowProc(ulMsg
, wParam
, lParam
); 
2225             if ( (pWnd
->GetScrollBarHorz() != NULLHANDLE 
|| 
2226                   pWnd
->GetScrollBarVert() != NULLHANDLE
) && 
2229                 if (pWnd
->GetScrollBarHorz() != NULLHANDLE
) 
2230                     ::WinInvalidateRect(pWnd
->GetScrollBarHorz(), NULL
, TRUE
); 
2231                 if (pWnd
->GetScrollBarVert() != NULLHANDLE
) 
2232                     ::WinInvalidateRect(pWnd
->GetScrollBarVert(), NULL
, TRUE
); 
2236             rc 
= ::WinDefWindowProc(hWnd
, ulMsg
, wParam
, lParam
); 
2240 } // end of wxWndProc 
2243 // We will add (or delete) messages we need to handle at this default 
2246 MRESULT 
wxWindowOS2::OS2WindowProc( WXUINT uMsg
, 
2251     // Did we process the uMsg? 
2253     bool bProcessed 
= false; 
2257     // For most messages we should return 0 when we do process the message 
2259     mResult 
= (MRESULT
)0; 
2267                 bProcessed 
= HandleCreate( (WXLPCREATESTRUCT
)lParam
 
2273                     // Return 0 to bAllow window creation 
2275                     mResult 
= (MRESULT
)(bMayCreate 
? 0 : -1); 
2286             bProcessed 
= HandleMove( LOWORD(lParam
) 
2292             bProcessed 
= HandleSize( LOWORD(lParam
) 
2298         case WM_WINDOWPOSCHANGED
: 
2301             // Dialogs under OS/2 do not get WM_SIZE events at all. 
2302             // Instead they get this, which can function much like WM_SIZE 
2303             // PSWP contains the new sizes and positioning, PSWP+1 the old 
2304             // We use this because ADJUSTWINDOWPOS comes BEFORE the new 
2305             // position is added and our auto layout does a WinQueryWindowRect 
2306             // to get the CURRENT client size.  That is the size used to position 
2307             // child controls, so we need to already be sized 
2308             // in order to get the child controls positoned properly. 
2310             if (IsKindOf(CLASSINFO(wxDialog
)) || IsKindOf(CLASSINFO(wxFrame
))) 
2312                 PSWP                pSwp 
= (PSWP
)PVOIDFROMMP(wParam
); 
2313                 PSWP                pSwp2 
= pSwp
++; 
2315                 if (!(pSwp
->cx 
== pSwp2
->cx 
&& 
2316                       pSwp
->cy 
== pSwp2
->cy
)) 
2317                     bProcessed 
= HandleSize( pSwp
->cx
 
2321                 if (IsKindOf(CLASSINFO(wxFrame
))) 
2323                     wxFrame
*            pFrame 
= wxDynamicCast(this, wxFrame
); 
2327                         if (pFrame
->GetStatusBar()) 
2328                             pFrame
->PositionStatusBar(); 
2329                         if (pFrame
->GetToolBar()) 
2330                             pFrame
->PositionToolBar(); 
2341                 UnpackActivate( wParam
 
2347                 bProcessed 
= HandleActivate( wState
 
2355             if (SHORT1FROMMP((MPARAM
)lParam
) == TRUE
) 
2356                 bProcessed 
= HandleSetFocus((WXHWND
)(HWND
)wParam
); 
2358                 bProcessed 
= HandleKillFocus((WXHWND
)(HWND
)wParam
); 
2362             bProcessed 
= HandlePaint(); 
2367             // Don't let the DefWindowProc() destroy our window - we'll do it 
2368             // ourselves in ~wxWindow 
2371             mResult 
= (MRESULT
)TRUE
; 
2375             bProcessed 
= HandleShow(wParam 
!= 0, (int)lParam
); 
2379         // Under OS2 PM Joysticks are treated just like mouse events 
2380         // The "Motion" events will be prevelent in joysticks 
2383         case WM_BUTTON1DOWN
: 
2385         case WM_BUTTON1DBLCLK
: 
2386         case WM_BUTTON1MOTIONEND
: 
2387         case WM_BUTTON1MOTIONSTART
: 
2388         case WM_BUTTON2DOWN
: 
2390         case WM_BUTTON2DBLCLK
: 
2391         case WM_BUTTON2MOTIONEND
: 
2392         case WM_BUTTON2MOTIONSTART
: 
2393         case WM_BUTTON3DOWN
: 
2395         case WM_BUTTON3DBLCLK
: 
2396         case WM_BUTTON3MOTIONEND
: 
2397         case WM_BUTTON3MOTIONSTART
: 
2399                 short               nX 
= LOWORD(wParam
); 
2400                 short               nY 
= HIWORD(wParam
); 
2403                 // Redirect the event to a static control if necessary 
2405                 if (this == GetCapture()) 
2407                     bProcessed 
= HandleMouseEvent( uMsg
 
2410                                                   ,(WXUINT
)SHORT2FROMMP(lParam
) 
2415                     wxWindow
*       pWin 
= FindWindowForMouseEvent( this 
2419                     if (!pWin
->IsOfStandardClass()) 
2421                         if (uMsg 
== WM_BUTTON1DOWN 
&& pWin
->AcceptsFocus() ) 
2424                     bProcessed 
= pWin
->HandleMouseEvent( uMsg
 
2427                                                         ,(WXUINT
)SHORT2FROMMP(lParam
) 
2434             bProcessed 
= HandleSysCommand(wParam
, lParam
); 
2441                 UnpackCommand(wParam
, lParam
, &id
, &hwnd
, &cmd
); 
2443                 bProcessed 
= HandleCommand(id
, cmd
, hwnd
); 
2448             // For these messages we must return TRUE if process the message 
2451         case WM_MEASUREITEM
: 
2453                 int                 nIdCtrl 
= (UINT
)wParam
; 
2455                 if ( uMsg 
== WM_DRAWITEM 
) 
2457                     bProcessed 
= OS2OnDrawItem(nIdCtrl
, 
2458                                               (WXDRAWITEMSTRUCT 
*)lParam
); 
2462                     return MRFROMLONG(OS2OnMeasureItem( nIdCtrl
 
2463                                                        ,(WXMEASUREITEMSTRUCT 
*)lParam
 
2468                     mResult 
= (MRESULT
)TRUE
; 
2472         case WM_QUERYDLGCODE
: 
2473             if (!IsOfStandardClass()) 
2477                     mResult 
= (MRESULT
)m_lDlgCode
; 
2482             //else: get the dlg code from the DefWindowProc() 
2487         // In OS/2 PM all keyboard events are of the WM_CHAR type.  Virtual key and key-up 
2488         // and key-down events are obtained from the WM_CHAR params. 
2492                 USHORT                  uKeyFlags 
= SHORT1FROMMP((MPARAM
)wParam
); 
2494                 if (uKeyFlags 
& KC_KEYUP
) 
2496                     //TODO: check if the cast to WXWORD isn't causing trouble 
2497                     bProcessed 
= HandleKeyUp(wParam
, lParam
); 
2500                 else // keydown event 
2502                     m_bLastKeydownProcessed 
= false; 
2504                     // If this has been processed by an event handler, 
2505                     // return 0 now (we've handled it). DON't RETURN 
2506                     // we still need to process further 
2508                     m_bLastKeydownProcessed 
= HandleKeyDown(wParam
, lParam
); 
2509                     if (uKeyFlags 
& KC_VIRTUALKEY
) 
2511                         USHORT          uVk 
= SHORT2FROMMP((MPARAM
)lParam
); 
2514                         // We consider these message "not interesting" to OnChar 
2527                             // Avoid duplicate messages to OnChar for these ASCII keys: they 
2528                             // will be translated by TranslateMessage() and received in WM_CHAR 
2533                                 // But set processed to false, not true to still pass them to 
2534                                 // the control's default window proc - otherwise built-in 
2535                                 // keyboard handling won't work 
2540                                 bProcessed 
= HandleChar(wParam
, lParam
); 
2544                     else // WM_CHAR -- Always an ASCII character 
2546                         if (m_bLastKeydownProcessed
) 
2549                             // The key was handled in the EVT_KEY_DOWN and handling 
2550                             // a key in an EVT_KEY_DOWN handler is meant, by 
2551                             // design, to prevent EVT_CHARs from happening 
2553                             m_bLastKeydownProcessed 
= false; 
2556                         else // do generate a CHAR event 
2558                             bProcessed 
= HandleChar(wParam
, lParam
, true); 
2571                 UnpackScroll( wParam
 
2578                 bProcessed 
= OS2OnScroll( uMsg 
== WM_HSCROLL 
? wxHORIZONTAL
 
2588             switch(SHORT2FROMMP(wParam
)) 
2592                         HWND                hWnd 
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
)); 
2593                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2600                         if (pWin
->IsKindOf(CLASSINFO(wxBitmapButton
))) 
2602                             wxBitmapButton
*     pBitmapButton 
= wxDynamicCast(pWin
, wxBitmapButton
); 
2604                             pBitmapButton
->OS2OnDraw((WXDRAWITEMSTRUCT 
*)lParam
); 
2610                 case BKN_PAGESELECTEDPENDING
: 
2612                         PPAGESELECTNOTIFY  pPage 
= (PPAGESELECTNOTIFY
)lParam
; 
2614                         if ((pPage
->ulPageIdNew 
!= pPage
->ulPageIdCur
) && 
2615                             (pPage
->ulPageIdNew 
> 0L && pPage
->ulPageIdCur 
> 0L)) 
2617                             wxWindowOS2
*        pWin 
= wxFindWinFromHandle(pPage
->hwndBook
); 
2618                             wxNotebookEvent     
vEvent( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
 
2619                                                        ,(int)SHORT1FROMMP(wParam
) 
2620                                                        ,(int)pPage
->ulPageIdNew
 
2621                                                        ,(int)pPage
->ulPageIdCur
 
2628                             if (pWin
->IsKindOf(CLASSINFO(wxNotebook
))) 
2630                                 wxNotebook
*         pNotebook 
= wxDynamicCast(pWin
, wxNotebook
); 
2632                                 vEvent
.SetEventObject(pWin
); 
2633                                 pNotebook
->OnSelChange(vEvent
); 
2645                 case BN_CLICKED
: // Dups as LN_SELECT and CBN_LBSELECT 
2647                         HWND                hWnd 
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
)); 
2648                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2656                         // Simulate a WM_COMMAND here, as wxWidgets expects all control 
2657                         // button clicks to generate WM_COMMAND msgs, not WM_CONTROL 
2659                         if (pWin
->IsKindOf(CLASSINFO(wxRadioBox
))) 
2661                             wxRadioBox
*         pRadioBox 
= wxDynamicCast(pWin
, wxRadioBox
); 
2663                             pRadioBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2664                                                   ,(WXWORD
)SHORT1FROMMP(wParam
) 
2667                         if (pWin
->IsKindOf(CLASSINFO(wxRadioButton
))) 
2669                             wxRadioButton
*      pRadioButton 
= wxDynamicCast(pWin
, wxRadioButton
); 
2671                             pRadioButton
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2672                                                      ,(WXWORD
)SHORT1FROMMP(wParam
) 
2675                         if (pWin
->IsKindOf(CLASSINFO(wxCheckBox
))) 
2677                             wxCheckBox
*         pCheckBox 
= wxDynamicCast(pWin
, wxCheckBox
); 
2679                             pCheckBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2680                                                   ,(WXWORD
)SHORT1FROMMP(wParam
) 
2683                         if (pWin
->IsKindOf(CLASSINFO(wxListBox
))) 
2685                             wxListBox
*          pListBox 
= wxDynamicCast(pWin
, wxListBox
); 
2687                             pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2688                                                  ,(WXWORD
)SHORT1FROMMP(wParam
) 
2690                             if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
) 
2693                         if (pWin
->IsKindOf(CLASSINFO(wxComboBox
))) 
2695                             wxComboBox
*          pComboBox 
= wxDynamicCast(pWin
, wxComboBox
); 
2697                             pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2698                                                   ,(WXWORD
)SHORT1FROMMP(wParam
) 
2701                         if (pWin
->IsKindOf(CLASSINFO(wxChoice
))) 
2703                             wxChoice
*           pChoice 
= wxDynamicCast(pWin
, wxChoice
); 
2705                             pChoice
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2706                                                 ,(WXWORD
)SHORT1FROMMP(wParam
) 
2715                         HWND                hWnd 
= HWNDFROMMP(lParam
); 
2716                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2724                         // Simulate a WM_COMMAND here, as wxWidgets expects all control 
2725                         // button clicks to generate WM_COMMAND msgs, not WM_CONTROL 
2727                         if (pWin
->IsKindOf(CLASSINFO(wxListBox
))) 
2729                             wxListBox
*          pListBox 
= wxDynamicCast(pWin
, wxListBox
); 
2731                             pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2732                                                  ,(WXWORD
)SHORT1FROMMP(wParam
) 
2734                             if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
) 
2738                         if (pWin
->IsKindOf(CLASSINFO(wxComboBox
))) 
2740                             wxComboBox
*          pComboBox 
= wxDynamicCast(pWin
, wxComboBox
); 
2742                             pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2743                                                   ,(WXWORD
)SHORT1FROMMP(wParam
) 
2751                 case SPBN_DOWNARROW
: 
2757                         ::WinSendMsg( HWNDFROMMP(lParam
) 
2760                                      ,MPFROM2SHORT( (USHORT
)10 
2761                                                    ,(USHORT
)SPBQ_UPDATEIFVALID
 
2765                         bProcessed 
= OS2OnScroll( wxVERTICAL
 
2766                                                  ,(WXWORD
)SHORT2FROMMP(wParam
) 
2773                 case SLN_SLIDERTRACK
: 
2775                         HWND         hWnd 
= ::WinWindowFromID(GetHWND(), SHORT1FROMMP(wParam
)); 
2776                         wxWindowOS2
* pChild 
= wxFindWinFromHandle(hWnd
); 
2783                         if (pChild
->IsKindOf(CLASSINFO(wxSlider
))) 
2784                             bProcessed 
= OS2OnScroll( wxVERTICAL
 
2785                                                      ,(WXWORD
)SHORT2FROMMP(wParam
) 
2786                                                      ,(WXWORD
)LONGFROMMP(lParam
) 
2794 #if defined(__VISAGECPP__) && (__IBMCPP__ >= 400) 
2795         case WM_CTLCOLORCHANGE
: 
2797                 bProcessed 
= HandleCtlColor(&hBrush
); 
2801         case WM_ERASEBACKGROUND
: 
2803             // Returning TRUE to requestw PM to paint the window background 
2804             // in SYSCLR_WINDOW. We don't really want that 
2806             bProcessed 
= HandleEraseBkgnd((WXHDC
)(HPS
)wParam
); 
2807             mResult 
= (MRESULT
)(FALSE
); 
2810             // the return value for this message is ignored 
2811         case WM_SYSCOLORCHANGE
: 
2812             bProcessed 
= HandleSysColorChange(); 
2815         case WM_REALIZEPALETTE
: 
2816             bProcessed 
= HandlePaletteChanged(); 
2819         // move all drag and drops to wxDrg 
2821             bProcessed 
= HandleEndDrag(wParam
); 
2825             bProcessed 
= HandleInitDialog((WXHWND
)(HWND
)wParam
); 
2829                 // we never set focus from here 
2830                 mResult 
= (MRESULT
)FALSE
; 
2834         // wxFrame specific message 
2835         case WM_MINMAXFRAME
: 
2836             bProcessed 
= HandleGetMinMaxInfo((PSWP
)wParam
); 
2839         case WM_SYSVALUECHANGED
: 
2840             // TODO: do something 
2841             mResult 
= (MRESULT
)TRUE
; 
2845         // Comparable to WM_SETPOINTER for windows, only for just controls 
2847         case WM_CONTROLPOINTER
: 
2848             bProcessed 
= HandleSetCursor( SHORT1FROMMP(wParam
) // Control ID 
2849                                          ,(HWND
)lParam         
// Cursor Handle 
2854                 // Returning TRUE stops the DefWindowProc() from further 
2855                 // processing this message - exactly what we need because we've 
2856                 // just set the cursor. 
2858                 mResult 
= (MRESULT
)TRUE
; 
2862 #if wxUSE_MENUS_NATIVE 
2864             if (wxCurrentPopupMenu
) 
2866                 if (GetHmenuOf(wxCurrentPopupMenu
) == (HWND
)lParam
) 
2868                     // Break out of msg loop in DoPopupMenu 
2869                     ::WinPostMsg((HWND
)lParam
,WM_COMMAND
,wParam
,0); 
2873 #endif // wxUSE_MENUS_NATIVE 
2879         wxLogTrace(wxTraceMessages
, wxT("Forwarding %s to DefWindowProc."), 
2880                    wxGetMessageName(uMsg
)); 
2881 #endif // __WXDEBUG__ 
2882         if (IsKindOf(CLASSINFO(wxFrame
))) 
2883             mResult 
= ::WinDefWindowProc(m_hWnd
, uMsg
, wParam
, lParam
); 
2884         else if (IsKindOf(CLASSINFO(wxDialog
))) 
2885             mResult 
= ::WinDefDlgProc( m_hWnd
, uMsg
, wParam
, lParam
); 
2887             mResult 
= OS2DefWindowProc(uMsg
, wParam
, lParam
); 
2890 } // end of wxWindowOS2::OS2WindowProc 
2892 // ---------------------------------------------------------------------------- 
2893 // wxWindow <-> HWND map 
2894 // ---------------------------------------------------------------------------- 
2896 wxWinHashTable 
*wxWinHandleHash 
= NULL
; 
2898 wxWindow
* wxFindWinFromHandle( 
2902     return (wxWindow 
*)wxWinHandleHash
->Get((long)hWnd
); 
2903 } // end of wxFindWinFromHandle 
2905 void wxAssociateWinWithHandle( 
2911     // Adding NULL hWnd is (first) surely a result of an error and 
2912     // (secondly) breaks menu command processing 
2914     wxCHECK_RET( hWnd 
!= (HWND
)NULL
, 
2915                  wxT("attempt to add a NULL hWnd to window list ignored") ); 
2917     wxWindow
*                       pOldWin 
= wxFindWinFromHandle((WXHWND
) hWnd
); 
2919     if (pOldWin 
&& (pOldWin 
!= pWin
)) 
2921         wxString  
Newstr(pWin
->GetClassInfo()->GetClassName()); 
2922         wxString 
Oldstr(pOldWin
->GetClassInfo()->GetClassName()); 
2923         wxLogError( _T("Bug! New window of class %s has same HWND %X as old window of class %s"), 
2931         wxWinHandleHash
->Put( (long)hWnd
 
2935 } // end of wxAssociateWinWithHandle 
2937 void wxRemoveHandleAssociation( wxWindowOS2
* pWin 
) 
2939     wxWinHandleHash
->Delete((long)pWin
->GetHWND()); 
2940 } // end of wxRemoveHandleAssociation 
2943 // Default destroyer - override if you destroy it in some other way 
2944 // (e.g. with MDI child windows) 
2946 void wxWindowOS2::OS2DestroyWindow() 
2950 bool wxWindowOS2::OS2GetCreateWindowCoords( const wxPoint
& rPos
, 
2951                                             const wxSize
&  rSize
, 
2955                                             int& rnHeight 
) const 
2957     bool bNonDefault 
= false; 
2958     static const int DEFAULT_Y 
= 200; 
2959     static const int DEFAULT_H 
= 250; 
2961     if (rPos
.x 
== wxDefaultCoord
) 
2963         rnX 
= rnY 
= CW_USEDEFAULT
; 
2968         rnY 
= rPos
.y 
== wxDefaultCoord 
? DEFAULT_Y 
: rPos
.y
; 
2971     if (rSize
.x 
== wxDefaultCoord
) 
2973         rnWidth 
= rnHeight 
= CW_USEDEFAULT
; 
2978         rnHeight 
= rSize
.y 
== wxDefaultCoord 
? DEFAULT_H 
: rSize
.y
; 
2982 } // end of wxWindowOS2::OS2GetCreateWindowCoords 
2984 WXHWND 
wxWindowOS2::OS2GetParent() const 
2986     return m_parent 
? m_parent
->GetHWND() : NULL
; 
2989 bool wxWindowOS2::OS2Create( PSZ            zClass
, 
2990                              const wxChar
*  zTitle
, 
2992                              const wxPoint
& rPos
, 
2993                              const wxSize
&  rSize
, 
2995                              WXDWORD        
WXUNUSED(dwExStyle
), 
3004     long                 lControlId 
= 0L; 
3005     wxWindowCreationHook 
vHook(this); 
3006     wxString             
sClassName((wxChar
*)zClass
); 
3008     OS2GetCreateWindowCoords( rPos
 
3018         lControlId 
= GetId(); 
3019         if (GetWindowStyleFlag() & wxCLIP_SIBLINGS
) 
3021             dwStyle 
|= WS_CLIPSIBLINGS
; 
3025     // For each class "Foo" we have we also have "FooNR" ("no repaint") class 
3026     // which is the same but without CS_[HV]REDRAW class styles so using it 
3027     // ensures that the window is not fully repainted on each resize 
3029     if (!HasFlag(wxFULL_REPAINT_ON_RESIZE
)) 
3031         sClassName 
+= wxT("NR"); 
3033     m_hWnd 
= (WXHWND
)::WinCreateWindow( (HWND
)OS2GetParent() 
3034                                        ,(PSZ
)sClassName
.c_str() 
3035                                        ,(PSZ
)(zTitle 
? zTitle 
: wxEmptyString
) 
3049         vError 
= ::WinGetLastError(wxGetInstance()); 
3050         sError 
= wxPMErrorToStr(vError
); 
3053     SubclassWin(m_hWnd
); 
3054     SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
)); 
3056     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE
)); 
3058     LONG lColor 
= (LONG
)m_backgroundColour
.GetPixel(); 
3060     if (!::WinSetPresParam( m_hWnd
 
3066         vError 
= ::WinGetLastError(vHabmain
); 
3067         sError 
= wxPMErrorToStr(vError
); 
3068         wxLogError(_T("Error creating frame. Error: %s\n"), sError
.c_str()); 
3077 } // end of wxWindowOS2::OS2Create 
3079 // =========================================================================== 
3080 // OS2 PM message handlers 
3081 // =========================================================================== 
3083 // --------------------------------------------------------------------------- 
3084 // window creation/destruction 
3085 // --------------------------------------------------------------------------- 
3087 bool wxWindowOS2::HandleCreate( WXLPCREATESTRUCT 
WXUNUSED(vCs
), 
3090     wxWindowCreateEvent             
vEvent((wxWindow
*)this); 
3092     (void)GetEventHandler()->ProcessEvent(vEvent
); 
3093     *pbMayCreate 
= true; 
3095 } // end of wxWindowOS2::HandleCreate 
3097 bool wxWindowOS2::HandleDestroy() 
3099     wxWindowDestroyEvent            
vEvent((wxWindow
*)this); 
3100     vEvent
.SetId(GetId()); 
3101     (void)GetEventHandler()->ProcessEvent(vEvent
); 
3104     // Delete our drop target if we've got one 
3106 #if wxUSE_DRAG_AND_DROP 
3107     if (m_dropTarget 
!= NULL
) 
3109         delete m_dropTarget
; 
3110         m_dropTarget 
= NULL
; 
3112 #endif // wxUSE_DRAG_AND_DROP 
3115     // WM_DESTROY handled 
3118 } // end of wxWindowOS2::HandleDestroy 
3120 // --------------------------------------------------------------------------- 
3122 // --------------------------------------------------------------------------- 
3123 void wxWindowOS2::OnSetFocus( 
3124   wxFocusEvent
&                     rEvent
 
3128 } // end of wxWindowOS2::OnSetFocus 
3130 bool wxWindowOS2::HandleActivate( 
3132 , WXHWND                            
WXUNUSED(hActivate
) 
3135     wxActivateEvent                 
vEvent( wxEVT_ACTIVATE
 
3139     vEvent
.SetEventObject(this); 
3140     return GetEventHandler()->ProcessEvent(vEvent
); 
3141 } // end of wxWindowOS2::HandleActivate 
3143 bool wxWindowOS2::HandleSetFocus( WXHWND 
WXUNUSED(hWnd
) ) 
3146     // Notify the parent keeping track of focus for the kbd navigation 
3147     // purposes that we got it 
3149     wxChildFocusEvent               
vEventFocus((wxWindow 
*)this); 
3150     (void)GetEventHandler()->ProcessEvent(vEventFocus
); 
3158         m_caret
->OnSetFocus(); 
3160 #endif // wxUSE_CARET 
3163     // If it's a wxTextCtrl don't send the event as it will be done 
3164     // after the control gets to process it from EN_FOCUS handler 
3165     if ( wxDynamicCastThis(wxTextCtrl
) ) 
3169 #endif // wxUSE_TEXTCTRL 
3171     wxFocusEvent                    
vEvent(wxEVT_SET_FOCUS
, m_windowId
); 
3173     vEvent
.SetEventObject(this); 
3174     return GetEventHandler()->ProcessEvent(vEvent
); 
3175 } // end of wxWindowOS2::HandleSetFocus 
3177 bool wxWindowOS2::HandleKillFocus( WXHWND hWnd 
) 
3185         m_caret
->OnKillFocus(); 
3187 #endif // wxUSE_CARET 
3191     // If it's a wxTextCtrl don't send the event as it will be done 
3192     // after the control gets to process it. 
3194     wxTextCtrl
*                     pCtrl 
= wxDynamicCastThis(wxTextCtrl
); 
3203     // Don't send the event when in the process of being deleted.  This can 
3204     // only cause problems if the event handler tries to access the object. 
3206     if ( m_isBeingDeleted 
) 
3211     wxFocusEvent                    
vEvent( wxEVT_KILL_FOCUS
 
3215     vEvent
.SetEventObject(this); 
3218     // wxFindWinFromHandle() may return NULL, it is ok 
3220     vEvent
.SetWindow(wxFindWinFromHandle(hWnd
)); 
3221     return GetEventHandler()->ProcessEvent(vEvent
); 
3222 } // end of wxWindowOS2::HandleKillFocus 
3224 // --------------------------------------------------------------------------- 
3226 // --------------------------------------------------------------------------- 
3228 bool wxWindowOS2::HandleShow( 
3230 , int                               WXUNUSED(nStatus
) 
3233     wxShowEvent                     
vEvent(GetId(), bShow
); 
3235     vEvent
.SetEventObject(this); 
3236     return GetEventHandler()->ProcessEvent(vEvent
); 
3237 } // end of wxWindowOS2::HandleShow 
3239 bool wxWindowOS2::HandleInitDialog( WXHWND 
WXUNUSED(hWndFocus
) ) 
3241     wxInitDialogEvent               
vEvent(GetId()); 
3243     vEvent
.SetEventObject(this); 
3244     return GetEventHandler()->ProcessEvent(vEvent
); 
3245 } // end of wxWindowOS2::HandleInitDialog 
3247 bool wxWindowOS2::HandleEndDrag(WXWPARAM 
WXUNUSED(wParam
)) 
3249    // TODO: We'll handle drag and drop later 
3253 bool wxWindowOS2::HandleSetCursor( USHORT 
WXUNUSED(vId
), 
3257     // Under OS/2 PM this allows the pointer to be changed 
3258     // as it passes over a control 
3260     ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)hPointer
); 
3262 } // end of wxWindowOS2::HandleSetCursor 
3264 // --------------------------------------------------------------------------- 
3265 // owner drawn stuff 
3266 // --------------------------------------------------------------------------- 
3267 bool wxWindowOS2::OS2OnDrawItem( int vId
, 
3268                                  WXDRAWITEMSTRUCT
* pItemStruct 
) 
3270 #if wxUSE_OWNER_DRAWN 
3273 #if wxUSE_MENUS_NATIVE 
3275     // Is it a menu item? 
3281         POWNERITEM                  pMeasureStruct 
= (POWNERITEM
)pItemStruct
; 
3282         wxFrame
*                    pFrame 
= (wxFrame
*)this; 
3283         wxMenuItem
*                 pMenuItem 
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
); 
3284         HDC                         hDC 
= ::GpiQueryDevice(pMeasureStruct
->hps
); 
3285         wxRect                      
vRect( pMeasureStruct
->rclItem
.xLeft
 
3286                                           ,pMeasureStruct
->rclItem
.yBottom
 
3287                                           ,pMeasureStruct
->rclItem
.xRight 
- pMeasureStruct
->rclItem
.xLeft
 
3288                                           ,pMeasureStruct
->rclItem
.yTop 
- pMeasureStruct
->rclItem
.yBottom
 
3290         vDc
.SetHDC( hDC
, false ); 
3291         vDc
.SetHPS( pMeasureStruct
->hps 
); 
3293         // Load the wxWidgets Pallete and set to RGB mode 
3295         if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
 
3299                                       ,(LONG
)wxTheColourDatabase
->m_nSize
 
3300                                       ,(PLONG
)wxTheColourDatabase
->m_palTable
 
3303             vError 
= ::WinGetLastError(vHabmain
); 
3304             sError 
= wxPMErrorToStr(vError
); 
3305             wxLogError(_T("Unable to set current color table (1). Error: %s\n"), sError
.c_str()); 
3308         // Set the color table to RGB mode 
3310         if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
 
3318             vError 
= ::WinGetLastError(vHabmain
); 
3319             sError 
= wxPMErrorToStr(vError
); 
3320             wxLogError(_T("Unable to set current color table (2). Error: %s\n"), sError
.c_str()); 
3323         wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE 
); 
3328         if (pMeasureStruct
->fsAttribute 
== pMeasureStruct
->fsAttributeOld
) 
3331             // Entire Item needs to be redrawn (either it has reappeared from 
3332             // behind another window or is being displayed for the first time 
3334             eAction 
= wxOwnerDrawn::wxODDrawAll
; 
3336             if (pMeasureStruct
->fsAttribute 
& MIA_HILITED
) 
3339                 // If it is currently selected we let the system handle it 
3341                 eStatus 
|= wxOwnerDrawn::wxODSelected
; 
3343             if (pMeasureStruct
->fsAttribute 
& MIA_CHECKED
) 
3346                 // If it is currently checked we draw our own 
3348                 eStatus 
|= wxOwnerDrawn::wxODChecked
; 
3349                 pMeasureStruct
->fsAttributeOld 
= pMeasureStruct
->fsAttribute 
&= ~MIA_CHECKED
; 
3351             if (pMeasureStruct
->fsAttribute 
& MIA_DISABLED
) 
3354                 // If it is currently disabled we let the system handle it 
3356                 eStatus 
|= wxOwnerDrawn::wxODDisabled
; 
3359             // Don't really care about framed (indicationg focus) or NoDismiss 
3364             if (pMeasureStruct
->fsAttribute 
& MIA_HILITED
) 
3366                 eAction 
= wxOwnerDrawn::wxODDrawAll
; 
3367                 eStatus 
|= wxOwnerDrawn::wxODSelected
; 
3369                 // Keep the system from trying to highlight with its bogus colors 
3371                 pMeasureStruct
->fsAttributeOld 
= pMeasureStruct
->fsAttribute 
&= ~MIA_HILITED
; 
3373             else if (!(pMeasureStruct
->fsAttribute 
& MIA_HILITED
)) 
3375                 eAction 
= wxOwnerDrawn::wxODDrawAll
; 
3378                 // Keep the system from trying to highlight with its bogus colors 
3380                 pMeasureStruct
->fsAttribute 
= pMeasureStruct
->fsAttributeOld 
&= ~MIA_HILITED
; 
3385                 // For now we don't care about anything else 
3386                 // just ignore the entire message! 
3392         // Now redraw the item 
3394         return(pMenuItem
->OnDrawItem( vDc
 
3396                                      ,(wxOwnerDrawn::wxODAction
)eAction
 
3397                                      ,(wxOwnerDrawn::wxODStatus
)eStatus
 
3400         // leave the fsAttribute and fsOldAttribute unchanged.  If different, 
3401         // the system will do the highlight or fraeming or disabling for us, 
3402         // otherwise, we'd have to do it ourselves. 
3405 #endif // wxUSE_MENUS_NATIVE 
3407     wxWindow
*                       pItem 
= FindItem(vId
); 
3409     if (pItem 
&& pItem
->IsKindOf(CLASSINFO(wxControl
))) 
3411         return ((wxControl 
*)pItem
)->OS2OnDraw(pItemStruct
); 
3415     pItemStruct 
= pItemStruct
; 
3418 } // end of wxWindowOS2::OS2OnDrawItem 
3420 long wxWindowOS2::OS2OnMeasureItem( int lId
, 
3421                                     WXMEASUREITEMSTRUCT
* pItemStruct 
) 
3423 #if wxUSE_OWNER_DRAWN 
3425     // Is it a menu item? 
3427     if (lId 
== 65536) // I really don't like this...has to be a better indicator 
3429         if (IsKindOf(CLASSINFO(wxFrame
))) // we'll assume if Frame then a menu 
3433             POWNERITEM              pMeasureStruct 
= (POWNERITEM
)pItemStruct
; 
3434             wxFrame
*                pFrame 
= (wxFrame
*)this; 
3435             wxMenuItem
*             pMenuItem 
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
); 
3437             wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE 
); 
3440             if (pMenuItem
->OnMeasureItem( &nWidth
 
3446                 pMeasureStruct
->rclItem
.xRight  
= nWidth
; 
3447                 pMeasureStruct
->rclItem
.xLeft   
= 0L; 
3448                 pMeasureStruct
->rclItem
.yTop    
= nHeight
; 
3449                 pMeasureStruct
->rclItem
.yBottom 
= 0L; 
3450                 mRc 
= MRFROM2SHORT(nHeight
, nWidth
); 
3451                 return LONGFROMMR(mRc
); 
3456     wxWindow
*                      pItem 
= FindItem(lId
); 
3458     if (pItem 
&& pItem
->IsKindOf(CLASSINFO(wxControl
))) 
3462         vItem
.idItem 
= (LONG
)pItemStruct
; 
3463         return ((wxControl 
*)pItem
)->OS2OnMeasure((WXMEASUREITEMSTRUCT
*)&vItem
); 
3467     pItemStruct 
= pItemStruct
; 
3468 #endif // wxUSE_OWNER_DRAWN 
3472 // --------------------------------------------------------------------------- 
3473 // colours and palettes 
3474 // --------------------------------------------------------------------------- 
3476 bool wxWindowOS2::HandleSysColorChange() 
3478     wxSysColourChangedEvent         vEvent
; 
3480     vEvent
.SetEventObject(this); 
3481     return GetEventHandler()->ProcessEvent(vEvent
); 
3482 } // end of wxWindowOS2::HandleSysColorChange 
3484 bool wxWindowOS2::HandleCtlColor( WXHBRUSH
* WXUNUSED(phBrush
) ) 
3487     // Not much provided with message. So not sure I can do anything with it 
3490 } // end of wxWindowOS2::HandleCtlColor 
3493 // Define for each class of dialog and control 
3494 WXHBRUSH 
wxWindowOS2::OnCtlColor(WXHDC 
WXUNUSED(hDC
), 
3495                                  WXHWND 
WXUNUSED(hWnd
), 
3496                                  WXUINT 
WXUNUSED(nCtlColor
), 
3497                                  WXUINT 
WXUNUSED(message
), 
3498                                  WXWPARAM 
WXUNUSED(wParam
), 
3499                                  WXLPARAM 
WXUNUSED(lParam
)) 
3504 bool wxWindowOS2::HandlePaletteChanged() 
3506     // need to set this to something first 
3507     WXHWND                          hWndPalChange 
= NULLHANDLE
; 
3509     wxPaletteChangedEvent           
vEvent(GetId()); 
3511     vEvent
.SetEventObject(this); 
3512     vEvent
.SetChangedWindow(wxFindWinFromHandle(hWndPalChange
)); 
3514     return GetEventHandler()->ProcessEvent(vEvent
); 
3515 } // end of wxWindowOS2::HandlePaletteChanged 
3518 // Responds to colour changes: passes event on to children. 
3520 void wxWindowOS2::OnSysColourChanged( 
3521   wxSysColourChangedEvent
&          rEvent
 
3524     wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); 
3529         // Only propagate to non-top-level windows 
3531         wxWindow
*                   pWin 
= (wxWindow 
*)node
->GetData(); 
3533         if (pWin
->GetParent()) 
3535             wxSysColourChangedEvent vEvent
; 
3537             rEvent
.SetEventObject(pWin
); 
3538             pWin
->GetEventHandler()->ProcessEvent(vEvent
); 
3540         node 
= node
->GetNext(); 
3542 } // end of wxWindowOS2::OnSysColourChanged 
3544 // --------------------------------------------------------------------------- 
3546 // --------------------------------------------------------------------------- 
3548 void wxWindow::OnPaint ( 
3549   wxPaintEvent
&                     rEvent
 
3552     HDC                             hDC 
= (HDC
)wxPaintDC::FindDCInCache((wxWindow
*) rEvent
.GetEventObject()); 
3556         OS2DefWindowProc( (WXUINT
)WM_PAINT
 
3561 } // end of wxWindow::OnPaint 
3563 bool wxWindowOS2::HandlePaint() 
3566     wxPaintEvent                    
vEvent(m_windowId
); 
3570     // Create empty region 
3571     // TODO: get HPS somewhere else if possible 
3572     hPS  
= ::WinGetPS(GetHwnd()); 
3573     hRgn 
= ::GpiCreateRegion(hPS
, 0, NULL
); 
3575     if (::WinQueryUpdateRegion(GetHwnd(), hRgn
) == RGN_ERROR
) 
3577          wxLogLastError(wxT("CreateRectRgn")); 
3580     // Get all the rectangles from the region, convert the individual 
3581     // rectangles to "the other" coordinate system and reassemble a 
3582     // region from the rectangles, to be feed into m_updateRegion. 
3585     PRECTL                      pUpdateRects 
= NULL
; 
3586     vRgnData
.ulDirection 
= RECTDIR_LFRT_TOPBOT
; 
3587     if (::GpiQueryRegionRects( hPS          
// Pres space 
3588                               ,hRgn         
// Handle of region to query 
3589                               ,NULL         
// Return all RECTs 
3590                               ,&vRgnData    
// Will contain number or RECTs in region 
3591                               ,NULL         
// NULL to return number of RECTs 
3594         pUpdateRects 
= new RECTL
[vRgnData
.crcReturned
]; 
3595         vRgnData
.crc 
= vRgnData
.crcReturned
; 
3596         vRgnData
.ircStart 
= 1; 
3597         if (::GpiQueryRegionRects( hPS      
// Pres space of source 
3598                                   ,hRgn     
// Handle of source region 
3599                                   ,NULL     
// Return all RECTs 
3600                                   ,&vRgnData 
// Operations set to return rects 
3601                                   ,pUpdateRects 
// Will contain the actual RECTS 
3606             ::WinQueryWindowRect(GetHwnd(), &vRect
); 
3607             height 
= vRect
.yTop
; 
3609             for(size_t i 
= 0; i 
< vRgnData
.crc
; i
++) 
3612                 rectHeight 
= pUpdateRects
[i
].yTop 
- pUpdateRects
[i
].yBottom
; 
3613                 pUpdateRects
[i
].yBottom 
= height 
- pUpdateRects
[i
].yTop
; 
3614                 pUpdateRects
[i
].yTop 
= pUpdateRects
[i
].yBottom 
+ rectHeight
; 
3616             ::GpiSetRegion(hPS
, hRgn
, vRgnData
.crc
, pUpdateRects
); 
3617             delete [] pUpdateRects
; 
3620     m_updateRegion 
= wxRegion(hRgn
, hPS
); 
3622     vEvent
.SetEventObject(this); 
3623     bProcessed 
= GetEventHandler()->ProcessEvent(vEvent
); 
3626          IsKindOf(CLASSINFO(wxPanel
)) && 
3627          GetChildren().GetCount() == 0 
3631         // OS/2 needs to process this right here, not by the default proc 
3632         // Window's default proc correctly paints everything, OS/2 does not. 
3633         // For decorative panels that typically have no children, we draw 
3639         hPS 
= ::WinBeginPaint( GetHwnd() 
3645             ::GpiCreateLogColorTable( hPS
 
3649                                      ,(LONG
)wxTheColourDatabase
->m_nSize
 
3650                                      ,(PLONG
)wxTheColourDatabase
->m_palTable
 
3652             ::GpiCreateLogColorTable( hPS
 
3659             if (::WinIsWindowVisible(GetHWND())) 
3660                 ::WinFillRect(hPS
, &vRect
,  GetBackgroundColour().GetPixel()); 
3663                 LINEBUNDLE      vLineBundle
; 
3665                 vLineBundle
.lColor     
= 0x00000000; // Black 
3666                 vLineBundle
.usMixMode  
= FM_OVERPAINT
; 
3667                 vLineBundle
.fxWidth    
= 1; 
3668                 vLineBundle
.lGeomWidth 
= 1; 
3669                 vLineBundle
.usType     
= LINETYPE_SOLID
; 
3670                 vLineBundle
.usEnd      
= 0; 
3671                 vLineBundle
.usJoin     
= 0; 
3674                               ,LBB_COLOR 
| LBB_MIX_MODE 
| LBB_WIDTH 
| LBB_GEOM_WIDTH 
| LBB_TYPE
 
3678                 ::WinQueryWindowRect(GetHwnd(), &vRect
); 
3688     else if (!bProcessed 
&& 
3689              IsKindOf(CLASSINFO(wxPanel
)) 
3693         // Panel with children, usually fills a frame client so no borders. 
3698         hPS 
= ::WinBeginPaint( GetHwnd() 
3704             ::GpiCreateLogColorTable( hPS
 
3708                                      ,(LONG
)wxTheColourDatabase
->m_nSize
 
3709                                      ,(PLONG
)wxTheColourDatabase
->m_palTable
 
3711             ::GpiCreateLogColorTable( hPS
 
3719             if (::WinIsWindowVisible(GetHWND())) 
3720                 ::WinFillRect(hPS
, &vRect
,  GetBackgroundColour().GetPixel()); 
3726 } // end of wxWindowOS2::HandlePaint 
3728 bool wxWindowOS2::HandleEraseBkgnd( WXHDC hDC 
) 
3733     ::WinQueryWindowPos(GetHwnd(), &vSwp
); 
3734     if (vSwp
.fl 
& SWP_MINIMIZE
) 
3739     vDC
.m_hPS 
= (HPS
)hDC
; // this is really a PS 
3740     vDC
.SetWindow((wxWindow
*)this); 
3742     wxEraseEvent 
vEvent(m_windowId
, &vDC
); 
3744     vEvent
.SetEventObject(this); 
3746     rc 
= GetEventHandler()->ProcessEvent(vEvent
); 
3748     vDC
.m_hPS 
= NULLHANDLE
; 
3750 } // end of wxWindowOS2::HandleEraseBkgnd 
3752 void wxWindowOS2::OnEraseBackground(wxEraseEvent
& rEvent
) 
3755     HPS     hPS 
= rEvent
.GetDC()->GetHPS(); 
3757     LONG    lColor 
= m_backgroundColour
.GetPixel(); 
3759     rc 
= ::WinQueryWindowRect(GetHwnd(), &vRect
); 
3760     rc 
= ::WinFillRect(hPS
, &vRect
, lColor
); 
3761 }  // end of wxWindowOS2::OnEraseBackground 
3763 // --------------------------------------------------------------------------- 
3764 // moving and resizing 
3765 // --------------------------------------------------------------------------- 
3767 bool wxWindowOS2::HandleMinimize() 
3769     wxIconizeEvent                  
vEvent(m_windowId
); 
3771     vEvent
.SetEventObject(this); 
3772     return GetEventHandler()->ProcessEvent(vEvent
); 
3773 } // end of wxWindowOS2::HandleMinimize 
3775 bool wxWindowOS2::HandleMaximize() 
3777     wxMaximizeEvent                 
vEvent(m_windowId
); 
3779     vEvent
.SetEventObject(this); 
3780     return GetEventHandler()->ProcessEvent(vEvent
); 
3781 } // end of wxWindowOS2::HandleMaximize 
3783 bool wxWindowOS2::HandleMove( int nX
, int nY 
) 
3786     wxMoveEvent 
vEvent(pt
, m_windowId
); 
3788     vEvent
.SetEventObject(this); 
3789     return GetEventHandler()->ProcessEvent(vEvent
); 
3790 }  // end of wxWindowOS2::HandleMove 
3792 bool wxWindowOS2::HandleSize( int    nWidth
, 
3794                               WXUINT 
WXUNUSED(nFlag
) ) 
3796     wxSize 
sz(nWidth
, nHeight
); 
3797     wxSizeEvent 
vEvent(sz
, m_windowId
); 
3799     vEvent
.SetEventObject(this); 
3800     return GetEventHandler()->ProcessEvent(vEvent
); 
3801 } // end of wxWindowOS2::HandleSize 
3803 bool wxWindowOS2::HandleGetMinMaxInfo( PSWP pSwp 
) 
3810             ::WinGetMaxPosition(GetHwnd(), pSwp
); 
3811             m_maxWidth 
= pSwp
->cx
; 
3812             m_maxHeight 
= pSwp
->cy
; 
3816             ::WinGetMinPosition(GetHwnd(), pSwp
, &vPoint
); 
3817             m_minWidth 
= pSwp
->cx
; 
3818             m_minHeight 
= pSwp
->cy
; 
3825 } // end of wxWindowOS2::HandleGetMinMaxInfo 
3827 // --------------------------------------------------------------------------- 
3829 // --------------------------------------------------------------------------- 
3830 bool wxWindowOS2::HandleCommand( WXWORD wId
, 
3834 #if wxUSE_MENUS_NATIVE 
3835     if (wxCurrentPopupMenu
) 
3837         wxMenu
*                     pPopupMenu 
= wxCurrentPopupMenu
; 
3839         wxCurrentPopupMenu 
= NULL
; 
3840         return pPopupMenu
->OS2Command(wCmd
, wId
); 
3842 #endif // wxUSE_MENUS_NATIVE 
3844     wxWindow
*                       pWin 
= FindItem(wId
); 
3848         pWin 
= wxFindWinFromHandle(hControl
); 
3852         return pWin
->OS2Command(wCmd
, wId
); 
3855 } // end of wxWindowOS2::HandleCommand 
3857 bool wxWindowOS2::HandleSysCommand( WXWPARAM wParam
, 
3858                                     WXLPARAM 
WXUNUSED(lParam
) ) 
3861     // 4 bits are reserved 
3863     switch (SHORT1FROMMP(wParam
)) 
3866             return HandleMaximize(); 
3869             return HandleMinimize(); 
3872 } // end of wxWindowOS2::HandleSysCommand 
3874 // --------------------------------------------------------------------------- 
3876 // --------------------------------------------------------------------------- 
3877 //TODO: check against MSW 
3878 void wxWindowOS2::InitMouseEvent( 
3879   wxMouseEvent
&                     rEvent
 
3886     DoGetSize(0, &nHeight
); 
3888     // Convert to wxWidgets standard coordinate system! 
3889     rEvent
.m_y           
= nHeight 
- nY
; 
3890     rEvent
.m_shiftDown   
= ((uFlags 
& KC_SHIFT
) != 0); 
3891     rEvent
.m_controlDown 
= ((uFlags 
& KC_CTRL
) != 0); 
3892     rEvent
.m_altDown     
= ((uFlags 
& KC_ALT
) != 0); 
3893     rEvent
.m_leftDown    
= IsKeyDown(VK_BUTTON1
); 
3894     rEvent
.m_middleDown  
= IsKeyDown(VK_BUTTON3
); 
3895     rEvent
.m_rightDown   
= IsKeyDown(VK_BUTTON2
); 
3896     rEvent
.SetTimestamp(s_currentMsg
.time
); 
3897     rEvent
.SetEventObject(this); 
3898     rEvent
.SetId(GetId()); 
3900 #if wxUSE_MOUSEEVENT_HACK 
3903     m_lastMouseEvent 
= rEvent
.GetEventType(); 
3904 #endif // wxUSE_MOUSEEVENT_HACK 
3905 } // end of wxWindowOS2::InitMouseEvent 
3907 bool wxWindowOS2::HandleMouseEvent( WXUINT uMsg
, 
3912     bool bProcessed 
= false; 
3915     // The mouse events take consecutive IDs from WM_MOUSEFIRST to 
3916     // WM_MOUSELAST, so it's enough to subtract WM_MOUSEMOVE == WM_MOUSEFIRST 
3917     // from the message id and take the value in the table to get wxWin event 
3920     static const wxEventType eventsMouse
[] = 
3935     if ((uMsg 
>= WM_MOUSEMOVE
) && (uMsg 
<= WM_BUTTON3DBLCLK
)) 
3937         wxMouseEvent 
vEvent(eventsMouse
[uMsg 
- WM_MOUSEMOVE
]); 
3939         InitMouseEvent( vEvent
 
3945         bProcessed 
= GetEventHandler()->ProcessEvent(vEvent
); 
3948             HPOINTER hCursor 
= (HPOINTER
)GetCursor().GetHCURSOR(); 
3950             if (hCursor 
!= NULLHANDLE
) 
3952                 ::WinSetPointer(HWND_DESKTOP
, hCursor
); 
3958 } // end of wxWindowOS2::HandleMouseEvent 
3960 bool wxWindowOS2::HandleMouseMove( int nX
, 
3964     if (!m_bMouseInWindow
) 
3967         // Generate an ENTER event 
3969         m_bMouseInWindow 
= true; 
3971         wxMouseEvent 
vEvent(wxEVT_ENTER_WINDOW
); 
3973         InitMouseEvent( vEvent
 
3979         (void)GetEventHandler()->ProcessEvent(vEvent
); 
3981     return HandleMouseEvent( WM_MOUSEMOVE
 
3986 } // end of wxWindowOS2::HandleMouseMove 
3988 // --------------------------------------------------------------------------- 
3989 // keyboard handling 
3990 // --------------------------------------------------------------------------- 
3993 // Create the key event of the given type for the given key - used by 
3994 // HandleChar and HandleKeyDown/Up 
3996 wxKeyEvent 
wxWindowOS2::CreateKeyEvent( 
4003     wxKeyEvent                      
vEvent(eType
); 
4005     vEvent
.SetId(GetId()); 
4006     vEvent
.m_shiftDown   
= IsShiftDown(); 
4007     vEvent
.m_controlDown 
= IsCtrlDown(); 
4008     vEvent
.m_altDown     
= (HIWORD(lParam
) & KC_ALT
) == KC_ALT
; 
4010     vEvent
.SetEventObject((wxWindow 
*)this); // const_cast 
4011     vEvent
.m_keyCode     
= nId
; 
4012     vEvent
.m_rawCode 
= (wxUint32
)wParam
; 
4013     vEvent
.m_rawFlags 
= (wxUint32
)lParam
; 
4014     vEvent
.SetTimestamp(s_currentMsg
.time
); 
4017     // Translate the position to client coords 
4022     ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
4023     ::WinQueryWindowRect( GetHwnd() 
4027     vPoint
.x 
-= vRect
.xLeft
; 
4028     vPoint
.y 
-= vRect
.yBottom
; 
4030     vEvent
.m_x 
= vPoint
.x
; 
4031     vEvent
.m_y 
= vPoint
.y
; 
4034 } // end of wxWindowOS2::CreateKeyEvent 
4037 // isASCII is true only when we're called from WM_CHAR handler and not from 
4040 bool wxWindowOS2::HandleChar( WXWPARAM 
WXUNUSED(wParam
), 
4044     bool bCtrlDown 
= false; 
4047     if (m_bLastKeydownProcessed
) 
4050         // The key was handled in the EVT_KEY_DOWN.  Handling a key in an 
4051         // EVT_KEY_DOWN handler is meant, by design, to prevent EVT_CHARs 
4052         // from happening, so just bail out at this point. 
4054         m_bLastKeydownProcessed 
= false; 
4060         // If 1 -> 26, translate to either special keycode or just set 
4061         // ctrlDown.  IOW, Ctrl-C should result in keycode == 3 and 
4062         // ControlDown() == true. 
4064         vId 
= SHORT1FROMMP(lParam
); 
4065         if ((vId 
> 0) && (vId 
< 27)) 
4087     else  // we're called from WM_KEYDOWN 
4089         vId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4094     wxKeyEvent 
vEvent(CreateKeyEvent( wxEVT_CHAR
, vId
, lParam 
)); 
4098         vEvent
.m_controlDown 
= true; 
4101     return (GetEventHandler()->ProcessEvent(vEvent
)); 
4104 bool wxWindowOS2::HandleKeyDown( WXWPARAM wParam
, 
4107     int nId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4112         // Normal ASCII char 
4114         nId 
= SHORT1FROMMP(lParam
); 
4119         wxKeyEvent  
vEvent(CreateKeyEvent( wxEVT_KEY_DOWN
 
4125         if (GetEventHandler()->ProcessEvent(vEvent
)) 
4131 } // end of wxWindowOS2::HandleKeyDown 
4133 bool wxWindowOS2::HandleKeyUp( WXWPARAM wParam
, 
4136     int nId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4141         // Normal ASCII char 
4143         nId 
= CHAR1FROMMP(lParam
); 
4148         wxKeyEvent 
vEvent(CreateKeyEvent( wxEVT_KEY_UP
 
4154         if (GetEventHandler()->ProcessEvent(vEvent
)) 
4158 } // end of wxWindowOS2::HandleKeyUp 
4160 // --------------------------------------------------------------------------- 
4162 // --------------------------------------------------------------------------- 
4164 // --------------------------------------------------------------------------- 
4166 // --------------------------------------------------------------------------- 
4168 bool wxWindowOS2::OS2OnScroll( int nOrientation
, 
4175         wxWindow
*                   pChild 
= wxFindWinFromHandle(hControl
); 
4178             return pChild
->OS2OnScroll( nOrientation
 
4185     wxScrollWinEvent                vEvent
; 
4187     vEvent
.SetPosition(wPos
); 
4188     vEvent
.SetOrientation(nOrientation
); 
4189     vEvent
.SetEventObject(this); 
4194             vEvent
.SetEventType(wxEVT_SCROLLWIN_LINEUP
); 
4198             vEvent
.SetEventType(wxEVT_SCROLLWIN_LINEDOWN
); 
4202             vEvent
.SetEventType(wxEVT_SCROLLWIN_PAGEUP
); 
4206             vEvent
.SetEventType(wxEVT_SCROLLWIN_PAGEDOWN
); 
4209         case SB_SLIDERPOSITION
: 
4210             vEvent
.SetEventType(wxEVT_SCROLLWIN_THUMBRELEASE
); 
4213         case SB_SLIDERTRACK
: 
4214             vEvent
.SetEventType(wxEVT_SCROLLWIN_THUMBTRACK
); 
4220     return GetEventHandler()->ProcessEvent(vEvent
); 
4221 } // end of wxWindowOS2::OS2OnScroll 
4224 //  Getting the Y position for a window, like a control, is a real 
4225 //  pain.  There are three situations we must deal with in determining 
4226 //  the OS2 to wxWidgets Y coordinate. 
4228 //  1)  The controls are created in a dialog. 
4229 //      This is the easiest since a dialog is created with its original 
4230 //      size so the standard: Y = ParentHeight - (Y + ControlHeight); 
4232 //  2)  The controls are direct children of a frame 
4233 //      In this instance the controls are actually children of the Frame's 
4234 //      client.  During creation the frame's client resizes several times 
4235 //      during creation of the status bar and toolbars.  The CFrame class 
4236 //      will take care of this using its AlterChildPos proc. 
4238 //  3)  The controls are children of a panel, which in turn is a child of 
4240 //      The panel may be one of many, in which case the same treatment 
4241 //      as 1 applies. It may be the only child, though. 
4242 //      This is the nastiest case.  A panel is created as the only child of 
4243 //      the frame and as such, when a frame has only one child, the child is 
4244 //      expanded to fit the entire client area of the frame.  Because the 
4245 //      controls are created BEFORE this occurs their positions are totally 
4246 //      whacked and any call to WinQueryWindowPos will return invalid 
4247 //      coordinates.  So for this situation we have to compare the size of 
4248 //      the panel at control creation time with that of the frame client.  If 
4249 //      they are the same we can use the standard Y position equation.  If 
4250 //      not, then we must use the Frame Client's dimensions to position them 
4251 //      as that will be the eventual size of the panel after the frame resizes 
4254 int wxWindowOS2::GetOS2ParentHeight( wxWindowOS2
* pParent 
) 
4261         if (pParent
->IsKindOf(CLASSINFO(wxDialog
))) 
4262             return(pParent
->GetClientSize().y
); 
4265     // Case 2 -- if we are one of the separately built standard Frame 
4266     //           children, like a statusbar, menubar, or toolbar we want to 
4267     //           use the frame, itself, for positioning.  Otherwise we are 
4268     //           child window and want to use the Frame's client. 
4270         else if (pParent
->IsKindOf(CLASSINFO(wxFrame
))) 
4272             if (IsKindOf(CLASSINFO(wxStatusBar
)) || 
4273                 IsKindOf(CLASSINFO(wxMenuBar
))   || 
4274                 IsKindOf(CLASSINFO(wxToolBar
)) 
4277                 if (IsKindOf(CLASSINFO(wxToolBar
))) 
4279                     wxFrame
*        pFrame 
= wxDynamicCast(GetParent(), wxFrame
); 
4281                     if (pFrame
->GetToolBar() == this) 
4282                         return(pParent
->GetSize().y
); 
4284                         return(pParent
->GetClientSize().y
); 
4287                     return(pParent
->GetSize().y
); 
4290                 return(pParent
->GetClientSize().y
); 
4293         // Case -- this is for any window that is the sole child of a Frame. 
4294         //         The grandparent must exist and it must be of type CFrame 
4295         //         and it's height must be different. Otherwise the standard 
4299             return(pParent
->GetClientSize().y
); 
4301     else // We must be a child of the screen 
4304         wxDisplaySize(NULL
,&nHeight
); 
4307 } // end of wxWindowOS2::GetOS2ParentHeight 
4310 // OS/2 needs a lot extra manipulation to deal with layouts 
4311 // for canvas windows, particularly scrolled ones. 
4313 wxWindowCreationHook::wxWindowCreationHook( 
4314   wxWindow
*                         pWinBeingCreated
 
4317     gpWinBeingCreated 
= pWinBeingCreated
; 
4318 } // end of wxWindowCreationHook::wxWindowCreationHook 
4320 wxWindowCreationHook::~wxWindowCreationHook() 
4322     gpWinBeingCreated 
= NULL
; 
4323 } // end of wxWindowCreationHook::~wxWindowCreationHook 
4325 // =========================================================================== 
4327 // =========================================================================== 
4333 ,wxFont
*                            WXUNUSED(pTheFont
) 
4340     hPS 
=::WinGetPS(hWnd
); 
4342     rc 
= ::GpiQueryFontMetrics(hPS
, sizeof(FONTMETRICS
), &vFM
); 
4346             *pX 
= vFM
.lAveCharWidth
; 
4348             *pY 
= vFM
.lEmHeight 
+ vFM
.lExternalLeading
; 
4357     ::WinReleasePS(hPS
); 
4358 } // end of wxGetCharSize 
4361 // Returns 0 if was a normal ASCII value, not a special key. This indicates that 
4362 // the key should be ignored by WM_KEYDOWN and processed by WM_CHAR instead. 
4364 int wxCharCodeOS2ToWX( 
4372         case VK_BACKTAB
:    nId 
= WXK_BACK
; break; 
4373         case VK_TAB
:        nId 
= WXK_TAB
; break; 
4374         case VK_CLEAR
:      nId 
= WXK_CLEAR
; break; 
4375         case VK_ENTER
:      nId 
= WXK_RETURN
; break; 
4376         case VK_SHIFT
:      nId 
= WXK_SHIFT
; break; 
4377         case VK_CTRL
:       nId 
= WXK_CONTROL
; break; 
4378         case VK_PAUSE
:      nId 
= WXK_PAUSE
; break; 
4379         case VK_SPACE
:      nId 
= WXK_SPACE
; break; 
4380         case VK_PAGEUP
:     nId 
= WXK_PAGEUP
; break; 
4381         case VK_PAGEDOWN
:   nId 
= WXK_PAGEDOWN
; break; 
4382         case VK_ESC
:        nId 
= WXK_ESCAPE
; break; 
4383         case VK_END
:        nId 
= WXK_END
; break; 
4384         case VK_HOME 
:      nId 
= WXK_HOME
; break; 
4385         case VK_LEFT 
:      nId 
= WXK_LEFT
; break; 
4386         case VK_UP
:         nId 
= WXK_UP
; break; 
4387         case VK_RIGHT
:      nId 
= WXK_RIGHT
; break; 
4388         case VK_DOWN 
:      nId 
= WXK_DOWN
; break; 
4389         case VK_PRINTSCRN
:  nId 
= WXK_PRINT
; break; 
4390         case VK_INSERT
:     nId 
= WXK_INSERT
; break; 
4391         case VK_DELETE
:     nId 
= WXK_DELETE
; break; 
4392         case VK_CAPSLOCK
:   nId 
= WXK_CAPITAL
; break; 
4393         case VK_F1
:         nId 
= WXK_F1
; break; 
4394         case VK_F2
:         nId 
= WXK_F2
; break; 
4395         case VK_F3
:         nId 
= WXK_F3
; break; 
4396         case VK_F4
:         nId 
= WXK_F4
; break; 
4397         case VK_F5
:         nId 
= WXK_F5
; break; 
4398         case VK_F6
:         nId 
= WXK_F6
; break; 
4399         case VK_F7
:         nId 
= WXK_F7
; break; 
4400         case VK_F8
:         nId 
= WXK_F8
; break; 
4401         case VK_F9
:         nId 
= WXK_F9
; break; 
4402         case VK_F10
:        nId 
= WXK_F10
; break; 
4403         case VK_F11
:        nId 
= WXK_F11
; break; 
4404         case VK_F12
:        nId 
= WXK_F12
; break; 
4405         case VK_F13
:        nId 
= WXK_F13
; break; 
4406         case VK_F14
:        nId 
= WXK_F14
; break; 
4407         case VK_F15
:        nId 
= WXK_F15
; break; 
4408         case VK_F16
:        nId 
= WXK_F16
; break; 
4409         case VK_F17
:        nId 
= WXK_F17
; break; 
4410         case VK_F18
:        nId 
= WXK_F18
; break; 
4411         case VK_F19
:        nId 
= WXK_F19
; break; 
4412         case VK_F20
:        nId 
= WXK_F20
; break; 
4413         case VK_F21
:        nId 
= WXK_F21
; break; 
4414         case VK_F22
:        nId 
= WXK_F22
; break; 
4415         case VK_F23
:        nId 
= WXK_F23
; break; 
4416         case VK_F24
:        nId 
= WXK_F24
; break; 
4417         case VK_OEM_1
:      nId 
= ';'; break; 
4418         case VK_OEM_PLUS
:   nId 
= '+'; break; 
4419         case VK_OEM_COMMA
:  nId 
= ','; break; 
4420         case VK_OEM_MINUS
:  nId 
= '-'; break; 
4421         case VK_OEM_PERIOD
: nId 
= '.'; break; 
4422         case VK_OEM_2
:      nId 
= '/'; break; 
4423         case VK_OEM_3
:      nId 
= '~'; break; 
4424         case VK_OEM_4
:      nId 
= '['; break; 
4425         case VK_OEM_5
:      nId 
= '\\'; break; 
4426         case VK_OEM_6
:      nId 
= ']'; break; 
4427         case VK_OEM_7
:      nId 
= '\''; break; 
4428         case VK_NUMLOCK
:    nId 
= WXK_NUMLOCK
; break; 
4429         case VK_SCRLLOCK
:   nId 
= WXK_SCROLL
; break; 
4436 } // end of wxCharCodeOS2ToWX 
4438 int wxCharCodeWXToOS2( int nId
, 
4447         case WXK_CLEAR
:     nKeySym 
= VK_CLEAR
; break; 
4448         case WXK_SHIFT
:     nKeySym 
= VK_SHIFT
; break; 
4449         case WXK_CONTROL
:   nKeySym 
= VK_CTRL
; break; 
4450         case WXK_PAUSE
:     nKeySym 
= VK_PAUSE
; break; 
4451         case WXK_PAGEUP
:    nKeySym 
= VK_PAGEUP
; break; 
4452         case WXK_PAGEDOWN
:  nKeySym 
= VK_PAGEDOWN
; break; 
4453         case WXK_END
:       nKeySym 
= VK_END
; break; 
4454         case WXK_HOME 
:     nKeySym 
= VK_HOME
; break; 
4455         case WXK_LEFT 
:     nKeySym 
= VK_LEFT
; break; 
4456         case WXK_UP
:        nKeySym 
= VK_UP
; break; 
4457         case WXK_RIGHT
:     nKeySym 
= VK_RIGHT
; break; 
4458         case WXK_DOWN 
:     nKeySym 
= VK_DOWN
; break; 
4459         case WXK_PRINT
:     nKeySym 
= VK_PRINTSCRN
; break; 
4460         case WXK_INSERT
:    nKeySym 
= VK_INSERT
; break; 
4461         case WXK_DELETE
:    nKeySym 
= VK_DELETE
; break; 
4462         case WXK_F1
:        nKeySym 
= VK_F1
; break; 
4463         case WXK_F2
:        nKeySym 
= VK_F2
; break; 
4464         case WXK_F3
:        nKeySym 
= VK_F3
; break; 
4465         case WXK_F4
:        nKeySym 
= VK_F4
; break; 
4466         case WXK_F5
:        nKeySym 
= VK_F5
; break; 
4467         case WXK_F6
:        nKeySym 
= VK_F6
; break; 
4468         case WXK_F7
:        nKeySym 
= VK_F7
; break; 
4469         case WXK_F8
:        nKeySym 
= VK_F8
; break; 
4470         case WXK_F9
:        nKeySym 
= VK_F9
; break; 
4471         case WXK_F10
:       nKeySym 
= VK_F10
; break; 
4472         case WXK_F11
:       nKeySym 
= VK_F11
; break; 
4473         case WXK_F12
:       nKeySym 
= VK_F12
; break; 
4474         case WXK_F13
:       nKeySym 
= VK_F13
; break; 
4475         case WXK_F14
:       nKeySym 
= VK_F14
; break; 
4476         case WXK_F15
:       nKeySym 
= VK_F15
; break; 
4477         case WXK_F16
:       nKeySym 
= VK_F16
; break; 
4478         case WXK_F17
:       nKeySym 
= VK_F17
; break; 
4479         case WXK_F18
:       nKeySym 
= VK_F18
; break; 
4480         case WXK_F19
:       nKeySym 
= VK_F19
; break; 
4481         case WXK_F20
:       nKeySym 
= VK_F20
; break; 
4482         case WXK_F21
:       nKeySym 
= VK_F21
; break; 
4483         case WXK_F22
:       nKeySym 
= VK_F22
; break; 
4484         case WXK_F23
:       nKeySym 
= VK_F23
; break; 
4485         case WXK_F24
:       nKeySym 
= VK_F24
; break; 
4486         case WXK_NUMLOCK
:   nKeySym 
= VK_NUMLOCK
; break; 
4487         case WXK_SCROLL
:    nKeySym 
= VK_SCRLLOCK
; break; 
4491                 *bIsVirtual 
= false; 
4497 } // end of wxCharCodeWXToOS2 
4500 bool wxGetKeyState(wxKeyCode key
) 
4502     wxASSERT_MSG(key 
!= WXK_LBUTTON 
&& key 
!= WXK_RBUTTON 
&& key 
!= 
4503         WXK_MBUTTON
, wxT("can't use wxGetKeyState() for mouse buttons")); 
4505     const LONG vk 
= wxCharCodeWXToOS2(key
); 
4506     // if the requested key is a LED key, return true if the led is pressed 
4507     if ( key 
== WXK_NUMLOCK 
|| key 
== WXK_CAPITAL 
|| key 
== WXK_SCROLL 
) 
4509         // low order bit means LED is highlighted and high order one means the 
4510         // key is down; for compatibility with the other ports return true if 
4511         // either one is set 
4512         return ::WinGetKeyState(HWND_DESKTOP
, vk
) != 0; 
4517         return IsKeyDown(vk
); 
4522 wxWindow
* wxGetActiveWindow() 
4524     HWND                            hWnd 
= ::WinQueryActiveWindow(HWND_DESKTOP
); 
4528         return wxFindWinFromHandle((WXHWND
)hWnd
); 
4531 } // end of wxGetActiveWindow 
4534 const wxChar
* wxGetMessageName( int nMessage 
) 
4538         case 0x0000: return wxT("WM_NULL"); 
4539         case 0x0001: return wxT("WM_CREATE"); 
4540         case 0x0002: return wxT("WM_DESTROY"); 
4541         case 0x0004: return wxT("WM_ENABLE"); 
4542         case 0x0005: return wxT("WM_SHOW"); 
4543         case 0x0006: return wxT("WM_MOVE"); 
4544         case 0x0007: return wxT("WM_SIZE"); 
4545         case 0x0008: return wxT("WM_ADJUSTWINDOWPOS"); 
4546         case 0x0009: return wxT("WM_CALCVALIDRECTS"); 
4547         case 0x000A: return wxT("WM_SETWINDOWPARAMS"); 
4548         case 0x000B: return wxT("WM_QUERYWINDOWPARAMS"); 
4549         case 0x000C: return wxT("WM_HITTEST"); 
4550         case 0x000D: return wxT("WM_ACTIVATE"); 
4551         case 0x000F: return wxT("WM_SETFOCUS"); 
4552         case 0x0010: return wxT("WM_SETSELECTION"); 
4553         case 0x0011: return wxT("WM_PPAINT"); 
4554         case 0x0012: return wxT("WM_PSETFOCUS"); 
4555         case 0x0013: return wxT("WM_PSYSCOLORCHANGE"); 
4556         case 0x0014: return wxT("WM_PSIZE"); 
4557         case 0x0015: return wxT("WM_PACTIVATE"); 
4558         case 0x0016: return wxT("WM_PCONTROL"); 
4559         case 0x0020: return wxT("WM_COMMAND"); 
4560         case 0x0021: return wxT("WM_SYSCOMMAND"); 
4561         case 0x0022: return wxT("WM_HELP"); 
4562         case 0x0023: return wxT("WM_PAINT"); 
4563         case 0x0024: return wxT("WM_TIMER"); 
4564         case 0x0025: return wxT("WM_SEM1"); 
4565         case 0x0026: return wxT("WM_SEM2"); 
4566         case 0x0027: return wxT("WM_SEM3"); 
4567         case 0x0028: return wxT("WM_SEM4"); 
4568         case 0x0029: return wxT("WM_CLOSE"); 
4569         case 0x002A: return wxT("WM_QUIT"); 
4570         case 0x002B: return wxT("WM_SYSCOLORCHANGE"); 
4571         case 0x002D: return wxT("WM_SYSVALUECHANGE"); 
4572         case 0x002E: return wxT("WM_APPTERMINATENOTIFY"); 
4573         case 0x002F: return wxT("WM_PRESPARAMCHANGED"); 
4574         // Control notification messages 
4575         case 0x0030: return wxT("WM_CONTROL"); 
4576         case 0x0031: return wxT("WM_VSCROLL"); 
4577         case 0x0032: return wxT("WM_HSCROLL"); 
4578         case 0x0033: return wxT("WM_INITMENU"); 
4579         case 0x0034: return wxT("WM_MENUSELECT"); 
4580         case 0x0035: return wxT("WM_MENUSEND"); 
4581         case 0x0036: return wxT("WM_DRAWITEM"); 
4582         case 0x0037: return wxT("WM_MEASUREITEM"); 
4583         case 0x0038: return wxT("WM_CONTROLPOINTER"); 
4584         case 0x003A: return wxT("WM_QUERYDLGCODE"); 
4585         case 0x003B: return wxT("WM_INITDLG"); 
4586         case 0x003C: return wxT("WM_SUBSTITUTESTRING"); 
4587         case 0x003D: return wxT("WM_MATCHMNEMONIC"); 
4588         case 0x003E: return wxT("WM_SAVEAPPLICATION"); 
4589         case 0x0129: return wxT("WM_CTLCOLORCHANGE"); 
4590         case 0x0130: return wxT("WM_QUERYCTLTYPE"); 
4592         case 0x0040: return wxT("WM_FLASHWINDOW"); 
4593         case 0x0041: return wxT("WM_FORMATFRAME"); 
4594         case 0x0042: return wxT("WM_UPDATEFRAME"); 
4595         case 0x0043: return wxT("WM_FOCUSCHANGE"); 
4596         case 0x0044: return wxT("WM_SETBORDERSIZE"); 
4597         case 0x0045: return wxT("WM_TRACKFRAME"); 
4598         case 0x0046: return wxT("WM_MINMAXFRAME"); 
4599         case 0x0047: return wxT("WM_SETICON"); 
4600         case 0x0048: return wxT("WM_QUERYICON"); 
4601         case 0x0049: return wxT("WM_SETACCELTABLE"); 
4602         case 0x004A: return wxT("WM_QUERYACCELTABLE"); 
4603         case 0x004B: return wxT("WM_TRANSLATEACCEL"); 
4604         case 0x004C: return wxT("WM_QUERYTRACKINFO"); 
4605         case 0x004D: return wxT("WM_QUERYBORDERSIZE"); 
4606         case 0x004E: return wxT("WM_NEXTMENU"); 
4607         case 0x004F: return wxT("WM_ERASEBACKGROUND"); 
4608         case 0x0050: return wxT("WM_QUERYFRAMEINFO"); 
4609         case 0x0051: return wxT("WM_QUERYFOCUSCHAIN"); 
4610         case 0x0052: return wxT("WM_OWNERPOSCHANGE"); 
4611         case 0x0053: return wxT("WM_CACLFRAMERECT"); 
4612         case 0x0055: return wxT("WM_WINDOWPOSCHANGED"); 
4613         case 0x0056: return wxT("WM_ADJUSTFRAMEPOS"); 
4614         case 0x0059: return wxT("WM_QUERYFRAMECTLCOUNT"); 
4615         case 0x005B: return wxT("WM_QUERYHELPINFO"); 
4616         case 0x005C: return wxT("WM_SETHELPINFO"); 
4617         case 0x005D: return wxT("WM_ERROR"); 
4618         case 0x005E: return wxT("WM_REALIZEPALETTE"); 
4619         // Clipboard messages 
4620         case 0x0060: return wxT("WM_RENDERFMT"); 
4621         case 0x0061: return wxT("WM_RENDERALLFMTS"); 
4622         case 0x0062: return wxT("WM_DESTROYCLIPBOARD"); 
4623         case 0x0063: return wxT("WM_PAINTCLIPBOARD"); 
4624         case 0x0064: return wxT("WM_SIZECLIPBOARD"); 
4625         case 0x0065: return wxT("WM_HSCROLLCLIPBOARD"); 
4626         case 0x0066: return wxT("WM_VSCROLLCLIPBOARD"); 
4627         case 0x0067: return wxT("WM_DRAWCLIPBOARD"); 
4629         case 0x0070: return wxT("WM_MOUSEMOVE"); 
4630         case 0x0071: return wxT("WM_BUTTON1DOWN"); 
4631         case 0x0072: return wxT("WM_BUTTON1UP"); 
4632         case 0x0073: return wxT("WM_BUTTON1DBLCLK"); 
4633         case 0x0074: return wxT("WM_BUTTON2DOWN"); 
4634         case 0x0075: return wxT("WM_BUTTON2UP"); 
4635         case 0x0076: return wxT("WM_BUTTON2DBLCLK"); 
4636         case 0x0077: return wxT("WM_BUTTON3DOWN"); 
4637         case 0x0078: return wxT("WM_BUTTON3UP"); 
4638         case 0x0079: return wxT("WM_BUTTON3DBLCLK"); 
4639         case 0x007D: return wxT("WM_MOUSEMAP"); 
4640         case 0x007E: return wxT("WM_VRNDISABLED"); 
4641         case 0x007F: return wxT("WM_VRNENABLED"); 
4642         case 0x0410: return wxT("WM_CHORD"); 
4643         case 0x0411: return wxT("WM_BUTTON1MOTIONSTART"); 
4644         case 0x0412: return wxT("WM_BUTTON1MOTIONEND"); 
4645         case 0x0413: return wxT("WM_BUTTON1CLICK"); 
4646         case 0x0414: return wxT("WM_BUTTON2MOTIONSTART"); 
4647         case 0x0415: return wxT("WM_BUTTON2MOTIONEND"); 
4648         case 0x0416: return wxT("WM_BUTTON2CLICK"); 
4649         case 0x0417: return wxT("WM_BUTTON3MOTIONSTART"); 
4650         case 0x0418: return wxT("WM_BUTTON3MOTIONEND"); 
4651         case 0x0419: return wxT("WM_BUTTON3CLICK"); 
4652         case 0x0420: return wxT("WM_BEGINDRAG"); 
4653         case 0x0421: return wxT("WM_ENDDRAG"); 
4654         case 0x0422: return wxT("WM_SINGLESELECT"); 
4655         case 0x0423: return wxT("WM_OPEN"); 
4656         case 0x0424: return wxT("WM_CONTEXTMENU"); 
4657         case 0x0425: return wxT("WM_CONTEXTHELP"); 
4658         case 0x0426: return wxT("WM_TEXTEDIT"); 
4659         case 0x0427: return wxT("WM_BEGINSELECT"); 
4660         case 0x0228: return wxT("WM_ENDSELECT"); 
4661         case 0x0429: return wxT("WM_PICKUP"); 
4662         case 0x04C0: return wxT("WM_PENFIRST"); 
4663         case 0x04FF: return wxT("WM_PENLAST"); 
4664         case 0x0500: return wxT("WM_MMPMFIRST"); 
4665         case 0x05FF: return wxT("WM_MMPMLAST"); 
4666         case 0x0600: return wxT("WM_STDDLGFIRST"); 
4667         case 0x06FF: return wxT("WM_STDDLGLAST"); 
4668         case 0x0BD0: return wxT("WM_BIDI_FIRST"); 
4669         case 0x0BFF: return wxT("WM_BIDI_LAST"); 
4671         case 0x007A: return wxT("WM_CHAR"); 
4672         case 0x007B: return wxT("WM_VIOCHAR"); 
4674         case 0x00A0: return wxT("WM_DDE_INITIATE"); 
4675         case 0x00A1: return wxT("WM_DDE_REQUEST"); 
4676         case 0x00A2: return wxT("WM_DDE_ACK"); 
4677         case 0x00A3: return wxT("WM_DDE_DATA"); 
4678         case 0x00A4: return wxT("WM_DDE_ADVISE"); 
4679         case 0x00A5: return wxT("WM_DDE_UNADVISE"); 
4680         case 0x00A6: return wxT("WM_DDE_POKE"); 
4681         case 0x00A7: return wxT("WM_DDE_EXECUTE"); 
4682         case 0x00A8: return wxT("WM_DDE_TERMINATE"); 
4683         case 0x00A9: return wxT("WM_DDE_INITIATEACK"); 
4684         case 0x00AF: return wxT("WM_DDE_LAST"); 
4686         case 0x0120: return wxT("BM_CLICK"); 
4687         case 0x0121: return wxT("BM_QUERYCHECKINDEX"); 
4688         case 0x0122: return wxT("BM_QUERYHILITE"); 
4689         case 0x0123: return wxT("BM_SETHILITE"); 
4690         case 0x0124: return wxT("BM_QUERYCHECK"); 
4691         case 0x0125: return wxT("BM_SETCHECK"); 
4692         case 0x0126: return wxT("BM_SETDEFAULT"); 
4693         case 0x0128: return wxT("BM_AUTOSIZE"); 
4695         case 0x029A: return wxT("CBID_LIST"); 
4696         case 0x029B: return wxT("CBID_EDIT"); 
4697         case 0x0170: return wxT("CBM_SHOWLIST"); 
4698         case 0x0171: return wxT("CBM_HILITE"); 
4699         case 0x0172: return wxT("CBM_ISLISTSHOWING"); 
4701         case 0x0140: return wxT("EM_QUERYCHANGED"); 
4702         case 0x0141: return wxT("EM_QUERYSEL"); 
4703         case 0x0142: return wxT("EM_SETSEL"); 
4704         case 0x0143: return wxT("EM_SETTEXTLIMIT"); 
4705         case 0x0144: return wxT("EM_CUT"); 
4706         case 0x0145: return wxT("EM_COPY"); 
4707         case 0x0146: return wxT("EM_CLEAR"); 
4708         case 0x0147: return wxT("EM_PASTE"); 
4709         case 0x0148: return wxT("EM_QUERYFIRSTCHAR"); 
4710         case 0x0149: return wxT("EM_SETFIRSTCHAR"); 
4711         case 0x014A: return wxT("EM_QUERYREADONLY"); 
4712         case 0x014B: return wxT("EM_SETREADONLY"); 
4713         case 0x014C: return wxT("EM_SETINSERTMODE"); 
4715         case 0x0160: return wxT("LM_QUERYITEMCOUNT"); 
4716         case 0x0161: return wxT("LM_INSERTITEM"); 
4717         case 0x0162: return wxT("LM_SETOPENINDEX"); 
4718         case 0x0163: return wxT("LM_DELETEITEM"); 
4719         case 0x0164: return wxT("LM_SELECTITEM"); 
4720         case 0x0165: return wxT("LM_QUERYSELECTION"); 
4721         case 0x0166: return wxT("LM_SETITEMTEXT"); 
4722         case 0x0167: return wxT("LM_QUERYITEMTEXTLENGTH"); 
4723         case 0x0168: return wxT("LM_QUERYITEMTEXT"); 
4724         case 0x0169: return wxT("LM_SETITEMHANDLE"); 
4725         case 0x016A: return wxT("LM_QUERYITEMHANDLE"); 
4726         case 0x016B: return wxT("LM_SEARCHSTRING"); 
4727         case 0x016C: return wxT("LM_SETITEMHEIGHT"); 
4728         case 0x016D: return wxT("LM_QUERYTOPINDEX"); 
4729         case 0x016E: return wxT("LM_DELETEALL"); 
4730         case 0x016F: return wxT("LM_INSERTMULITEMS"); 
4731         case 0x0660: return wxT("LM_SETITEMWIDTH"); 
4733         case 0x0180: return wxT("MM_INSERTITEM"); 
4734         case 0x0181: return wxT("MM_DELETEITEM"); 
4735         case 0x0182: return wxT("MM_QUERYITEM"); 
4736         case 0x0183: return wxT("MM_SETITEM"); 
4737         case 0x0184: return wxT("MM_QUERYITEMCOUNT"); 
4738         case 0x0185: return wxT("MM_STARTMENUMODE"); 
4739         case 0x0186: return wxT("MM_ENDMENUMODE"); 
4740         case 0x0188: return wxT("MM_REMOVEITEM"); 
4741         case 0x0189: return wxT("MM_SELECTITEM"); 
4742         case 0x018A: return wxT("MM_QUERYSELITEMID"); 
4743         case 0x018B: return wxT("MM_QUERYITEMTEXT"); 
4744         case 0x018C: return wxT("MM_QUERYITEMTEXTLENGTH"); 
4745         case 0x018D: return wxT("MM_SETITEMHANDLE"); 
4746         case 0x018E: return wxT("MM_SETITEMTEXT"); 
4747         case 0x018F: return wxT("MM_ITEMPOSITIONFROMID"); 
4748         case 0x0190: return wxT("MM_ITEMIDFROMPOSITION"); 
4749         case 0x0191: return wxT("MM_QUERYITEMATTR"); 
4750         case 0x0192: return wxT("MM_SETITEMATTR"); 
4751         case 0x0193: return wxT("MM_ISITEMVALID"); 
4752         case 0x0194: return wxT("MM_QUERYITEMRECT"); 
4753         case 0x0431: return wxT("MM_QUERYDEFAULTITEMID"); 
4754         case 0x0432: return wxT("MM_SETDEFAULTITEMID"); 
4756         case 0x01A0: return wxT("SBM_SETSCROLLBAR"); 
4757         case 0x01A1: return wxT("SBM_SETPOS"); 
4758         case 0x01A2: return wxT("SBM_QUERYPOS"); 
4759         case 0x01A3: return wxT("SBM_QUERYRANGE"); 
4760         case 0x01A6: return wxT("SBM_SETTHUMBSIZE"); 
4763         case 0x0F00: return wxT("WM_HELPBASE"); 
4764         case 0x0FFF: return wxT("WM_HELPTOP"); 
4765         // Beginning of user defined messages 
4766         case 0x1000: return wxT("WM_USER"); 
4768         // wxWidgets user defined types 
4771         // case 0x1000 + 0: return wxT("LVM_GETBKCOLOR"); 
4772         case 0x1000 + 1: return wxT("LVM_SETBKCOLOR"); 
4773         case 0x1000 + 2: return wxT("LVM_GETIMAGELIST"); 
4774         case 0x1000 + 3: return wxT("LVM_SETIMAGELIST"); 
4775         case 0x1000 + 4: return wxT("LVM_GETITEMCOUNT"); 
4776         case 0x1000 + 5: return wxT("LVM_GETITEMA"); 
4777         case 0x1000 + 75: return wxT("LVM_GETITEMW"); 
4778         case 0x1000 + 6: return wxT("LVM_SETITEMA"); 
4779         case 0x1000 + 76: return wxT("LVM_SETITEMW"); 
4780         case 0x1000 + 7: return wxT("LVM_INSERTITEMA"); 
4781         case 0x1000 + 77: return wxT("LVM_INSERTITEMW"); 
4782         case 0x1000 + 8: return wxT("LVM_DELETEITEM"); 
4783         case 0x1000 + 9: return wxT("LVM_DELETEALLITEMS"); 
4784         case 0x1000 + 10: return wxT("LVM_GETCALLBACKMASK"); 
4785         case 0x1000 + 11: return wxT("LVM_SETCALLBACKMASK"); 
4786         case 0x1000 + 12: return wxT("LVM_GETNEXTITEM"); 
4787         case 0x1000 + 13: return wxT("LVM_FINDITEMA"); 
4788         case 0x1000 + 83: return wxT("LVM_FINDITEMW"); 
4789         case 0x1000 + 14: return wxT("LVM_GETITEMRECT"); 
4790         case 0x1000 + 15: return wxT("LVM_SETITEMPOSITION"); 
4791         case 0x1000 + 16: return wxT("LVM_GETITEMPOSITION"); 
4792         case 0x1000 + 17: return wxT("LVM_GETSTRINGWIDTHA"); 
4793         case 0x1000 + 87: return wxT("LVM_GETSTRINGWIDTHW"); 
4794         case 0x1000 + 18: return wxT("LVM_HITTEST"); 
4795         case 0x1000 + 19: return wxT("LVM_ENSUREVISIBLE"); 
4796         case 0x1000 + 20: return wxT("LVM_SCROLL"); 
4797         case 0x1000 + 21: return wxT("LVM_REDRAWITEMS"); 
4798         case 0x1000 + 22: return wxT("LVM_ARRANGE"); 
4799         case 0x1000 + 23: return wxT("LVM_EDITLABELA"); 
4800         case 0x1000 + 118: return wxT("LVM_EDITLABELW"); 
4801         case 0x1000 + 24: return wxT("LVM_GETEDITCONTROL"); 
4802         case 0x1000 + 25: return wxT("LVM_GETCOLUMNA"); 
4803         case 0x1000 + 95: return wxT("LVM_GETCOLUMNW"); 
4804         case 0x1000 + 26: return wxT("LVM_SETCOLUMNA"); 
4805         case 0x1000 + 96: return wxT("LVM_SETCOLUMNW"); 
4806         case 0x1000 + 27: return wxT("LVM_INSERTCOLUMNA"); 
4807         case 0x1000 + 97: return wxT("LVM_INSERTCOLUMNW"); 
4808         case 0x1000 + 28: return wxT("LVM_DELETECOLUMN"); 
4809         case 0x1000 + 29: return wxT("LVM_GETCOLUMNWIDTH"); 
4810         case 0x1000 + 30: return wxT("LVM_SETCOLUMNWIDTH"); 
4811         case 0x1000 + 31: return wxT("LVM_GETHEADER"); 
4812         case 0x1000 + 33: return wxT("LVM_CREATEDRAGIMAGE"); 
4813         case 0x1000 + 34: return wxT("LVM_GETVIEWRECT"); 
4814         case 0x1000 + 35: return wxT("LVM_GETTEXTCOLOR"); 
4815         case 0x1000 + 36: return wxT("LVM_SETTEXTCOLOR"); 
4816         case 0x1000 + 37: return wxT("LVM_GETTEXTBKCOLOR"); 
4817         case 0x1000 + 38: return wxT("LVM_SETTEXTBKCOLOR"); 
4818         case 0x1000 + 39: return wxT("LVM_GETTOPINDEX"); 
4819         case 0x1000 + 40: return wxT("LVM_GETCOUNTPERPAGE"); 
4820         case 0x1000 + 41: return wxT("LVM_GETORIGIN"); 
4821         case 0x1000 + 42: return wxT("LVM_UPDATE"); 
4822         case 0x1000 + 43: return wxT("LVM_SETITEMSTATE"); 
4823         case 0x1000 + 44: return wxT("LVM_GETITEMSTATE"); 
4824         case 0x1000 + 45: return wxT("LVM_GETITEMTEXTA"); 
4825         case 0x1000 + 115: return wxT("LVM_GETITEMTEXTW"); 
4826         case 0x1000 + 46: return wxT("LVM_SETITEMTEXTA"); 
4827         case 0x1000 + 116: return wxT("LVM_SETITEMTEXTW"); 
4828         case 0x1000 + 47: return wxT("LVM_SETITEMCOUNT"); 
4829         case 0x1000 + 48: return wxT("LVM_SORTITEMS"); 
4830         case 0x1000 + 49: return wxT("LVM_SETITEMPOSITION32"); 
4831         case 0x1000 + 50: return wxT("LVM_GETSELECTEDCOUNT"); 
4832         case 0x1000 + 51: return wxT("LVM_GETITEMSPACING"); 
4833         case 0x1000 + 52: return wxT("LVM_GETISEARCHSTRINGA"); 
4834         case 0x1000 + 117: return wxT("LVM_GETISEARCHSTRINGW"); 
4835         case 0x1000 + 53: return wxT("LVM_SETICONSPACING"); 
4836         case 0x1000 + 54: return wxT("LVM_SETEXTENDEDLISTVIEWSTYLE"); 
4837         case 0x1000 + 55: return wxT("LVM_GETEXTENDEDLISTVIEWSTYLE"); 
4838         case 0x1000 + 56: return wxT("LVM_GETSUBITEMRECT"); 
4839         case 0x1000 + 57: return wxT("LVM_SUBITEMHITTEST"); 
4840         case 0x1000 + 58: return wxT("LVM_SETCOLUMNORDERARRAY"); 
4841         case 0x1000 + 59: return wxT("LVM_GETCOLUMNORDERARRAY"); 
4842         case 0x1000 + 60: return wxT("LVM_SETHOTITEM"); 
4843         case 0x1000 + 61: return wxT("LVM_GETHOTITEM"); 
4844         case 0x1000 + 62: return wxT("LVM_SETHOTCURSOR"); 
4845         case 0x1000 + 63: return wxT("LVM_GETHOTCURSOR"); 
4846         case 0x1000 + 64: return wxT("LVM_APPROXIMATEVIEWRECT"); 
4847         case 0x1000 + 65: return wxT("LVM_SETWORKAREA"); 
4850         case 0x1100 + 0: return wxT("TVM_INSERTITEMA"); 
4851         case 0x1100 + 50: return wxT("TVM_INSERTITEMW"); 
4852         case 0x1100 + 1: return wxT("TVM_DELETEITEM"); 
4853         case 0x1100 + 2: return wxT("TVM_EXPAND"); 
4854         case 0x1100 + 4: return wxT("TVM_GETITEMRECT"); 
4855         case 0x1100 + 5: return wxT("TVM_GETCOUNT"); 
4856         case 0x1100 + 6: return wxT("TVM_GETINDENT"); 
4857         case 0x1100 + 7: return wxT("TVM_SETINDENT"); 
4858         case 0x1100 + 8: return wxT("TVM_GETIMAGELIST"); 
4859         case 0x1100 + 9: return wxT("TVM_SETIMAGELIST"); 
4860         case 0x1100 + 10: return wxT("TVM_GETNEXTITEM"); 
4861         case 0x1100 + 11: return wxT("TVM_SELECTITEM"); 
4862         case 0x1100 + 12: return wxT("TVM_GETITEMA"); 
4863         case 0x1100 + 62: return wxT("TVM_GETITEMW"); 
4864         case 0x1100 + 13: return wxT("TVM_SETITEMA"); 
4865         case 0x1100 + 63: return wxT("TVM_SETITEMW"); 
4866         case 0x1100 + 14: return wxT("TVM_EDITLABELA"); 
4867         case 0x1100 + 65: return wxT("TVM_EDITLABELW"); 
4868         case 0x1100 + 15: return wxT("TVM_GETEDITCONTROL"); 
4869         case 0x1100 + 16: return wxT("TVM_GETVISIBLECOUNT"); 
4870         case 0x1100 + 17: return wxT("TVM_HITTEST"); 
4871         case 0x1100 + 18: return wxT("TVM_CREATEDRAGIMAGE"); 
4872         case 0x1100 + 19: return wxT("TVM_SORTCHILDREN"); 
4873         case 0x1100 + 20: return wxT("TVM_ENSUREVISIBLE"); 
4874         case 0x1100 + 21: return wxT("TVM_SORTCHILDRENCB"); 
4875         case 0x1100 + 22: return wxT("TVM_ENDEDITLABELNOW"); 
4876         case 0x1100 + 23: return wxT("TVM_GETISEARCHSTRINGA"); 
4877         case 0x1100 + 64: return wxT("TVM_GETISEARCHSTRINGW"); 
4878         case 0x1100 + 24: return wxT("TVM_SETTOOLTIPS"); 
4879         case 0x1100 + 25: return wxT("TVM_GETTOOLTIPS"); 
4882         case 0x1200 + 0: return wxT("HDM_GETITEMCOUNT"); 
4883         case 0x1200 + 1: return wxT("HDM_INSERTITEMA"); 
4884         case 0x1200 + 10: return wxT("HDM_INSERTITEMW"); 
4885         case 0x1200 + 2: return wxT("HDM_DELETEITEM"); 
4886         case 0x1200 + 3: return wxT("HDM_GETITEMA"); 
4887         case 0x1200 + 11: return wxT("HDM_GETITEMW"); 
4888         case 0x1200 + 4: return wxT("HDM_SETITEMA"); 
4889         case 0x1200 + 12: return wxT("HDM_SETITEMW"); 
4890         case 0x1200 + 5: return wxT("HDM_LAYOUT"); 
4891         case 0x1200 + 6: return wxT("HDM_HITTEST"); 
4892         case 0x1200 + 7: return wxT("HDM_GETITEMRECT"); 
4893         case 0x1200 + 8: return wxT("HDM_SETIMAGELIST"); 
4894         case 0x1200 + 9: return wxT("HDM_GETIMAGELIST"); 
4895         case 0x1200 + 15: return wxT("HDM_ORDERTOINDEX"); 
4896         case 0x1200 + 16: return wxT("HDM_CREATEDRAGIMAGE"); 
4897         case 0x1200 + 17: return wxT("HDM_GETORDERARRAY"); 
4898         case 0x1200 + 18: return wxT("HDM_SETORDERARRAY"); 
4899         case 0x1200 + 19: return wxT("HDM_SETHOTDIVIDER"); 
4902         case 0x1300 + 2: return wxT("TCM_GETIMAGELIST"); 
4903         case 0x1300 + 3: return wxT("TCM_SETIMAGELIST"); 
4904         case 0x1300 + 4: return wxT("TCM_GETITEMCOUNT"); 
4905         case 0x1300 + 5: return wxT("TCM_GETITEMA"); 
4906         case 0x1300 + 60: return wxT("TCM_GETITEMW"); 
4907         case 0x1300 + 6: return wxT("TCM_SETITEMA"); 
4908         case 0x1300 + 61: return wxT("TCM_SETITEMW"); 
4909         case 0x1300 + 7: return wxT("TCM_INSERTITEMA"); 
4910         case 0x1300 + 62: return wxT("TCM_INSERTITEMW"); 
4911         case 0x1300 + 8: return wxT("TCM_DELETEITEM"); 
4912         case 0x1300 + 9: return wxT("TCM_DELETEALLITEMS"); 
4913         case 0x1300 + 10: return wxT("TCM_GETITEMRECT"); 
4914         case 0x1300 + 11: return wxT("TCM_GETCURSEL"); 
4915         case 0x1300 + 12: return wxT("TCM_SETCURSEL"); 
4916         case 0x1300 + 13: return wxT("TCM_HITTEST"); 
4917         case 0x1300 + 14: return wxT("TCM_SETITEMEXTRA"); 
4918         case 0x1300 + 40: return wxT("TCM_ADJUSTRECT"); 
4919         case 0x1300 + 41: return wxT("TCM_SETITEMSIZE"); 
4920         case 0x1300 + 42: return wxT("TCM_REMOVEIMAGE"); 
4921         case 0x1300 + 43: return wxT("TCM_SETPADDING"); 
4922         case 0x1300 + 44: return wxT("TCM_GETROWCOUNT"); 
4923         case 0x1300 + 45: return wxT("TCM_GETTOOLTIPS"); 
4924         case 0x1300 + 46: return wxT("TCM_SETTOOLTIPS"); 
4925         case 0x1300 + 47: return wxT("TCM_GETCURFOCUS"); 
4926         case 0x1300 + 48: return wxT("TCM_SETCURFOCUS"); 
4927         case 0x1300 + 49: return wxT("TCM_SETMINTABWIDTH"); 
4928         case 0x1300 + 50: return wxT("TCM_DESELECTALL"); 
4931         case WM_USER
+1000+1: return wxT("TB_ENABLEBUTTON"); 
4932         case WM_USER
+1000+2: return wxT("TB_CHECKBUTTON"); 
4933         case WM_USER
+1000+3: return wxT("TB_PRESSBUTTON"); 
4934         case WM_USER
+1000+4: return wxT("TB_HIDEBUTTON"); 
4935         case WM_USER
+1000+5: return wxT("TB_INDETERMINATE"); 
4936         case WM_USER
+1000+9: return wxT("TB_ISBUTTONENABLED"); 
4937         case WM_USER
+1000+10: return wxT("TB_ISBUTTONCHECKED"); 
4938         case WM_USER
+1000+11: return wxT("TB_ISBUTTONPRESSED"); 
4939         case WM_USER
+1000+12: return wxT("TB_ISBUTTONHIDDEN"); 
4940         case WM_USER
+1000+13: return wxT("TB_ISBUTTONINDETERMINATE"); 
4941         case WM_USER
+1000+17: return wxT("TB_SETSTATE"); 
4942         case WM_USER
+1000+18: return wxT("TB_GETSTATE"); 
4943         case WM_USER
+1000+19: return wxT("TB_ADDBITMAP"); 
4944         case WM_USER
+1000+20: return wxT("TB_ADDBUTTONS"); 
4945         case WM_USER
+1000+21: return wxT("TB_INSERTBUTTON"); 
4946         case WM_USER
+1000+22: return wxT("TB_DELETEBUTTON"); 
4947         case WM_USER
+1000+23: return wxT("TB_GETBUTTON"); 
4948         case WM_USER
+1000+24: return wxT("TB_BUTTONCOUNT"); 
4949         case WM_USER
+1000+25: return wxT("TB_COMMANDTOINDEX"); 
4950         case WM_USER
+1000+26: return wxT("TB_SAVERESTOREA"); 
4951         case WM_USER
+1000+76: return wxT("TB_SAVERESTOREW"); 
4952         case WM_USER
+1000+27: return wxT("TB_CUSTOMIZE"); 
4953         case WM_USER
+1000+28: return wxT("TB_ADDSTRINGA"); 
4954         case WM_USER
+1000+77: return wxT("TB_ADDSTRINGW"); 
4955         case WM_USER
+1000+29: return wxT("TB_GETITEMRECT"); 
4956         case WM_USER
+1000+30: return wxT("TB_BUTTONSTRUCTSIZE"); 
4957         case WM_USER
+1000+31: return wxT("TB_SETBUTTONSIZE"); 
4958         case WM_USER
+1000+32: return wxT("TB_SETBITMAPSIZE"); 
4959         case WM_USER
+1000+33: return wxT("TB_AUTOSIZE"); 
4960         case WM_USER
+1000+35: return wxT("TB_GETTOOLTIPS"); 
4961         case WM_USER
+1000+36: return wxT("TB_SETTOOLTIPS"); 
4962         case WM_USER
+1000+37: return wxT("TB_SETPARENT"); 
4963         case WM_USER
+1000+39: return wxT("TB_SETROWS"); 
4964         case WM_USER
+1000+40: return wxT("TB_GETROWS"); 
4965         case WM_USER
+1000+42: return wxT("TB_SETCMDID"); 
4966         case WM_USER
+1000+43: return wxT("TB_CHANGEBITMAP"); 
4967         case WM_USER
+1000+44: return wxT("TB_GETBITMAP"); 
4968         case WM_USER
+1000+45: return wxT("TB_GETBUTTONTEXTA"); 
4969         case WM_USER
+1000+75: return wxT("TB_GETBUTTONTEXTW"); 
4970         case WM_USER
+1000+46: return wxT("TB_REPLACEBITMAP"); 
4971         case WM_USER
+1000+47: return wxT("TB_SETINDENT"); 
4972         case WM_USER
+1000+48: return wxT("TB_SETIMAGELIST"); 
4973         case WM_USER
+1000+49: return wxT("TB_GETIMAGELIST"); 
4974         case WM_USER
+1000+50: return wxT("TB_LOADIMAGES"); 
4975         case WM_USER
+1000+51: return wxT("TB_GETRECT"); 
4976         case WM_USER
+1000+52: return wxT("TB_SETHOTIMAGELIST"); 
4977         case WM_USER
+1000+53: return wxT("TB_GETHOTIMAGELIST"); 
4978         case WM_USER
+1000+54: return wxT("TB_SETDISABLEDIMAGELIST"); 
4979         case WM_USER
+1000+55: return wxT("TB_GETDISABLEDIMAGELIST"); 
4980         case WM_USER
+1000+56: return wxT("TB_SETSTYLE"); 
4981         case WM_USER
+1000+57: return wxT("TB_GETSTYLE"); 
4982         case WM_USER
+1000+58: return wxT("TB_GETBUTTONSIZE"); 
4983         case WM_USER
+1000+59: return wxT("TB_SETBUTTONWIDTH"); 
4984         case WM_USER
+1000+60: return wxT("TB_SETMAXTEXTROWS"); 
4985         case WM_USER
+1000+61: return wxT("TB_GETTEXTROWS"); 
4986         case WM_USER
+1000+41: return wxT("TB_GETBITMAPFLAGS"); 
4989     static wxString s_szBuf
; 
4990     s_szBuf
.Printf(wxT("<unknown message = %d>"), nMessage
); 
4991     return s_szBuf
.c_str(); 
4993 } // end of wxGetMessageName 
4995 #endif // __WXDEBUG__ 
4999 static void TranslateKbdEventToMouse( 
5007     // Construct the key mask 
5008     ULONG
&                          fwKeys 
= *pFlags
; 
5010     fwKeys 
= VK_BUTTON2
; 
5011     if ((::WinGetKeyState(HWND_DESKTOP
, VK_CTRL
) & 0x100) != 0) 
5013     if ((::WinGetKeyState(HWND_DESKTOP
, VK_SHIFT
) & 0x100) != 0) 
5017     // Simulate right mouse button click 
5021     ::WinQueryMsgPos(vHabmain
, &vPoint
); 
5025     pWin
->ScreenToClient(pX
, pY
); 
5026 } // end of TranslateKbdEventToMouse 
5029 // Find the wxWindow at the current mouse position, returning the mouse 
5031 wxWindow
* wxFindWindowAtPointer(wxPoint
& WXUNUSED(rPt
)) 
5033     return wxFindWindowAtPoint(wxGetMousePosition()); 
5036 wxWindow
* wxFindWindowAtPoint(const wxPoint
& rPt
) 
5043     HWND      hWndHit 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt2
, FALSE
); 
5044     wxWindow
* pWin 
= wxFindWinFromHandle((WXHWND
)hWndHit
) ; 
5045     HWND      hWnd 
= hWndHit
; 
5048     // Try to find a window with a wxWindow associated with it 
5050     while (!pWin 
&& (hWnd 
!= 0)) 
5052         hWnd 
= ::WinQueryWindow(hWnd
, QW_PARENT
); 
5053         pWin 
= wxFindWinFromHandle((WXHWND
)hWnd
) ; 
5058 // Get the current mouse position. 
5059 wxPoint 
wxGetMousePosition() 
5063     ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
); 
5064     return wxPoint(vPt
.x
, vPt
.y
); 
5067 wxMouseState 
wxGetMouseState() 
5070     wxPoint pt 
= wxGetMousePosition(); 
5073     ms
.SetLeftDown(IsKeyDown(VK_BUTTON1
)); 
5074     ms
.SetMiddleDown(IsKeyDown(VK_BUTTON3
)); 
5075     ms
.SetRightDown(IsKeyDown(VK_BUTTON2
)); 
5076     ms
.SetControlDown(IsCtrlDown()); 
5077     ms
.SetShiftDown(IsShiftDown()); 
5078     ms
.SetAltDown(IsKeyDown(VK_ALT
)|IsKeyDown(VK_ALTGRAF
)); 
5079     ms
.SetMetaDown(IsKeyDown(VK_ALTGRAF
)); 
5084 wxWindowOS2
* FindWindowForMouseEvent( wxWindow
* pWin
, 
5085                                       short*    WXUNUSED(pnX
), 
5086                                       short*    WXUNUSED(pnY
) ) 
5088     HWND   hWnd 
= GetHwndOf(pWin
); 
5089     HWND   hWndUnderMouse
; 
5091     BOOL   rcEnabled 
= FALSE
; 
5092     BOOL   rcVisible 
= FALSE
; 
5094     ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
5095     hWndUnderMouse 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, TRUE
); 
5096     if (hWndUnderMouse 
!= HWND_DESKTOP
) 
5098         wxWindow
*                   pWinUnderMouse 
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
); 
5102             wxWindowList::compatibility_iterator current 
= pWinUnderMouse
->GetChildren().GetFirst(); 
5103             wxWindow
*               pGrandChild 
= NULL
; 
5107             ::WinMapWindowPoints(HWND_DESKTOP
, hWndUnderMouse
, &vPoint
, 1); 
5109             // Find a child window mouse might be under 
5113                 wxWindow
*                   pChild 
= current
->GetData(); 
5115                 vPoint2
.x 
= vPoint
.x
; 
5116                 vPoint2
.y 
= vPoint
.y
; 
5117                 ::WinMapWindowPoints(hWndUnderMouse
, pChild
->GetHWND(), &vPoint2
, 1); 
5118                 ::WinQueryWindowRect(pChild
->GetHWND(), &vRect
); 
5119                 if (::WinPtInRect(vHabmain
, &vRect
, &vPoint2
)) 
5121                     if (pChild
->IsTopLevel()) 
5124                         wxWindowList::compatibility_iterator current2 
=pChild
->GetChildren().GetFirst(); 
5128                             wxWindow
*           pGrandChild 
= current2
->GetData(); 
5130                             vPoint3
.x 
= vPoint2
.x
; 
5131                             vPoint3
.y 
= vPoint2
.y
; 
5132                             ::WinMapWindowPoints( pChild
->GetHWND() 
5133                                                  ,pGrandChild
->GetHWND() 
5137                             ::WinQueryWindowRect(pGrandChild
->GetHWND(), &vRect
); 
5138                             if (::WinPtInRect(vHabmain
, &vRect
, &vPoint3
)) 
5140                                 hWndUnderMouse 
= GetHwndOf(pGrandChild
); 
5141                                 pWinUnderMouse 
= pGrandChild
; 
5144                             current2 
= current2
->GetNext(); 
5149                     hWndUnderMouse 
= GetHwndOf(pChild
); 
5150                     pWinUnderMouse 
= pChild
; 
5151                     rcVisible 
= ::WinIsWindowVisible(hWndUnderMouse
); 
5152                     rcEnabled 
= ::WinIsWindowEnabled(hWndUnderMouse
); 
5153                     if (rcVisible 
&& rcEnabled
) 
5156                 current 
= current
->GetNext(); 
5160     rcVisible 
= ::WinIsWindowVisible(hWndUnderMouse
); 
5161     rcEnabled 
= ::WinIsWindowEnabled(hWndUnderMouse
); 
5165     // Check that we have a child window which is susceptible to receive mouse 
5166     // events: for this it must be shown and enabled 
5168     if ( hWndUnderMouse 
&& 
5169          hWndUnderMouse 
!= hWnd 
&& 
5170          rcVisible 
&& rcEnabled
) 
5172         wxWindow
*                       pWinUnderMouse 
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
); 
5177             // Translate the mouse coords to the other window coords 
5179             pWin 
= pWinUnderMouse
; 
5183 } // end of FindWindowForMouseEvent