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" 
  21     #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" 
  51     #include "wx/ownerdrw.h" 
  54 #if     wxUSE_DRAG_AND_DROP 
  58 #include "wx/menuitem.h" 
  61 #include "wx/os2/private.h" 
  64     #include "wx/tooltip.h" 
  68     #include "wx/notebook.h" 
  79 #include "wx/textctrl.h" 
  84 // Place compiler, OS specific includes here 
  88 // Standard macros -- these are for OS/2 PM, but most GUI's have something similar 
  92 //  SHORT1FROMMP -- LOWORD 
  94     #define GET_X_LPARAM(mp) ((unsigned short)(unsigned long)(mp)) 
  96 //  SHORT2FROMMP -- HIWORD 
  98     #define GET_Y_LPARAM(mp) ((unsigned short)(unsigned long)(mp >> 16)) 
  99 #endif // GET_X_LPARAM 
 101 #ifndef CW_USEDEFAULT 
 102 #  define CW_USEDEFAULT    ((int)0x80000000) 
 106     #define VK_OEM_1        0xBA 
 107     #define VK_OEM_PLUS     0xBB 
 108     #define VK_OEM_COMMA    0xBC 
 109     #define VK_OEM_MINUS    0xBD 
 110     #define VK_OEM_PERIOD   0xBE 
 111     #define VK_OEM_2        0xBF 
 112     #define VK_OEM_3        0xC0 
 113     #define VK_OEM_4        0xDB 
 114     #define VK_OEM_5        0xDC 
 115     #define VK_OEM_6        0xDD 
 116     #define VK_OEM_7        0xDE 
 119 // --------------------------------------------------------------------------- 
 121 // --------------------------------------------------------------------------- 
 124 // The last PM message we got (MT-UNSAFE) 
 128 #if wxUSE_MENUS_NATIVE 
 129 wxMenu
*                   wxCurrentPopupMenu 
= NULL
; 
 130 #endif // wxUSE_MENUS_NATIVE 
 132 // --------------------------------------------------------------------------- 
 134 // --------------------------------------------------------------------------- 
 137 // the window proc for all our windows; most gui's have something similar 
 139 MRESULT EXPENTRY 
wxWndProc( HWND hWnd
 
 146     const wxChar 
*wxGetMessageName(int message
); 
 149 wxWindowOS2
* FindWindowForMouseEvent( wxWindow
* pWin
 
 153 void         wxRemoveHandleAssociation(wxWindowOS2
* pWin
); 
 154 void         wxAssociateWinWithHandle( HWND         hWnd
 
 157 wxWindow
* wxFindWinFromHandle(WXHWND hWnd
); 
 160 // get the current state of SHIFT/CTRL keys 
 162 static inline bool IsShiftDown() { return (::WinGetKeyState(HWND_DESKTOP
, VK_SHIFT
) & 0x8000) != 0; } 
 163 static inline bool IsCtrlDown() { return (::WinGetKeyState(HWND_DESKTOP
, VK_CTRL
) & 0x8000) != 0; } 
 165 static wxWindow
*                    gpWinBeingCreated 
= NULL
; 
 167 // --------------------------------------------------------------------------- 
 169 // --------------------------------------------------------------------------- 
 171 // in wxUniv-OS/2 this class is abstract because it doesn't have DoPopupMenu() 
 173 #ifdef __WXUNIVERSAL__ 
 174     IMPLEMENT_ABSTRACT_CLASS(wxWindowOS2
, wxWindowBase
) 
 176     IMPLEMENT_DYNAMIC_CLASS(wxWindow
, wxWindowBase
) 
 177 #endif // __WXUNIVERSAL__/__WXPM__ 
 179 BEGIN_EVENT_TABLE(wxWindowOS2
, wxWindowBase
) 
 180     EVT_ERASE_BACKGROUND(wxWindowOS2::OnEraseBackground
) 
 181     EVT_SYS_COLOUR_CHANGED(wxWindowOS2::OnSysColourChanged
) 
 182     EVT_IDLE(wxWindowOS2::OnIdle
) 
 183     EVT_SET_FOCUS(wxWindowOS2::OnSetFocus
) 
 186 // =========================================================================== 
 188 // =========================================================================== 
 190 // --------------------------------------------------------------------------- 
 191 // wxWindow utility functions 
 192 // --------------------------------------------------------------------------- 
 195 // Find an item given the PM Window id 
 197 wxWindow
* wxWindowOS2::FindItem( 
 202     wxControl
*                      pItem 
= wxDynamicCast(this, wxControl
); 
 207         // I it we or one of our "internal" children? 
 209         if (pItem
->GetId() == lId
 
 210 #ifndef __WXUNIVERSAL__ 
 211             || (pItem
->GetSubcontrols().Index(lId
) != wxNOT_FOUND
) 
 218 #endif // wxUSE_CONTROLS 
 220     wxWindowList::compatibility_iterator  current 
= GetChildren().GetFirst(); 
 224         wxWindow
*                   pChildWin 
= current
->GetData(); 
 225         wxWindow
*                   pWnd 
= pChildWin
->FindItem(lId
); 
 230         current 
= current
->GetNext(); 
 233 } // end of wxWindowOS2::FindItem 
 236 // Find an item given the PM Window handle 
 238 wxWindow
* wxWindowOS2::FindItemByHWND( 
 243     wxWindowList::compatibility_iterator current 
= GetChildren().GetFirst(); 
 247         wxWindow
*                   pParent 
= current
->GetData(); 
 250         // Do a recursive search. 
 252         wxWindow
*                   pWnd 
= pParent
->FindItemByHWND(hWnd
); 
 259             || pParent
->IsKindOf(CLASSINFO(wxControl
)) 
 260 #endif // wxUSE_CONTROLS 
 263             wxWindow
*               pItem 
= current
->GetData(); 
 265             if (pItem
->GetHWND() == hWnd
) 
 269                 if (pItem
->ContainsHWND(hWnd
)) 
 273         current 
= current
->GetNext(); 
 276 } // end of wxWindowOS2::FindItemByHWND 
 279 // Default command handler 
 281 bool wxWindowOS2::OS2Command( WXUINT 
WXUNUSED(uParam
), 
 282                               WXWORD 
WXUNUSED(uId
) ) 
 287 // ---------------------------------------------------------------------------- 
 288 // constructors and such 
 289 // ---------------------------------------------------------------------------- 
 291 void wxWindowOS2::Init() 
 296     m_bWinCaptured 
= false; 
 298     m_fnOldWndProc          
= NULL
; 
 300     m_bMouseInWindow        
= false; 
 301     m_bLastKeydownProcessed 
= false; 
 302     m_pChildrenDisabled     
= NULL
; 
 309     m_hWndScrollBarHorz 
= 0L; 
 310     m_hWndScrollBarVert 
= 0L; 
 312     memset(&m_vWinSwp
, '\0', sizeof (SWP
)); 
 315     // Pass WM_GETDLGCODE to DefWindowProc() 
 321     m_bBackgroundTransparent 
= false; 
 324     // As all windows are created with WS_VISIBLE style... 
 328 #if wxUSE_MOUSEEVENT_HACK 
 331     m_nLastMouseEvent 
= -1; 
 332 #endif // wxUSE_MOUSEEVENT_HACK 
 333 } // wxWindowOS2::Init 
 338 wxWindowOS2::~wxWindowOS2() 
 340     m_isBeingDeleted 
= true; 
 342     for (wxWindow
* pWin 
= GetParent(); pWin
; pWin 
= pWin
->GetParent()) 
 344         wxTopLevelWindow
*           pFrame 
= wxDynamicCast(pWin
, wxTopLevelWindow
); 
 348             if (pFrame
->GetLastFocus() == this) 
 349                 pFrame
->SetLastFocus(NULL
); 
 357         if(!::WinDestroyWindow(GetHWND())) 
 358             wxLogLastError(wxT("DestroyWindow")); 
 360         // remove hWnd <-> wxWindow association 
 362         wxRemoveHandleAssociation(this); 
 364     delete m_pChildrenDisabled
; 
 365 } // end of wxWindowOS2::~wxWindowOS2 
 367 // real construction (Init() must have been called before!) 
 368 bool wxWindowOS2::Create( wxWindow
*       pParent
, 
 373                           const wxString
& rName 
) 
 375     HWND hParent 
= NULLHANDLE
; 
 376     ULONG ulCreateFlags 
= 0; 
 377     WXDWORD dwExStyle 
= 0; 
 379     wxCHECK_MSG(pParent
, false, wxT("can't create wxWindow without parent")); 
 383     // wxGTK doesn't allow to create controls with static box as the parent so 
 384     // this will result in a crash when the program is ported to wxGTK - warn 
 387     // the correct solution is to create the controls as siblings of the 
 390     wxASSERT_MSG( !wxDynamicCast(pParent
, wxStaticBox
), 
 391                   _T("wxStaticBox can't be used as a window parent!") ); 
 392 #endif // wxUSE_STATBOX 
 394      // Ensure groupbox backgrounds are painted 
 395      if (IsKindOf(CLASSINFO(wxPanel
))) 
 396          lStyle 
&= ~wxCLIP_CHILDREN
; 
 398     if ( !CreateBase( pParent
 
 410         pParent
->AddChild(this); 
 411         hParent 
= GetWinHwnd(pParent
); 
 413         if (pParent
->IsKindOf(CLASSINFO(wxScrolledWindow
))) 
 414             ulCreateFlags 
|= WS_CLIPSIBLINGS
; 
 418     // Most wxSTYLES are really PM Class specific styles and will be 
 419     // set in those class create procs.  PM's basic windows styles are 
 422     ulCreateFlags 
|=  OS2GetCreateWindowFlags(&dwExStyle
); 
 425 #ifdef __WXUNIVERSAL__ 
 426     // no 3d effects, we draw them ourselves 
 428 #endif // !wxUniversal 
 429     if (lStyle 
& wxPOPUP_WINDOW
) 
 431         ulCreateFlags 
&= ~WS_VISIBLE
; 
 436         ulCreateFlags 
|= WS_VISIBLE
; 
 440     // Generic OS/2 Windows have no Control Data but other classes 
 441     // that call OS2Create may have some. 
 443     return(OS2Create( (PSZ
)wxCanvasClassName
 
 448                      ,NULL         
// Control Data 
 452 } // end of wxWindowOS2::Create 
 454 // --------------------------------------------------------------------------- 
 456 // --------------------------------------------------------------------------- 
 458 void wxWindowOS2::SetFocus() 
 460     HWND                            hWnd 
= GetHwnd(); 
 461     wxCHECK_RET( hWnd
, _T("can't set focus to invalid window") ); 
 464         ::WinSetFocus(HWND_DESKTOP
, hWnd
); 
 465 } // end of wxWindowOS2::SetFocus 
 467 void wxWindowOS2::SetFocusFromKbd() 
 470     // Nothing else to do under OS/2 
 472     wxWindowBase::SetFocusFromKbd(); 
 473 } // end of wxWindowOS2::SetFocus 
 475 wxWindow
* wxWindowBase::DoFindFocus() 
 477     HWND                            hWnd 
= ::WinQueryFocus(HWND_DESKTOP
); 
 481         return wxFindWinFromHandle((WXHWND
)hWnd
); 
 484 } // wxWindowBase::DoFindFocus 
 486 bool wxWindowOS2::Enable( bool bEnable 
) 
 488     if (!wxWindowBase::Enable(bEnable
)) 
 491     HWND                            hWnd 
= GetHwnd(); 
 494         ::WinEnableWindow(hWnd
, (BOOL
)bEnable
); 
 497     // The logic below doesn't apply to the top level windows -- otherwise 
 498     // showing a modal dialog would result in total greying out (and ungreying 
 499     // out later) of everything which would be really ugly 
 504     wxWindowList::compatibility_iterator     node 
= GetChildren().GetFirst(); 
 508         wxWindow
*                   pChild 
= node
->GetData(); 
 513             // Enable the child back unless it had been disabled before us 
 515             if (!m_pChildrenDisabled 
|| !m_pChildrenDisabled
->Find(pChild
)) 
 518         else // we're being disabled 
 520             if (pChild
->IsEnabled()) 
 523                 // Disable it as children shouldn't stay enabled while the 
 528             else // child already disabled, remember it 
 531                 // Have we created the list of disabled children already? 
 533                 if (!m_pChildrenDisabled
) 
 534                     m_pChildrenDisabled 
= new wxWindowList
; 
 535                 m_pChildrenDisabled
->Append(pChild
); 
 538         node 
= node
->GetNext(); 
 540     if (bEnable 
&& m_pChildrenDisabled
) 
 543         // We don't need this list any more, don't keep unused memory 
 545         delete m_pChildrenDisabled
; 
 546         m_pChildrenDisabled 
= NULL
; 
 549 } // end of wxWindowOS2::Enable 
 551 bool wxWindowOS2::Show( bool bShow 
) 
 553     if (!wxWindowBase::Show(bShow
)) 
 556     HWND                            hWnd 
= GetHwnd(); 
 558     ::WinShowWindow(hWnd
, bShow
); 
 562         ::WinSetWindowPos(hWnd
, HWND_TOP
, 0, 0, 0, 0, SWP_ACTIVATE 
| SWP_ZORDER
); 
 565 } // end of wxWindowOS2::Show 
 567 void wxWindowOS2::Raise() 
 569     ::WinSetWindowPos(GetHwnd(), HWND_TOP
, 0, 0, 0, 0, SWP_ZORDER 
| SWP_ACTIVATE
); 
 570 } // end of wxWindowOS2::Raise 
 572 void wxWindowOS2::Lower() 
 574     ::WinSetWindowPos(GetHwnd(), HWND_BOTTOM
, 0, 0, 0, 0, SWP_ZORDER 
| SWP_DEACTIVATE
); 
 575 } // end of wxWindowOS2::Lower 
 577 void wxWindowOS2::SetLabel( const wxString
& label 
) 
 579     ::WinSetWindowText(GetHwnd(), (PSZ
)label
.c_str()); 
 580 } // end of wxWindowOS2::SetLabel 
 582 wxString 
wxWindowOS2::GetLabel() const 
 584     return wxGetWindowText(GetHWND()); 
 585 } // end of wxWindowOS2::GetLabel 
 587 void wxWindowOS2::DoCaptureMouse() 
 589     HWND hWnd 
= GetHwnd(); 
 591     if (hWnd 
&& !m_bWinCaptured
) 
 593         ::WinSetCapture(HWND_DESKTOP
, hWnd
); 
 594         m_bWinCaptured 
= true; 
 596 } // end of wxWindowOS2::DoCaptureMouse 
 598 void wxWindowOS2::DoReleaseMouse() 
 602         ::WinSetCapture(HWND_DESKTOP
, NULLHANDLE
); 
 603         m_bWinCaptured 
= false; 
 605 } // end of wxWindowOS2::ReleaseMouse 
 607 /* static */ wxWindow
* wxWindowBase::GetCapture() 
 609     HWND hwnd 
= ::WinQueryCapture(HWND_DESKTOP
); 
 610     return hwnd 
? wxFindWinFromHandle((WXHWND
)hwnd
) : (wxWindow 
*)NULL
; 
 611 } // end of wxWindowBase::GetCapture 
 613 bool wxWindowOS2::SetFont( const wxFont
& rFont 
) 
 615     if (!wxWindowBase::SetFont(rFont
)) 
 621     HWND hWnd 
= GetHwnd(); 
 623     wxOS2SetFont( hWnd
, rFont 
); 
 625 } // end of wxWindowOS2::SetFont 
 627 // check if base implementation is OK 
 628 bool wxWindowOS2::SetCursor( const wxCursor
& rCursor
) 
 630     if ( !wxWindowBase::SetCursor(rCursor
)) 
 636     if ( m_cursor
.Ok() ) { 
 637         HWND                            hWnd 
= GetHwnd(); 
 641         ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
 642         ::WinQueryWindowRect(hWnd
, &vRect
); 
 644         if (::WinPtInRect(vHabmain
, &vRect
, &vPoint
) && !wxIsBusy()) 
 646             ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)m_cursor
.GetHCURSOR()); 
 650 } // end of wxWindowOS2::SetCursor 
 652 void wxWindowOS2::WarpPointer( 
 661     ::WinQueryWindowRect(GetHwnd(), &vRect
); 
 665     ::WinSetPointerPos(HWND_DESKTOP
, (LONG
)nX
, (LONG
)(nY
)); 
 666 } // end of wxWindowOS2::WarpPointer 
 669 // --------------------------------------------------------------------------- 
 671 // --------------------------------------------------------------------------- 
 673 int  wxWindowOS2::GetScrollPos( 
 677     if (nOrient 
== wxHORIZONTAL
) 
 678         return((int)::WinSendMsg(m_hWndScrollBarHorz
, SBM_QUERYPOS
, (MPARAM
)NULL
, (MPARAM
)NULL
)); 
 680         return((int)::WinSendMsg(m_hWndScrollBarVert
, SBM_QUERYPOS
, (MPARAM
)NULL
, (MPARAM
)NULL
)); 
 681 } // end of wxWindowOS2::GetScrollPos 
 683 int wxWindowOS2::GetScrollRange( 
 689     if (nOrient 
== wxHORIZONTAL
) 
 690         mr 
= ::WinSendMsg(m_hWndScrollBarHorz
, SBM_QUERYRANGE
, (MPARAM
)NULL
, (MPARAM
)NULL
); 
 692         mr 
= ::WinSendMsg(m_hWndScrollBarVert
, SBM_QUERYRANGE
, (MPARAM
)NULL
, (MPARAM
)NULL
); 
 693     return((int)SHORT2FROMMR(mr
)); 
 694 } // end of wxWindowOS2::GetScrollRange 
 696 int wxWindowOS2::GetScrollThumb( 
 700     if (nOrient 
== wxHORIZONTAL 
) 
 701         return m_nXThumbSize
; 
 703         return m_nYThumbSize
; 
 704 } // end of wxWindowOS2::GetScrollThumb 
 706 void wxWindowOS2::SetScrollPos( 
 709 , bool                              WXUNUSED(bRefresh
) 
 712     if (nOrient 
== wxHORIZONTAL 
) 
 713         ::WinSendMsg(m_hWndScrollBarHorz
, SBM_SETPOS
, (MPARAM
)nPos
, (MPARAM
)NULL
); 
 715         ::WinSendMsg(m_hWndScrollBarVert
, SBM_SETPOS
, (MPARAM
)nPos
, (MPARAM
)NULL
); 
 716 } // end of wxWindowOS2::SetScrollPos 
 718 void wxWindowOS2::SetScrollbar( int  nOrient
, 
 722                                 bool WXUNUSED(bRefresh
) ) 
 724     HWND                            hWnd 
= GetHwnd(); 
 725     int                             nOldRange 
= nRange 
- nThumbVisible
; 
 726     int                             nRange1 
= nOldRange
; 
 727     int                             nPageSize 
= nThumbVisible
; 
 728     int         nVSBWidth  
= wxSystemSettingsNative::GetMetric(wxSYS_VSCROLL_X
, 
 730     int         nHSBHeight 
= wxSystemSettingsNative::GetMetric(wxSYS_HSCROLL_Y
, 
 734     ULONG                           ulStyle 
= WS_VISIBLE 
| WS_SYNCPAINT
; 
 739     wxWindow
*                       pParent 
= GetParent(); 
 741     if (pParent 
&& pParent
->IsKindOf(CLASSINFO(wxFrame
))) 
 745         pFrame 
= wxDynamicCast(pParent
, wxFrame
); 
 746         hWndParent 
= pFrame
->GetFrame(); 
 747         hWndClient 
= GetHwndOf(pParent
); 
 752             hWndParent 
= GetHwndOf(pParent
); 
 754             hWndParent 
= GetHwnd(); 
 755         hWndClient 
= hWndParent
; 
 757     ::WinQueryWindowPos(hWndClient
, &vSwp
); 
 758     ::WinQueryWindowPos(hWnd
, &vSwpOwner
); 
 760     if (nPageSize 
> 1 && nRange 
> 0) 
 762         nRange1 
+= (nPageSize 
- 1); 
 765     vInfo
.cb 
= sizeof(SBCDATA
); 
 767     vInfo
.posLast 
= (SHORT
)nRange1
; 
 768     vInfo
.posThumb 
= (SHORT
)nPos
; 
 770     if (nOrient 
== wxHORIZONTAL 
) 
 773         if (m_hWndScrollBarHorz 
== 0L) 
 776             // Since the scrollbars are usually created before the owner is 
 777             // sized either via an OnSize event directly or via sizers or 
 778             // layout constraints, we will initially just use the coords of 
 779             // the parent window (this is usually a frame client window). But 
 780             // the bars themselves, are children of the parent frame (i.e 
 781             // siblings of the frame client.  The owner, however is the actual 
 782             // window being scrolled (or at least the one responsible for 
 783             // handling the scroll events). The owner will be resized later, 
 784             // as it is usually a child of a top level window, and when that 
 785             // is done its scrollbars will be resized and repositioned as well. 
 787             m_hWndScrollBarHorz 
= ::WinCreateWindow( hWndParent
 
 805             // The owner (the scrolled window) is a child of the Frame's 
 806             // client window, usually.  The scrollbars are children of the 
 807             // frame, itself, and thus are positioned relative to the frame's 
 808             // origin, not the frame's client window origin. 
 809             // The starting x position is the same as the starting x position 
 810             // of the owner, but in terms of the parent frame. 
 811             // The starting y position is wxSYS_HSCROLL_Y pels below the 
 812             // origin of the owner in terms of the parent frame. 
 813             // The horz bar is the same width as the owner and wxSYS_HSCROLL_Y 
 816             if (nRange1 
>= nThumbVisible
) 
 818                 ::WinSetWindowPos( m_hWndScrollBarHorz
 
 820                                   ,vSwp
.x 
+ vSwpOwner
.x
 
 821                                   ,(vSwp
.y 
+ vSwpOwner
.y
) - nHSBHeight
 
 824                                   ,SWP_MOVE 
| SWP_SIZE 
| SWP_SHOW 
| SWP_ACTIVATE 
| SWP_ZORDER
 
 826                 ::WinSendMsg( m_hWndScrollBarHorz
 
 829                              ,MPFROM2SHORT(0, (SHORT
)nRange1
) 
 831                 ::WinSendMsg( m_hWndScrollBarHorz
 
 833                              ,MPFROM2SHORT( (SHORT
)nThumbVisible
 
 840                 ::WinShowWindow(m_hWndScrollBarHorz
, FALSE
); 
 846         if (m_hWndScrollBarVert 
== 0L) 
 849             // Since the scrollbars are usually created before the owner is 
 850             // sized either via an OnSize event directly or via sizers or 
 851             // layout constraints, we will initially just use the coords of 
 852             // the parent window (this is usually a frame client window). But 
 853             // the bars themselves, are children of the parent frame (i.e 
 854             // siblings of the frame client.  The owner, however is the actual 
 855             // window being scrolled (or at least the one responsible for 
 856             // handling the scroll events). The owner will be resized later, 
 857             // as it is usually a child of a top level window, and when that 
 858             // is done its scrollbars will be resized and repositioned as well. 
 860             m_hWndScrollBarVert 
= ::WinCreateWindow( hWndParent
 
 864                                                     ,vSwp
.x 
+ vSwp
.cx 
- nVSBWidth
 
 867                                                     ,vSwp
.cy 
- nHSBHeight
 
 878             // The owner (the scrolled window) is a child of the Frame's 
 879             // client window, usually.  The scrollbars are children of the 
 880             // frame, itself and thus are positioned relative to the frame's 
 881             // origin, not the frame's client window's origin. 
 882             // Thus, the x position will be frame client's x (usually a few 
 883             // pels inside the parent frame, plus the width of the owner. 
 884             // Since we may be using sizers or layout constraints for multiple 
 885             // child scrolled windows, the y position will be the frame client's 
 886             // y pos plus the scrolled windows y position, yielding the y 
 887             // position of the scrollbar relative to the parent frame (the vert 
 888             // scrollbar is on the right and starts at the bottom of the 
 890             // It is wxSYS_VSCROLL_X pels wide and the same height as the owner. 
 892             if (nRange1 
>= nThumbVisible
) 
 894                 ::WinSetWindowPos( m_hWndScrollBarVert
 
 896                                   ,vSwp
.x 
+ vSwpOwner
.x 
+ vSwpOwner
.cx
 
 897                                   ,vSwp
.y 
+ vSwpOwner
.y
 
 900                                   ,SWP_ACTIVATE 
| SWP_MOVE 
| SWP_SIZE 
| SWP_SHOW
 
 902                 ::WinSendMsg( m_hWndScrollBarVert
 
 905                              ,MPFROM2SHORT(0, (SHORT
)nRange1
) 
 907                 ::WinSendMsg( m_hWndScrollBarVert
 
 909                              ,MPFROM2SHORT( (SHORT
)nThumbVisible
 
 916                 ::WinShowWindow(m_hWndScrollBarVert
, FALSE
); 
 918         m_nYThumbSize 
= nThumbVisible
; 
 920 } // end of wxWindowOS2::SetScrollbar 
 923 void wxWindowOS2::ScrollWindow( int nDx
, 
 925                                 const wxRect
* pRect 
) 
 929     ::WinQueryWindowRect(GetHwnd(), &vRect
); 
 930     int height 
= vRect
.yTop
; 
 933         vRect
.xLeft   
= pRect
->x
; 
 934         vRect
.yTop    
= height 
- pRect
->y
; 
 935         vRect
.xRight  
= pRect
->x 
+ pRect
->width
; 
 936         vRect
.yBottom 
= vRect
.yTop 
- pRect
->height
; 
 938     nDy 
*= -1; // flip the sign of Dy as OS/2 is opposite Windows. 
 939     ::WinScrollWindow( GetHwnd() 
 946                       ,SW_SCROLLCHILDREN 
| SW_INVALIDATERGN
 
 948 } // end of wxWindowOS2::ScrollWindow 
 950 // --------------------------------------------------------------------------- 
 952 // --------------------------------------------------------------------------- 
 954 void wxWindowOS2::SubclassWin( 
 958     HWND                            hwnd 
= (HWND
)hWnd
; 
 960     wxCHECK_RET(::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in SubclassWin") ); 
 961     wxAssociateWinWithHandle( hWnd
 
 964     if (!wxCheckWindowWndProc( hWnd
 
 965                               ,(WXFARPROC
)wxWndProc
 
 968         m_fnOldWndProc 
= (WXFARPROC
) ::WinSubclassWindow(hwnd
, (PFNWP
)wxWndProc
); 
 972         m_fnOldWndProc 
= (WXFARPROC
)NULL
; 
 974 } // end of wxWindowOS2::SubclassWin 
 976 void wxWindowOS2::UnsubclassWin() 
 979     // Restore old Window proc 
 981     HWND                            hwnd 
= GetHWND(); 
 985         wxCHECK_RET( ::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in UnsubclassWin") ); 
 987         PFNWP                       fnProc 
= (PFNWP
)::WinQueryWindowPtr(hwnd
, QWP_PFNWP
); 
 989         if ( (m_fnOldWndProc 
!= 0) && (fnProc 
!= (PFNWP
) m_fnOldWndProc
)) 
 991             WinSubclassWindow(hwnd
, (PFNWP
)m_fnOldWndProc
); 
 995 } // end of wxWindowOS2::UnsubclassWin 
 997 bool wxCheckWindowWndProc( 
 999 , WXFARPROC                         fnWndProc
 
1002     static char                     zBuffer
[512]; 
1005     ::WinQueryClassName((HWND
)hWnd
, (LONG
)512, (PCH
)zBuffer
); 
1006     ::WinQueryClassInfo(wxGetInstance(), (PSZ
)zBuffer
, &vCls
); 
1007     return(fnWndProc 
== (WXFARPROC
)vCls
.pfnWindowProc
); 
1008 } // end of WinGuiBase_CheckWindowWndProc 
1010 void wxWindowOS2::SetWindowStyleFlag( 
1014     long                            lFlagsOld 
= GetWindowStyleFlag(); 
1016     if (lFlags 
== lFlagsOld
) 
1020     // Update the internal variable 
1022     wxWindowBase::SetWindowStyleFlag(lFlags
); 
1025     // Now update the Windows style as well if needed - and if the window had 
1026     // been already created 
1032     WXDWORD                         dwExstyleOld
; 
1033     long                            lStyle 
= OS2GetStyle( lFlags
 
1036     long                            lStyleOld 
= OS2GetStyle( lFlagsOld
 
1040     if (lStyle 
!= lStyleOld
) 
1043         // Some flags (e.g. WS_VISIBLE or WS_DISABLED) should not be changed by 
1044         // this function so instead of simply setting the style to the new 
1045         // value we clear the bits which were set in styleOld but are set in 
1046         // the new one and set the ones which were not set before 
1048         long                        lStyleReal 
= ::WinQueryWindowULong(GetHwnd(), QWL_STYLE
); 
1050         lStyleReal 
&= ~lStyleOld
; 
1051         lStyleReal 
|= lStyle
; 
1053         ::WinSetWindowULong(GetHwnd(), QWL_STYLE
, lStyleReal
); 
1055 } // end of wxWindowOS2::SetWindowStyleFlag 
1057 WXDWORD 
wxWindowOS2::OS2GetStyle( long     lFlags
, 
1058                                   WXDWORD
* WXUNUSED(pdwExstyle
) ) const 
1060     WXDWORD                         dwStyle 
= 0L; 
1062     if (lFlags 
& wxCLIP_CHILDREN 
) 
1063         dwStyle 
|= WS_CLIPCHILDREN
; 
1065     if (lFlags 
& wxCLIP_SIBLINGS 
) 
1066         dwStyle 
|= WS_CLIPSIBLINGS
; 
1069 } // end of wxWindowOS2::OS2GetStyle 
1072 // Make a Windows extended style from the given wxWidgets window style 
1074 WXDWORD 
wxWindowOS2::MakeExtendedStyle( 
1076 , bool                              bEliminateBorders
 
1080    // Simply fill out with wxWindow extended styles.  We'll conjure 
1081    // something up in OS2Create and all window redrawing pieces later 
1083     WXDWORD                         dwStyle 
= 0; 
1085     if (lStyle 
& wxTRANSPARENT_WINDOW 
) 
1086         dwStyle 
|= wxTRANSPARENT_WINDOW
; 
1088     if (!bEliminateBorders
) 
1090         if (lStyle 
& wxSUNKEN_BORDER
) 
1091             dwStyle 
|= wxSUNKEN_BORDER
; 
1092         if (lStyle 
& wxDOUBLE_BORDER
) 
1093             dwStyle 
|= wxDOUBLE_BORDER
; 
1094         if (lStyle 
& wxRAISED_BORDER 
) 
1095             dwStyle 
|= wxRAISED_BORDER
; 
1096         if (lStyle 
& wxSTATIC_BORDER
) 
1097             dwStyle 
|= wxSTATIC_BORDER
; 
1100 } // end of wxWindowOS2::MakeExtendedStyle 
1103 // Setup background and foreground colours correctly 
1105 void wxWindowOS2::SetupColours() 
1108         SetBackgroundColour(GetParent()->GetBackgroundColour()); 
1109 } // end of wxWindowOS2::SetupColours 
1111 void wxWindowOS2::OnIdle( 
1112   wxIdleEvent
&                      WXUNUSED(rEvent
) 
1116     // Check if we need to send a LEAVE event 
1118     if (m_bMouseInWindow
) 
1122         ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
1123         if (::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, FALSE
) != (HWND
)GetHwnd()) 
1126             // Generate a LEAVE event 
1128             m_bMouseInWindow 
= false; 
1131             // Unfortunately the mouse button and keyboard state may have changed 
1132             // by the time the OnIdle function is called, so 'state' may be 
1142             wxMouseEvent            
rEvent(wxEVT_LEAVE_WINDOW
); 
1144             InitMouseEvent( rEvent
 
1149             (void)GetEventHandler()->ProcessEvent(rEvent
); 
1152     if (wxUpdateUIEvent::CanUpdate(this)) 
1153         UpdateWindowUI(wxUPDATE_UI_FROMIDLE
); 
1154 } // end of wxWindowOS2::OnIdle 
1157 // Set this window to be the child of 'parent'. 
1159 bool wxWindowOS2::Reparent( wxWindow
* pParent
) 
1161     if (!wxWindowBase::Reparent(pParent
)) 
1164     HWND hWndChild 
= GetHwnd(); 
1165     HWND hWndParent 
= GetParent() ? GetWinHwnd(GetParent()) : (HWND
)0; 
1167     ::WinSetParent(hWndChild
, hWndParent
, TRUE
); 
1169 } // end of wxWindowOS2::Reparent 
1171 void wxWindowOS2::Update() 
1173     ::WinUpdateWindow(GetHwnd()); 
1174 } // end of wxWindowOS2::Update 
1176 void wxWindowOS2::Freeze() 
1178    ::WinSendMsg(GetHwnd(), WM_VRNDISABLED
, (MPARAM
)0, (MPARAM
)0); 
1179 } // end of wxWindowOS2::Freeze 
1181 void wxWindowOS2::Thaw() 
1183    ::WinSendMsg(GetHwnd(), WM_VRNENABLED
, (MPARAM
)TRUE
, (MPARAM
)0); 
1186     // We need to refresh everything or otherwise he invalidated area is not 
1190 } // end of wxWindowOS2::Thaw 
1192 void wxWindowOS2::Refresh( bool bEraseBack
, 
1193                            const wxRect
* pRect 
) 
1195     HWND hWnd 
= GetHwnd(); 
1204             ::WinQueryWindowRect(GetHwnd(), &vOs2Rect
); 
1205             height 
= vOs2Rect
.yTop
; 
1206             vOs2Rect
.xLeft   
= pRect
->x
; 
1207             vOs2Rect
.yTop    
= height 
- pRect
->y
; 
1208             vOs2Rect
.xRight  
= pRect
->x 
+ pRect
->width
; 
1209             vOs2Rect
.yBottom 
= vOs2Rect
.yTop 
- pRect
->height
; 
1211             ::WinInvalidateRect(hWnd
, &vOs2Rect
, bEraseBack
); 
1214             ::WinInvalidateRect(hWnd
, NULL
, bEraseBack
); 
1215         if (m_hWndScrollBarHorz 
!= NULLHANDLE
) 
1216             ::WinInvalidateRect(m_hWndScrollBarHorz
, NULL
, TRUE
); 
1217         if (m_hWndScrollBarVert 
!= NULLHANDLE
) 
1218             ::WinInvalidateRect(m_hWndScrollBarVert
, NULL
, TRUE
); 
1220 } // end of wxWindowOS2::Refresh 
1222 // --------------------------------------------------------------------------- 
1224 // --------------------------------------------------------------------------- 
1226 #if wxUSE_DRAG_AND_DROP 
1227 void wxWindowOS2::SetDropTarget( 
1228   wxDropTarget
*                     pDropTarget
 
1231     m_dropTarget 
= pDropTarget
; 
1232 } // end of wxWindowOS2::SetDropTarget 
1236 // old style file-manager drag&drop support: we retain the old-style 
1237 // DragAcceptFiles in parallel with SetDropTarget. 
1239 void wxWindowOS2::DragAcceptFiles( 
1243     HWND                            hWnd 
= GetHwnd(); 
1245     if (hWnd 
&& bAccept
) 
1246         ::DrgAcceptDroppedFiles(hWnd
, NULL
, NULL
, DO_COPY
, 0L); 
1247 } // end of wxWindowOS2::DragAcceptFiles 
1249 // ---------------------------------------------------------------------------- 
1251 // ---------------------------------------------------------------------------- 
1255 void wxWindowOS2::DoSetToolTip( 
1259     wxWindowBase::DoSetToolTip(pTooltip
); 
1262         m_tooltip
->SetWindow(this); 
1263 } // end of wxWindowOS2::DoSetToolTip 
1265 #endif // wxUSE_TOOLTIPS 
1267 // --------------------------------------------------------------------------- 
1268 // moving and resizing 
1269 // --------------------------------------------------------------------------- 
1272 void wxWindowOS2::DoGetSize( 
1280     if (IsKindOf(CLASSINFO(wxFrame
))) 
1282         wxFrame
*                    pFrame 
= wxDynamicCast(this, wxFrame
); 
1283         hWnd 
= pFrame
->GetFrame(); 
1288     ::WinQueryWindowRect(hWnd
, &vRect
); 
1291         *pWidth 
= vRect
.xRight 
- vRect
.xLeft
; 
1293         // OS/2 PM is backwards from windows 
1294         *pHeight 
= vRect
.yTop 
- vRect
.yBottom
; 
1295 } // end of wxWindowOS2::DoGetSize 
1297 void wxWindowOS2::DoGetPosition( 
1302     HWND                            hWnd 
= GetHwnd(); 
1305     wxWindow
*                       pParent 
= GetParent(); 
1308     // It would seem that WinQueryWindowRect would be the correlary to 
1309     // the WIN32 WinGetRect, but unlike WinGetRect which returns the window 
1310     // origin position in screen coordinates, WinQueryWindowRect returns it 
1311     // relative to itself, i.e. (0,0).  To get the same under PM we must 
1312     // us WinQueryWindowPos.  This call, unlike the WIN32 call, however, 
1313     // returns a position relative to it's parent, so no parent adujstments 
1314     // are needed under OS/2.  Also, windows should be created using 
1315     // wxWindow coordinates, i.e 0,0 is the TOP left so vSwp will already 
1318     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1324     // We may be faking the client origin. So a window that's really at (0, 
1325     // 30) may appear (to wxWin apps) to be at (0, 0). 
1329         wxPoint                     
vPt(pParent
->GetClientAreaOrigin()); 
1339 } // end of wxWindowOS2::DoGetPosition 
1341 void wxWindowOS2::DoScreenToClient( 
1346     HWND                            hWnd 
= GetHwnd(); 
1349     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1355 } // end of wxWindowOS2::DoScreenToClient 
1357 void wxWindowOS2::DoClientToScreen( 
1362     HWND                            hWnd 
= GetHwnd(); 
1365     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1371 } // end of wxWindowOS2::DoClientToScreen 
1374 // Get size *available for subwindows* i.e. excluding menu bar etc. 
1375 // Must be a frame type window 
1377 void wxWindowOS2::DoGetClientSize( 
1382     HWND                            hWnd 
= GetHwnd(); 
1385    ::WinQueryWindowRect(hWnd
, &vRect
); 
1386     if (IsKindOf(CLASSINFO(wxDialog
))) 
1391         // For a Dialog we have to explicitly request the client portion. 
1392         // For a Frame the hWnd IS the client window 
1394         hWndTitle 
= ::WinWindowFromID(hWnd
, FID_TITLEBAR
); 
1395         if (::WinQueryWindowRect(hWndTitle
, &vTitle
)) 
1397             if (vTitle
.yTop 
- vTitle
.yBottom 
== 0) 
1400                 // Dialog has not been created yet, use a default 
1404             vRect
.yTop 
-= (vTitle
.yTop 
- vTitle
.yBottom
); 
1407         ULONG                       uStyle 
= ::WinQueryWindowULong(hWnd
, QWL_STYLE
); 
1410         // Deal with borders 
1412         if (uStyle 
& FCF_DLGBORDER
) 
1419         else if (uStyle 
& FCF_SIZEBORDER
) 
1426         else if (uStyle 
& FCF_BORDER
) 
1433         else // make some kind of adjustment or top sizers ram into the titlebar! 
1442         *pWidth  
= vRect
.xRight 
- vRect
.xLeft
; 
1444         *pHeight 
= vRect
.yTop 
- vRect
.yBottom
; 
1445 } // end of wxWindowOS2::DoGetClientSize 
1447 void wxWindowOS2::DoMoveWindow( 
1455     wxWindow
*                       pParent 
= GetParent(); 
1457     /* Due to OS/2's inverted coordinate system, changing the height 
1458        of a window requires repositioning all it's children, e.g. if 
1459        you want a child of height 100 to be at the top left corner of 
1460        the parent you need to position the lower left corner of the 
1461        child at (0, (height of parent - 100)), so, obviously, if the 
1462        height of the parent changes, the child needs to be repositioned. */ 
1464     GetSize(0, &nHeightDelta
); 
1465     nHeightDelta 
= nHeight 
- nHeightDelta
; 
1467     if (pParent 
&& !IsKindOf(CLASSINFO(wxDialog
))) 
1469         int                         nOS2Height 
= GetOS2ParentHeight(pParent
); 
1471         nY 
= nOS2Height 
- (nY 
+ nHeight
); 
1477         ::WinQueryWindowRect(HWND_DESKTOP
, &vRect
); 
1478         nY 
= vRect
.yTop 
- (nY 
+ nHeight
); 
1482     // In the case of a frame whose client is sized, the client cannot be 
1483     // large than its parent frame minus its borders! This usually happens 
1484     // when using an autosizer to size a frame to precisely hold client 
1485     // controls as in the notebook sample. 
1487     // In this case, we may need to resize both a frame and its client so we 
1488     // need a quick calc of the frame border size, then if the frame 
1489     // (less its borders) is smaller than the client, size the frame to 
1490     // encompass the client with the appropriate border size. 
1492     if (IsKindOf(CLASSINFO(wxFrame
))) 
1496         int                         nWidthFrameDelta 
= 0; 
1497         int                         nHeightFrameDelta 
= 0; 
1498         int                         nHeightFrame 
= 0; 
1499         int                         nWidthFrame 
= 0; 
1502         pFrame 
= wxDynamicCast(this, wxFrame
); 
1503         hWndFrame 
= pFrame
->GetFrame(); 
1504         ::WinQueryWindowRect(hWndFrame
, &vRect
); 
1505         ::WinMapWindowPoints(hWndFrame
, HWND_DESKTOP
, (PPOINTL
)&vRect
, 2); 
1507         ::WinCalcFrameRect(hWndFrame
, &vRect
, TRUE
); 
1508         nWidthFrameDelta 
= ((vRect
.xLeft 
- vFRect
.xLeft
) + (vFRect
.xRight 
- vRect
.xRight
)); 
1509         nHeightFrameDelta 
= ((vRect
.yBottom 
- vFRect
.yBottom
) + (vFRect
.yTop 
- vRect
.yTop
)); 
1510         nWidthFrame 
= vFRect
.xRight 
- vFRect
.xLeft
; 
1511         nHeightFrame 
= vFRect
.yTop 
- vFRect
.yBottom
; 
1513         if (nWidth 
== vFRect
.xRight 
- vFRect
.xLeft 
&& 
1514             nHeight 
== vFRect
.yTop 
- vFRect
.yBottom
) 
1517             // In this case the caller is not aware of OS/2's need to size both 
1518             // the frame and it's client and is really only moving the window, 
1519             // not resizeing it.  So move the frame, and back off the sizes 
1520             // for a proper client fit. 
1522             ::WinSetWindowPos( hWndFrame
 
1524                               ,(LONG
)nX 
- (vRect
.xLeft 
- vFRect
.xLeft
) 
1525                               ,(LONG
)nY 
- (vRect
.yBottom 
- vFRect
.yBottom
) 
1530             nX 
+= (vRect
.xLeft 
- vFRect
.xLeft
); 
1531             nY 
+= (vRect
.yBottom 
- vFRect
.yBottom
); 
1532             nWidth 
-= nWidthFrameDelta
; 
1533             nHeight 
-= nHeightFrameDelta
; 
1537             if (nWidth 
> nWidthFrame 
- nHeightFrameDelta 
|| 
1538                 nHeight 
> nHeightFrame 
- nHeightFrameDelta
) 
1540                 ::WinSetWindowPos( hWndFrame
 
1542                                   ,(LONG
)nX 
- (vRect
.xLeft 
- vFRect
.xLeft
) 
1543                                   ,(LONG
)nY 
- (vRect
.yBottom 
- vFRect
.yBottom
) 
1544                                   ,(LONG
)nWidth 
+ nWidthFrameDelta
 
1545                                   ,(LONG
)nHeight 
+ nHeightFrameDelta
 
1546                                   ,SWP_MOVE 
| SWP_SIZE
 
1552     ::WinSetWindowPos( GetHwnd() 
1558                       ,SWP_SIZE 
| SWP_MOVE
 
1560     if (m_vWinSwp
.cx 
== 0 && m_vWinSwp
.cy 
== 0 && m_vWinSwp
.fl 
== 0) 
1564         ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp
); 
1567         int                         nYDiff 
= m_vWinSwp
.cy 
- nHeight
; 
1570         // Handle resizing of scrolled windows.  The target or window to 
1571         // be scrolled is the owner (gets the scroll notifications).  The 
1572         // parent is usually the parent frame of the scrolled panel window. 
1573         // In order to show the scrollbars the target window will be shrunk 
1574         // by the size of the scroll bar widths and moved in the X and Y 
1575         // directon.  That value will be computed as part of the diff for 
1576         // moving the children.  Everytime the window is sized the 
1577         // toplevel OnSize is going to resize the panel to fit the client 
1578         // or the whole sizer and will need to me resized. This will send 
1579         // a WM_SIZE out which will be intercepted by the ScrollHelper 
1580         // which will cause the scrollbars to be displayed via the SetScrollbar 
1583         if (IsKindOf(CLASSINFO(wxScrolledWindow
))) 
1585             int                     nAdjustWidth  
= 0; 
1586             int                     nAdjustHeight 
= 0; 
1587             int nHSBHeight 
= wxSystemSettingsNative::GetMetric(wxSYS_HSCROLL_Y
, 
1589             int nVSBWidth  
= wxSystemSettingsNative::GetMetric(wxSYS_VSCROLL_X
, 
1593             if (GetScrollBarHorz() == NULLHANDLE 
|| 
1594                 !WinIsWindowShowing(GetScrollBarHorz())) 
1597                 nAdjustHeight 
= nHSBHeight
; 
1598             if (GetScrollBarVert() == NULLHANDLE 
|| 
1599                 !WinIsWindowShowing(GetScrollBarVert())) 
1602                 nAdjustWidth 
= nVSBWidth
; 
1603             ::WinQueryWindowPos(GetHwnd(), &vSwpScroll
); 
1604             ::WinSetWindowPos( GetHwnd() 
1607                               ,vSwpScroll
.y 
+ nAdjustHeight
 
1608                               ,vSwpScroll
.cx 
- nAdjustWidth
 
1609                               ,vSwpScroll
.cy 
- nAdjustHeight
 
1610                               ,SWP_MOVE 
| SWP_SIZE
 
1612             nYDiff 
-= nAdjustHeight
; 
1614         MoveChildren(nYDiff
); 
1615         ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp
); 
1618     // FIXME: By my logic, the next line should be needed as it moves child 
1619     //        windows when resizing the parent (see comment at beginning of 
1620     //        function). However, this seems to cause lots of problems. At 
1621     //        least, e.g. the grid sample almost works with this line 
1622     //        commented out but crashes badly with it. 
1623     MoveChildren(nHeightDelta
); 
1625 } // end of wxWindowOS2::DoMoveWindow 
1628 // Set the size of the window: if the dimensions are positive, just use them, 
1629 // but if any of them is equal to -1, it means that we must find the value for 
1630 // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in 
1631 // which case -1 is a valid value for x and y) 
1633 // If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate 
1634 // the width/height to best suit our contents, otherwise we reuse the current 
1637 void wxWindowOS2::DoSetSize( int nX
, 
1644     // Get the current size and position... 
1650     wxSize vSize 
= wxDefaultSize
; 
1652     GetPosition(&nCurrentX
, &nCurrentY
); 
1653     GetSize(&nCurrentWidth
, &nCurrentHeight
); 
1656     // ... and don't do anything (avoiding flicker) if it's already ok 
1659     // Must convert Y coords to test for equality under OS/2 
1663     if (nX 
== nCurrentX 
&& nY2 
== nCurrentY 
&& 
1664         nWidth 
== nCurrentWidth 
&& nHeight 
== nCurrentHeight
) 
1669     if (nX 
== wxDefaultCoord 
&& !(nSizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
)) 
1671     if (nY 
== wxDefaultCoord 
&& !(nSizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
)) 
1674     AdjustForParentClientOrigin(nX
, nY
, nSizeFlags
); 
1676     if (nWidth 
== wxDefaultCoord
) 
1678         if (nSizeFlags 
& wxSIZE_AUTO_WIDTH
) 
1680             vSize  
= DoGetBestSize(); 
1686             // Just take the current one 
1688             nWidth 
= nCurrentWidth
; 
1692     if (nHeight 
== wxDefaultCoord
) 
1694         if (nSizeFlags 
& wxSIZE_AUTO_HEIGHT
) 
1696             if (vSize
.x 
== wxDefaultCoord
) 
1698                 vSize 
= DoGetBestSize(); 
1704             // just take the current one 
1705             nHeight 
= nCurrentHeight
; 
1709     DoMoveWindow( nX
, nY
, nWidth
, nHeight 
); 
1710 } // end of wxWindowOS2::DoSetSize 
1712 void wxWindowOS2::DoSetClientSize( int nWidth
, 
1718     wxWindow
* pParent 
= (wxWindow
*)GetParent(); 
1719     HWND      hParentWnd 
= (HWND
)0; 
1722         hParentWnd 
= (HWND
)pParent
->GetHWND(); 
1724     if (IsKindOf(CLASSINFO(wxFrame
))) 
1726         wxFrame
* pFrame 
= wxDynamicCast(this, wxFrame
); 
1727         HWND     hFrame 
= pFrame
->GetFrame(); 
1732         ::WinQueryWindowRect(GetHwnd(), &vRect2
); 
1733         ::WinQueryWindowRect(hFrame
, &vRect
); 
1734         ::WinQueryWindowRect(hParentWnd
, &vRect3
); 
1735         nActualWidth 
= vRect2
.xRight 
- vRect2
.xLeft 
- vRect
.xRight 
+ nWidth
; 
1736         nActualHeight 
= vRect2
.yTop 
- vRect2
.yBottom 
- vRect
.yTop 
+ nHeight
; 
1738         vPoint
.x 
= vRect2
.xLeft
; 
1739         vPoint
.y 
= vRect2
.yBottom
; 
1742             vPoint
.x 
-= vRect3
.xLeft
; 
1743             vPoint
.y 
-= vRect3
.yBottom
; 
1751         GetPosition(&nX
, &nY
); 
1752         nActualWidth  
= nWidth
; 
1753         nActualHeight 
= nHeight
; 
1758     DoMoveWindow( vPoint
.x
, vPoint
.y
, nActualWidth
, nActualHeight 
); 
1760     wxSize 
size( nWidth
, nHeight 
); 
1761     wxSizeEvent 
vEvent( size
, m_windowId 
); 
1762     vEvent
.SetEventObject(this); 
1763     GetEventHandler()->ProcessEvent(vEvent
); 
1764 } // end of wxWindowOS2::DoSetClientSize 
1766 // --------------------------------------------------------------------------- 
1768 // --------------------------------------------------------------------------- 
1770 int wxWindowOS2::GetCharHeight() const 
1773     FONTMETRICS                     vFontMetrics
; 
1775     hPs 
= ::WinGetPS(GetHwnd()); 
1777     if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
)) 
1779         ::WinReleasePS(hPs
); 
1782     ::WinReleasePS(hPs
); 
1783     return(vFontMetrics
.lMaxAscender 
+ vFontMetrics
.lMaxDescender
); 
1784 } // end of wxWindowOS2::GetCharHeight 
1786 int wxWindowOS2::GetCharWidth() const 
1789     FONTMETRICS                     vFontMetrics
; 
1791     hPs 
= ::WinGetPS(GetHwnd()); 
1793     if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
)) 
1795         ::WinReleasePS(hPs
); 
1798     ::WinReleasePS(hPs
); 
1799     return(vFontMetrics
.lAveCharWidth
); 
1800 } // end of wxWindowOS2::GetCharWidth 
1802 void wxWindowOS2::GetTextExtent( const wxString
& rString
, 
1806                                  int* pExternalLeading
, 
1807                                  const wxFont
* WXUNUSED(pTheFont
) ) const 
1809     POINTL      avPoint
[TXTBOX_COUNT
]; 
1814     FONTMETRICS vFM
; // metrics structure 
1819     hPS 
= ::WinGetPS(GetHwnd()); 
1821     l 
= rString
.length(); 
1824         pStr 
= (PCH
)rString
.c_str(); 
1827         // In world coordinates. 
1829         bRc 
= ::GpiQueryTextBox( hPS
, 
1832                                  TXTBOX_COUNT
,// return maximum information 
1833                                  avPoint      
// array of coordinates points 
1837             vPtMin
.x 
= avPoint
[0].x
; 
1838             vPtMax
.x 
= avPoint
[0].x
; 
1839             vPtMin
.y 
= avPoint
[0].y
; 
1840             vPtMax
.y 
= avPoint
[0].y
; 
1841             for (i 
= 1; i 
< 4; i
++) 
1843                 if(vPtMin
.x 
> avPoint
[i
].x
) vPtMin
.x 
= avPoint
[i
].x
; 
1844                 if(vPtMin
.y 
> avPoint
[i
].y
) vPtMin
.y 
= avPoint
[i
].y
; 
1845                 if(vPtMax
.x 
< avPoint
[i
].x
) vPtMax
.x 
= avPoint
[i
].x
; 
1846                 if(vPtMax
.y 
< avPoint
[i
].y
) vPtMax
.y 
= avPoint
[i
].y
; 
1848             bRc 
= ::GpiQueryFontMetrics( hPS
 
1849                                         ,sizeof(FONTMETRICS
) 
1876         *pX 
= (vPtMax
.x 
- vPtMin
.x 
+ 1); 
1878         *pY 
= (vPtMax
.y 
- vPtMin
.y 
+ 1); 
1882             *pDescent 
= vFM
.lMaxDescender
; 
1886     if (pExternalLeading
) 
1889             *pExternalLeading 
= vFM
.lExternalLeading
; 
1891             *pExternalLeading 
= 0; 
1893     ::WinReleasePS(hPS
); 
1894 } // end of wxWindow::GetTextExtent 
1896 bool wxWindowOS2::IsMouseInWindow() const 
1899     // Get the mouse position 
1902     ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
); 
1905     // Find the window which currently has the cursor and go up the window 
1906     // chain until we find this window - or exhaust it 
1908     HWND hWnd 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt
, TRUE
); 
1910     while (hWnd 
&& (hWnd 
!= GetHwnd())) 
1911         hWnd 
= ::WinQueryWindow(hWnd
, QW_PARENT
); 
1913     return hWnd 
!= NULL
; 
1914 } // end of wxWindowOS2::IsMouseInWindow 
1917 // --------------------------------------------------------------------------- 
1919 // --------------------------------------------------------------------------- 
1921 #if wxUSE_MENUS_NATIVE 
1922 bool wxWindowOS2::DoPopupMenu( wxMenu
* pMenu
, int nX
, int nY 
) 
1924     HWND hWndOwner 
= GetHwnd(); 
1925     HWND hWndParent 
= GetHwnd(); 
1926     HWND hMenu 
= GetHmenuOf(pMenu
); 
1927     bool bIsWaiting 
= true; 
1930     // Protect against recursion 
1931     if (wxCurrentPopupMenu
) 
1934     pMenu
->SetInvokingWindow(this); 
1937     if ( nX 
== -1 && nY 
== -1 ) 
1939         wxPoint mouse 
= wxGetMousePosition(); 
1940         nX 
= mouse
.x
; nY 
= mouse
.y
; 
1944         DoClientToScreen( &nX
 
1947         DoGetSize(0,&nHeight
); 
1950     wxCurrentPopupMenu 
= pMenu
; 
1952     ::WinPopupMenu( hWndParent
 
1958                    ,PU_HCONSTRAIN 
| PU_VCONSTRAIN 
| PU_MOUSEBUTTON1 
| PU_KEYBOARD
 
1965         ::WinGetMsg(vHabmain
,&vMsg
, (HWND
)0, 0, 0); 
1966         if (vMsg
.msg 
== WM_COMMAND
) 
1968         ::WinDispatchMsg(vHabmain
, (PQMSG
)&vMsg
); 
1971     wxCurrentPopupMenu 
= NULL
; 
1972     pMenu
->SetInvokingWindow(NULL
); 
1974 } // end of wxWindowOS2::DoPopupMenu 
1975 #endif // wxUSE_MENUS_NATIVE 
1977 // =========================================================================== 
1978 // pre/post message processing 
1979 // =========================================================================== 
1981 MRESULT 
wxWindowOS2::OS2DefWindowProc( WXUINT uMsg
, 
1986         return (MRESULT
)m_fnOldWndProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
); 
1988         return ::WinDefWindowProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
); 
1989 } // end of wxWindowOS2::OS2DefWindowProc 
1991 bool wxWindowOS2::OS2ProcessMessage( WXMSG
* pMsg 
) 
1993 // wxUniversal implements tab traversal itself 
1994 #ifndef __WXUNIVERSAL__ 
1995     QMSG
*                           pQMsg 
= (QMSG
*)pMsg
; 
1997     if (m_hWnd 
!= 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL
)) 
2000         // Intercept dialog navigation keys 
2002         bool   bProcess 
= true; 
2003         USHORT uKeyFlags 
= SHORT1FROMMP(pQMsg
->mp1
); 
2005         if (uKeyFlags 
& KC_KEYUP
) 
2008         if (uKeyFlags 
& KC_ALT
) 
2011         if (!(uKeyFlags 
& KC_VIRTUALKEY
)) 
2016             bool                    bCtrlDown 
= IsCtrlDown(); 
2017             bool                    bShiftDown 
= IsShiftDown(); 
2020             // WM_QUERYDLGCODE: ask the control if it wants the key for itself, 
2021             // don't process it if it's the case (except for Ctrl-Tab/Enter 
2022             // combinations which are always processed) 
2024             ULONG                   ulDlgCode 
= 0; 
2028                 ulDlgCode 
= (ULONG
)::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0); 
2031             bool bForward 
= true; 
2032             bool bWindowChange 
= false; 
2034             switch (SHORT2FROMMP(pQMsg
->mp2
)) 
2037                 // Going to make certain assumptions about specific types of controls 
2038                 // here, so we may have to alter some things later if they prove invalid 
2042                     // Shift tabl will always be a nav-key but tabs may be wanted 
2051                         // Entry Fields want tabs for themselve usually 
2055                             case DLGC_ENTRYFIELD
: 
2065                         // Ctrl-Tab cycles thru notebook pages 
2067                         bWindowChange 
= bCtrlDown
; 
2068                         bForward 
= !bShiftDown
; 
2091                             // ctrl-enter is not processed 
2095                         else if (ulDlgCode 
& DLGC_BUTTON
) 
2098                             // buttons want process Enter themselevs 
2104                             wxButton
*   pBtn 
= wxDynamicCast( GetDefaultItem() 
2108                             if (pBtn 
&& pBtn
->IsEnabled()) 
2111                                 // If we do have a default button, do press it 
2113                                 pBtn
->OS2Command(BN_CLICKED
, 0 /* unused */); 
2116                             else if (!IsTopLevel()) 
2119                                 // if not a top level window, let parent 
2124                             // else: but if it does not it makes sense to make 
2125                             //       it work like a TAB - and that's what we do. 
2126                             //       Note that Ctrl-Enter always works this way. 
2137                 wxNavigationKeyEvent    vEvent
; 
2139                 vEvent
.SetDirection(bForward
); 
2140                 vEvent
.SetWindowChange(bWindowChange
); 
2141                 vEvent
.SetEventObject(this); 
2143                 if (GetEventHandler()->ProcessEvent(vEvent
)) 
2145                     wxButton
*       pBtn 
= wxDynamicCast(FindFocus(), wxButton
); 
2150                         // The button which has focus should be default 
2159         // Let Dialogs process 
2161         if (::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0)); 
2165     pMsg 
= pMsg
; // just shut up the compiler 
2166 #endif // __WXUNIVERSAL__ 
2169 } // end of wxWindowOS2::OS2ProcessMessage 
2171 bool wxWindowOS2::OS2TranslateMessage( WXMSG
* pMsg 
) 
2173 #if wxUSE_ACCEL && !defined(__WXUNIVERSAL__) 
2174     return m_acceleratorTable
.Translate(m_hWnd
, pMsg
); 
2178 #endif //wxUSE_ACCEL 
2179 } // end of wxWindowOS2::OS2TranslateMessage 
2181 bool wxWindowOS2::OS2ShouldPreProcessMessage( WXMSG
* WXUNUSED(pMsg
) ) 
2183     // preprocess all messages by default 
2185 } // end of wxWindowOS2::OS2ShouldPreProcessMessage 
2187 // --------------------------------------------------------------------------- 
2188 // message params unpackers 
2189 // --------------------------------------------------------------------------- 
2191 void wxWindowOS2::UnpackCommand( 
2199     *pId 
= LOWORD(wParam
); 
2200     *phWnd 
= NULL
;  // or may be GetHWND() ? 
2201     *pCmd 
= LOWORD(lParam
); 
2202 } // end of wxWindowOS2::UnpackCommand 
2204 void wxWindowOS2::UnpackActivate( 
2211     *pState     
= LOWORD(wParam
); 
2212     *phWnd      
= (WXHWND
)lParam
; 
2213 } // end of wxWindowOS2::UnpackActivate 
2215 void wxWindowOS2::UnpackScroll( 
2226     ulId    
= (ULONG
)LONGFROMMP(wParam
); 
2227     hWnd 
= ::WinWindowFromID(GetHwnd(), ulId
); 
2228     if (hWnd 
== m_hWndScrollBarHorz 
|| hWnd 
== m_hWndScrollBarVert
) 
2229         *phWnd 
= NULLHANDLE
; 
2233     *pPos  
= SHORT1FROMMP(lParam
); 
2234     *pCode 
= SHORT2FROMMP(lParam
); 
2235 } // end of wxWindowOS2::UnpackScroll 
2237 void wxWindowOS2::UnpackMenuSelect( 
2245     *pItem 
= (WXWORD
)LOWORD(wParam
); 
2246     *pFlags 
= HIWORD(wParam
); 
2247     *phMenu 
= (WXHMENU
)lParam
; 
2248 } // end of wxWindowOS2::UnpackMenuSelect 
2250 // --------------------------------------------------------------------------- 
2251 // Main wxWidgets window proc and the window proc for wxWindow 
2252 // --------------------------------------------------------------------------- 
2255 // Hook for new window just as it's being created, when the window isn't yet 
2256 // associated with the handle 
2258 wxWindowOS2
*                         wxWndHook 
= NULL
; 
2263 MRESULT EXPENTRY 
wxWndProc( 
2270     wxWindowOS2
*                    pWnd 
= wxFindWinFromHandle((WXHWND
)hWnd
); 
2273     // When we get the first message for the HWND we just created, we associate 
2274     // it with wxWindow stored in wxWndHook 
2276     if (!pWnd 
&& wxWndHook
) 
2278         wxAssociateWinWithHandle(hWnd
, wxWndHook
); 
2281         pWnd
->SetHWND((WXHWND
)hWnd
); 
2284     MRESULT                         rc 
= (MRESULT
)0; 
2288     // Stop right here if we don't have a valid handle in our wxWindow object. 
2290     if (pWnd 
&& !pWnd
->GetHWND()) 
2292         pWnd
->SetHWND((WXHWND
) hWnd
); 
2293         rc 
= pWnd
->OS2DefWindowProc(ulMsg
, wParam
, lParam 
); 
2300             rc 
= pWnd
->OS2WindowProc(ulMsg
, wParam
, lParam
); 
2301             if ( (pWnd
->GetScrollBarHorz() != NULLHANDLE 
|| 
2302                   pWnd
->GetScrollBarVert() != NULLHANDLE
) && 
2305                 if (pWnd
->GetScrollBarHorz() != NULLHANDLE
) 
2306                     ::WinInvalidateRect(pWnd
->GetScrollBarHorz(), NULL
, TRUE
); 
2307                 if (pWnd
->GetScrollBarVert() != NULLHANDLE
) 
2308                     ::WinInvalidateRect(pWnd
->GetScrollBarVert(), NULL
, TRUE
); 
2312             rc 
= ::WinDefWindowProc(hWnd
, ulMsg
, wParam
, lParam
); 
2316 } // end of wxWndProc 
2319 // We will add (or delete) messages we need to handle at this default 
2322 MRESULT 
wxWindowOS2::OS2WindowProc( WXUINT uMsg
, 
2327     // Did we process the uMsg? 
2329     bool bProcessed 
= false; 
2333     // For most messages we should return 0 when we do process the message 
2335     mResult 
= (MRESULT
)0; 
2343                 bProcessed 
= HandleCreate( (WXLPCREATESTRUCT
)lParam
 
2349                     // Return 0 to bAllow window creation 
2351                     mResult 
= (MRESULT
)(bMayCreate 
? 0 : -1); 
2362             bProcessed 
= HandleMove( LOWORD(lParam
) 
2368             bProcessed 
= HandleSize( LOWORD(lParam
) 
2374         case WM_WINDOWPOSCHANGED
: 
2377             // Dialogs under OS/2 do not get WM_SIZE events at all. 
2378             // Instead they get this, which can function much like WM_SIZE 
2379             // PSWP contains the new sizes and positioning, PSWP+1 the old 
2380             // We use this because ADJUSTWINDOWPOS comes BEFORE the new 
2381             // position is added and our auto layout does a WinQueryWindowRect 
2382             // to get the CURRENT client size.  That is the size used to position 
2383             // child controls, so we need to already be sized 
2384             // in order to get the child controls positoned properly. 
2386             if (IsKindOf(CLASSINFO(wxDialog
)) || IsKindOf(CLASSINFO(wxFrame
))) 
2388                 PSWP                pSwp 
= (PSWP
)PVOIDFROMMP(wParam
); 
2389                 PSWP                pSwp2 
= pSwp
++; 
2391                 if (!(pSwp
->cx 
== pSwp2
->cx 
&& 
2392                       pSwp
->cy 
== pSwp2
->cy
)) 
2393                     bProcessed 
= HandleSize( pSwp
->cx
 
2397                 if (IsKindOf(CLASSINFO(wxFrame
))) 
2399                     wxFrame
*            pFrame 
= wxDynamicCast(this, wxFrame
); 
2403                         if (pFrame
->GetStatusBar()) 
2404                             pFrame
->PositionStatusBar(); 
2405                         if (pFrame
->GetToolBar()) 
2406                             pFrame
->PositionToolBar(); 
2417                 UnpackActivate( wParam
 
2423                 bProcessed 
= HandleActivate( wState
 
2431             if (SHORT1FROMMP((MPARAM
)lParam
) == TRUE
) 
2432                 bProcessed 
= HandleSetFocus((WXHWND
)(HWND
)wParam
); 
2434                 bProcessed 
= HandleKillFocus((WXHWND
)(HWND
)wParam
); 
2438             bProcessed 
= HandlePaint(); 
2443             // Don't let the DefWindowProc() destroy our window - we'll do it 
2444             // ourselves in ~wxWindow 
2447             mResult 
= (MRESULT
)TRUE
; 
2451             bProcessed 
= HandleShow(wParam 
!= 0, (int)lParam
); 
2455         // Under OS2 PM Joysticks are treated just like mouse events 
2456         // The "Motion" events will be prevelent in joysticks 
2459         case WM_BUTTON1DOWN
: 
2461         case WM_BUTTON1DBLCLK
: 
2462         case WM_BUTTON1MOTIONEND
: 
2463         case WM_BUTTON1MOTIONSTART
: 
2464         case WM_BUTTON2DOWN
: 
2466         case WM_BUTTON2DBLCLK
: 
2467         case WM_BUTTON2MOTIONEND
: 
2468         case WM_BUTTON2MOTIONSTART
: 
2469         case WM_BUTTON3DOWN
: 
2471         case WM_BUTTON3DBLCLK
: 
2472         case WM_BUTTON3MOTIONEND
: 
2473         case WM_BUTTON3MOTIONSTART
: 
2475                 if (uMsg 
== WM_BUTTON1DOWN 
&& AcceptsFocus()) 
2478                 short               nX 
= LOWORD(wParam
); 
2479                 short               nY 
= HIWORD(wParam
); 
2482                 // Redirect the event to a static control if necessary 
2484                 if (this == GetCapture()) 
2486                     bProcessed 
= HandleMouseEvent( uMsg
 
2489                                                   ,(WXUINT
)SHORT2FROMMP(lParam
) 
2494                     wxWindow
*       pWin 
= FindWindowForMouseEvent( this 
2498                     if (!pWin
->IsOfStandardClass()) 
2500                         if (uMsg 
== WM_BUTTON1DOWN 
&& pWin
->AcceptsFocus() ) 
2503                     bProcessed 
= pWin
->HandleMouseEvent( uMsg
 
2506                                                         ,(WXUINT
)SHORT2FROMMP(lParam
) 
2513             bProcessed 
= HandleSysCommand(wParam
, lParam
); 
2520                 UnpackCommand(wParam
, lParam
, &id
, &hwnd
, &cmd
); 
2522                 bProcessed 
= HandleCommand(id
, cmd
, hwnd
); 
2527             // For these messages we must return TRUE if process the message 
2530         case WM_MEASUREITEM
: 
2532                 int                 nIdCtrl 
= (UINT
)wParam
; 
2534                 if ( uMsg 
== WM_DRAWITEM 
) 
2536                     bProcessed 
= OS2OnDrawItem(nIdCtrl
, 
2537                                               (WXDRAWITEMSTRUCT 
*)lParam
); 
2541                     return MRFROMLONG(OS2OnMeasureItem( nIdCtrl
 
2542                                                        ,(WXMEASUREITEMSTRUCT 
*)lParam
 
2547                     mResult 
= (MRESULT
)TRUE
; 
2551         case WM_QUERYDLGCODE
: 
2552             if (!IsOfStandardClass()) 
2556                     mResult 
= (MRESULT
)m_lDlgCode
; 
2561             //else: get the dlg code from the DefWindowProc() 
2566         // In OS/2 PM all keyboard events are of the WM_CHAR type.  Virtual key and key-up 
2567         // and key-down events are obtained from the WM_CHAR params. 
2571                 USHORT                  uKeyFlags 
= SHORT1FROMMP((MPARAM
)wParam
); 
2573                 if (uKeyFlags 
& KC_KEYUP
) 
2575                     //TODO: check if the cast to WXWORD isn't causing trouble 
2576                     bProcessed 
= HandleKeyUp(wParam
, lParam
); 
2579                 else // keydown event 
2581                     m_bLastKeydownProcessed 
= false; 
2583                     // If this has been processed by an event handler, 
2584                     // return 0 now (we've handled it). DON't RETURN 
2585                     // we still need to process further 
2587                     m_bLastKeydownProcessed 
= HandleKeyDown(wParam
, lParam
); 
2588                     if (uKeyFlags 
& KC_VIRTUALKEY
) 
2590                         USHORT          uVk 
= SHORT2FROMMP((MPARAM
)lParam
); 
2593                         // We consider these message "not interesting" to OnChar 
2606                             // Avoid duplicate messages to OnChar for these ASCII keys: they 
2607                             // will be translated by TranslateMessage() and received in WM_CHAR 
2612                                 // But set processed to false, not true to still pass them to 
2613                                 // the control's default window proc - otherwise built-in 
2614                                 // keyboard handling won't work 
2619                                 bProcessed 
= HandleChar(wParam
, lParam
); 
2623                     else // WM_CHAR -- Always an ASCII character 
2625                         if (m_bLastKeydownProcessed
) 
2628                             // The key was handled in the EVT_KEY_DOWN and handling 
2629                             // a key in an EVT_KEY_DOWN handler is meant, by 
2630                             // design, to prevent EVT_CHARs from happening 
2632                             m_bLastKeydownProcessed 
= false; 
2635                         else // do generate a CHAR event 
2637                             bProcessed 
= HandleChar(wParam
, lParam
, true); 
2650                 UnpackScroll( wParam
 
2657                 bProcessed 
= OS2OnScroll( uMsg 
== WM_HSCROLL 
? wxHORIZONTAL
 
2667             switch(SHORT2FROMMP(wParam
)) 
2671                         HWND                hWnd 
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
)); 
2672                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2679                         if (pWin
->IsKindOf(CLASSINFO(wxBitmapButton
))) 
2681                             wxBitmapButton
*     pBitmapButton 
= wxDynamicCast(pWin
, wxBitmapButton
); 
2683                             pBitmapButton
->OS2OnDraw((WXDRAWITEMSTRUCT 
*)lParam
); 
2689                 case BKN_PAGESELECTEDPENDING
: 
2691                         PPAGESELECTNOTIFY  pPage 
= (PPAGESELECTNOTIFY
)lParam
; 
2693                         if ((pPage
->ulPageIdNew 
!= pPage
->ulPageIdCur
) && 
2694                             (pPage
->ulPageIdNew 
> 0L && pPage
->ulPageIdCur 
> 0L)) 
2696                             wxWindowOS2
*        pWin 
= wxFindWinFromHandle(pPage
->hwndBook
); 
2697                             wxNotebookEvent     
vEvent( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
 
2698                                                        ,(int)SHORT1FROMMP(wParam
) 
2699                                                        ,(int)pPage
->ulPageIdNew
 
2700                                                        ,(int)pPage
->ulPageIdCur
 
2707                             if (pWin
->IsKindOf(CLASSINFO(wxNotebook
))) 
2709                                 wxNotebook
*         pNotebook 
= wxDynamicCast(pWin
, wxNotebook
); 
2711                                 vEvent
.SetEventObject(pWin
); 
2712                                 pNotebook
->OnSelChange(vEvent
); 
2723                 case BN_CLICKED
: // Dups as LN_SELECT and CBN_LBSELECT 
2725                         HWND                hWnd 
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
)); 
2726                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2734                         // Simulate a WM_COMMAND here, as wxWidgets expects all control 
2735                         // button clicks to generate WM_COMMAND msgs, not WM_CONTROL 
2737                         if (pWin
->IsKindOf(CLASSINFO(wxRadioBox
))) 
2739                             wxRadioBox
*         pRadioBox 
= wxDynamicCast(pWin
, wxRadioBox
); 
2741                             pRadioBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2742                                                   ,(WXWORD
)SHORT1FROMMP(wParam
) 
2745                         if (pWin
->IsKindOf(CLASSINFO(wxRadioButton
))) 
2747                             wxRadioButton
*      pRadioButton 
= wxDynamicCast(pWin
, wxRadioButton
); 
2749                             pRadioButton
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2750                                                      ,(WXWORD
)SHORT1FROMMP(wParam
) 
2753                         if (pWin
->IsKindOf(CLASSINFO(wxCheckBox
))) 
2755                             wxCheckBox
*         pCheckBox 
= wxDynamicCast(pWin
, wxCheckBox
); 
2757                             pCheckBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2758                                                   ,(WXWORD
)SHORT1FROMMP(wParam
) 
2761                         if (pWin
->IsKindOf(CLASSINFO(wxListBox
))) 
2763                             wxListBox
*          pListBox 
= wxDynamicCast(pWin
, wxListBox
); 
2765                             pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2766                                                  ,(WXWORD
)SHORT1FROMMP(wParam
) 
2768                             if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
) 
2771                         if (pWin
->IsKindOf(CLASSINFO(wxComboBox
))) 
2773                             wxComboBox
*          pComboBox 
= wxDynamicCast(pWin
, wxComboBox
); 
2775                             pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2776                                                   ,(WXWORD
)SHORT1FROMMP(wParam
) 
2783                 case LN_ENTER
:   /* dups as CBN_EFCHANGE */ 
2785                         HWND                hWnd 
= HWNDFROMMP(lParam
); 
2786                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2794                         // Simulate a WM_COMMAND here, as wxWidgets expects all control 
2795                         // button clicks to generate WM_COMMAND msgs, not WM_CONTROL 
2797                         if (pWin
->IsKindOf(CLASSINFO(wxListBox
))) 
2799                             wxListBox
*          pListBox 
= wxDynamicCast(pWin
, wxListBox
); 
2801                             pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2802                                                  ,(WXWORD
)SHORT1FROMMP(wParam
) 
2804                             if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
) 
2808                         if (pWin
->IsKindOf(CLASSINFO(wxComboBox
))) 
2810                             wxComboBox
*          pComboBox 
= wxDynamicCast(pWin
, wxComboBox
); 
2812                             pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2813                                                   ,(WXWORD
)SHORT1FROMMP(wParam
) 
2821                 case SPBN_DOWNARROW
: 
2827                         ::WinSendMsg( HWNDFROMMP(lParam
) 
2830                                      ,MPFROM2SHORT( (USHORT
)10 
2831                                                    ,(USHORT
)SPBQ_UPDATEIFVALID
 
2835                         bProcessed 
= OS2OnScroll( wxVERTICAL
 
2836                                                  ,(WXWORD
)SHORT2FROMMP(wParam
) 
2843                 case SLN_SLIDERTRACK
: 
2845                         HWND         hWnd 
= ::WinWindowFromID(GetHWND(), SHORT1FROMMP(wParam
)); 
2846                         wxWindowOS2
* pChild 
= wxFindWinFromHandle(hWnd
); 
2853                         if (pChild
->IsKindOf(CLASSINFO(wxSlider
))) 
2854                             bProcessed 
= OS2OnScroll( wxVERTICAL
 
2855                                                      ,(WXWORD
)SHORT2FROMMP(wParam
) 
2856                                                      ,(WXWORD
)LONGFROMMP(lParam
) 
2864 #if defined(__VISAGECPP__) && (__IBMCPP__ >= 400) 
2865         case WM_CTLCOLORCHANGE
: 
2867                 bProcessed 
= HandleCtlColor(&hBrush
); 
2871         case WM_ERASEBACKGROUND
: 
2873             // Returning TRUE to requestw PM to paint the window background 
2874             // in SYSCLR_WINDOW. We don't really want that 
2876             bProcessed 
= HandleEraseBkgnd((WXHDC
)(HPS
)wParam
); 
2877             mResult 
= (MRESULT
)(FALSE
); 
2880             // the return value for this message is ignored 
2881         case WM_SYSCOLORCHANGE
: 
2882             bProcessed 
= HandleSysColorChange(); 
2885         case WM_REALIZEPALETTE
: 
2886             bProcessed 
= HandlePaletteChanged(); 
2889         // move all drag and drops to wxDrg 
2891             bProcessed 
= HandleEndDrag(wParam
); 
2895             bProcessed 
= HandleInitDialog((WXHWND
)(HWND
)wParam
); 
2899                 // we never set focus from here 
2900                 mResult 
= (MRESULT
)FALSE
; 
2904         // wxFrame specific message 
2905         case WM_MINMAXFRAME
: 
2906             bProcessed 
= HandleGetMinMaxInfo((PSWP
)wParam
); 
2909         case WM_SYSVALUECHANGED
: 
2910             // TODO: do something 
2911             mResult 
= (MRESULT
)TRUE
; 
2915         // Comparable to WM_SETPOINTER for windows, only for just controls 
2917         case WM_CONTROLPOINTER
: 
2918             bProcessed 
= HandleSetCursor( SHORT1FROMMP(wParam
) // Control ID 
2919                                          ,(HWND
)lParam         
// Cursor Handle 
2924                 // Returning TRUE stops the DefWindowProc() from further 
2925                 // processing this message - exactly what we need because we've 
2926                 // just set the cursor. 
2928                 mResult 
= (MRESULT
)TRUE
; 
2932 #if wxUSE_MENUS_NATIVE 
2934             if (wxCurrentPopupMenu
) 
2936                 if (GetHmenuOf(wxCurrentPopupMenu
) == (HWND
)lParam
) 
2938                     // Break out of msg loop in DoPopupMenu 
2939                     ::WinPostMsg((HWND
)lParam
,WM_COMMAND
,wParam
,0); 
2943 #endif // wxUSE_MENUS_NATIVE 
2949         wxLogTrace(wxTraceMessages
, wxT("Forwarding %s to DefWindowProc."), 
2950                    wxGetMessageName(uMsg
)); 
2951 #endif // __WXDEBUG__ 
2952         if (IsKindOf(CLASSINFO(wxFrame
))) 
2953             mResult 
= ::WinDefWindowProc(m_hWnd
, uMsg
, wParam
, lParam
); 
2954         else if (IsKindOf(CLASSINFO(wxDialog
))) 
2955             mResult 
= ::WinDefDlgProc( m_hWnd
, uMsg
, wParam
, lParam
); 
2957             mResult 
= OS2DefWindowProc(uMsg
, wParam
, lParam
); 
2960 } // end of wxWindowOS2::OS2WindowProc 
2962 // ---------------------------------------------------------------------------- 
2963 // wxWindow <-> HWND map 
2964 // ---------------------------------------------------------------------------- 
2966 wxWinHashTable 
*wxWinHandleHash 
= NULL
; 
2968 wxWindow
* wxFindWinFromHandle( 
2972     return (wxWindow 
*)wxWinHandleHash
->Get((long)hWnd
); 
2973 } // end of wxFindWinFromHandle 
2975 void wxAssociateWinWithHandle( 
2981     // Adding NULL hWnd is (first) surely a result of an error and 
2982     // (secondly) breaks menu command processing 
2984     wxCHECK_RET( hWnd 
!= (HWND
)NULL
, 
2985                  wxT("attempt to add a NULL hWnd to window list ignored") ); 
2988     wxWindow
*                       pOldWin 
= wxFindWinFromHandle((WXHWND
) hWnd
); 
2990     if (pOldWin 
&& (pOldWin 
!= pWin
)) 
2992         wxString                    
str(pWin
->GetClassInfo()->GetClassName()); 
2994         wxLogError( _T("Bug! Found existing HWND %X for new window of class %s") 
3001         wxWinHandleHash
->Put( (long)hWnd
 
3005 } // end of wxAssociateWinWithHandle 
3007 void wxRemoveHandleAssociation( wxWindowOS2
* pWin 
) 
3009     wxWinHandleHash
->Delete((long)pWin
->GetHWND()); 
3010 } // end of wxRemoveHandleAssociation 
3013 // Default destroyer - override if you destroy it in some other way 
3014 // (e.g. with MDI child windows) 
3016 void wxWindowOS2::OS2DestroyWindow() 
3020 bool wxWindowOS2::OS2GetCreateWindowCoords( const wxPoint
& rPos
, 
3021                                             const wxSize
&  rSize
, 
3025                                             int& rnHeight 
) const 
3027     bool bNonDefault 
= false; 
3028     static const int DEFAULT_Y 
= 200; 
3029     static const int DEFAULT_H 
= 250; 
3031     if (rPos
.x 
== wxDefaultCoord
) 
3033         rnX 
= rnY 
= CW_USEDEFAULT
; 
3038         rnY 
= rPos
.y 
== wxDefaultCoord 
? DEFAULT_Y 
: rPos
.y
; 
3041     if (rSize
.x 
== wxDefaultCoord
) 
3043         rnWidth 
= rnHeight 
= CW_USEDEFAULT
; 
3048         rnHeight 
= rSize
.y 
== wxDefaultCoord 
? DEFAULT_H 
: rSize
.y
; 
3052 } // end of wxWindowOS2::OS2GetCreateWindowCoords 
3054 WXHWND 
wxWindowOS2::OS2GetParent() const 
3056     return m_parent 
? m_parent
->GetHWND() : NULL
; 
3059 bool wxWindowOS2::OS2Create( PSZ            zClass
, 
3060                              const wxChar
*  zTitle
, 
3062                              const wxPoint
& rPos
, 
3063                              const wxSize
&  rSize
, 
3065                              WXDWORD        
WXUNUSED(dwExStyle
), 
3074     long                 lControlId 
= 0L; 
3075     wxWindowCreationHook 
vHook(this); 
3076     wxString             
sClassName((wxChar
*)zClass
); 
3078     OS2GetCreateWindowCoords( rPos
 
3088         lControlId 
= GetId(); 
3089         if (GetWindowStyleFlag() & wxCLIP_SIBLINGS
) 
3091             dwStyle 
|= WS_CLIPSIBLINGS
; 
3095     // For each class "Foo" we have we also have "FooNR" ("no repaint") class 
3096     // which is the same but without CS_[HV]REDRAW class styles so using it 
3097     // ensures that the window is not fully repainted on each resize 
3099     if (!HasFlag(wxFULL_REPAINT_ON_RESIZE
)) 
3101         sClassName 
+= wxT("NR"); 
3103     m_hWnd 
= (WXHWND
)::WinCreateWindow( (HWND
)OS2GetParent() 
3104                                        ,(PSZ
)sClassName
.c_str() 
3105                                        ,(PSZ
)(zTitle 
? zTitle 
: wxEmptyString
) 
3119         vError 
= ::WinGetLastError(wxGetInstance()); 
3120         sError 
= wxPMErrorToStr(vError
); 
3123     SubclassWin(m_hWnd
); 
3124     SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
)); 
3126     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE
)); 
3128     LONG lColor 
= (LONG
)m_backgroundColour
.GetPixel(); 
3130     if (!::WinSetPresParam( m_hWnd
 
3136         vError 
= ::WinGetLastError(vHabmain
); 
3137         sError 
= wxPMErrorToStr(vError
); 
3138         wxLogError(_T("Error creating frame. Error: %s\n"), sError
.c_str()); 
3147 } // end of WinGuiBase_Window::OS2Create 
3149 // =========================================================================== 
3150 // OS2 PM message handlers 
3151 // =========================================================================== 
3153 // --------------------------------------------------------------------------- 
3154 // window creation/destruction 
3155 // --------------------------------------------------------------------------- 
3157 bool wxWindowOS2::HandleCreate( WXLPCREATESTRUCT 
WXUNUSED(vCs
), 
3160     wxWindowCreateEvent             
vEvent((wxWindow
*)this); 
3162     (void)GetEventHandler()->ProcessEvent(vEvent
); 
3163     *pbMayCreate 
= true; 
3165 } // end of wxWindowOS2::HandleCreate 
3167 bool wxWindowOS2::HandleDestroy() 
3169     wxWindowDestroyEvent            
vEvent((wxWindow
*)this); 
3170     vEvent
.SetId(GetId()); 
3171     (void)GetEventHandler()->ProcessEvent(vEvent
); 
3174     // Delete our drop target if we've got one 
3176 #if wxUSE_DRAG_AND_DROP 
3177     if (m_dropTarget 
!= NULL
) 
3179         delete m_dropTarget
; 
3180         m_dropTarget 
= NULL
; 
3182 #endif // wxUSE_DRAG_AND_DROP 
3185     // WM_DESTROY handled 
3188 } // end of wxWindowOS2::HandleDestroy 
3190 // --------------------------------------------------------------------------- 
3192 // --------------------------------------------------------------------------- 
3193 void wxWindowOS2::OnSetFocus( 
3194   wxFocusEvent
&                     rEvent
 
3198 } // end of wxWindowOS2::OnSetFocus 
3200 bool wxWindowOS2::HandleActivate( 
3202 , WXHWND                            
WXUNUSED(hActivate
) 
3205     wxActivateEvent                 
vEvent( wxEVT_ACTIVATE
 
3209     vEvent
.SetEventObject(this); 
3210     return GetEventHandler()->ProcessEvent(vEvent
); 
3211 } // end of wxWindowOS2::HandleActivate 
3213 bool wxWindowOS2::HandleSetFocus( WXHWND 
WXUNUSED(hWnd
) ) 
3216     // Notify the parent keeping track of focus for the kbd navigation 
3217     // purposes that we got it 
3219     wxChildFocusEvent               
vEventFocus((wxWindow 
*)this); 
3220     (void)GetEventHandler()->ProcessEvent(vEventFocus
); 
3228         m_caret
->OnSetFocus(); 
3230 #endif // wxUSE_CARET 
3233     // If it's a wxTextCtrl don't send the event as it will be done 
3234     // after the control gets to process it from EN_FOCUS handler 
3235     if ( wxDynamicCastThis(wxTextCtrl
) ) 
3239 #endif // wxUSE_TEXTCTRL 
3241     wxFocusEvent                    
vEvent(wxEVT_SET_FOCUS
, m_windowId
); 
3243     vEvent
.SetEventObject(this); 
3244     return GetEventHandler()->ProcessEvent(vEvent
); 
3245 } // end of wxWindowOS2::HandleSetFocus 
3247 bool wxWindowOS2::HandleKillFocus( WXHWND hWnd 
) 
3255         m_caret
->OnKillFocus(); 
3257 #endif // wxUSE_CARET 
3261     // If it's a wxTextCtrl don't send the event as it will be done 
3262     // after the control gets to process it. 
3264     wxTextCtrl
*                     pCtrl 
= wxDynamicCastThis(wxTextCtrl
); 
3273     // Don't send the event when in the process of being deleted.  This can 
3274     // only cause problems if the event handler tries to access the object. 
3276     if ( m_isBeingDeleted 
) 
3281     wxFocusEvent                    
vEvent( wxEVT_KILL_FOCUS
 
3285     vEvent
.SetEventObject(this); 
3288     // wxFindWinFromHandle() may return NULL, it is ok 
3290     vEvent
.SetWindow(wxFindWinFromHandle(hWnd
)); 
3291     return GetEventHandler()->ProcessEvent(vEvent
); 
3292 } // end of wxWindowOS2::HandleKillFocus 
3294 // --------------------------------------------------------------------------- 
3296 // --------------------------------------------------------------------------- 
3298 bool wxWindowOS2::HandleShow( 
3300 , int                               WXUNUSED(nStatus
) 
3303     wxShowEvent                     
vEvent(GetId(), bShow
); 
3305     vEvent
.SetEventObject(this); 
3306     return GetEventHandler()->ProcessEvent(vEvent
); 
3307 } // end of wxWindowOS2::HandleShow 
3309 bool wxWindowOS2::HandleInitDialog( WXHWND 
WXUNUSED(hWndFocus
) ) 
3311     wxInitDialogEvent               
vEvent(GetId()); 
3313     vEvent
.SetEventObject(this); 
3314     return GetEventHandler()->ProcessEvent(vEvent
); 
3315 } // end of wxWindowOS2::HandleInitDialog 
3317 bool wxWindowOS2::HandleEndDrag(WXWPARAM 
WXUNUSED(wParam
)) 
3319    // TODO: We'll handle drag and drop later 
3323 bool wxWindowOS2::HandleSetCursor( USHORT 
WXUNUSED(vId
), 
3327     // Under OS/2 PM this allows the pointer to be changed 
3328     // as it passes over a control 
3330     ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)hPointer
); 
3332 } // end of wxWindowOS2::HandleSetCursor 
3334 // --------------------------------------------------------------------------- 
3335 // owner drawn stuff 
3336 // --------------------------------------------------------------------------- 
3337 bool wxWindowOS2::OS2OnDrawItem( int vId
, 
3338                                  WXDRAWITEMSTRUCT
* pItemStruct 
) 
3340 #if wxUSE_OWNER_DRAWN 
3343 #if wxUSE_MENUS_NATIVE 
3345     // Is it a menu item? 
3351         POWNERITEM                  pMeasureStruct 
= (POWNERITEM
)pItemStruct
; 
3352         wxFrame
*                    pFrame 
= (wxFrame
*)this; 
3353         wxMenuItem
*                 pMenuItem 
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
); 
3354         HDC                         hDC 
= ::GpiQueryDevice(pMeasureStruct
->hps
); 
3355         wxRect                      
vRect( pMeasureStruct
->rclItem
.xLeft
 
3356                                           ,pMeasureStruct
->rclItem
.yBottom
 
3357                                           ,pMeasureStruct
->rclItem
.xRight 
- pMeasureStruct
->rclItem
.xLeft
 
3358                                           ,pMeasureStruct
->rclItem
.yTop 
- pMeasureStruct
->rclItem
.yBottom
 
3360         vDc
.SetHDC( hDC
, false ); 
3361         vDc
.SetHPS( pMeasureStruct
->hps 
); 
3363         // Load the wxWidgets Pallete and set to RGB mode 
3365         if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
 
3369                                       ,(LONG
)wxTheColourDatabase
->m_nSize
 
3370                                       ,(PLONG
)wxTheColourDatabase
->m_palTable
 
3373             vError 
= ::WinGetLastError(vHabmain
); 
3374             sError 
= wxPMErrorToStr(vError
); 
3375             wxLogError(_T("Unable to set current color table. Error: %s\n"), sError
.c_str()); 
3378         // Set the color table to RGB mode 
3380         if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
 
3388             vError 
= ::WinGetLastError(vHabmain
); 
3389             sError 
= wxPMErrorToStr(vError
); 
3390             wxLogError(_T("Unable to set current color table. Error: %s\n"), sError
.c_str()); 
3393         wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE 
); 
3398         if (pMeasureStruct
->fsAttribute 
== pMeasureStruct
->fsAttributeOld
) 
3401             // Entire Item needs to be redrawn (either it has reappeared from 
3402             // behind another window or is being displayed for the first time 
3404             eAction 
= wxOwnerDrawn::wxODDrawAll
; 
3406             if (pMeasureStruct
->fsAttribute 
& MIA_HILITED
) 
3409                 // If it is currently selected we let the system handle it 
3411                 eStatus 
|= wxOwnerDrawn::wxODSelected
; 
3413             if (pMeasureStruct
->fsAttribute 
& MIA_CHECKED
) 
3416                 // If it is currently checked we draw our own 
3418                 eStatus 
|= wxOwnerDrawn::wxODChecked
; 
3419                 pMeasureStruct
->fsAttributeOld 
= pMeasureStruct
->fsAttribute 
&= ~MIA_CHECKED
; 
3421             if (pMeasureStruct
->fsAttribute 
& MIA_DISABLED
) 
3424                 // If it is currently disabled we let the system handle it 
3426                 eStatus 
|= wxOwnerDrawn::wxODDisabled
; 
3429             // Don't really care about framed (indicationg focus) or NoDismiss 
3434             if (pMeasureStruct
->fsAttribute 
& MIA_HILITED
) 
3436                 eAction 
= wxOwnerDrawn::wxODDrawAll
; 
3437                 eStatus 
|= wxOwnerDrawn::wxODSelected
; 
3439                 // Keep the system from trying to highlight with its bogus colors 
3441                 pMeasureStruct
->fsAttributeOld 
= pMeasureStruct
->fsAttribute 
&= ~MIA_HILITED
; 
3443             else if (!(pMeasureStruct
->fsAttribute 
& MIA_HILITED
)) 
3445                 eAction 
= wxOwnerDrawn::wxODDrawAll
; 
3448                 // Keep the system from trying to highlight with its bogus colors 
3450                 pMeasureStruct
->fsAttribute 
= pMeasureStruct
->fsAttributeOld 
&= ~MIA_HILITED
; 
3455                 // For now we don't care about anything else 
3456                 // just ignore the entire message! 
3462         // Now redraw the item 
3464         return(pMenuItem
->OnDrawItem( vDc
 
3466                                      ,(wxOwnerDrawn::wxODAction
)eAction
 
3467                                      ,(wxOwnerDrawn::wxODStatus
)eStatus
 
3470         // leave the fsAttribute and fsOldAttribute unchanged.  If different, 
3471         // the system will do the highlight or fraeming or disabling for us, 
3472         // otherwise, we'd have to do it ourselves. 
3475 #endif // wxUSE_MENUS_NATIVE 
3477     wxWindow
*                       pItem 
= FindItem(vId
); 
3479     if (pItem 
&& pItem
->IsKindOf(CLASSINFO(wxControl
))) 
3481         return ((wxControl 
*)pItem
)->OS2OnDraw(pItemStruct
); 
3485     pItemStruct 
= pItemStruct
; 
3488 } // end of wxWindowOS2::OS2OnDrawItem 
3490 long wxWindowOS2::OS2OnMeasureItem( int lId
, 
3491                                     WXMEASUREITEMSTRUCT
* pItemStruct 
) 
3493 #if wxUSE_OWNER_DRAWN 
3495     // Is it a menu item? 
3497     if (lId 
== 65536) // I really don't like this...has to be a better indicator 
3499         if (IsKindOf(CLASSINFO(wxFrame
))) // we'll assume if Frame then a menu 
3503             POWNERITEM              pMeasureStruct 
= (POWNERITEM
)pItemStruct
; 
3504             wxFrame
*                pFrame 
= (wxFrame
*)this; 
3505             wxMenuItem
*             pMenuItem 
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
); 
3507             wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE 
); 
3510             if (pMenuItem
->OnMeasureItem( &nWidth
 
3516                 pMeasureStruct
->rclItem
.xRight  
= nWidth
; 
3517                 pMeasureStruct
->rclItem
.xLeft   
= 0L; 
3518                 pMeasureStruct
->rclItem
.yTop    
= nHeight
; 
3519                 pMeasureStruct
->rclItem
.yBottom 
= 0L; 
3520                 mRc 
= MRFROM2SHORT(nHeight
, nWidth
); 
3521                 return LONGFROMMR(mRc
); 
3526     wxWindow
*                      pItem 
= FindItem(lId
); 
3528     if (pItem 
&& pItem
->IsKindOf(CLASSINFO(wxControl
))) 
3532         vItem
.idItem 
= (LONG
)pItemStruct
; 
3533         return ((wxControl 
*)pItem
)->OS2OnMeasure((WXMEASUREITEMSTRUCT
*)&vItem
); 
3537     pItemStruct 
= pItemStruct
; 
3538 #endif // wxUSE_OWNER_DRAWN 
3542 // --------------------------------------------------------------------------- 
3543 // colours and palettes 
3544 // --------------------------------------------------------------------------- 
3546 bool wxWindowOS2::HandleSysColorChange() 
3548     wxSysColourChangedEvent         vEvent
; 
3550     vEvent
.SetEventObject(this); 
3551     return GetEventHandler()->ProcessEvent(vEvent
); 
3552 } // end of wxWindowOS2::HandleSysColorChange 
3554 bool wxWindowOS2::HandleCtlColor( WXHBRUSH
* WXUNUSED(phBrush
) ) 
3557     // Not much provided with message. So not sure I can do anything with it 
3560 } // end of wxWindowOS2::HandleCtlColor 
3563 // Define for each class of dialog and control 
3564 WXHBRUSH 
wxWindowOS2::OnCtlColor(WXHDC 
WXUNUSED(hDC
), 
3565                                  WXHWND 
WXUNUSED(hWnd
), 
3566                                  WXUINT 
WXUNUSED(nCtlColor
), 
3567                                  WXUINT 
WXUNUSED(message
), 
3568                                  WXWPARAM 
WXUNUSED(wParam
), 
3569                                  WXLPARAM 
WXUNUSED(lParam
)) 
3574 bool wxWindowOS2::HandlePaletteChanged() 
3576     // need to set this to something first 
3577     WXHWND                          hWndPalChange 
= NULLHANDLE
; 
3579     wxPaletteChangedEvent           
vEvent(GetId()); 
3581     vEvent
.SetEventObject(this); 
3582     vEvent
.SetChangedWindow(wxFindWinFromHandle(hWndPalChange
)); 
3584     return GetEventHandler()->ProcessEvent(vEvent
); 
3585 } // end of wxWindowOS2::HandlePaletteChanged 
3588 // Responds to colour changes: passes event on to children. 
3590 void wxWindowOS2::OnSysColourChanged( 
3591   wxSysColourChangedEvent
&          rEvent
 
3594     wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); 
3599         // Only propagate to non-top-level windows 
3601         wxWindow
*                   pWin 
= (wxWindow 
*)node
->GetData(); 
3603         if (pWin
->GetParent()) 
3605             wxSysColourChangedEvent vEvent
; 
3607             rEvent
.SetEventObject(pWin
); 
3608             pWin
->GetEventHandler()->ProcessEvent(vEvent
); 
3610         node 
= node
->GetNext(); 
3612 } // end of wxWindowOS2::OnSysColourChanged 
3614 // --------------------------------------------------------------------------- 
3616 // --------------------------------------------------------------------------- 
3618 void wxWindow::OnPaint ( 
3619   wxPaintEvent
&                     rEvent
 
3622     HDC                             hDC 
= (HDC
)wxPaintDC::FindDCInCache((wxWindow
*) rEvent
.GetEventObject()); 
3626         OS2DefWindowProc( (WXUINT
)WM_PAINT
 
3631 } // end of wxWindow::OnPaint 
3633 bool wxWindowOS2::HandlePaint() 
3636     wxPaintEvent                    
vEvent(m_windowId
); 
3640     // Create empty region 
3641     // TODO: get HPS somewhere else if possible 
3642     hPS  
= ::WinGetPS(GetHwnd()); 
3643     hRgn 
= ::GpiCreateRegion(hPS
, 0, NULL
); 
3645     if (::WinQueryUpdateRegion(GetHwnd(), hRgn
) == RGN_ERROR
) 
3647          wxLogLastError(wxT("CreateRectRgn")); 
3651     // Get all the rectangles from the region, convert the individual 
3652     // rectangles to "the other" coordinate system and reassemble a 
3653     // region from the rectangles, to be feed into m_updateRegion. 
3655     // FIXME: This is a bad hack since OS/2 API specifies that rectangles 
3656     //        passed into GpiSetRegion must not have Bottom > Top, 
3657     //        however, at first sight, it _seems_ to work nonetheless. 
3660     PRECTL                      pUpdateRects 
= NULL
; 
3661     vRgnData
.ulDirection 
= RECTDIR_LFRT_TOPBOT
; 
3662     if (::GpiQueryRegionRects( hPS          
// Pres space 
3663                               ,hRgn         
// Handle of region to query 
3664                               ,NULL         
// Return all RECTs 
3665                               ,&vRgnData    
// Will contain number or RECTs in region 
3666                               ,NULL         
// NULL to return number of RECTs 
3669         pUpdateRects 
= new RECTL
[vRgnData
.crcReturned
]; 
3670         vRgnData
.crc 
= vRgnData
.crcReturned
; 
3671         vRgnData
.ircStart 
= 1; 
3672         if (::GpiQueryRegionRects( hPS      
// Pres space of source 
3673                                   ,hRgn     
// Handle of source region 
3674                                   ,NULL     
// Return all RECTs 
3675                                   ,&vRgnData 
// Operations set to return rects 
3676                                   ,pUpdateRects 
// Will contain the actual RECTS 
3681             ::WinQueryWindowRect(GetHwnd(), &vRect
); 
3682             height 
= vRect
.yTop
; 
3684             for(size_t i 
= 0; i 
< vRgnData
.crc
; i
++) 
3687                 rectHeight 
= pUpdateRects
[i
].yTop 
- pUpdateRects
[i
].yBottom
; 
3688                 pUpdateRects
[i
].yTop 
= height 
- pUpdateRects
[i
].yTop
; 
3689                 pUpdateRects
[i
].yBottom 
= pUpdateRects
[i
].yTop 
+ rectHeight
; 
3691             ::GpiSetRegion(hPS
, hRgn
, vRgnData
.crc
, pUpdateRects
); 
3692             delete [] pUpdateRects
; 
3696     m_updateRegion 
= wxRegion(hRgn
, hPS
); 
3698     vEvent
.SetEventObject(this); 
3699     bProcessed 
= GetEventHandler()->ProcessEvent(vEvent
); 
3702          IsKindOf(CLASSINFO(wxPanel
)) && 
3703          GetChildren().GetCount() == 0 
3707         // OS/2 needs to process this right here, not by the default proc 
3708         // Window's default proc correctly paints everything, OS/2 does not. 
3709         // For decorative panels that typically have no children, we draw 
3715         hPS 
= ::WinBeginPaint( GetHwnd() 
3721             ::GpiCreateLogColorTable( hPS
 
3725                                      ,(LONG
)wxTheColourDatabase
->m_nSize
 
3726                                      ,(PLONG
)wxTheColourDatabase
->m_palTable
 
3728             ::GpiCreateLogColorTable( hPS
 
3735             if (::WinIsWindowVisible(GetHWND())) 
3736                 ::WinFillRect(hPS
, &vRect
,  GetBackgroundColour().GetPixel()); 
3739                 LINEBUNDLE      vLineBundle
; 
3741                 vLineBundle
.lColor     
= 0x00000000; // Black 
3742                 vLineBundle
.usMixMode  
= FM_OVERPAINT
; 
3743                 vLineBundle
.fxWidth    
= 1; 
3744                 vLineBundle
.lGeomWidth 
= 1; 
3745                 vLineBundle
.usType     
= LINETYPE_SOLID
; 
3746                 vLineBundle
.usEnd      
= 0; 
3747                 vLineBundle
.usJoin     
= 0; 
3750                               ,LBB_COLOR 
| LBB_MIX_MODE 
| LBB_WIDTH 
| LBB_GEOM_WIDTH 
| LBB_TYPE
 
3754                 ::WinQueryWindowRect(GetHwnd(), &vRect
); 
3764     else if (!bProcessed 
&& 
3765              IsKindOf(CLASSINFO(wxPanel
)) 
3769         // Panel with children, usually fills a frame client so no borders. 
3774         hPS 
= ::WinBeginPaint( GetHwnd() 
3780             ::GpiCreateLogColorTable( hPS
 
3784                                      ,(LONG
)wxTheColourDatabase
->m_nSize
 
3785                                      ,(PLONG
)wxTheColourDatabase
->m_palTable
 
3787             ::GpiCreateLogColorTable( hPS
 
3795             if (::WinIsWindowVisible(GetHWND())) 
3796                 ::WinFillRect(hPS
, &vRect
,  GetBackgroundColour().GetPixel()); 
3802 } // end of wxWindowOS2::HandlePaint 
3804 bool wxWindowOS2::HandleEraseBkgnd( WXHDC hDC 
) 
3809     ::WinQueryWindowPos(GetHwnd(), &vSwp
); 
3810     if (vSwp
.fl 
& SWP_MINIMIZE
) 
3815     vDC
.m_hPS 
= (HPS
)hDC
; // this is really a PS 
3816     vDC
.SetWindow((wxWindow
*)this); 
3819     wxEraseEvent 
vEvent(m_windowId
, &vDC
); 
3821     vEvent
.SetEventObject(this); 
3823     rc 
= GetEventHandler()->ProcessEvent(vEvent
); 
3826     vDC
.m_hPS 
= NULLHANDLE
; 
3828 } // end of wxWindowOS2::HandleEraseBkgnd 
3830 void wxWindowOS2::OnEraseBackground(wxEraseEvent
& rEvent
) 
3833     HPS     hPS 
= rEvent
.GetDC()->GetHPS(); 
3835     LONG    lColor 
= m_backgroundColour
.GetPixel(); 
3837     rc 
= ::WinQueryWindowRect(GetHwnd(), &vRect
); 
3838     rc 
= ::WinFillRect(hPS
, &vRect
, lColor
); 
3839 }  // end of wxWindowOS2::OnEraseBackground 
3841 // --------------------------------------------------------------------------- 
3842 // moving and resizing 
3843 // --------------------------------------------------------------------------- 
3845 bool wxWindowOS2::HandleMinimize() 
3847     wxIconizeEvent                  
vEvent(m_windowId
); 
3849     vEvent
.SetEventObject(this); 
3850     return GetEventHandler()->ProcessEvent(vEvent
); 
3851 } // end of wxWindowOS2::HandleMinimize 
3853 bool wxWindowOS2::HandleMaximize() 
3855     wxMaximizeEvent                 
vEvent(m_windowId
); 
3857     vEvent
.SetEventObject(this); 
3858     return GetEventHandler()->ProcessEvent(vEvent
); 
3859 } // end of wxWindowOS2::HandleMaximize 
3861 bool wxWindowOS2::HandleMove( int nX
, int nY 
) 
3864     wxMoveEvent 
vEvent(pt
, m_windowId
); 
3866     vEvent
.SetEventObject(this); 
3867     return GetEventHandler()->ProcessEvent(vEvent
); 
3868 }  // end of wxWindowOS2::HandleMove 
3870 bool wxWindowOS2::HandleSize( int    nWidth
, 
3872                               WXUINT 
WXUNUSED(nFlag
) ) 
3874     wxSize 
sz(nWidth
, nHeight
); 
3875     wxSizeEvent 
vEvent(sz
, m_windowId
); 
3877     vEvent
.SetEventObject(this); 
3878     return GetEventHandler()->ProcessEvent(vEvent
); 
3879 } // end of wxWindowOS2::HandleSize 
3881 bool wxWindowOS2::HandleGetMinMaxInfo( PSWP pSwp 
) 
3888             ::WinGetMaxPosition(GetHwnd(), pSwp
); 
3889             m_maxWidth 
= pSwp
->cx
; 
3890             m_maxHeight 
= pSwp
->cy
; 
3894             ::WinGetMinPosition(GetHwnd(), pSwp
, &vPoint
); 
3895             m_minWidth 
= pSwp
->cx
; 
3896             m_minHeight 
= pSwp
->cy
; 
3903 } // end of wxWindowOS2::HandleGetMinMaxInfo 
3905 // --------------------------------------------------------------------------- 
3907 // --------------------------------------------------------------------------- 
3908 bool wxWindowOS2::HandleCommand( WXWORD wId
, 
3912 #if wxUSE_MENUS_NATIVE 
3913     if (wxCurrentPopupMenu
) 
3915         wxMenu
*                     pPopupMenu 
= wxCurrentPopupMenu
; 
3917         wxCurrentPopupMenu 
= NULL
; 
3918         return pPopupMenu
->OS2Command(wCmd
, wId
); 
3920 #endif // wxUSE_MENUS_NATIVE 
3922     wxWindow
*                       pWin 
= FindItem(wId
); 
3926         pWin 
= wxFindWinFromHandle(hControl
); 
3930         return pWin
->OS2Command(wCmd
, wId
); 
3933 } // end of wxWindowOS2::HandleCommand 
3935 bool wxWindowOS2::HandleSysCommand( WXWPARAM wParam
, 
3936                                     WXLPARAM 
WXUNUSED(lParam
) ) 
3939     // 4 bits are reserved 
3941     switch (SHORT1FROMMP(wParam
)) 
3944             return HandleMaximize(); 
3947             return HandleMinimize(); 
3950 } // end of wxWindowOS2::HandleSysCommand 
3952 // --------------------------------------------------------------------------- 
3954 // --------------------------------------------------------------------------- 
3955 //TODO: check against MSW 
3956 void wxWindowOS2::InitMouseEvent( 
3957   wxMouseEvent
&                     rEvent
 
3964     DoGetSize(0, &nHeight
); 
3966     // Convert to wxWidgets standard coordinate system! 
3967     rEvent
.m_y           
= nHeight 
- nY
; 
3968     rEvent
.m_shiftDown   
= ((uFlags 
& KC_SHIFT
) != 0); 
3969     rEvent
.m_controlDown 
= ((uFlags 
& KC_CTRL
) != 0); 
3970     rEvent
.m_altDown     
= ((uFlags 
& KC_ALT
) != 0); 
3971     rEvent
.m_leftDown    
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON1
) & 
3973     rEvent
.m_middleDown  
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON3
) & 
3975     rEvent
.m_rightDown   
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON2
) & 
3977     rEvent
.SetTimestamp(s_currentMsg
.time
); 
3978     rEvent
.SetEventObject(this); 
3979     rEvent
.SetId(GetId()); 
3981 #if wxUSE_MOUSEEVENT_HACK 
3984     m_lastMouseEvent 
= rEvent
.GetEventType(); 
3985 #endif // wxUSE_MOUSEEVENT_HACK 
3986 } // end of wxWindowOS2::InitMouseEvent 
3988 bool wxWindowOS2::HandleMouseEvent( WXUINT uMsg
, 
3993     bool bProcessed 
= false; 
3996     // The mouse events take consecutive IDs from WM_MOUSEFIRST to 
3997     // WM_MOUSELAST, so it's enough to subtract WM_MOUSEMOVE == WM_MOUSEFIRST 
3998     // from the message id and take the value in the table to get wxWin event 
4001     static const wxEventType eventsMouse
[] = 
4016     if ((uMsg 
>= WM_MOUSEMOVE
) && (uMsg 
<= WM_BUTTON3DBLCLK
)) 
4018         wxMouseEvent 
vEvent(eventsMouse
[uMsg 
- WM_MOUSEMOVE
]); 
4020         InitMouseEvent( vEvent
 
4026         bProcessed 
= GetEventHandler()->ProcessEvent(vEvent
); 
4029             HPOINTER hCursor 
= (HPOINTER
)GetCursor().GetHCURSOR(); 
4031             if (hCursor 
!= NULLHANDLE
) 
4033                 ::WinSetPointer(HWND_DESKTOP
, hCursor
); 
4039 } // end of wxWindowOS2::HandleMouseEvent 
4041 bool wxWindowOS2::HandleMouseMove( int nX
, 
4045     if (!m_bMouseInWindow
) 
4048         // Generate an ENTER event 
4050         m_bMouseInWindow 
= true; 
4052         wxMouseEvent 
vEvent(wxEVT_ENTER_WINDOW
); 
4054         InitMouseEvent( vEvent
 
4060         (void)GetEventHandler()->ProcessEvent(vEvent
); 
4062     return HandleMouseEvent( WM_MOUSEMOVE
 
4067 } // end of wxWindowOS2::HandleMouseMove 
4069 // --------------------------------------------------------------------------- 
4070 // keyboard handling 
4071 // --------------------------------------------------------------------------- 
4074 // Create the key event of the given type for the given key - used by 
4075 // HandleChar and HandleKeyDown/Up 
4077 wxKeyEvent 
wxWindowOS2::CreateKeyEvent( 
4084     wxKeyEvent                      
vEvent(eType
); 
4086     vEvent
.SetId(GetId()); 
4087     vEvent
.m_shiftDown   
= IsShiftDown(); 
4088     vEvent
.m_controlDown 
= IsCtrlDown(); 
4089     vEvent
.m_altDown     
= (HIWORD(lParam
) & KC_ALT
) == KC_ALT
; 
4091     vEvent
.SetEventObject((wxWindow 
*)this); // const_cast 
4092     vEvent
.m_keyCode     
= nId
; 
4093     vEvent
.m_rawCode 
= (wxUint32
)wParam
; 
4094     vEvent
.m_rawFlags 
= (wxUint32
)lParam
; 
4095     vEvent
.SetTimestamp(s_currentMsg
.time
); 
4098     // Translate the position to client coords 
4103     ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
4104     ::WinQueryWindowRect( GetHwnd() 
4108     vPoint
.x 
-= vRect
.xLeft
; 
4109     vPoint
.y 
-= vRect
.yBottom
; 
4111     vEvent
.m_x 
= vPoint
.x
; 
4112     vEvent
.m_y 
= vPoint
.y
; 
4115 } // end of wxWindowOS2::CreateKeyEvent 
4118 // isASCII is true only when we're called from WM_CHAR handler and not from 
4121 bool wxWindowOS2::HandleChar( WXWPARAM 
WXUNUSED(wParam
), 
4125     bool bCtrlDown 
= false; 
4128     if (m_bLastKeydownProcessed
) 
4131         // The key was handled in the EVT_KEY_DOWN.  Handling a key in an 
4132         // EVT_KEY_DOWN handler is meant, by design, to prevent EVT_CHARs 
4133         // from happening, so just bail out at this point. 
4135         m_bLastKeydownProcessed 
= false; 
4141         // If 1 -> 26, translate to either special keycode or just set 
4142         // ctrlDown.  IOW, Ctrl-C should result in keycode == 3 and 
4143         // ControlDown() == true. 
4145         vId 
= SHORT1FROMMP(lParam
); 
4146         if ((vId 
> 0) && (vId 
< 27)) 
4168     else  // we're called from WM_KEYDOWN 
4170         vId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4175     wxKeyEvent 
vEvent(CreateKeyEvent( wxEVT_CHAR
, vId
, lParam 
)); 
4179         vEvent
.m_controlDown 
= true; 
4182     return (GetEventHandler()->ProcessEvent(vEvent
)); 
4185 bool wxWindowOS2::HandleKeyDown( WXWPARAM wParam
, 
4188     int nId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4193         // Normal ASCII char 
4195         nId 
= SHORT1FROMMP(lParam
); 
4200         wxKeyEvent  
vEvent(CreateKeyEvent( wxEVT_KEY_DOWN
 
4206         if (GetEventHandler()->ProcessEvent(vEvent
)) 
4212 } // end of wxWindowOS2::HandleKeyDown 
4214 bool wxWindowOS2::HandleKeyUp( WXWPARAM wParam
, 
4217     int nId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4222         // Normal ASCII char 
4224         nId 
= CHAR1FROMMP(lParam
); 
4229         wxKeyEvent 
vEvent(CreateKeyEvent( wxEVT_KEY_UP
 
4235         if (GetEventHandler()->ProcessEvent(vEvent
)) 
4239 } // end of wxWindowOS2::HandleKeyUp 
4241 // --------------------------------------------------------------------------- 
4243 // --------------------------------------------------------------------------- 
4245 // --------------------------------------------------------------------------- 
4247 // --------------------------------------------------------------------------- 
4249 bool wxWindowOS2::OS2OnScroll( int nOrientation
, 
4256         wxWindow
*                   pChild 
= wxFindWinFromHandle(hControl
); 
4259             return pChild
->OS2OnScroll( nOrientation
 
4266     wxScrollWinEvent                vEvent
; 
4268     vEvent
.SetPosition(wPos
); 
4269     vEvent
.SetOrientation(nOrientation
); 
4270     vEvent
.SetEventObject(this); 
4275             vEvent
.SetEventType(wxEVT_SCROLLWIN_LINEUP
); 
4279             vEvent
.SetEventType(wxEVT_SCROLLWIN_LINEDOWN
); 
4283             vEvent
.SetEventType(wxEVT_SCROLLWIN_PAGEUP
); 
4287             vEvent
.SetEventType(wxEVT_SCROLLWIN_PAGEDOWN
); 
4290         case SB_SLIDERPOSITION
: 
4291             vEvent
.SetEventType(wxEVT_SCROLLWIN_THUMBRELEASE
); 
4294         case SB_SLIDERTRACK
: 
4295             vEvent
.SetEventType(wxEVT_SCROLLWIN_THUMBTRACK
); 
4301     return GetEventHandler()->ProcessEvent(vEvent
); 
4302 } // end of wxWindowOS2::OS2OnScroll 
4304 void wxWindowOS2::MoveChildren( 
4309     // We want to handle top levels ourself, manually 
4311     if (!IsTopLevel() && GetAutoLayout()) 
4319         for (wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); 
4321              node 
= node
->GetNext()) 
4323             wxWindow
*               pWin 
= node
->GetData(); 
4325             ::WinQueryWindowPos( GetHwndOf(pWin
) 
4328             // Actually, only move children that already are placed on the 
4329             // frame, not ones which are still at wxDefaultCoord. 
4330             if (vSwp
.y 
== wxDefaultCoord
) 
4332             if (pWin
->IsKindOf(CLASSINFO(wxControl
))) 
4337                 // Must deal with controls that have margins like ENTRYFIELD.  The SWP 
4338                 // struct of such a control will have and origin offset from its intended 
4339                 // position by the width of the margins. 
4341                 pCtrl 
= wxDynamicCast(pWin
, wxControl
); 
4342                 vSwp
.y 
-= pCtrl
->GetYComp(); 
4343                 vSwp
.x 
-= pCtrl
->GetXComp(); 
4345             ::WinSetWindowPos( GetHwndOf(pWin
) 
4353             ::WinQueryWindowPos(GetHwndOf(pWin
), pWin
->GetSwp()); 
4354             if (pWin
->IsKindOf(CLASSINFO(wxRadioBox
))) 
4356                 wxRadioBox
*     pRadioBox
; 
4358                 pRadioBox 
= wxDynamicCast(pWin
, wxRadioBox
); 
4359                 pRadioBox
->AdjustButtons( (int)vSwp
.x
 
4360                                          ,(int)vSwp
.y 
- nDiff
 
4363                                          ,pRadioBox
->GetSizeFlags() 
4366             if (pWin
->IsKindOf(CLASSINFO(wxSlider
))) 
4370                 pSlider 
= wxDynamicCast(pWin
, wxSlider
); 
4371                 pSlider
->AdjustSubControls( (int)vSwp
.x
 
4372                                            ,(int)vSwp
.y 
- nDiff
 
4375                                            ,(int)pSlider
->GetSizeFlags() 
4381 } // end of wxWindowOS2::MoveChildren 
4384 //  Getting the Y position for a window, like a control, is a real 
4385 //  pain.  There are three sitatuions we must deal with in determining 
4386 //  the OS2 to wxWidgets Y coordinate. 
4388 //  1)  The controls are created in a dialog. 
4389 //      This is the easiest since a dialog is created with its original 
4390 //      size so the standard: Y = ParentHeight - (Y + ControlHeight); 
4392 //  2)  The controls are direct children of a frame 
4393 //      In this instance the controls are actually children of the Frame's 
4394 //      client.  During creation the frame's client resizes several times 
4395 //      during creation of the status bar and toolbars.  The CFrame class 
4396 //      will take care of this using its AlterChildPos proc. 
4398 //  3)  The controls are children of a panel, which in turn is a child of 
4400 //      The panel may be one of many, in which case the same treatment 
4401 //      as 1 applies. It may be the only child, though. 
4402 //      This is the nastiest case.  A panel is created as the only child of 
4403 //      the frame and as such, when a frame has only one child, the child is 
4404 //      expanded to fit the entire client area of the frame.  Because the 
4405 //      controls are created BEFORE this occurs their positions are totally 
4406 //      whacked and any call to WinQueryWindowPos will return invalid 
4407 //      coordinates.  So for this situation we have to compare the size of 
4408 //      the panel at control creation time with that of the frame client.  If 
4409 //      they are the same we can use the standard Y position equation.  If 
4410 //      not, then we must use the Frame Client's dimensions to position them 
4411 //      as that will be the eventual size of the panel after the frame resizes 
4414 int wxWindowOS2::GetOS2ParentHeight( wxWindowOS2
* pParent 
) 
4419     if (pParent
->IsKindOf(CLASSINFO(wxDialog
))) 
4420         return(pParent
->GetClientSize().y
); 
4423     // Case 2 -- if we are one of the separately built standard Frame 
4424     //           children, like a statusbar, menubar, or toolbar we want to 
4425     //           use the frame, itself, for positioning.  Otherwise we are 
4426     //           child window and want to use the Frame's client. 
4428     else if (pParent
->IsKindOf(CLASSINFO(wxFrame
))) 
4430         if (IsKindOf(CLASSINFO(wxStatusBar
)) || 
4431             IsKindOf(CLASSINFO(wxMenuBar
))   || 
4432             IsKindOf(CLASSINFO(wxToolBar
)) 
4435             if (IsKindOf(CLASSINFO(wxToolBar
))) 
4437                 wxFrame
*            pFrame 
= wxDynamicCast(GetParent(), wxFrame
); 
4439                 if (pFrame
->GetToolBar() == this) 
4440                     return(pParent
->GetSize().y
); 
4442                     return(pParent
->GetClientSize().y
); 
4445                 return(pParent
->GetSize().y
); 
4448             return(pParent
->GetClientSize().y
); 
4451     // Case -- this is for any window that is the sole child of a Frame. 
4452     //         The grandparent must exist and it must be of type CFrame 
4453     //         and it's height must be different. Otherwise the standard 
4459     return(pParent
->GetClientSize().y
); 
4462 } // end of wxWindowOS2::GetOS2ParentHeight 
4465 // OS/2 needs a lot extra manipulation to deal with layouts 
4466 // for canvas windows, particularly scrolled ones. 
4468 wxWindowCreationHook::wxWindowCreationHook( 
4469   wxWindow
*                         pWinBeingCreated
 
4472     gpWinBeingCreated 
= pWinBeingCreated
; 
4473 } // end of wxWindowCreationHook::wxWindowCreationHook 
4475 wxWindowCreationHook::~wxWindowCreationHook() 
4477     gpWinBeingCreated 
= NULL
; 
4478 } // end of wxWindowCreationHook::~wxWindowCreationHook 
4480 // =========================================================================== 
4482 // =========================================================================== 
4488 ,wxFont
*                            WXUNUSED(pTheFont
) 
4495     hPS 
=::WinGetPS(hWnd
); 
4497     rc 
= ::GpiQueryFontMetrics(hPS
, sizeof(FONTMETRICS
), &vFM
); 
4501             *pX 
= vFM
.lAveCharWidth
; 
4503             *pY 
= vFM
.lEmHeight 
+ vFM
.lExternalLeading
; 
4512     ::WinReleasePS(hPS
); 
4513 } // end of wxGetCharSize 
4516 // Returns 0 if was a normal ASCII value, not a special key. This indicates that 
4517 // the key should be ignored by WM_KEYDOWN and processed by WM_CHAR instead. 
4519 int wxCharCodeOS2ToWX( 
4527         case VK_BACKTAB
:    nId 
= WXK_BACK
; break; 
4528         case VK_TAB
:        nId 
= WXK_TAB
; break; 
4529         case VK_CLEAR
:      nId 
= WXK_CLEAR
; break; 
4530         case VK_ENTER
:      nId 
= WXK_RETURN
; break; 
4531         case VK_SHIFT
:      nId 
= WXK_SHIFT
; break; 
4532         case VK_CTRL
:       nId 
= WXK_CONTROL
; break; 
4533         case VK_PAUSE
:      nId 
= WXK_PAUSE
; break; 
4534         case VK_SPACE
:      nId 
= WXK_SPACE
; break; 
4535         case VK_PAGEUP
:     nId 
= WXK_PRIOR
; break; 
4536         case VK_PAGEDOWN
:   nId 
= WXK_NEXT
; break; 
4537         case VK_ESC
:        nId 
= WXK_ESCAPE
; break; 
4538         case VK_END
:        nId 
= WXK_END
; break; 
4539         case VK_HOME 
:      nId 
= WXK_HOME
; break; 
4540         case VK_LEFT 
:      nId 
= WXK_LEFT
; break; 
4541         case VK_UP
:         nId 
= WXK_UP
; break; 
4542         case VK_RIGHT
:      nId 
= WXK_RIGHT
; break; 
4543         case VK_DOWN 
:      nId 
= WXK_DOWN
; break; 
4544         case VK_PRINTSCRN
:  nId 
= WXK_PRINT
; break; 
4545         case VK_INSERT
:     nId 
= WXK_INSERT
; break; 
4546         case VK_DELETE
:     nId 
= WXK_DELETE
; break; 
4547         case VK_CAPSLOCK
:   nId 
= WXK_CAPITAL
; break; 
4548         case VK_F1
:         nId 
= WXK_F1
; break; 
4549         case VK_F2
:         nId 
= WXK_F2
; break; 
4550         case VK_F3
:         nId 
= WXK_F3
; break; 
4551         case VK_F4
:         nId 
= WXK_F4
; break; 
4552         case VK_F5
:         nId 
= WXK_F5
; break; 
4553         case VK_F6
:         nId 
= WXK_F6
; break; 
4554         case VK_F7
:         nId 
= WXK_F7
; break; 
4555         case VK_F8
:         nId 
= WXK_F8
; break; 
4556         case VK_F9
:         nId 
= WXK_F9
; break; 
4557         case VK_F10
:        nId 
= WXK_F10
; break; 
4558         case VK_F11
:        nId 
= WXK_F11
; break; 
4559         case VK_F12
:        nId 
= WXK_F12
; break; 
4560         case VK_F13
:        nId 
= WXK_F13
; break; 
4561         case VK_F14
:        nId 
= WXK_F14
; break; 
4562         case VK_F15
:        nId 
= WXK_F15
; break; 
4563         case VK_F16
:        nId 
= WXK_F16
; break; 
4564         case VK_F17
:        nId 
= WXK_F17
; break; 
4565         case VK_F18
:        nId 
= WXK_F18
; break; 
4566         case VK_F19
:        nId 
= WXK_F19
; break; 
4567         case VK_F20
:        nId 
= WXK_F20
; break; 
4568         case VK_F21
:        nId 
= WXK_F21
; break; 
4569         case VK_F22
:        nId 
= WXK_F22
; break; 
4570         case VK_F23
:        nId 
= WXK_F23
; break; 
4571         case VK_F24
:        nId 
= WXK_F24
; break; 
4572         case VK_OEM_1
:      nId 
= ';'; break; 
4573         case VK_OEM_PLUS
:   nId 
= '+'; break; 
4574         case VK_OEM_COMMA
:  nId 
= ','; break; 
4575         case VK_OEM_MINUS
:  nId 
= '-'; break; 
4576         case VK_OEM_PERIOD
: nId 
= '.'; break; 
4577         case VK_OEM_2
:      nId 
= '/'; break; 
4578         case VK_OEM_3
:      nId 
= '~'; break; 
4579         case VK_OEM_4
:      nId 
= '['; break; 
4580         case VK_OEM_5
:      nId 
= '\\'; break; 
4581         case VK_OEM_6
:      nId 
= ']'; break; 
4582         case VK_OEM_7
:      nId 
= '\''; break; 
4583         case VK_NUMLOCK
:    nId 
= WXK_NUMLOCK
; break; 
4584         case VK_SCRLLOCK
:   nId 
= WXK_SCROLL
; break; 
4591 } // end of wxCharCodeOS2ToWX 
4593 int wxCharCodeWXToOS2( int nId
, 
4601         case WXK_CLEAR
:     nKeySym 
= VK_CLEAR
; break; 
4602         case WXK_SHIFT
:     nKeySym 
= VK_SHIFT
; break; 
4603         case WXK_CONTROL
:   nKeySym 
= VK_CTRL
; break; 
4604         case WXK_PAUSE
:     nKeySym 
= VK_PAUSE
; break; 
4605         case WXK_PRIOR
:     nKeySym 
= VK_PAGEUP
; break; 
4606         case WXK_NEXT 
:     nKeySym 
= VK_PAGEDOWN
; break; 
4607         case WXK_END
:       nKeySym 
= VK_END
; break; 
4608         case WXK_HOME 
:     nKeySym 
= VK_HOME
; break; 
4609         case WXK_LEFT 
:     nKeySym 
= VK_LEFT
; break; 
4610         case WXK_UP
:        nKeySym 
= VK_UP
; break; 
4611         case WXK_RIGHT
:     nKeySym 
= VK_RIGHT
; break; 
4612         case WXK_DOWN 
:     nKeySym 
= VK_DOWN
; break; 
4613         case WXK_PRINT
:     nKeySym 
= VK_PRINTSCRN
; break; 
4614         case WXK_INSERT
:    nKeySym 
= VK_INSERT
; break; 
4615         case WXK_DELETE
:    nKeySym 
= VK_DELETE
; break; 
4616         case WXK_F1
:        nKeySym 
= VK_F1
; break; 
4617         case WXK_F2
:        nKeySym 
= VK_F2
; break; 
4618         case WXK_F3
:        nKeySym 
= VK_F3
; break; 
4619         case WXK_F4
:        nKeySym 
= VK_F4
; break; 
4620         case WXK_F5
:        nKeySym 
= VK_F5
; break; 
4621         case WXK_F6
:        nKeySym 
= VK_F6
; break; 
4622         case WXK_F7
:        nKeySym 
= VK_F7
; break; 
4623         case WXK_F8
:        nKeySym 
= VK_F8
; break; 
4624         case WXK_F9
:        nKeySym 
= VK_F9
; break; 
4625         case WXK_F10
:       nKeySym 
= VK_F10
; break; 
4626         case WXK_F11
:       nKeySym 
= VK_F11
; break; 
4627         case WXK_F12
:       nKeySym 
= VK_F12
; break; 
4628         case WXK_F13
:       nKeySym 
= VK_F13
; break; 
4629         case WXK_F14
:       nKeySym 
= VK_F14
; break; 
4630         case WXK_F15
:       nKeySym 
= VK_F15
; break; 
4631         case WXK_F16
:       nKeySym 
= VK_F16
; break; 
4632         case WXK_F17
:       nKeySym 
= VK_F17
; break; 
4633         case WXK_F18
:       nKeySym 
= VK_F18
; break; 
4634         case WXK_F19
:       nKeySym 
= VK_F19
; break; 
4635         case WXK_F20
:       nKeySym 
= VK_F20
; break; 
4636         case WXK_F21
:       nKeySym 
= VK_F21
; break; 
4637         case WXK_F22
:       nKeySym 
= VK_F22
; break; 
4638         case WXK_F23
:       nKeySym 
= VK_F23
; break; 
4639         case WXK_F24
:       nKeySym 
= VK_F24
; break; 
4640         case WXK_NUMLOCK
:   nKeySym 
= VK_NUMLOCK
; break; 
4641         case WXK_SCROLL
:    nKeySym 
= VK_SCRLLOCK
; break; 
4644             *bIsVirtual 
= false; 
4650 } // end of wxCharCodeWXToOS2 
4652 wxWindow
* wxGetActiveWindow() 
4654     HWND                            hWnd 
= ::WinQueryActiveWindow(HWND_DESKTOP
); 
4658         return wxFindWinFromHandle((WXHWND
)hWnd
); 
4661 } // end of wxGetActiveWindow 
4664 const wxChar
* wxGetMessageName( int nMessage 
) 
4668         case 0x0000: return wxT("WM_NULL"); 
4669         case 0x0001: return wxT("WM_CREATE"); 
4670         case 0x0002: return wxT("WM_DESTROY"); 
4671         case 0x0004: return wxT("WM_ENABLE"); 
4672         case 0x0005: return wxT("WM_SHOW"); 
4673         case 0x0006: return wxT("WM_MOVE"); 
4674         case 0x0007: return wxT("WM_SIZE"); 
4675         case 0x0008: return wxT("WM_ADJUSTWINDOWPOS"); 
4676         case 0x0009: return wxT("WM_CALCVALIDRECTS"); 
4677         case 0x000A: return wxT("WM_SETWINDOWPARAMS"); 
4678         case 0x000B: return wxT("WM_QUERYWINDOWPARAMS"); 
4679         case 0x000C: return wxT("WM_HITTEST"); 
4680         case 0x000D: return wxT("WM_ACTIVATE"); 
4681         case 0x000F: return wxT("WM_SETFOCUS"); 
4682         case 0x0010: return wxT("WM_SETSELECTION"); 
4683         case 0x0011: return wxT("WM_PPAINT"); 
4684         case 0x0012: return wxT("WM_PSETFOCUS"); 
4685         case 0x0013: return wxT("WM_PSYSCOLORCHANGE"); 
4686         case 0x0014: return wxT("WM_PSIZE"); 
4687         case 0x0015: return wxT("WM_PACTIVATE"); 
4688         case 0x0016: return wxT("WM_PCONTROL"); 
4689         case 0x0020: return wxT("WM_COMMAND"); 
4690         case 0x0021: return wxT("WM_SYSCOMMAND"); 
4691         case 0x0022: return wxT("WM_HELP"); 
4692         case 0x0023: return wxT("WM_PAINT"); 
4693         case 0x0024: return wxT("WM_TIMER"); 
4694         case 0x0025: return wxT("WM_SEM1"); 
4695         case 0x0026: return wxT("WM_SEM2"); 
4696         case 0x0027: return wxT("WM_SEM3"); 
4697         case 0x0028: return wxT("WM_SEM4"); 
4698         case 0x0029: return wxT("WM_CLOSE"); 
4699         case 0x002A: return wxT("WM_QUIT"); 
4700         case 0x002B: return wxT("WM_SYSCOLORCHANGE"); 
4701         case 0x002D: return wxT("WM_SYSVALUECHANGE"); 
4702         case 0x002E: return wxT("WM_APPTERMINATENOTIFY"); 
4703         case 0x002F: return wxT("WM_PRESPARAMCHANGED"); 
4704         // Control notification messages 
4705         case 0x0030: return wxT("WM_CONTROL"); 
4706         case 0x0031: return wxT("WM_VSCROLL"); 
4707         case 0x0032: return wxT("WM_HSCROLL"); 
4708         case 0x0033: return wxT("WM_INITMENU"); 
4709         case 0x0034: return wxT("WM_MENUSELECT"); 
4710         case 0x0035: return wxT("WM_MENUSEND"); 
4711         case 0x0036: return wxT("WM_DRAWITEM"); 
4712         case 0x0037: return wxT("WM_MEASUREITEM"); 
4713         case 0x0038: return wxT("WM_CONTROLPOINTER"); 
4714         case 0x003A: return wxT("WM_QUERYDLGCODE"); 
4715         case 0x003B: return wxT("WM_INITDLG"); 
4716         case 0x003C: return wxT("WM_SUBSTITUTESTRING"); 
4717         case 0x003D: return wxT("WM_MATCHMNEMONIC"); 
4718         case 0x003E: return wxT("WM_SAVEAPPLICATION"); 
4719         case 0x0129: return wxT("WM_CTLCOLORCHANGE"); 
4720         case 0x0130: return wxT("WM_QUERYCTLTYPE"); 
4722         case 0x0040: return wxT("WM_FLASHWINDOW"); 
4723         case 0x0041: return wxT("WM_FORMATFRAME"); 
4724         case 0x0042: return wxT("WM_UPDATEFRAME"); 
4725         case 0x0043: return wxT("WM_FOCUSCHANGE"); 
4726         case 0x0044: return wxT("WM_SETBORDERSIZE"); 
4727         case 0x0045: return wxT("WM_TRACKFRAME"); 
4728         case 0x0046: return wxT("WM_MINMAXFRAME"); 
4729         case 0x0047: return wxT("WM_SETICON"); 
4730         case 0x0048: return wxT("WM_QUERYICON"); 
4731         case 0x0049: return wxT("WM_SETACCELTABLE"); 
4732         case 0x004A: return wxT("WM_QUERYACCELTABLE"); 
4733         case 0x004B: return wxT("WM_TRANSLATEACCEL"); 
4734         case 0x004C: return wxT("WM_QUERYTRACKINFO"); 
4735         case 0x004D: return wxT("WM_QUERYBORDERSIZE"); 
4736         case 0x004E: return wxT("WM_NEXTMENU"); 
4737         case 0x004F: return wxT("WM_ERASEBACKGROUND"); 
4738         case 0x0050: return wxT("WM_QUERYFRAMEINFO"); 
4739         case 0x0051: return wxT("WM_QUERYFOCUSCHAIN"); 
4740         case 0x0052: return wxT("WM_OWNERPOSCHANGE"); 
4741         case 0x0053: return wxT("WM_CACLFRAMERECT"); 
4742         case 0x0055: return wxT("WM_WINDOWPOSCHANGED"); 
4743         case 0x0056: return wxT("WM_ADJUSTFRAMEPOS"); 
4744         case 0x0059: return wxT("WM_QUERYFRAMECTLCOUNT"); 
4745         case 0x005B: return wxT("WM_QUERYHELPINFO"); 
4746         case 0x005C: return wxT("WM_SETHELPINFO"); 
4747         case 0x005D: return wxT("WM_ERROR"); 
4748         case 0x005E: return wxT("WM_REALIZEPALETTE"); 
4749         // Clipboard messages 
4750         case 0x0060: return wxT("WM_RENDERFMT"); 
4751         case 0x0061: return wxT("WM_RENDERALLFMTS"); 
4752         case 0x0062: return wxT("WM_DESTROYCLIPBOARD"); 
4753         case 0x0063: return wxT("WM_PAINTCLIPBOARD"); 
4754         case 0x0064: return wxT("WM_SIZECLIPBOARD"); 
4755         case 0x0065: return wxT("WM_HSCROLLCLIPBOARD"); 
4756         case 0x0066: return wxT("WM_VSCROLLCLIPBOARD"); 
4757         case 0x0067: return wxT("WM_DRAWCLIPBOARD"); 
4759         case 0x0070: return wxT("WM_MOUSEMOVE"); 
4760         case 0x0071: return wxT("WM_BUTTON1DOWN"); 
4761         case 0x0072: return wxT("WM_BUTTON1UP"); 
4762         case 0x0073: return wxT("WM_BUTTON1DBLCLK"); 
4763         case 0x0074: return wxT("WM_BUTTON2DOWN"); 
4764         case 0x0075: return wxT("WM_BUTTON2UP"); 
4765         case 0x0076: return wxT("WM_BUTTON2DBLCLK"); 
4766         case 0x0077: return wxT("WM_BUTTON3DOWN"); 
4767         case 0x0078: return wxT("WM_BUTTON3UP"); 
4768         case 0x0079: return wxT("WM_BUTTON3DBLCLK"); 
4769         case 0x007D: return wxT("WM_MOUSEMAP"); 
4770         case 0x007E: return wxT("WM_VRNDISABLED"); 
4771         case 0x007F: return wxT("WM_VRNENABLED"); 
4772         case 0x0410: return wxT("WM_CHORD"); 
4773         case 0x0411: return wxT("WM_BUTTON1MOTIONSTART"); 
4774         case 0x0412: return wxT("WM_BUTTON1MOTIONEND"); 
4775         case 0x0413: return wxT("WM_BUTTON1CLICK"); 
4776         case 0x0414: return wxT("WM_BUTTON2MOTIONSTART"); 
4777         case 0x0415: return wxT("WM_BUTTON2MOTIONEND"); 
4778         case 0x0416: return wxT("WM_BUTTON2CLICK"); 
4779         case 0x0417: return wxT("WM_BUTTON3MOTIONSTART"); 
4780         case 0x0418: return wxT("WM_BUTTON3MOTIONEND"); 
4781         case 0x0419: return wxT("WM_BUTTON3CLICK"); 
4782         case 0x0420: return wxT("WM_BEGINDRAG"); 
4783         case 0x0421: return wxT("WM_ENDDRAG"); 
4784         case 0x0422: return wxT("WM_SINGLESELECT"); 
4785         case 0x0423: return wxT("WM_OPEN"); 
4786         case 0x0424: return wxT("WM_CONTEXTMENU"); 
4787         case 0x0425: return wxT("WM_CONTEXTHELP"); 
4788         case 0x0426: return wxT("WM_TEXTEDIT"); 
4789         case 0x0427: return wxT("WM_BEGINSELECT"); 
4790         case 0x0228: return wxT("WM_ENDSELECT"); 
4791         case 0x0429: return wxT("WM_PICKUP"); 
4792         case 0x04C0: return wxT("WM_PENFIRST"); 
4793         case 0x04FF: return wxT("WM_PENLAST"); 
4794         case 0x0500: return wxT("WM_MMPMFIRST"); 
4795         case 0x05FF: return wxT("WM_MMPMLAST"); 
4796         case 0x0600: return wxT("WM_STDDLGFIRST"); 
4797         case 0x06FF: return wxT("WM_STDDLGLAST"); 
4798         case 0x0BD0: return wxT("WM_BIDI_FIRST"); 
4799         case 0x0BFF: return wxT("WM_BIDI_LAST"); 
4801         case 0x007A: return wxT("WM_CHAR"); 
4802         case 0x007B: return wxT("WM_VIOCHAR"); 
4804         case 0x00A0: return wxT("WM_DDE_INITIATE"); 
4805         case 0x00A1: return wxT("WM_DDE_REQUEST"); 
4806         case 0x00A2: return wxT("WM_DDE_ACK"); 
4807         case 0x00A3: return wxT("WM_DDE_DATA"); 
4808         case 0x00A4: return wxT("WM_DDE_ADVISE"); 
4809         case 0x00A5: return wxT("WM_DDE_UNADVISE"); 
4810         case 0x00A6: return wxT("WM_DDE_POKE"); 
4811         case 0x00A7: return wxT("WM_DDE_EXECUTE"); 
4812         case 0x00A8: return wxT("WM_DDE_TERMINATE"); 
4813         case 0x00A9: return wxT("WM_DDE_INITIATEACK"); 
4814         case 0x00AF: return wxT("WM_DDE_LAST"); 
4816         case 0x0120: return wxT("BM_CLICK"); 
4817         case 0x0121: return wxT("BM_QUERYCHECKINDEX"); 
4818         case 0x0122: return wxT("BM_QUERYHILITE"); 
4819         case 0x0123: return wxT("BM_SETHILITE"); 
4820         case 0x0124: return wxT("BM_QUERYCHECK"); 
4821         case 0x0125: return wxT("BM_SETCHECK"); 
4822         case 0x0126: return wxT("BM_SETDEFAULT"); 
4823         case 0x0128: return wxT("BM_AUTOSIZE"); 
4825         case 0x029A: return wxT("CBID_LIST"); 
4826         case 0x029B: return wxT("CBID_EDIT"); 
4827         case 0x0170: return wxT("CBM_SHOWLIST"); 
4828         case 0x0171: return wxT("CBM_HILITE"); 
4829         case 0x0172: return wxT("CBM_ISLISTSHOWING"); 
4831         case 0x0140: return wxT("EM_QUERYCHANGED"); 
4832         case 0x0141: return wxT("EM_QUERYSEL"); 
4833         case 0x0142: return wxT("EM_SETSEL"); 
4834         case 0x0143: return wxT("EM_SETTEXTLIMIT"); 
4835         case 0x0144: return wxT("EM_CUT"); 
4836         case 0x0145: return wxT("EM_COPY"); 
4837         case 0x0146: return wxT("EM_CLEAR"); 
4838         case 0x0147: return wxT("EM_PASTE"); 
4839         case 0x0148: return wxT("EM_QUERYFIRSTCHAR"); 
4840         case 0x0149: return wxT("EM_SETFIRSTCHAR"); 
4841         case 0x014A: return wxT("EM_QUERYREADONLY"); 
4842         case 0x014B: return wxT("EM_SETREADONLY"); 
4843         case 0x014C: return wxT("EM_SETINSERTMODE"); 
4845         case 0x0160: return wxT("LM_QUERYITEMCOUNT"); 
4846         case 0x0161: return wxT("LM_INSERTITEM"); 
4847         case 0x0162: return wxT("LM_SETOPENINDEX"); 
4848         case 0x0163: return wxT("LM_DELETEITEM"); 
4849         case 0x0164: return wxT("LM_SELECTITEM"); 
4850         case 0x0165: return wxT("LM_QUERYSELECTION"); 
4851         case 0x0166: return wxT("LM_SETITEMTEXT"); 
4852         case 0x0167: return wxT("LM_QUERYITEMTEXTLENGTH"); 
4853         case 0x0168: return wxT("LM_QUERYITEMTEXT"); 
4854         case 0x0169: return wxT("LM_SETITEMHANDLE"); 
4855         case 0x016A: return wxT("LM_QUERYITEMHANDLE"); 
4856         case 0x016B: return wxT("LM_SEARCHSTRING"); 
4857         case 0x016C: return wxT("LM_SETITEMHEIGHT"); 
4858         case 0x016D: return wxT("LM_QUERYTOPINDEX"); 
4859         case 0x016E: return wxT("LM_DELETEALL"); 
4860         case 0x016F: return wxT("LM_INSERTMULITEMS"); 
4861         case 0x0660: return wxT("LM_SETITEMWIDTH"); 
4863         case 0x0180: return wxT("MM_INSERTITEM"); 
4864         case 0x0181: return wxT("MM_DELETEITEM"); 
4865         case 0x0182: return wxT("MM_QUERYITEM"); 
4866         case 0x0183: return wxT("MM_SETITEM"); 
4867         case 0x0184: return wxT("MM_QUERYITEMCOUNT"); 
4868         case 0x0185: return wxT("MM_STARTMENUMODE"); 
4869         case 0x0186: return wxT("MM_ENDMENUMODE"); 
4870         case 0x0188: return wxT("MM_REMOVEITEM"); 
4871         case 0x0189: return wxT("MM_SELECTITEM"); 
4872         case 0x018A: return wxT("MM_QUERYSELITEMID"); 
4873         case 0x018B: return wxT("MM_QUERYITEMTEXT"); 
4874         case 0x018C: return wxT("MM_QUERYITEMTEXTLENGTH"); 
4875         case 0x018D: return wxT("MM_SETITEMHANDLE"); 
4876         case 0x018E: return wxT("MM_SETITEMTEXT"); 
4877         case 0x018F: return wxT("MM_ITEMPOSITIONFROMID"); 
4878         case 0x0190: return wxT("MM_ITEMIDFROMPOSITION"); 
4879         case 0x0191: return wxT("MM_QUERYITEMATTR"); 
4880         case 0x0192: return wxT("MM_SETITEMATTR"); 
4881         case 0x0193: return wxT("MM_ISITEMVALID"); 
4882         case 0x0194: return wxT("MM_QUERYITEMRECT"); 
4883         case 0x0431: return wxT("MM_QUERYDEFAULTITEMID"); 
4884         case 0x0432: return wxT("MM_SETDEFAULTITEMID"); 
4886         case 0x01A0: return wxT("SBM_SETSCROLLBAR"); 
4887         case 0x01A1: return wxT("SBM_SETPOS"); 
4888         case 0x01A2: return wxT("SBM_QUERYPOS"); 
4889         case 0x01A3: return wxT("SBM_QUERYRANGE"); 
4890         case 0x01A6: return wxT("SBM_SETTHUMBSIZE"); 
4893         case 0x0F00: return wxT("WM_HELPBASE"); 
4894         case 0x0FFF: return wxT("WM_HELPTOP"); 
4895         // Beginning of user defined messages 
4896         case 0x1000: return wxT("WM_USER"); 
4898         // wxWidgets user defined types 
4901         // case 0x1000 + 0: return wxT("LVM_GETBKCOLOR"); 
4902         case 0x1000 + 1: return wxT("LVM_SETBKCOLOR"); 
4903         case 0x1000 + 2: return wxT("LVM_GETIMAGELIST"); 
4904         case 0x1000 + 3: return wxT("LVM_SETIMAGELIST"); 
4905         case 0x1000 + 4: return wxT("LVM_GETITEMCOUNT"); 
4906         case 0x1000 + 5: return wxT("LVM_GETITEMA"); 
4907         case 0x1000 + 75: return wxT("LVM_GETITEMW"); 
4908         case 0x1000 + 6: return wxT("LVM_SETITEMA"); 
4909         case 0x1000 + 76: return wxT("LVM_SETITEMW"); 
4910         case 0x1000 + 7: return wxT("LVM_INSERTITEMA"); 
4911         case 0x1000 + 77: return wxT("LVM_INSERTITEMW"); 
4912         case 0x1000 + 8: return wxT("LVM_DELETEITEM"); 
4913         case 0x1000 + 9: return wxT("LVM_DELETEALLITEMS"); 
4914         case 0x1000 + 10: return wxT("LVM_GETCALLBACKMASK"); 
4915         case 0x1000 + 11: return wxT("LVM_SETCALLBACKMASK"); 
4916         case 0x1000 + 12: return wxT("LVM_GETNEXTITEM"); 
4917         case 0x1000 + 13: return wxT("LVM_FINDITEMA"); 
4918         case 0x1000 + 83: return wxT("LVM_FINDITEMW"); 
4919         case 0x1000 + 14: return wxT("LVM_GETITEMRECT"); 
4920         case 0x1000 + 15: return wxT("LVM_SETITEMPOSITION"); 
4921         case 0x1000 + 16: return wxT("LVM_GETITEMPOSITION"); 
4922         case 0x1000 + 17: return wxT("LVM_GETSTRINGWIDTHA"); 
4923         case 0x1000 + 87: return wxT("LVM_GETSTRINGWIDTHW"); 
4924         case 0x1000 + 18: return wxT("LVM_HITTEST"); 
4925         case 0x1000 + 19: return wxT("LVM_ENSUREVISIBLE"); 
4926         case 0x1000 + 20: return wxT("LVM_SCROLL"); 
4927         case 0x1000 + 21: return wxT("LVM_REDRAWITEMS"); 
4928         case 0x1000 + 22: return wxT("LVM_ARRANGE"); 
4929         case 0x1000 + 23: return wxT("LVM_EDITLABELA"); 
4930         case 0x1000 + 118: return wxT("LVM_EDITLABELW"); 
4931         case 0x1000 + 24: return wxT("LVM_GETEDITCONTROL"); 
4932         case 0x1000 + 25: return wxT("LVM_GETCOLUMNA"); 
4933         case 0x1000 + 95: return wxT("LVM_GETCOLUMNW"); 
4934         case 0x1000 + 26: return wxT("LVM_SETCOLUMNA"); 
4935         case 0x1000 + 96: return wxT("LVM_SETCOLUMNW"); 
4936         case 0x1000 + 27: return wxT("LVM_INSERTCOLUMNA"); 
4937         case 0x1000 + 97: return wxT("LVM_INSERTCOLUMNW"); 
4938         case 0x1000 + 28: return wxT("LVM_DELETECOLUMN"); 
4939         case 0x1000 + 29: return wxT("LVM_GETCOLUMNWIDTH"); 
4940         case 0x1000 + 30: return wxT("LVM_SETCOLUMNWIDTH"); 
4941         case 0x1000 + 31: return wxT("LVM_GETHEADER"); 
4942         case 0x1000 + 33: return wxT("LVM_CREATEDRAGIMAGE"); 
4943         case 0x1000 + 34: return wxT("LVM_GETVIEWRECT"); 
4944         case 0x1000 + 35: return wxT("LVM_GETTEXTCOLOR"); 
4945         case 0x1000 + 36: return wxT("LVM_SETTEXTCOLOR"); 
4946         case 0x1000 + 37: return wxT("LVM_GETTEXTBKCOLOR"); 
4947         case 0x1000 + 38: return wxT("LVM_SETTEXTBKCOLOR"); 
4948         case 0x1000 + 39: return wxT("LVM_GETTOPINDEX"); 
4949         case 0x1000 + 40: return wxT("LVM_GETCOUNTPERPAGE"); 
4950         case 0x1000 + 41: return wxT("LVM_GETORIGIN"); 
4951         case 0x1000 + 42: return wxT("LVM_UPDATE"); 
4952         case 0x1000 + 43: return wxT("LVM_SETITEMSTATE"); 
4953         case 0x1000 + 44: return wxT("LVM_GETITEMSTATE"); 
4954         case 0x1000 + 45: return wxT("LVM_GETITEMTEXTA"); 
4955         case 0x1000 + 115: return wxT("LVM_GETITEMTEXTW"); 
4956         case 0x1000 + 46: return wxT("LVM_SETITEMTEXTA"); 
4957         case 0x1000 + 116: return wxT("LVM_SETITEMTEXTW"); 
4958         case 0x1000 + 47: return wxT("LVM_SETITEMCOUNT"); 
4959         case 0x1000 + 48: return wxT("LVM_SORTITEMS"); 
4960         case 0x1000 + 49: return wxT("LVM_SETITEMPOSITION32"); 
4961         case 0x1000 + 50: return wxT("LVM_GETSELECTEDCOUNT"); 
4962         case 0x1000 + 51: return wxT("LVM_GETITEMSPACING"); 
4963         case 0x1000 + 52: return wxT("LVM_GETISEARCHSTRINGA"); 
4964         case 0x1000 + 117: return wxT("LVM_GETISEARCHSTRINGW"); 
4965         case 0x1000 + 53: return wxT("LVM_SETICONSPACING"); 
4966         case 0x1000 + 54: return wxT("LVM_SETEXTENDEDLISTVIEWSTYLE"); 
4967         case 0x1000 + 55: return wxT("LVM_GETEXTENDEDLISTVIEWSTYLE"); 
4968         case 0x1000 + 56: return wxT("LVM_GETSUBITEMRECT"); 
4969         case 0x1000 + 57: return wxT("LVM_SUBITEMHITTEST"); 
4970         case 0x1000 + 58: return wxT("LVM_SETCOLUMNORDERARRAY"); 
4971         case 0x1000 + 59: return wxT("LVM_GETCOLUMNORDERARRAY"); 
4972         case 0x1000 + 60: return wxT("LVM_SETHOTITEM"); 
4973         case 0x1000 + 61: return wxT("LVM_GETHOTITEM"); 
4974         case 0x1000 + 62: return wxT("LVM_SETHOTCURSOR"); 
4975         case 0x1000 + 63: return wxT("LVM_GETHOTCURSOR"); 
4976         case 0x1000 + 64: return wxT("LVM_APPROXIMATEVIEWRECT"); 
4977         case 0x1000 + 65: return wxT("LVM_SETWORKAREA"); 
4980         case 0x1100 + 0: return wxT("TVM_INSERTITEMA"); 
4981         case 0x1100 + 50: return wxT("TVM_INSERTITEMW"); 
4982         case 0x1100 + 1: return wxT("TVM_DELETEITEM"); 
4983         case 0x1100 + 2: return wxT("TVM_EXPAND"); 
4984         case 0x1100 + 4: return wxT("TVM_GETITEMRECT"); 
4985         case 0x1100 + 5: return wxT("TVM_GETCOUNT"); 
4986         case 0x1100 + 6: return wxT("TVM_GETINDENT"); 
4987         case 0x1100 + 7: return wxT("TVM_SETINDENT"); 
4988         case 0x1100 + 8: return wxT("TVM_GETIMAGELIST"); 
4989         case 0x1100 + 9: return wxT("TVM_SETIMAGELIST"); 
4990         case 0x1100 + 10: return wxT("TVM_GETNEXTITEM"); 
4991         case 0x1100 + 11: return wxT("TVM_SELECTITEM"); 
4992         case 0x1100 + 12: return wxT("TVM_GETITEMA"); 
4993         case 0x1100 + 62: return wxT("TVM_GETITEMW"); 
4994         case 0x1100 + 13: return wxT("TVM_SETITEMA"); 
4995         case 0x1100 + 63: return wxT("TVM_SETITEMW"); 
4996         case 0x1100 + 14: return wxT("TVM_EDITLABELA"); 
4997         case 0x1100 + 65: return wxT("TVM_EDITLABELW"); 
4998         case 0x1100 + 15: return wxT("TVM_GETEDITCONTROL"); 
4999         case 0x1100 + 16: return wxT("TVM_GETVISIBLECOUNT"); 
5000         case 0x1100 + 17: return wxT("TVM_HITTEST"); 
5001         case 0x1100 + 18: return wxT("TVM_CREATEDRAGIMAGE"); 
5002         case 0x1100 + 19: return wxT("TVM_SORTCHILDREN"); 
5003         case 0x1100 + 20: return wxT("TVM_ENSUREVISIBLE"); 
5004         case 0x1100 + 21: return wxT("TVM_SORTCHILDRENCB"); 
5005         case 0x1100 + 22: return wxT("TVM_ENDEDITLABELNOW"); 
5006         case 0x1100 + 23: return wxT("TVM_GETISEARCHSTRINGA"); 
5007         case 0x1100 + 64: return wxT("TVM_GETISEARCHSTRINGW"); 
5008         case 0x1100 + 24: return wxT("TVM_SETTOOLTIPS"); 
5009         case 0x1100 + 25: return wxT("TVM_GETTOOLTIPS"); 
5012         case 0x1200 + 0: return wxT("HDM_GETITEMCOUNT"); 
5013         case 0x1200 + 1: return wxT("HDM_INSERTITEMA"); 
5014         case 0x1200 + 10: return wxT("HDM_INSERTITEMW"); 
5015         case 0x1200 + 2: return wxT("HDM_DELETEITEM"); 
5016         case 0x1200 + 3: return wxT("HDM_GETITEMA"); 
5017         case 0x1200 + 11: return wxT("HDM_GETITEMW"); 
5018         case 0x1200 + 4: return wxT("HDM_SETITEMA"); 
5019         case 0x1200 + 12: return wxT("HDM_SETITEMW"); 
5020         case 0x1200 + 5: return wxT("HDM_LAYOUT"); 
5021         case 0x1200 + 6: return wxT("HDM_HITTEST"); 
5022         case 0x1200 + 7: return wxT("HDM_GETITEMRECT"); 
5023         case 0x1200 + 8: return wxT("HDM_SETIMAGELIST"); 
5024         case 0x1200 + 9: return wxT("HDM_GETIMAGELIST"); 
5025         case 0x1200 + 15: return wxT("HDM_ORDERTOINDEX"); 
5026         case 0x1200 + 16: return wxT("HDM_CREATEDRAGIMAGE"); 
5027         case 0x1200 + 17: return wxT("HDM_GETORDERARRAY"); 
5028         case 0x1200 + 18: return wxT("HDM_SETORDERARRAY"); 
5029         case 0x1200 + 19: return wxT("HDM_SETHOTDIVIDER"); 
5032         case 0x1300 + 2: return wxT("TCM_GETIMAGELIST"); 
5033         case 0x1300 + 3: return wxT("TCM_SETIMAGELIST"); 
5034         case 0x1300 + 4: return wxT("TCM_GETITEMCOUNT"); 
5035         case 0x1300 + 5: return wxT("TCM_GETITEMA"); 
5036         case 0x1300 + 60: return wxT("TCM_GETITEMW"); 
5037         case 0x1300 + 6: return wxT("TCM_SETITEMA"); 
5038         case 0x1300 + 61: return wxT("TCM_SETITEMW"); 
5039         case 0x1300 + 7: return wxT("TCM_INSERTITEMA"); 
5040         case 0x1300 + 62: return wxT("TCM_INSERTITEMW"); 
5041         case 0x1300 + 8: return wxT("TCM_DELETEITEM"); 
5042         case 0x1300 + 9: return wxT("TCM_DELETEALLITEMS"); 
5043         case 0x1300 + 10: return wxT("TCM_GETITEMRECT"); 
5044         case 0x1300 + 11: return wxT("TCM_GETCURSEL"); 
5045         case 0x1300 + 12: return wxT("TCM_SETCURSEL"); 
5046         case 0x1300 + 13: return wxT("TCM_HITTEST"); 
5047         case 0x1300 + 14: return wxT("TCM_SETITEMEXTRA"); 
5048         case 0x1300 + 40: return wxT("TCM_ADJUSTRECT"); 
5049         case 0x1300 + 41: return wxT("TCM_SETITEMSIZE"); 
5050         case 0x1300 + 42: return wxT("TCM_REMOVEIMAGE"); 
5051         case 0x1300 + 43: return wxT("TCM_SETPADDING"); 
5052         case 0x1300 + 44: return wxT("TCM_GETROWCOUNT"); 
5053         case 0x1300 + 45: return wxT("TCM_GETTOOLTIPS"); 
5054         case 0x1300 + 46: return wxT("TCM_SETTOOLTIPS"); 
5055         case 0x1300 + 47: return wxT("TCM_GETCURFOCUS"); 
5056         case 0x1300 + 48: return wxT("TCM_SETCURFOCUS"); 
5057         case 0x1300 + 49: return wxT("TCM_SETMINTABWIDTH"); 
5058         case 0x1300 + 50: return wxT("TCM_DESELECTALL"); 
5061         case WM_USER
+1000+1: return wxT("TB_ENABLEBUTTON"); 
5062         case WM_USER
+1000+2: return wxT("TB_CHECKBUTTON"); 
5063         case WM_USER
+1000+3: return wxT("TB_PRESSBUTTON"); 
5064         case WM_USER
+1000+4: return wxT("TB_HIDEBUTTON"); 
5065         case WM_USER
+1000+5: return wxT("TB_INDETERMINATE"); 
5066         case WM_USER
+1000+9: return wxT("TB_ISBUTTONENABLED"); 
5067         case WM_USER
+1000+10: return wxT("TB_ISBUTTONCHECKED"); 
5068         case WM_USER
+1000+11: return wxT("TB_ISBUTTONPRESSED"); 
5069         case WM_USER
+1000+12: return wxT("TB_ISBUTTONHIDDEN"); 
5070         case WM_USER
+1000+13: return wxT("TB_ISBUTTONINDETERMINATE"); 
5071         case WM_USER
+1000+17: return wxT("TB_SETSTATE"); 
5072         case WM_USER
+1000+18: return wxT("TB_GETSTATE"); 
5073         case WM_USER
+1000+19: return wxT("TB_ADDBITMAP"); 
5074         case WM_USER
+1000+20: return wxT("TB_ADDBUTTONS"); 
5075         case WM_USER
+1000+21: return wxT("TB_INSERTBUTTON"); 
5076         case WM_USER
+1000+22: return wxT("TB_DELETEBUTTON"); 
5077         case WM_USER
+1000+23: return wxT("TB_GETBUTTON"); 
5078         case WM_USER
+1000+24: return wxT("TB_BUTTONCOUNT"); 
5079         case WM_USER
+1000+25: return wxT("TB_COMMANDTOINDEX"); 
5080         case WM_USER
+1000+26: return wxT("TB_SAVERESTOREA"); 
5081         case WM_USER
+1000+76: return wxT("TB_SAVERESTOREW"); 
5082         case WM_USER
+1000+27: return wxT("TB_CUSTOMIZE"); 
5083         case WM_USER
+1000+28: return wxT("TB_ADDSTRINGA"); 
5084         case WM_USER
+1000+77: return wxT("TB_ADDSTRINGW"); 
5085         case WM_USER
+1000+29: return wxT("TB_GETITEMRECT"); 
5086         case WM_USER
+1000+30: return wxT("TB_BUTTONSTRUCTSIZE"); 
5087         case WM_USER
+1000+31: return wxT("TB_SETBUTTONSIZE"); 
5088         case WM_USER
+1000+32: return wxT("TB_SETBITMAPSIZE"); 
5089         case WM_USER
+1000+33: return wxT("TB_AUTOSIZE"); 
5090         case WM_USER
+1000+35: return wxT("TB_GETTOOLTIPS"); 
5091         case WM_USER
+1000+36: return wxT("TB_SETTOOLTIPS"); 
5092         case WM_USER
+1000+37: return wxT("TB_SETPARENT"); 
5093         case WM_USER
+1000+39: return wxT("TB_SETROWS"); 
5094         case WM_USER
+1000+40: return wxT("TB_GETROWS"); 
5095         case WM_USER
+1000+42: return wxT("TB_SETCMDID"); 
5096         case WM_USER
+1000+43: return wxT("TB_CHANGEBITMAP"); 
5097         case WM_USER
+1000+44: return wxT("TB_GETBITMAP"); 
5098         case WM_USER
+1000+45: return wxT("TB_GETBUTTONTEXTA"); 
5099         case WM_USER
+1000+75: return wxT("TB_GETBUTTONTEXTW"); 
5100         case WM_USER
+1000+46: return wxT("TB_REPLACEBITMAP"); 
5101         case WM_USER
+1000+47: return wxT("TB_SETINDENT"); 
5102         case WM_USER
+1000+48: return wxT("TB_SETIMAGELIST"); 
5103         case WM_USER
+1000+49: return wxT("TB_GETIMAGELIST"); 
5104         case WM_USER
+1000+50: return wxT("TB_LOADIMAGES"); 
5105         case WM_USER
+1000+51: return wxT("TB_GETRECT"); 
5106         case WM_USER
+1000+52: return wxT("TB_SETHOTIMAGELIST"); 
5107         case WM_USER
+1000+53: return wxT("TB_GETHOTIMAGELIST"); 
5108         case WM_USER
+1000+54: return wxT("TB_SETDISABLEDIMAGELIST"); 
5109         case WM_USER
+1000+55: return wxT("TB_GETDISABLEDIMAGELIST"); 
5110         case WM_USER
+1000+56: return wxT("TB_SETSTYLE"); 
5111         case WM_USER
+1000+57: return wxT("TB_GETSTYLE"); 
5112         case WM_USER
+1000+58: return wxT("TB_GETBUTTONSIZE"); 
5113         case WM_USER
+1000+59: return wxT("TB_SETBUTTONWIDTH"); 
5114         case WM_USER
+1000+60: return wxT("TB_SETMAXTEXTROWS"); 
5115         case WM_USER
+1000+61: return wxT("TB_GETTEXTROWS"); 
5116         case WM_USER
+1000+41: return wxT("TB_GETBITMAPFLAGS"); 
5119     static wxString s_szBuf
; 
5120     s_szBuf
.Printf(wxT("<unknown message = %d>"), nMessage
); 
5121     return s_szBuf
.c_str(); 
5123 } // end of wxGetMessageName 
5125 #endif // __WXDEBUG__ 
5129 static void TranslateKbdEventToMouse( 
5137     // Construct the key mask 
5138     ULONG
&                          fwKeys 
= *pFlags
; 
5140     fwKeys 
= VK_BUTTON2
; 
5141     if ((::WinGetKeyState(HWND_DESKTOP
, VK_CTRL
) & 0x100) != 0) 
5143     if ((::WinGetKeyState(HWND_DESKTOP
, VK_SHIFT
) & 0x100) != 0) 
5147     // Simulate right mouse button click 
5151     ::WinQueryMsgPos(vHabmain
, &vPoint
); 
5155     pWin
->ScreenToClient(pX
, pY
); 
5156 } // end of TranslateKbdEventToMouse 
5159 // Find the wxWindow at the current mouse position, returning the mouse 
5161 wxWindow
* wxFindWindowAtPointer(wxPoint
& WXUNUSED(rPt
)) 
5163     return wxFindWindowAtPoint(wxGetMousePosition()); 
5166 wxWindow
* wxFindWindowAtPoint(const wxPoint
& rPt
) 
5173     HWND      hWndHit 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt2
, FALSE
); 
5174     wxWindow
* pWin 
= wxFindWinFromHandle((WXHWND
)hWndHit
) ; 
5175     HWND      hWnd 
= hWndHit
; 
5178     // Try to find a window with a wxWindow associated with it 
5180     while (!pWin 
&& (hWnd 
!= 0)) 
5182         hWnd 
= ::WinQueryWindow(hWnd
, QW_PARENT
); 
5183         pWin 
= wxFindWinFromHandle((WXHWND
)hWnd
) ; 
5188 // Get the current mouse position. 
5189 wxPoint 
wxGetMousePosition() 
5193     ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
); 
5194     return wxPoint(vPt
.x
, vPt
.y
); 
5197 wxWindowOS2
* FindWindowForMouseEvent( wxWindow
* pWin
, 
5198                                       short*    WXUNUSED(pnX
), 
5199                                       short*    WXUNUSED(pnY
) ) 
5201     HWND   hWnd 
= GetHwndOf(pWin
); 
5202     HWND   hWndUnderMouse
; 
5204     BOOL   rcEnabled 
= FALSE
; 
5205     BOOL   rcVisible 
= FALSE
; 
5207     ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
5208     hWndUnderMouse 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, TRUE
); 
5209     if (hWndUnderMouse 
!= HWND_DESKTOP
) 
5211         wxWindow
*                   pWinUnderMouse 
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
); 
5215             wxWindowList::compatibility_iterator current 
= pWinUnderMouse
->GetChildren().GetFirst(); 
5216             wxWindow
*               pGrandChild 
= NULL
; 
5220             ::WinMapWindowPoints(HWND_DESKTOP
, hWndUnderMouse
, &vPoint
, 1); 
5222             // Find a child window mouse might be under 
5226                 wxWindow
*                   pChild 
= current
->GetData(); 
5228                 vPoint2
.x 
= vPoint
.x
; 
5229                 vPoint2
.y 
= vPoint
.y
; 
5230                 ::WinMapWindowPoints(hWndUnderMouse
, pChild
->GetHWND(), &vPoint2
, 1); 
5231                 ::WinQueryWindowRect(pChild
->GetHWND(), &vRect
); 
5232                 if (::WinPtInRect(vHabmain
, &vRect
, &vPoint2
)) 
5234                     if (pChild
->IsTopLevel()) 
5237                         wxWindowList::compatibility_iterator current2 
=pChild
->GetChildren().GetFirst(); 
5241                             wxWindow
*           pGrandChild 
= current2
->GetData(); 
5243                             vPoint3
.x 
= vPoint2
.x
; 
5244                             vPoint3
.y 
= vPoint2
.y
; 
5245                             ::WinMapWindowPoints( pChild
->GetHWND() 
5246                                                  ,pGrandChild
->GetHWND() 
5250                             ::WinQueryWindowRect(pGrandChild
->GetHWND(), &vRect
); 
5251                             if (::WinPtInRect(vHabmain
, &vRect
, &vPoint3
)) 
5253                                 hWndUnderMouse 
= GetHwndOf(pGrandChild
); 
5254                                 pWinUnderMouse 
= pGrandChild
; 
5257                             current2 
= current2
->GetNext(); 
5262                     hWndUnderMouse 
= GetHwndOf(pChild
); 
5263                     pWinUnderMouse 
= pChild
; 
5264                     rcVisible 
= ::WinIsWindowVisible(hWndUnderMouse
); 
5265                     rcEnabled 
= ::WinIsWindowEnabled(hWndUnderMouse
); 
5266                     if (rcVisible 
&& rcEnabled
) 
5269                 current 
= current
->GetNext(); 
5273     rcVisible 
= ::WinIsWindowVisible(hWndUnderMouse
); 
5274     rcEnabled 
= ::WinIsWindowEnabled(hWndUnderMouse
); 
5278     // Check that we have a child window which is susceptible to receive mouse 
5279     // events: for this it must be shown and enabled 
5281     if ( hWndUnderMouse 
&& 
5282          hWndUnderMouse 
!= hWnd 
&& 
5283          rcVisible 
&& rcEnabled
) 
5285         wxWindow
*                       pWinUnderMouse 
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
); 
5290             // Translate the mouse coords to the other window coords 
5292             pWin 
= pWinUnderMouse
; 
5296 } // end of FindWindowForMouseEvent