1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/os2/window.cpp 
   4 // Author:      David Webster 
   8 // Copyright:   (c) David Webster 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  13 // For compilers that support precompilation, includes "wx.h". 
  15 #include "wx/wxprec.h" 
  17 #include "wx/window.h" 
  26     #include "wx/dcclient.h" 
  30     #include "wx/layout.h" 
  31     #include "wx/checkbox.h" 
  32     #include "wx/combobox.h" 
  33     #include "wx/dialog.h" 
  35     #include "wx/listbox.h" 
  36     #include "wx/button.h" 
  37     #include "wx/bmpbuttn.h" 
  38     #include "wx/msgdlg.h" 
  39     #include "wx/scrolwin.h" 
  40     #include "wx/radiobox.h" 
  41     #include "wx/radiobut.h" 
  42     #include "wx/slider.h" 
  43     #include "wx/statbox.h" 
  44     #include "wx/statusbr.h" 
  45     #include "wx/toolbar.h" 
  46     #include "wx/settings.h" 
  49     #include "wx/textctrl.h" 
  50     #include "wx/menuitem.h" 
  54 #include "wx/os2/dcclient.h" 
  57     #include "wx/ownerdrw.h" 
  60 #if     wxUSE_DRAG_AND_DROP 
  64 #include "wx/os2/private.h" 
  67     #include "wx/tooltip.h" 
  71     #include "wx/notebook.h" 
  81 // Place compiler, OS specific includes here 
  85 // Standard macros -- these are for OS/2 PM, but most GUI's have something similar 
  89 //  SHORT1FROMMP -- LOWORD 
  91     #define GET_X_LPARAM(mp) ((unsigned short)(unsigned long)(mp)) 
  93 //  SHORT2FROMMP -- HIWORD 
  95     #define GET_Y_LPARAM(mp) ((unsigned short)(unsigned long)(mp >> 16)) 
  96 #endif // GET_X_LPARAM 
  99 #  define CW_USEDEFAULT    ((int)0x80000000) 
 103     #define VK_OEM_1        0xBA 
 104     #define VK_OEM_PLUS     0xBB 
 105     #define VK_OEM_COMMA    0xBC 
 106     #define VK_OEM_MINUS    0xBD 
 107     #define VK_OEM_PERIOD   0xBE 
 108     #define VK_OEM_2        0xBF 
 109     #define VK_OEM_3        0xC0 
 110     #define VK_OEM_4        0xDB 
 111     #define VK_OEM_5        0xDC 
 112     #define VK_OEM_6        0xDD 
 113     #define VK_OEM_7        0xDE 
 116 // --------------------------------------------------------------------------- 
 118 // --------------------------------------------------------------------------- 
 121 // The last PM message we got (MT-UNSAFE) 
 125 #if wxUSE_MENUS_NATIVE 
 126 extern wxMenu
*            wxCurrentPopupMenu
; 
 127 #endif // wxUSE_MENUS_NATIVE 
 129 // --------------------------------------------------------------------------- 
 131 // --------------------------------------------------------------------------- 
 134 // the window proc for all our windows; most gui's have something similar 
 136 MRESULT EXPENTRY 
wxWndProc( HWND hWnd
 
 143     const wxChar 
*wxGetMessageName(int message
); 
 146 wxWindowOS2
* FindWindowForMouseEvent( wxWindow
* pWin
 
 150 void         wxRemoveHandleAssociation(wxWindowOS2
* pWin
); 
 151 void         wxAssociateWinWithHandle( HWND         hWnd
 
 154 wxWindow
* wxFindWinFromHandle(WXHWND hWnd
); 
 157 // get the current state of SHIFT/CTRL keys 
 159 static inline bool IsKeyDown(LONG key
) {return (::WinGetKeyState(HWND_DESKTOP
, key
) & 0x8000) != 0; } 
 160 static inline bool IsShiftDown() { return IsKeyDown(VK_SHIFT
); } 
 161 static inline bool IsCtrlDown() { return IsKeyDown(VK_CTRL
); } 
 163 static wxWindow
*                    gpWinBeingCreated 
= NULL
; 
 165 // --------------------------------------------------------------------------- 
 167 // --------------------------------------------------------------------------- 
 169 // in wxUniv-OS/2 this class is abstract because it doesn't have DoPopupMenu() 
 171 #ifdef __WXUNIVERSAL__ 
 172     IMPLEMENT_ABSTRACT_CLASS(wxWindowOS2
, wxWindowBase
) 
 173 #endif // __WXUNIVERSAL__ 
 175 BEGIN_EVENT_TABLE(wxWindowOS2
, wxWindowBase
) 
 176     EVT_ERASE_BACKGROUND(wxWindowOS2::OnEraseBackground
) 
 177     EVT_SYS_COLOUR_CHANGED(wxWindowOS2::OnSysColourChanged
) 
 178     EVT_IDLE(wxWindowOS2::OnIdle
) 
 179     EVT_SET_FOCUS(wxWindowOS2::OnSetFocus
) 
 182 // =========================================================================== 
 184 // =========================================================================== 
 186 // --------------------------------------------------------------------------- 
 187 // wxWindow utility functions 
 188 // --------------------------------------------------------------------------- 
 191 // Find an item given the PM Window id 
 193 wxWindow
* wxWindowOS2::FindItem( 
 198     wxControl
*                      pItem 
= wxDynamicCast(this, wxControl
); 
 203         // I it we or one of our "internal" children? 
 205         if (pItem
->GetId() == lId
 
 206 #ifndef __WXUNIVERSAL__ 
 207             || (pItem
->GetSubcontrols().Index(lId
) != wxNOT_FOUND
) 
 214 #endif // wxUSE_CONTROLS 
 216     wxWindowList::compatibility_iterator  current 
= GetChildren().GetFirst(); 
 220         wxWindow
*                   pChildWin 
= current
->GetData(); 
 221         wxWindow
*                   pWnd 
= pChildWin
->FindItem(lId
); 
 226         current 
= current
->GetNext(); 
 229 } // end of wxWindowOS2::FindItem 
 232 // Find an item given the PM Window handle 
 234 wxWindow
* wxWindowOS2::FindItemByHWND( 
 239     wxWindowList::compatibility_iterator current 
= GetChildren().GetFirst(); 
 243         wxWindow
*                   pParent 
= current
->GetData(); 
 246         // Do a recursive search. 
 248         wxWindow
*                   pWnd 
= pParent
->FindItemByHWND(hWnd
); 
 255             || pParent
->IsKindOf(CLASSINFO(wxControl
)) 
 256 #endif // wxUSE_CONTROLS 
 259             wxWindow
*               pItem 
= current
->GetData(); 
 261             if (pItem
->GetHWND() == hWnd
) 
 265                 if (pItem
->ContainsHWND(hWnd
)) 
 269         current 
= current
->GetNext(); 
 272 } // end of wxWindowOS2::FindItemByHWND 
 275 // Default command handler 
 277 bool wxWindowOS2::OS2Command( WXUINT 
WXUNUSED(uParam
), 
 278                               WXWORD 
WXUNUSED(uId
) ) 
 283 // ---------------------------------------------------------------------------- 
 284 // constructors and such 
 285 // ---------------------------------------------------------------------------- 
 287 void wxWindowOS2::Init() 
 292     m_bWinCaptured 
= false; 
 294     m_fnOldWndProc          
= NULL
; 
 296     m_bMouseInWindow        
= false; 
 297     m_bLastKeydownProcessed 
= false; 
 304     m_hWndScrollBarHorz 
= 0L; 
 305     m_hWndScrollBarVert 
= 0L; 
 307     memset(&m_vWinSwp
, '\0', sizeof (SWP
)); 
 310     // Pass WM_GETDLGCODE to DefWindowProc() 
 316     m_bBackgroundTransparent 
= false; 
 319     // As all windows are created with WS_VISIBLE style... 
 323 #if wxUSE_MOUSEEVENT_HACK 
 326     m_nLastMouseEvent 
= -1; 
 327 #endif // wxUSE_MOUSEEVENT_HACK 
 328 } // wxWindowOS2::Init 
 333 wxWindowOS2::~wxWindowOS2() 
 337     for (wxWindow
* pWin 
= GetParent(); pWin
; pWin 
= pWin
->GetParent()) 
 339         wxTopLevelWindow
*           pFrame 
= wxDynamicCast(pWin
, wxTopLevelWindow
); 
 343             if (pFrame
->GetLastFocus() == this) 
 344                 pFrame
->SetLastFocus(NULL
); 
 352         if(!::WinDestroyWindow(GetHWND())) 
 354             wxLogLastError(wxT("DestroyWindow")); 
 357         // remove hWnd <-> wxWindow association 
 359         wxRemoveHandleAssociation(this); 
 361 } // end of wxWindowOS2::~wxWindowOS2 
 363 // real construction (Init() must have been called before!) 
 364 bool wxWindowOS2::Create( wxWindow
*       pParent
, 
 369                           const wxString
& rName 
) 
 371     HWND hParent 
= NULLHANDLE
; 
 372     ULONG ulCreateFlags 
= 0; 
 373     WXDWORD dwExStyle 
= 0; 
 375     wxCHECK_MSG(pParent
, false, wxT("can't create wxWindow without parent")); 
 379     // wxGTK doesn't allow to create controls with static box as the parent so 
 380     // this will result in a crash when the program is ported to wxGTK - warn 
 383     // the correct solution is to create the controls as siblings of the 
 386     wxASSERT_MSG( !wxDynamicCast(pParent
, wxStaticBox
), 
 387                   wxT("wxStaticBox can't be used as a window parent!") ); 
 388 #endif // wxUSE_STATBOX 
 390      // Ensure groupbox backgrounds are painted 
 391      if (IsKindOf(CLASSINFO(wxPanel
))) 
 392          lStyle 
&= ~wxCLIP_CHILDREN
; 
 394     if ( !CreateBase( pParent
 
 406         pParent
->AddChild(this); 
 407         hParent 
= GetWinHwnd(pParent
); 
 409         if (pParent
->IsKindOf(CLASSINFO(wxScrolledWindow
))) 
 410             ulCreateFlags 
|= WS_CLIPSIBLINGS
; 
 414     // Most wxSTYLES are really PM Class specific styles and will be 
 415     // set in those class create procs.  PM's basic windows styles are 
 418     ulCreateFlags 
|=  OS2GetCreateWindowFlags(&dwExStyle
); 
 421 #ifdef __WXUNIVERSAL__ 
 422     // no 3d effects, we draw them ourselves 
 424 #endif // !wxUniversal 
 425     if (lStyle 
& wxPOPUP_WINDOW
) 
 427         ulCreateFlags 
&= ~WS_VISIBLE
; 
 432         ulCreateFlags 
|= WS_VISIBLE
; 
 436     // Generic OS/2 Windows have no Control Data but other classes 
 437     // that call OS2Create may have some. 
 439     return(OS2Create( (PSZ
)wxCanvasClassName
 
 444                      ,NULL         
// Control Data 
 448 } // end of wxWindowOS2::Create 
 450 // --------------------------------------------------------------------------- 
 452 // --------------------------------------------------------------------------- 
 454 void wxWindowOS2::SetFocus() 
 456     HWND                            hWnd 
= GetHwnd(); 
 457     wxCHECK_RET( hWnd
, wxT("can't set focus to invalid window") ); 
 460         ::WinSetFocus(HWND_DESKTOP
, hWnd
); 
 461 } // end of wxWindowOS2::SetFocus 
 463 void wxWindowOS2::SetFocusFromKbd() 
 466     // Nothing else to do under OS/2 
 468     wxWindowBase::SetFocusFromKbd(); 
 469 } // end of wxWindowOS2::SetFocus 
 471 wxWindow
* wxWindowBase::DoFindFocus() 
 473     HWND                            hWnd 
= ::WinQueryFocus(HWND_DESKTOP
); 
 477         return wxFindWinFromHandle((WXHWND
)hWnd
); 
 480 } // wxWindowBase::DoFindFocus 
 482 void wxWindowOS2::DoEnable( bool bEnable 
) 
 484     HWND                            hWnd 
= GetHwnd(); 
 486         ::WinEnableWindow(hWnd
, (BOOL
)bEnable
); 
 489 bool wxWindowOS2::Show( bool bShow 
) 
 491     if (!wxWindowBase::Show(bShow
)) 
 494     HWND                            hWnd 
= GetHwnd(); 
 496     ::WinShowWindow(hWnd
, bShow
); 
 500         ::WinSetWindowPos(hWnd
, HWND_TOP
, 0, 0, 0, 0, SWP_ACTIVATE 
| SWP_ZORDER
); 
 503 } // end of wxWindowOS2::Show 
 505 void wxWindowOS2::Raise() 
 507     ::WinSetWindowPos(GetHwnd(), HWND_TOP
, 0, 0, 0, 0, SWP_ZORDER 
| SWP_ACTIVATE
); 
 508 } // end of wxWindowOS2::Raise 
 510 void wxWindowOS2::Lower() 
 512     ::WinSetWindowPos(GetHwnd(), HWND_BOTTOM
, 0, 0, 0, 0, SWP_ZORDER 
| SWP_DEACTIVATE
); 
 513 } // end of wxWindowOS2::Lower 
 515 void wxWindowOS2::SetLabel( const wxString
& label 
) 
 517     ::WinSetWindowText(GetHwnd(), label
.c_str()); 
 518 } // end of wxWindowOS2::SetLabel 
 520 wxString 
wxWindowOS2::GetLabel() const 
 522     return wxGetWindowText(GetHWND()); 
 523 } // end of wxWindowOS2::GetLabel 
 525 void wxWindowOS2::DoCaptureMouse() 
 527     HWND hWnd 
= GetHwnd(); 
 529     if (hWnd 
&& !m_bWinCaptured
) 
 531         ::WinSetCapture(HWND_DESKTOP
, hWnd
); 
 532         m_bWinCaptured 
= true; 
 534 } // end of wxWindowOS2::DoCaptureMouse 
 536 void wxWindowOS2::DoReleaseMouse() 
 540         ::WinSetCapture(HWND_DESKTOP
, NULLHANDLE
); 
 541         m_bWinCaptured 
= false; 
 543 } // end of wxWindowOS2::ReleaseMouse 
 545 /* static */ wxWindow
* wxWindowBase::GetCapture() 
 547     HWND hwnd 
= ::WinQueryCapture(HWND_DESKTOP
); 
 548     return hwnd 
? wxFindWinFromHandle((WXHWND
)hwnd
) : NULL
; 
 549 } // end of wxWindowBase::GetCapture 
 551 bool wxWindowOS2::SetFont( const wxFont
& rFont 
) 
 553     if (!wxWindowBase::SetFont(rFont
)) 
 559     HWND hWnd 
= GetHwnd(); 
 561     wxOS2SetFont( hWnd
, rFont 
); 
 563 } // end of wxWindowOS2::SetFont 
 565 // check if base implementation is OK 
 566 bool wxWindowOS2::SetCursor( const wxCursor
& rCursor
) 
 568     if ( !wxWindowBase::SetCursor(rCursor
)) 
 574     if ( m_cursor
.IsOk() ) { 
 575         HWND                            hWnd 
= GetHwnd(); 
 579         ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
 580         ::WinQueryWindowRect(hWnd
, &vRect
); 
 582         if (::WinPtInRect(vHabmain
, &vRect
, &vPoint
) && !wxIsBusy()) 
 584             ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)m_cursor
.GetHCURSOR()); 
 588 } // end of wxWindowOS2::SetCursor 
 590 void wxWindowOS2::WarpPointer( 
 599     ::WinQueryWindowRect(GetHwnd(), &vRect
); 
 603     ::WinSetPointerPos(HWND_DESKTOP
, (LONG
)nX
, (LONG
)(nY
)); 
 604 } // end of wxWindowOS2::WarpPointer 
 607 // --------------------------------------------------------------------------- 
 609 // --------------------------------------------------------------------------- 
 611 int  wxWindowOS2::GetScrollPos( 
 615     if (nOrient 
== wxHORIZONTAL
) 
 616         return((int)::WinSendMsg(m_hWndScrollBarHorz
, SBM_QUERYPOS
, (MPARAM
)NULL
, (MPARAM
)NULL
)); 
 618         return((int)::WinSendMsg(m_hWndScrollBarVert
, SBM_QUERYPOS
, (MPARAM
)NULL
, (MPARAM
)NULL
)); 
 619 } // end of wxWindowOS2::GetScrollPos 
 621 int wxWindowOS2::GetScrollRange( 
 627     if (nOrient 
== wxHORIZONTAL
) 
 628         mr 
= ::WinSendMsg(m_hWndScrollBarHorz
, SBM_QUERYRANGE
, (MPARAM
)NULL
, (MPARAM
)NULL
); 
 630         mr 
= ::WinSendMsg(m_hWndScrollBarVert
, SBM_QUERYRANGE
, (MPARAM
)NULL
, (MPARAM
)NULL
); 
 631     return((int)SHORT2FROMMR(mr
)); 
 632 } // end of wxWindowOS2::GetScrollRange 
 634 int wxWindowOS2::GetScrollThumb( 
 638     if (nOrient 
== wxHORIZONTAL 
) 
 639         return m_nXThumbSize
; 
 641         return m_nYThumbSize
; 
 642 } // end of wxWindowOS2::GetScrollThumb 
 644 void wxWindowOS2::SetScrollPos( 
 647 , bool                              WXUNUSED(bRefresh
) 
 650     if (nOrient 
== wxHORIZONTAL 
) 
 651         ::WinSendMsg(m_hWndScrollBarHorz
, SBM_SETPOS
, (MPARAM
)nPos
, (MPARAM
)NULL
); 
 653         ::WinSendMsg(m_hWndScrollBarVert
, SBM_SETPOS
, (MPARAM
)nPos
, (MPARAM
)NULL
); 
 654 } // end of wxWindowOS2::SetScrollPos 
 656 void wxWindowOS2::SetScrollbar( int  nOrient
, 
 660                                 bool WXUNUSED(bRefresh
) ) 
 662     HWND                            hWnd 
= GetHwnd(); 
 663     int                             nOldRange 
= nRange 
- nThumbVisible
; 
 664     int                             nRange1 
= nOldRange
; 
 665     int                             nPageSize 
= nThumbVisible
; 
 666     int         nVSBWidth  
= wxSystemSettingsNative::GetMetric(wxSYS_VSCROLL_X
, 
 668     int         nHSBHeight 
= wxSystemSettingsNative::GetMetric(wxSYS_HSCROLL_Y
, 
 672     ULONG                           ulStyle 
= WS_VISIBLE 
| WS_SYNCPAINT
; 
 677     wxWindow
*                       pParent 
= GetParent(); 
 679     if (pParent 
&& pParent
->IsKindOf(CLASSINFO(wxFrame
))) 
 683         pFrame 
= wxDynamicCast(pParent
, wxFrame
); 
 684         hWndParent 
= pFrame
->GetFrame(); 
 685         hWndClient 
= GetHwndOf(pParent
); 
 690             hWndParent 
= GetHwndOf(pParent
); 
 692             hWndParent 
= GetHwnd(); 
 693         hWndClient 
= hWndParent
; 
 695     ::WinQueryWindowPos(hWndClient
, &vSwp
); 
 696     ::WinQueryWindowPos(hWnd
, &vSwpOwner
); 
 698     if (nPageSize 
> 1 && nRange 
> 0) 
 700         nRange1 
+= (nPageSize 
- 1); 
 703     vInfo
.cb 
= sizeof(SBCDATA
); 
 705     vInfo
.posLast 
= (SHORT
)nRange1
; 
 706     vInfo
.posThumb 
= (SHORT
)nPos
; 
 708     if (nOrient 
== wxHORIZONTAL 
) 
 711         if (m_hWndScrollBarHorz 
== 0L) 
 714             // Since the scrollbars are usually created before the owner is 
 715             // sized either via an OnSize event directly or via sizers or 
 716             // layout constraints, we will initially just use the coords of 
 717             // the parent window (this is usually a frame client window). But 
 718             // the bars themselves, are children of the parent frame (i.e 
 719             // siblings of the frame client.  The owner, however is the actual 
 720             // window being scrolled (or at least the one responsible for 
 721             // handling the scroll events). The owner will be resized later, 
 722             // as it is usually a child of a top level window, and when that 
 723             // is done its scrollbars will be resized and repositioned as well. 
 725             m_hWndScrollBarHorz 
= ::WinCreateWindow( hWndParent
 
 743             // The owner (the scrolled window) is a child of the Frame's 
 744             // client window, usually.  The scrollbars are children of the 
 745             // frame, itself, and thus are positioned relative to the frame's 
 746             // origin, not the frame's client window origin. 
 747             // The starting x position is the same as the starting x position 
 748             // of the owner, but in terms of the parent frame. 
 749             // The starting y position is wxSYS_HSCROLL_Y pels below the 
 750             // origin of the owner in terms of the parent frame. 
 751             // The horz bar is the same width as the owner and wxSYS_HSCROLL_Y 
 754             if (nRange1 
>= nThumbVisible
) 
 756                 ::WinSetWindowPos( m_hWndScrollBarHorz
 
 758                                   ,vSwp
.x 
+ vSwpOwner
.x
 
 759                                   ,(vSwp
.y 
+ vSwpOwner
.y
) - nHSBHeight
 
 762                                   ,SWP_MOVE 
| SWP_SIZE 
| SWP_SHOW 
| SWP_ACTIVATE 
| SWP_ZORDER
 
 764                 ::WinSendMsg( m_hWndScrollBarHorz
 
 767                              ,MPFROM2SHORT(0, (SHORT
)nRange1
) 
 769                 ::WinSendMsg( m_hWndScrollBarHorz
 
 771                              ,MPFROM2SHORT( (SHORT
)nThumbVisible
 
 778                 ::WinShowWindow(m_hWndScrollBarHorz
, FALSE
); 
 784         if (m_hWndScrollBarVert 
== 0L) 
 787             // Since the scrollbars are usually created before the owner is 
 788             // sized either via an OnSize event directly or via sizers or 
 789             // layout constraints, we will initially just use the coords of 
 790             // the parent window (this is usually a frame client window). But 
 791             // the bars themselves, are children of the parent frame (i.e 
 792             // siblings of the frame client.  The owner, however is the actual 
 793             // window being scrolled (or at least the one responsible for 
 794             // handling the scroll events). The owner will be resized later, 
 795             // as it is usually a child of a top level window, and when that 
 796             // is done its scrollbars will be resized and repositioned as well. 
 798             m_hWndScrollBarVert 
= ::WinCreateWindow( hWndParent
 
 802                                                     ,vSwp
.x 
+ vSwp
.cx 
- nVSBWidth
 
 805                                                     ,vSwp
.cy 
- nHSBHeight
 
 816             // The owner (the scrolled window) is a child of the Frame's 
 817             // client window, usually.  The scrollbars are children of the 
 818             // frame, itself and thus are positioned relative to the frame's 
 819             // origin, not the frame's client window's origin. 
 820             // Thus, the x position will be frame client's x (usually a few 
 821             // pels inside the parent frame, plus the width of the owner. 
 822             // Since we may be using sizers or layout constraints for multiple 
 823             // child scrolled windows, the y position will be the frame client's 
 824             // y pos plus the scrolled windows y position, yielding the y 
 825             // position of the scrollbar relative to the parent frame (the vert 
 826             // scrollbar is on the right and starts at the bottom of the 
 828             // It is wxSYS_VSCROLL_X pels wide and the same height as the owner. 
 830             if (nRange1 
>= nThumbVisible
) 
 832                 ::WinSetWindowPos( m_hWndScrollBarVert
 
 834                                   ,vSwp
.x 
+ vSwpOwner
.x 
+ vSwpOwner
.cx
 
 835                                   ,vSwp
.y 
+ vSwpOwner
.y
 
 838                                   ,SWP_ACTIVATE 
| SWP_MOVE 
| SWP_SIZE 
| SWP_SHOW
 
 840                 ::WinSendMsg( m_hWndScrollBarVert
 
 843                              ,MPFROM2SHORT(0, (SHORT
)nRange1
) 
 845                 ::WinSendMsg( m_hWndScrollBarVert
 
 847                              ,MPFROM2SHORT( (SHORT
)nThumbVisible
 
 854                 ::WinShowWindow(m_hWndScrollBarVert
, FALSE
); 
 856         m_nYThumbSize 
= nThumbVisible
; 
 858 } // end of wxWindowOS2::SetScrollbar 
 861 void wxWindowOS2::ScrollWindow( int nDx
, 
 863                                 const wxRect
* pRect 
) 
 867     ::WinQueryWindowRect(GetHwnd(), &vRect
); 
 868     int height 
= vRect
.yTop
; 
 871         vRect
.xLeft   
= pRect
->x
; 
 872         vRect
.yTop    
= height 
- pRect
->y
; 
 873         vRect
.xRight  
= pRect
->x 
+ pRect
->width
; 
 874         vRect
.yBottom 
= vRect
.yTop 
- pRect
->height
; 
 876     nDy 
*= -1; // flip the sign of Dy as OS/2 is opposite Windows. 
 877     ::WinScrollWindow( GetHwnd() 
 884                       ,SW_SCROLLCHILDREN 
| SW_INVALIDATERGN
 
 886 } // end of wxWindowOS2::ScrollWindow 
 888 // --------------------------------------------------------------------------- 
 890 // --------------------------------------------------------------------------- 
 892 void wxWindowOS2::SubclassWin( 
 896     HWND                            hwnd 
= (HWND
)hWnd
; 
 898     wxCHECK_RET(::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in SubclassWin") ); 
 899     wxAssociateWinWithHandle( hWnd
 
 902     if (!wxCheckWindowWndProc( hWnd
 
 903                               ,(WXFARPROC
)wxWndProc
 
 906         m_fnOldWndProc 
= (WXFARPROC
) ::WinSubclassWindow(hwnd
, (PFNWP
)wxWndProc
); 
 910         m_fnOldWndProc 
= (WXFARPROC
)NULL
; 
 912 } // end of wxWindowOS2::SubclassWin 
 914 void wxWindowOS2::UnsubclassWin() 
 917     // Restore old Window proc 
 919     HWND                            hwnd 
= GetHWND(); 
 923         wxCHECK_RET( ::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in UnsubclassWin") ); 
 925         PFNWP                       fnProc 
= (PFNWP
)::WinQueryWindowPtr(hwnd
, QWP_PFNWP
); 
 927         if ( (m_fnOldWndProc 
!= 0) && (fnProc 
!= (PFNWP
) m_fnOldWndProc
)) 
 929             WinSubclassWindow(hwnd
, (PFNWP
)m_fnOldWndProc
); 
 933 } // end of wxWindowOS2::UnsubclassWin 
 935 bool wxCheckWindowWndProc( 
 937 , WXFARPROC                         fnWndProc
 
 940     static char                     zBuffer
[512]; 
 943     ::WinQueryClassName((HWND
)hWnd
, (LONG
)512, (PCH
)zBuffer
); 
 944     ::WinQueryClassInfo(wxGetInstance(), (PSZ
)zBuffer
, &vCls
); 
 945     return(fnWndProc 
== (WXFARPROC
)vCls
.pfnWindowProc
); 
 946 } // end of WinGuiBase_CheckWindowWndProc 
 948 void wxWindowOS2::SetWindowStyleFlag( 
 952     long                            lFlagsOld 
= GetWindowStyleFlag(); 
 954     if (lFlags 
== lFlagsOld
) 
 958     // Update the internal variable 
 960     wxWindowBase::SetWindowStyleFlag(lFlags
); 
 963     // Now update the Windows style as well if needed - and if the window had 
 964     // been already created 
 970     WXDWORD                         dwExstyleOld
; 
 971     long                            lStyle 
= OS2GetStyle( lFlags
 
 974     long                            lStyleOld 
= OS2GetStyle( lFlagsOld
 
 978     if (lStyle 
!= lStyleOld
) 
 981         // Some flags (e.g. WS_VISIBLE or WS_DISABLED) should not be changed by 
 982         // this function so instead of simply setting the style to the new 
 983         // value we clear the bits which were set in styleOld but are set in 
 984         // the new one and set the ones which were not set before 
 986         long                        lStyleReal 
= ::WinQueryWindowULong(GetHwnd(), QWL_STYLE
); 
 988         lStyleReal 
&= ~lStyleOld
; 
 989         lStyleReal 
|= lStyle
; 
 991         ::WinSetWindowULong(GetHwnd(), QWL_STYLE
, lStyleReal
); 
 993 } // end of wxWindowOS2::SetWindowStyleFlag 
 995 WXDWORD 
wxWindowOS2::OS2GetStyle( long     lFlags
, 
 996                                   WXDWORD
* WXUNUSED(pdwExstyle
) ) const 
 998     WXDWORD                         dwStyle 
= 0L; 
1000     if (lFlags 
& wxCLIP_CHILDREN 
) 
1001         dwStyle 
|= WS_CLIPCHILDREN
; 
1003     if (lFlags 
& wxCLIP_SIBLINGS 
) 
1004         dwStyle 
|= WS_CLIPSIBLINGS
; 
1007 } // end of wxWindowOS2::OS2GetStyle 
1010 // Make a Windows extended style from the given wxWidgets window style 
1012 WXDWORD 
wxWindowOS2::MakeExtendedStyle( 
1014 , bool                              bEliminateBorders
 
1018    // Simply fill out with wxWindow extended styles.  We'll conjure 
1019    // something up in OS2Create and all window redrawing pieces later 
1021     WXDWORD                         dwStyle 
= 0; 
1023     if (lStyle 
& wxTRANSPARENT_WINDOW 
) 
1024         dwStyle 
|= wxTRANSPARENT_WINDOW
; 
1026     if (!bEliminateBorders
) 
1028         if (lStyle 
& wxSUNKEN_BORDER
) 
1029             dwStyle 
|= wxSUNKEN_BORDER
; 
1030         if (lStyle 
& wxDOUBLE_BORDER
) 
1031             dwStyle 
|= wxDOUBLE_BORDER
; 
1032         if (lStyle 
& wxRAISED_BORDER 
) 
1033             dwStyle 
|= wxRAISED_BORDER
; 
1034         if (lStyle 
& wxSTATIC_BORDER
) 
1035             dwStyle 
|= wxSTATIC_BORDER
; 
1038 } // end of wxWindowOS2::MakeExtendedStyle 
1041 // Setup background and foreground colours correctly 
1043 void wxWindowOS2::SetupColours() 
1046         SetBackgroundColour(GetParent()->GetBackgroundColour()); 
1047 } // end of wxWindowOS2::SetupColours 
1049 void wxWindowOS2::OnIdle( 
1050   wxIdleEvent
&                      WXUNUSED(rEvent
) 
1054     // Check if we need to send a LEAVE event 
1056     if (m_bMouseInWindow
) 
1060         ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
1061         if (::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, FALSE
) != (HWND
)GetHwnd()) 
1064             // Generate a LEAVE event 
1066             m_bMouseInWindow 
= false; 
1069             // Unfortunately the mouse button and keyboard state may have changed 
1070             // by the time the OnIdle function is called, so 'state' may be 
1080             wxMouseEvent            
rEvent(wxEVT_LEAVE_WINDOW
); 
1082             InitMouseEvent( rEvent
 
1087             (void)HandleWindowEvent(rEvent
); 
1090 } // end of wxWindowOS2::OnIdle 
1093 // Set this window to be the child of 'parent'. 
1095 bool wxWindowOS2::Reparent( wxWindowBase
* pParent
) 
1097     if (!wxWindowBase::Reparent(pParent
)) 
1100     HWND hWndChild 
= GetHwnd(); 
1101     HWND hWndParent 
= GetParent() ? GetWinHwnd(GetParent()) : (HWND
)0; 
1103     ::WinSetParent(hWndChild
, hWndParent
, TRUE
); 
1105 } // end of wxWindowOS2::Reparent 
1107 void wxWindowOS2::Update() 
1109     ::WinUpdateWindow(GetHwnd()); 
1110 } // end of wxWindowOS2::Update 
1112 void wxWindowOS2::DoFreeze() 
1114    ::WinSendMsg(GetHwnd(), WM_VRNDISABLED
, (MPARAM
)0, (MPARAM
)0); 
1115 } // end of wxWindowOS2::Freeze 
1117 void wxWindowOS2::DoThaw() 
1119    ::WinSendMsg(GetHwnd(), WM_VRNENABLED
, (MPARAM
)TRUE
, (MPARAM
)0); 
1122     // We need to refresh everything or otherwise he invalidated area is not 
1126 } // end of wxWindowOS2::Thaw 
1128 void wxWindowOS2::Refresh( bool bEraseBack
, 
1129                            const wxRect
* pRect 
) 
1131     HWND hWnd 
= GetHwnd(); 
1140             ::WinQueryWindowRect(GetHwnd(), &vOs2Rect
); 
1141             height 
= vOs2Rect
.yTop
; 
1142             vOs2Rect
.xLeft   
= pRect
->x
; 
1143             vOs2Rect
.yTop    
= height 
- pRect
->y
; 
1144             vOs2Rect
.xRight  
= pRect
->x 
+ pRect
->width
; 
1145             vOs2Rect
.yBottom 
= vOs2Rect
.yTop 
- pRect
->height
; 
1147             ::WinInvalidateRect(hWnd
, &vOs2Rect
, bEraseBack
); 
1150             ::WinInvalidateRect(hWnd
, NULL
, bEraseBack
); 
1151         if (m_hWndScrollBarHorz 
!= NULLHANDLE
) 
1152             ::WinInvalidateRect(m_hWndScrollBarHorz
, NULL
, TRUE
); 
1153         if (m_hWndScrollBarVert 
!= NULLHANDLE
) 
1154             ::WinInvalidateRect(m_hWndScrollBarVert
, NULL
, TRUE
); 
1156 } // end of wxWindowOS2::Refresh 
1158 // --------------------------------------------------------------------------- 
1160 // --------------------------------------------------------------------------- 
1162 #if wxUSE_DRAG_AND_DROP 
1163 void wxWindowOS2::SetDropTarget( 
1164   wxDropTarget
*                     pDropTarget
 
1167     m_dropTarget 
= pDropTarget
; 
1168 } // end of wxWindowOS2::SetDropTarget 
1172 // old style file-manager drag&drop support: we retain the old-style 
1173 // DragAcceptFiles in parallel with SetDropTarget. 
1175 void wxWindowOS2::DragAcceptFiles( 
1179     HWND                            hWnd 
= GetHwnd(); 
1181     if (hWnd 
&& bAccept
) 
1182         ::DrgAcceptDroppedFiles(hWnd
, NULL
, NULL
, DO_COPY
, 0L); 
1183 } // end of wxWindowOS2::DragAcceptFiles 
1185 // ---------------------------------------------------------------------------- 
1187 // ---------------------------------------------------------------------------- 
1191 void wxWindowOS2::DoSetToolTip( 
1195     wxWindowBase::DoSetToolTip(pTooltip
); 
1198         m_tooltip
->SetWindow(this); 
1199 } // end of wxWindowOS2::DoSetToolTip 
1201 #endif // wxUSE_TOOLTIPS 
1203 // --------------------------------------------------------------------------- 
1204 // moving and resizing 
1205 // --------------------------------------------------------------------------- 
1208 void wxWindowOS2::DoGetSize( 
1216     if (IsKindOf(CLASSINFO(wxFrame
))) 
1218         wxFrame
*                    pFrame 
= wxDynamicCast(this, wxFrame
); 
1219         hWnd 
= pFrame
->GetFrame(); 
1224     ::WinQueryWindowRect(hWnd
, &vRect
); 
1227         *pWidth 
= vRect
.xRight 
- vRect
.xLeft
; 
1229         // OS/2 PM is backwards from windows 
1230         *pHeight 
= vRect
.yTop 
- vRect
.yBottom
; 
1231 } // end of wxWindowOS2::DoGetSize 
1233 void wxWindowOS2::DoGetPosition( 
1239     // Return parameters assume wxWidgets coordinate system 
1244     wxWindow
*                       pParent 
= GetParent(); 
1247     // It would seem that WinQueryWindowRect would be the correlary to 
1248     // the WIN32 WinGetRect, but unlike WinGetRect which returns the window 
1249     // origin position in screen coordinates, WinQueryWindowRect returns it 
1250     // relative to itself, i.e. (0,0).  To get the same under PM we must 
1251     // use WinQueryWindowPos.  This call, unlike the WIN32 call, however, 
1252     // returns a position relative to it's parent, so no parent adujstments 
1253     // are needed under OS/2.  Also, windows should be created using 
1254     // wxWindow coordinates, i.e. 0,0 is the TOP left. 
1256     if (IsKindOf(CLASSINFO(wxFrame
))) 
1258         wxFrame
*                    pFrame 
= wxDynamicCast(this, wxFrame
); 
1259         hWnd 
= pFrame
->GetFrame(); 
1264     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1269     // We need to convert to wxWidgets coordinates 
1271     DoGetSize(NULL
,&vHeight
); 
1272     wxWindow
* pWindow 
= wxDynamicCast(this,wxWindow
); 
1273     vPoint
.y 
= pWindow
->GetOS2ParentHeight(pParent
) - vPoint
.y 
- vHeight
; 
1276     // We may be faking the client origin. So a window that's really at (0, 
1277     // 30) may appear (to wxWin apps) to be at (0, 0). 
1281         wxPoint                     
vPt(pParent
->GetClientAreaOrigin()); 
1291 } // end of wxWindowOS2::DoGetPosition 
1293 void wxWindowOS2::DoScreenToClient( 
1298     HWND                            hWnd 
= GetHwnd(); 
1301     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1307 } // end of wxWindowOS2::DoScreenToClient 
1309 void wxWindowOS2::DoClientToScreen( 
1314     HWND                            hWnd 
= GetHwnd(); 
1317     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1323 } // end of wxWindowOS2::DoClientToScreen 
1326 // Get size *available for subwindows* i.e. excluding menu bar etc. 
1327 // Must be a frame type window 
1329 void wxWindowOS2::DoGetClientSize( 
1334     HWND                            hWnd 
= GetHwnd(); 
1337    ::WinQueryWindowRect(hWnd
, &vRect
); 
1338     if (IsKindOf(CLASSINFO(wxDialog
))) 
1343         // For a Dialog we have to explicitly request the client portion. 
1344         // For a Frame the hWnd IS the client window 
1346         hWndTitle 
= ::WinWindowFromID(hWnd
, FID_TITLEBAR
); 
1347         if (::WinQueryWindowRect(hWndTitle
, &vTitle
)) 
1349             if (vTitle
.yTop 
- vTitle
.yBottom 
== 0) 
1352                 // Dialog has not been created yet, use a default 
1356             vRect
.yTop 
-= (vTitle
.yTop 
- vTitle
.yBottom
); 
1359         ULONG                       uStyle 
= ::WinQueryWindowULong(hWnd
, QWL_STYLE
); 
1362         // Deal with borders 
1364         if (uStyle 
& FCF_DLGBORDER
) 
1371         else if (uStyle 
& FCF_SIZEBORDER
) 
1378         else if (uStyle 
& FCF_BORDER
) 
1385         else // make some kind of adjustment or top sizers ram into the titlebar! 
1394         *pWidth  
= vRect
.xRight 
- vRect
.xLeft
; 
1396         *pHeight 
= vRect
.yTop 
- vRect
.yBottom
; 
1397 } // end of wxWindowOS2::DoGetClientSize 
1399 void wxWindowOS2::DoMoveWindow( 
1407     // Input parameters assume wxWidgets coordinate system 
1410     wxWindow
*                       pParent 
= GetParent(); 
1411     HWND                            hWnd 
= GetHwnd(); 
1413     if (pParent 
&& !IsKindOf(CLASSINFO(wxDialog
))) 
1415         int                         nOS2Height 
= GetOS2ParentHeight(pParent
); 
1417         nY 
= nOS2Height 
- (nY 
+ nHeight
); 
1423         ::WinQueryWindowRect(HWND_DESKTOP
, &vRect
); 
1424         nY 
= vRect
.yTop 
- (nY 
+ nHeight
); 
1428     // In the case of a frame whose client is sized, the client cannot be 
1429     // large than its parent frame minus its borders! This usually happens 
1430     // when using an autosizer to size a frame to precisely hold client 
1431     // controls as in the notebook sample. 
1433     // In this case, we may need to resize both a frame and its client so we 
1434     // need a quick calc of the frame border size, then if the frame 
1435     // (less its borders) is smaller than the client, size the frame to 
1436     // encompass the client with the appropriate border size. 
1438     if (IsKindOf(CLASSINFO(wxFrame
))) 
1441         int                         nWidthFrameDelta 
= 0; 
1442         int                         nHeightFrameDelta 
= 0; 
1445         pFrame 
= wxDynamicCast(this, wxFrame
); 
1446         hWnd 
= pFrame
->GetFrame(); 
1447         ::WinQueryWindowRect(hWnd
, &vRect
); 
1448         ::WinMapWindowPoints(hWnd
, HWND_DESKTOP
, (PPOINTL
)&vRect
, 2); 
1450         ::WinCalcFrameRect(hWnd
, &vRect
, TRUE
); 
1451         nWidthFrameDelta 
= ((vRect
.xLeft 
- vFRect
.xLeft
) + (vFRect
.xRight 
- vRect
.xRight
)); 
1452         nHeightFrameDelta 
= ((vRect
.yBottom 
- vFRect
.yBottom
) + (vFRect
.yTop 
- vRect
.yTop
)); 
1453         // Input values refer to the window position relative to its parent 
1454         // which may be the Desktop so we need to calculate 
1455         // the new frame values to keep the wxWidgets frame origin constant 
1456         nY 
-= nHeightFrameDelta
; 
1457         nWidth 
+= nWidthFrameDelta
; 
1458         nHeight 
+= nHeightFrameDelta
; 
1460     ::WinSetWindowPos( hWnd
 
1466                       ,SWP_SIZE 
| SWP_MOVE
 
1468     if (m_vWinSwp
.cx 
== 0 && m_vWinSwp
.cy 
== 0 && m_vWinSwp
.fl 
== 0) 
1472         ::WinQueryWindowPos(hWnd
, &m_vWinSwp
); 
1476         // Handle resizing of scrolled windows.  The target or window to 
1477         // be scrolled is the owner (gets the scroll notifications).  The 
1478         // parent is usually the parent frame of the scrolled panel window. 
1479         // In order to show the scrollbars the target window will be shrunk 
1480         // by the size of the scroll bar widths and moved in the X and Y 
1481         // directon.  That value will be computed as part of the diff for 
1482         // moving the children.  Everytime the window is sized the 
1483         // toplevel OnSize is going to resize the panel to fit the client 
1484         // or the whole sizer and will need to me resized. This will send 
1485         // a WM_SIZE out which will be intercepted by the ScrollHelper 
1486         // which will cause the scrollbars to be displayed via the SetScrollbar 
1489         if (IsKindOf(CLASSINFO(wxScrolledWindow
))) 
1491             int                     nAdjustWidth  
= 0; 
1492             int                     nAdjustHeight 
= 0; 
1493             int nHSBHeight 
= wxSystemSettingsNative::GetMetric(wxSYS_HSCROLL_Y
, 
1495             int nVSBWidth  
= wxSystemSettingsNative::GetMetric(wxSYS_VSCROLL_X
, 
1499             if (GetScrollBarHorz() == NULLHANDLE 
|| 
1500                 !WinIsWindowShowing(GetScrollBarHorz())) 
1503                 nAdjustHeight 
= nHSBHeight
; 
1504             if (GetScrollBarVert() == NULLHANDLE 
|| 
1505                 !WinIsWindowShowing(GetScrollBarVert())) 
1508                 nAdjustWidth 
= nVSBWidth
; 
1509             ::WinQueryWindowPos(hWnd
, &vSwpScroll
); 
1510             ::WinSetWindowPos( hWnd
 
1513                               ,vSwpScroll
.y 
+ nAdjustHeight
 
1514                               ,vSwpScroll
.cx 
- nAdjustWidth
 
1515                               ,vSwpScroll
.cy 
- nAdjustHeight
 
1516                               ,SWP_MOVE 
| SWP_SIZE
 
1519         ::WinQueryWindowPos(hWnd
, &m_vWinSwp
); 
1521 } // end of wxWindowOS2::DoMoveWindow 
1524 // Set the size of the window: if the dimensions are positive, just use them, 
1525 // but if any of them is equal to -1, it means that we must find the value for 
1526 // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in 
1527 // which case -1 is a valid value for x and y) 
1529 // If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate 
1530 // the width/height to best suit our contents, otherwise we reuse the current 
1533 void wxWindowOS2::DoSetSize( int nX
, 
1540     // Input & output parameters assume wxWidgets coordinate system 
1544     // Get the current size and position... 
1550     wxSize vSize 
= wxDefaultSize
; 
1552     GetPosition(&nCurrentX
, &nCurrentY
); 
1553     GetSize(&nCurrentWidth
, &nCurrentHeight
); 
1556     // ... and don't do anything (avoiding flicker) if it's already ok 
1558     if (nX 
== nCurrentX 
&& nY 
== nCurrentY 
&& 
1559         nWidth 
== nCurrentWidth 
&& nHeight 
== nCurrentHeight
) 
1564     if (nX 
== wxDefaultCoord 
&& !(nSizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
)) 
1566     if (nY 
== wxDefaultCoord 
&& !(nSizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
)) 
1569     AdjustForParentClientOrigin(nX
, nY
, nSizeFlags
); 
1571     if (nWidth 
== wxDefaultCoord
) 
1573         if (nSizeFlags 
& wxSIZE_AUTO_WIDTH
) 
1575             vSize  
= DoGetBestSize(); 
1581             // Just take the current one 
1583             nWidth 
= nCurrentWidth
; 
1587     if (nHeight 
== wxDefaultCoord
) 
1589         if (nSizeFlags 
& wxSIZE_AUTO_HEIGHT
) 
1591             if (vSize
.x 
== wxDefaultCoord
) 
1593                 vSize 
= DoGetBestSize(); 
1599             // just take the current one 
1600             nHeight 
= nCurrentHeight
; 
1604     DoMoveWindow( nX
, nY
, nWidth
, nHeight 
); 
1605 } // end of wxWindowOS2::DoSetSize 
1607 void wxWindowOS2::DoSetClientSize( int nWidth
, 
1611     // nX & nY assume wxWidgets coordinate system 
1616     GetPosition(&nX
, &nY
); 
1618     DoMoveWindow( nX
, nY
, nWidth
, nHeight 
); 
1620     wxSize 
size( nWidth
, nHeight 
); 
1621     wxSizeEvent 
vEvent( size
, m_windowId 
); 
1622     vEvent
.SetEventObject(this); 
1623     HandleWindowEvent(vEvent
); 
1624 } // end of wxWindowOS2::DoSetClientSize 
1626 // --------------------------------------------------------------------------- 
1628 // --------------------------------------------------------------------------- 
1630 int wxWindowOS2::GetCharHeight() const 
1633     FONTMETRICS                     vFontMetrics
; 
1635     hPs 
= ::WinGetPS(GetHwnd()); 
1637     if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
)) 
1639         ::WinReleasePS(hPs
); 
1642     ::WinReleasePS(hPs
); 
1643     return(vFontMetrics
.lMaxAscender 
+ vFontMetrics
.lMaxDescender
); 
1644 } // end of wxWindowOS2::GetCharHeight 
1646 int wxWindowOS2::GetCharWidth() const 
1649     FONTMETRICS                     vFontMetrics
; 
1651     hPs 
= ::WinGetPS(GetHwnd()); 
1653     if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
)) 
1655         ::WinReleasePS(hPs
); 
1658     ::WinReleasePS(hPs
); 
1659     return(vFontMetrics
.lAveCharWidth
); 
1660 } // end of wxWindowOS2::GetCharWidth 
1662 void wxWindowOS2::DoGetTextExtent( const wxString
& rString
, 
1666                                    int* pExternalLeading
, 
1667                                    const wxFont
* WXUNUSED(pTheFont
) ) const 
1669     POINTL      avPoint
[TXTBOX_COUNT
]; 
1674     FONTMETRICS vFM
; // metrics structure 
1678     hPS 
= ::WinGetPS(GetHwnd()); 
1680     l 
= rString
.length(); 
1684         // In world coordinates. 
1686         bRc 
= ::GpiQueryTextBox( hPS
, 
1688                                  (char*) rString
.wx_str(), 
1689                                  TXTBOX_COUNT
,// return maximum information 
1690                                  avPoint      
// array of coordinates points 
1694             vPtMin
.x 
= avPoint
[0].x
; 
1695             vPtMax
.x 
= avPoint
[0].x
; 
1696             vPtMin
.y 
= avPoint
[0].y
; 
1697             vPtMax
.y 
= avPoint
[0].y
; 
1698             for (i 
= 1; i 
< 4; i
++) 
1700                 if(vPtMin
.x 
> avPoint
[i
].x
) vPtMin
.x 
= avPoint
[i
].x
; 
1701                 if(vPtMin
.y 
> avPoint
[i
].y
) vPtMin
.y 
= avPoint
[i
].y
; 
1702                 if(vPtMax
.x 
< avPoint
[i
].x
) vPtMax
.x 
= avPoint
[i
].x
; 
1703                 if(vPtMax
.y 
< avPoint
[i
].y
) vPtMax
.y 
= avPoint
[i
].y
; 
1705             bRc 
= ::GpiQueryFontMetrics( hPS
 
1706                                         ,sizeof(FONTMETRICS
) 
1733         *pX 
= (vPtMax
.x 
- vPtMin
.x 
+ 1); 
1735         *pY 
= (vPtMax
.y 
- vPtMin
.y 
+ 1); 
1739             *pDescent 
= vFM
.lMaxDescender
; 
1743     if (pExternalLeading
) 
1746             *pExternalLeading 
= vFM
.lExternalLeading
; 
1748             *pExternalLeading 
= 0; 
1750     ::WinReleasePS(hPS
); 
1751 } // end of wxWindow::DoGetTextExtent 
1753 bool wxWindowOS2::IsMouseInWindow() const 
1756     // Get the mouse position 
1759     ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
); 
1762     // Find the window which currently has the cursor and go up the window 
1763     // chain until we find this window - or exhaust it 
1765     HWND hWnd 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt
, TRUE
); 
1767     while (hWnd 
&& (hWnd 
!= GetHwnd())) 
1768         hWnd 
= ::WinQueryWindow(hWnd
, QW_PARENT
); 
1770     return hWnd 
!= NULL
; 
1771 } // end of wxWindowOS2::IsMouseInWindow 
1774 // --------------------------------------------------------------------------- 
1776 // --------------------------------------------------------------------------- 
1778 #if wxUSE_MENUS_NATIVE 
1779 bool wxWindowOS2::DoPopupMenu( wxMenu
* pMenu
, int nX
, int nY 
) 
1781     HWND hWndOwner 
= GetHwnd(); 
1782     HWND hWndParent 
= GetHwnd(); 
1783     HWND hMenu 
= GetHmenuOf(pMenu
); 
1784     bool bIsWaiting 
= true; 
1789     if ( nX 
== -1 && nY 
== -1 ) 
1791         wxPoint mouse 
= wxGetMousePosition(); 
1792         nX 
= mouse
.x
; nY 
= mouse
.y
; 
1796         DoClientToScreen( &nX
 
1799         DoGetSize(0,&nHeight
); 
1803     ::WinPopupMenu( hWndParent
 
1809                    ,PU_HCONSTRAIN 
| PU_VCONSTRAIN 
| PU_MOUSEBUTTON1 
| PU_KEYBOARD
 
1816         ::WinGetMsg(vHabmain
,&vMsg
, (HWND
)0, 0, 0); 
1817         if (vMsg
.msg 
== WM_COMMAND
) 
1819         ::WinDispatchMsg(vHabmain
, (PQMSG
)&vMsg
); 
1823 } // end of wxWindowOS2::DoPopupMenu 
1824 #endif // wxUSE_MENUS_NATIVE 
1826 // =========================================================================== 
1827 // pre/post message processing 
1828 // =========================================================================== 
1830 MRESULT 
wxWindowOS2::OS2DefWindowProc( WXUINT uMsg
, 
1835         return (MRESULT
)m_fnOldWndProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
); 
1837         return ::WinDefWindowProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
); 
1838 } // end of wxWindowOS2::OS2DefWindowProc 
1840 bool wxWindowOS2::OS2ProcessMessage( WXMSG
* pMsg 
) 
1842 // wxUniversal implements tab traversal itself 
1843 #ifndef __WXUNIVERSAL__ 
1844     QMSG
*                           pQMsg 
= (QMSG
*)pMsg
; 
1846     if (m_hWnd 
!= 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL
)) 
1849         // Intercept dialog navigation keys 
1851         bool   bProcess 
= true; 
1852         USHORT uKeyFlags 
= SHORT1FROMMP(pQMsg
->mp1
); 
1854         if (uKeyFlags 
& KC_KEYUP
) 
1857         if (uKeyFlags 
& KC_ALT
) 
1860         if (!(uKeyFlags 
& KC_VIRTUALKEY
)) 
1865             bool                    bCtrlDown 
= IsCtrlDown(); 
1866             bool                    bShiftDown 
= IsShiftDown(); 
1869             // WM_QUERYDLGCODE: ask the control if it wants the key for itself, 
1870             // don't process it if it's the case (except for Ctrl-Tab/Enter 
1871             // combinations which are always processed) 
1873             ULONG                   ulDlgCode 
= 0; 
1877                 ulDlgCode 
= (ULONG
)::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0); 
1880             bool bForward 
= true; 
1881             bool bWindowChange 
= false; 
1883             switch (SHORT2FROMMP(pQMsg
->mp2
)) 
1886                 // Going to make certain assumptions about specific types of controls 
1887                 // here, so we may have to alter some things later if they prove invalid 
1891                     // Shift tabl will always be a nav-key but tabs may be wanted 
1900                         // Entry Fields want tabs for themselve usually 
1904                             case DLGC_ENTRYFIELD
: 
1914                         // Ctrl-Tab cycles thru notebook pages 
1916                         bWindowChange 
= bCtrlDown
; 
1917                         bForward 
= !bShiftDown
; 
1940                             // ctrl-enter is not processed 
1944                         else if (ulDlgCode 
& DLGC_BUTTON
) 
1947                             // buttons want process Enter themselevs 
1953                             wxTopLevelWindow 
*tlw 
= wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow
); 
1954                             wxButton
*   pBtn 
= NULL
; 
1958                                 pBtn 
= wxDynamicCast(tlw
->GetDefaultItem(), wxButton
); 
1961                             if (pBtn 
&& pBtn
->IsEnabled()) 
1964                                 // If we do have a default button, do press it 
1966                                 pBtn
->OS2Command(BN_CLICKED
, 0 /* unused */); 
1969                             else if (!IsTopLevel()) 
1972                                 // if not a top level window, let parent 
1977                             // else: but if it does not it makes sense to make 
1978                             //       it work like a TAB - and that's what we do. 
1979                             //       Note that Ctrl-Enter always works this way. 
1990                 wxNavigationKeyEvent    vEvent
; 
1992                 vEvent
.SetDirection(bForward
); 
1993                 vEvent
.SetWindowChange(bWindowChange
); 
1994                 vEvent
.SetEventObject(this); 
1996                 if (HandleWindowEvent(vEvent
)) 
1998                     wxButton
*       pBtn 
= wxDynamicCast(FindFocus(), wxButton
); 
2003                         // The button which has focus should be default 
2012         // Let Dialogs process 
2014         if (::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0)); 
2018     pMsg 
= pMsg
; // just shut up the compiler 
2019 #endif // __WXUNIVERSAL__ 
2022 } // end of wxWindowOS2::OS2ProcessMessage 
2024 bool wxWindowOS2::OS2TranslateMessage( WXMSG
* pMsg 
) 
2026 #if wxUSE_ACCEL && !defined(__WXUNIVERSAL__) 
2027     return m_acceleratorTable
.Translate(m_hWnd
, pMsg
); 
2031 #endif //wxUSE_ACCEL 
2032 } // end of wxWindowOS2::OS2TranslateMessage 
2034 bool wxWindowOS2::OS2ShouldPreProcessMessage( WXMSG
* WXUNUSED(pMsg
) ) 
2036     // preprocess all messages by default 
2038 } // end of wxWindowOS2::OS2ShouldPreProcessMessage 
2040 // --------------------------------------------------------------------------- 
2041 // message params unpackers 
2042 // --------------------------------------------------------------------------- 
2044 void wxWindowOS2::UnpackCommand( 
2052     *pId 
= LOWORD(wParam
); 
2053     *phWnd 
= NULL
;  // or may be GetHWND() ? 
2054     *pCmd 
= LOWORD(lParam
); 
2055 } // end of wxWindowOS2::UnpackCommand 
2057 void wxWindowOS2::UnpackActivate( 
2064     *pState     
= LOWORD(wParam
); 
2065     *phWnd      
= (WXHWND
)lParam
; 
2066 } // end of wxWindowOS2::UnpackActivate 
2068 void wxWindowOS2::UnpackScroll( 
2079     ulId    
= (ULONG
)LONGFROMMP(wParam
); 
2080     hWnd 
= ::WinWindowFromID(GetHwnd(), ulId
); 
2081     if (hWnd 
== m_hWndScrollBarHorz 
|| hWnd 
== m_hWndScrollBarVert
) 
2082         *phWnd 
= NULLHANDLE
; 
2086     *pPos  
= SHORT1FROMMP(lParam
); 
2087     *pCode 
= SHORT2FROMMP(lParam
); 
2088 } // end of wxWindowOS2::UnpackScroll 
2090 void wxWindowOS2::UnpackMenuSelect( 
2098     *pItem 
= (WXWORD
)LOWORD(wParam
); 
2099     *pFlags 
= HIWORD(wParam
); 
2100     *phMenu 
= (WXHMENU
)lParam
; 
2101 } // end of wxWindowOS2::UnpackMenuSelect 
2103 // --------------------------------------------------------------------------- 
2104 // Main wxWidgets window proc and the window proc for wxWindow 
2105 // --------------------------------------------------------------------------- 
2108 // Hook for new window just as it's being created, when the window isn't yet 
2109 // associated with the handle 
2111 wxWindowOS2
*                         wxWndHook 
= NULL
; 
2116 MRESULT EXPENTRY 
wxWndProc( 
2123     wxWindowOS2
*                    pWnd 
= wxFindWinFromHandle((WXHWND
)hWnd
); 
2126     // When we get the first message for the HWND we just created, we associate 
2127     // it with wxWindow stored in wxWndHook 
2129     if (!pWnd 
&& wxWndHook
) 
2131         wxAssociateWinWithHandle(hWnd
, wxWndHook
); 
2134         pWnd
->SetHWND((WXHWND
)hWnd
); 
2137     MRESULT                         rc 
= (MRESULT
)0; 
2141     // Stop right here if we don't have a valid handle in our wxWindow object. 
2143     if (pWnd 
&& !pWnd
->GetHWND()) 
2145         pWnd
->SetHWND((WXHWND
) hWnd
); 
2146         rc 
= pWnd
->OS2DefWindowProc(ulMsg
, wParam
, lParam 
); 
2153             rc 
= pWnd
->OS2WindowProc(ulMsg
, wParam
, lParam
); 
2154             if ( (pWnd
->GetScrollBarHorz() != NULLHANDLE 
|| 
2155                   pWnd
->GetScrollBarVert() != NULLHANDLE
) && 
2158                 if (pWnd
->GetScrollBarHorz() != NULLHANDLE
) 
2159                     ::WinInvalidateRect(pWnd
->GetScrollBarHorz(), NULL
, TRUE
); 
2160                 if (pWnd
->GetScrollBarVert() != NULLHANDLE
) 
2161                     ::WinInvalidateRect(pWnd
->GetScrollBarVert(), NULL
, TRUE
); 
2165             rc 
= ::WinDefWindowProc(hWnd
, ulMsg
, wParam
, lParam
); 
2169 } // end of wxWndProc 
2172 // We will add (or delete) messages we need to handle at this default 
2175 MRESULT 
wxWindowOS2::OS2WindowProc( WXUINT uMsg
, 
2180     // Did we process the uMsg? 
2182     bool bProcessed 
= false; 
2186     // For most messages we should return 0 when we do process the message 
2188     mResult 
= (MRESULT
)0; 
2196                 bProcessed 
= HandleCreate( (WXLPCREATESTRUCT
)lParam
 
2202                     // Return 0 to bAllow window creation 
2204                     mResult 
= (MRESULT
)(bMayCreate 
? 0 : -1); 
2215             bProcessed 
= HandleMove( LOWORD(lParam
) 
2221             bProcessed 
= HandleSize( LOWORD(lParam
) 
2227         case WM_WINDOWPOSCHANGED
: 
2230             // Dialogs under OS/2 do not get WM_SIZE events at all. 
2231             // Instead they get this, which can function much like WM_SIZE 
2232             // PSWP contains the new sizes and positioning, PSWP+1 the old 
2233             // We use this because ADJUSTWINDOWPOS comes BEFORE the new 
2234             // position is added and our auto layout does a WinQueryWindowRect 
2235             // to get the CURRENT client size.  That is the size used to position 
2236             // child controls, so we need to already be sized 
2237             // in order to get the child controls positoned properly. 
2239             if (IsKindOf(CLASSINFO(wxDialog
)) || IsKindOf(CLASSINFO(wxFrame
))) 
2241                 PSWP                pSwp 
= (PSWP
)PVOIDFROMMP(wParam
); 
2242                 PSWP                pSwp2 
= pSwp
++; 
2244                 if (!(pSwp
->cx 
== pSwp2
->cx 
&& 
2245                       pSwp
->cy 
== pSwp2
->cy
)) 
2246                     bProcessed 
= HandleSize( pSwp
->cx
 
2250                 if (IsKindOf(CLASSINFO(wxFrame
))) 
2252                     wxFrame
*            pFrame 
= wxDynamicCast(this, wxFrame
); 
2256                         if (pFrame
->GetStatusBar()) 
2257                             pFrame
->PositionStatusBar(); 
2258                         if (pFrame
->GetToolBar()) 
2259                             pFrame
->PositionToolBar(); 
2270                 UnpackActivate( wParam
 
2276                 bProcessed 
= HandleActivate( wState
 
2284             if (SHORT1FROMMP((MPARAM
)lParam
) == TRUE
) 
2285                 bProcessed 
= HandleSetFocus((WXHWND
)(HWND
)wParam
); 
2287                 bProcessed 
= HandleKillFocus((WXHWND
)(HWND
)wParam
); 
2291             bProcessed 
= HandlePaint(); 
2296             // Don't let the DefWindowProc() destroy our window - we'll do it 
2297             // ourselves in ~wxWindow 
2300             mResult 
= (MRESULT
)TRUE
; 
2304             bProcessed 
= HandleShow(wParam 
!= 0, (int)lParam
); 
2308         // Under OS2 PM Joysticks are treated just like mouse events 
2309         // The "Motion" events will be prevelent in joysticks 
2312         case WM_BUTTON1DOWN
: 
2314         case WM_BUTTON1DBLCLK
: 
2315         case WM_BUTTON1MOTIONEND
: 
2316         case WM_BUTTON1MOTIONSTART
: 
2317         case WM_BUTTON2DOWN
: 
2319         case WM_BUTTON2DBLCLK
: 
2320         case WM_BUTTON2MOTIONEND
: 
2321         case WM_BUTTON2MOTIONSTART
: 
2322         case WM_BUTTON3DOWN
: 
2324         case WM_BUTTON3DBLCLK
: 
2325         case WM_BUTTON3MOTIONEND
: 
2326         case WM_BUTTON3MOTIONSTART
: 
2328                 short               nX 
= LOWORD(wParam
); 
2329                 short               nY 
= HIWORD(wParam
); 
2332                 // Redirect the event to a static control if necessary 
2334                 if (this == GetCapture()) 
2336                     bProcessed 
= HandleMouseEvent( uMsg
 
2339                                                   ,(WXUINT
)SHORT2FROMMP(lParam
) 
2344                     wxWindow
*       pWin 
= FindWindowForMouseEvent( this 
2348                     if (!pWin
->IsOfStandardClass()) 
2350                         if (uMsg 
== WM_BUTTON1DOWN 
&& pWin
->CanAcceptFocus() ) 
2353                     bProcessed 
= pWin
->HandleMouseEvent( uMsg
 
2356                                                         ,(WXUINT
)SHORT2FROMMP(lParam
) 
2363             bProcessed 
= HandleSysCommand(wParam
, lParam
); 
2370                 UnpackCommand(wParam
, lParam
, &id
, &hwnd
, &cmd
); 
2372                 bProcessed 
= HandleCommand(id
, cmd
, hwnd
); 
2377             // For these messages we must return TRUE if process the message 
2380         case WM_MEASUREITEM
: 
2382                 int                 nIdCtrl 
= (UINT
)wParam
; 
2384                 if ( uMsg 
== WM_DRAWITEM 
) 
2386                     bProcessed 
= OS2OnDrawItem(nIdCtrl
, 
2387                                               (WXDRAWITEMSTRUCT 
*)lParam
); 
2391                     return MRFROMLONG(OS2OnMeasureItem( nIdCtrl
 
2392                                                        ,(WXMEASUREITEMSTRUCT 
*)lParam
 
2397                     mResult 
= (MRESULT
)TRUE
; 
2401         case WM_QUERYDLGCODE
: 
2402             if (!IsOfStandardClass()) 
2406                     mResult 
= (MRESULT
)m_lDlgCode
; 
2411             //else: get the dlg code from the DefWindowProc() 
2416         // In OS/2 PM all keyboard events are of the WM_CHAR type.  Virtual key and key-up 
2417         // and key-down events are obtained from the WM_CHAR params. 
2421                 USHORT                  uKeyFlags 
= SHORT1FROMMP((MPARAM
)wParam
); 
2423                 if (uKeyFlags 
& KC_KEYUP
) 
2425                     //TODO: check if the cast to WXWORD isn't causing trouble 
2426                     bProcessed 
= HandleKeyUp(wParam
, lParam
); 
2429                 else // keydown event 
2431                     m_bLastKeydownProcessed 
= false; 
2433                     // If this has been processed by an event handler, 
2434                     // return 0 now (we've handled it). DON't RETURN 
2435                     // we still need to process further 
2437                     m_bLastKeydownProcessed 
= HandleKeyDown(wParam
, lParam
); 
2438                     if (uKeyFlags 
& KC_VIRTUALKEY
) 
2440                         USHORT          uVk 
= SHORT2FROMMP((MPARAM
)lParam
); 
2443                         // We consider these message "not interesting" to OnChar 
2456                             // Avoid duplicate messages to OnChar for these ASCII keys: they 
2457                             // will be translated by TranslateMessage() and received in WM_CHAR 
2462                                 // But set processed to false, not true to still pass them to 
2463                                 // the control's default window proc - otherwise built-in 
2464                                 // keyboard handling won't work 
2469                                 bProcessed 
= HandleChar(wParam
, lParam
); 
2473                     else // WM_CHAR -- Always an ASCII character 
2475                         if (m_bLastKeydownProcessed
) 
2478                             // The key was handled in the EVT_KEY_DOWN and handling 
2479                             // a key in an EVT_KEY_DOWN handler is meant, by 
2480                             // design, to prevent EVT_CHARs from happening 
2482                             m_bLastKeydownProcessed 
= false; 
2485                         else // do generate a CHAR event 
2487                             bProcessed 
= HandleChar(wParam
, lParam
, true); 
2500                 UnpackScroll( wParam
 
2507                 bProcessed 
= OS2OnScroll( uMsg 
== WM_HSCROLL 
? wxHORIZONTAL
 
2517             switch(SHORT2FROMMP(wParam
)) 
2521                         HWND                hWnd 
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
)); 
2522                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2529                         if (pWin
->IsKindOf(CLASSINFO(wxBitmapButton
))) 
2531                             wxBitmapButton
*     pBitmapButton 
= wxDynamicCast(pWin
, wxBitmapButton
); 
2533                             pBitmapButton
->OS2OnDraw((WXDRAWITEMSTRUCT 
*)lParam
); 
2539                 case BKN_PAGESELECTEDPENDING
: 
2541                         PPAGESELECTNOTIFY  pPage 
= (PPAGESELECTNOTIFY
)lParam
; 
2543                         if ((pPage
->ulPageIdNew 
!= pPage
->ulPageIdCur
) && 
2544                             (pPage
->ulPageIdNew 
> 0L && pPage
->ulPageIdCur 
> 0L)) 
2546                             wxWindowOS2
*        pWin 
= wxFindWinFromHandle(pPage
->hwndBook
); 
2547                             wxBookCtrlEvent     
vEvent( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
 
2548                                                        ,(int)SHORT1FROMMP(wParam
) 
2549                                                        ,(int)pPage
->ulPageIdNew
 
2550                                                        ,(int)pPage
->ulPageIdCur
 
2557                             if (pWin
->IsKindOf(CLASSINFO(wxNotebook
))) 
2559                                 wxNotebook
*         pNotebook 
= wxDynamicCast(pWin
, wxNotebook
); 
2561                                 vEvent
.SetEventObject(pWin
); 
2562                                 pNotebook
->OnSelChange(vEvent
); 
2574                 case BN_CLICKED
: // Dups as LN_SELECT and CBN_LBSELECT 
2576                         HWND                hWnd 
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
)); 
2577                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2585                         // Simulate a WM_COMMAND here, as wxWidgets expects all control 
2586                         // button clicks to generate WM_COMMAND msgs, not WM_CONTROL 
2588                         if (pWin
->IsKindOf(CLASSINFO(wxRadioBox
))) 
2590                             wxRadioBox
*         pRadioBox 
= wxDynamicCast(pWin
, wxRadioBox
); 
2592                             pRadioBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2593                                                   ,(WXWORD
)SHORT1FROMMP(wParam
) 
2596                         if (pWin
->IsKindOf(CLASSINFO(wxRadioButton
))) 
2598                             wxRadioButton
*      pRadioButton 
= wxDynamicCast(pWin
, wxRadioButton
); 
2600                             pRadioButton
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2601                                                      ,(WXWORD
)SHORT1FROMMP(wParam
) 
2604                         if (pWin
->IsKindOf(CLASSINFO(wxCheckBox
))) 
2606                             wxCheckBox
*         pCheckBox 
= wxDynamicCast(pWin
, wxCheckBox
); 
2608                             pCheckBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2609                                                   ,(WXWORD
)SHORT1FROMMP(wParam
) 
2612                         if (pWin
->IsKindOf(CLASSINFO(wxListBox
))) 
2614                             wxListBox
*          pListBox 
= wxDynamicCast(pWin
, wxListBox
); 
2616                             pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2617                                                  ,(WXWORD
)SHORT1FROMMP(wParam
) 
2619                             if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
) 
2622                         if (pWin
->IsKindOf(CLASSINFO(wxComboBox
))) 
2624                             wxComboBox
*          pComboBox 
= wxDynamicCast(pWin
, wxComboBox
); 
2626                             pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2627                                                   ,(WXWORD
)SHORT1FROMMP(wParam
) 
2630                         if (pWin
->IsKindOf(CLASSINFO(wxChoice
))) 
2632                             wxChoice
*           pChoice 
= wxDynamicCast(pWin
, wxChoice
); 
2634                             pChoice
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2635                                                 ,(WXWORD
)SHORT1FROMMP(wParam
) 
2644                         HWND                hWnd 
= HWNDFROMMP(lParam
); 
2645                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2653                         // Simulate a WM_COMMAND here, as wxWidgets expects all control 
2654                         // button clicks to generate WM_COMMAND msgs, not WM_CONTROL 
2656                         if (pWin
->IsKindOf(CLASSINFO(wxListBox
))) 
2658                             wxListBox
*          pListBox 
= wxDynamicCast(pWin
, wxListBox
); 
2660                             pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2661                                                  ,(WXWORD
)SHORT1FROMMP(wParam
) 
2663                             if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
) 
2667                         if (pWin
->IsKindOf(CLASSINFO(wxComboBox
))) 
2669                             wxComboBox
*          pComboBox 
= wxDynamicCast(pWin
, wxComboBox
); 
2671                             pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2672                                                   ,(WXWORD
)SHORT1FROMMP(wParam
) 
2680                 case SPBN_DOWNARROW
: 
2686                         ::WinSendMsg( HWNDFROMMP(lParam
) 
2689                                      ,MPFROM2SHORT( (USHORT
)10 
2690                                                    ,(USHORT
)SPBQ_UPDATEIFVALID
 
2694                         bProcessed 
= OS2OnScroll( wxVERTICAL
 
2695                                                  ,(WXWORD
)SHORT2FROMMP(wParam
) 
2702                 case SLN_SLIDERTRACK
: 
2704                         HWND         hWnd 
= ::WinWindowFromID(GetHWND(), SHORT1FROMMP(wParam
)); 
2705                         wxWindowOS2
* pChild 
= wxFindWinFromHandle(hWnd
); 
2712                         if (pChild
->IsKindOf(CLASSINFO(wxSlider
))) 
2713                             bProcessed 
= OS2OnScroll( wxVERTICAL
 
2714                                                      ,(WXWORD
)SHORT2FROMMP(wParam
) 
2715                                                      ,(WXWORD
)LONGFROMMP(lParam
) 
2723 #if defined(__VISAGECPP__) && (__IBMCPP__ >= 400) 
2724         case WM_CTLCOLORCHANGE
: 
2726                 bProcessed 
= HandleCtlColor(&hBrush
); 
2730         case WM_ERASEBACKGROUND
: 
2732             // Returning TRUE to requestw PM to paint the window background 
2733             // in SYSCLR_WINDOW. We don't really want that 
2735             bProcessed 
= HandleEraseBkgnd((WXHDC
)(HPS
)wParam
); 
2736             mResult 
= (MRESULT
)(FALSE
); 
2739             // the return value for this message is ignored 
2740         case WM_SYSCOLORCHANGE
: 
2741             bProcessed 
= HandleSysColorChange(); 
2744         case WM_REALIZEPALETTE
: 
2745             bProcessed 
= HandlePaletteChanged(); 
2748         // move all drag and drops to wxDrg 
2750             bProcessed 
= HandleEndDrag(wParam
); 
2754             bProcessed 
= HandleInitDialog((WXHWND
)(HWND
)wParam
); 
2758                 // we never set focus from here 
2759                 mResult 
= (MRESULT
)FALSE
; 
2763         // wxFrame specific message 
2764         case WM_MINMAXFRAME
: 
2765             bProcessed 
= HandleGetMinMaxInfo((PSWP
)wParam
); 
2768         case WM_SYSVALUECHANGED
: 
2769             // TODO: do something 
2770             mResult 
= (MRESULT
)TRUE
; 
2774         // Comparable to WM_SETPOINTER for windows, only for just controls 
2776         case WM_CONTROLPOINTER
: 
2777             bProcessed 
= HandleSetCursor( SHORT1FROMMP(wParam
) // Control ID 
2778                                          ,(HWND
)lParam         
// Cursor Handle 
2783                 // Returning TRUE stops the DefWindowProc() from further 
2784                 // processing this message - exactly what we need because we've 
2785                 // just set the cursor. 
2787                 mResult 
= (MRESULT
)TRUE
; 
2791 #if wxUSE_MENUS_NATIVE 
2793             if (wxCurrentPopupMenu
) 
2795                 if (GetHmenuOf(wxCurrentPopupMenu
) == (HWND
)lParam
) 
2797                     // Break out of msg loop in DoPopupMenu 
2798                     ::WinPostMsg((HWND
)lParam
,WM_COMMAND
,wParam
,0); 
2802 #endif // wxUSE_MENUS_NATIVE 
2808         wxLogTrace(wxTraceMessages
, wxT("Forwarding %s to DefWindowProc."), 
2809                    wxGetMessageName(uMsg
)); 
2810 #endif // __WXDEBUG__ 
2811         if (IsKindOf(CLASSINFO(wxFrame
))) 
2812             mResult 
= ::WinDefWindowProc(m_hWnd
, uMsg
, wParam
, lParam
); 
2813         else if (IsKindOf(CLASSINFO(wxDialog
))) 
2814             mResult 
= ::WinDefDlgProc( m_hWnd
, uMsg
, wParam
, lParam
); 
2816             mResult 
= OS2DefWindowProc(uMsg
, wParam
, lParam
); 
2819 } // end of wxWindowOS2::OS2WindowProc 
2821 // ---------------------------------------------------------------------------- 
2822 // wxWindow <-> HWND map 
2823 // ---------------------------------------------------------------------------- 
2825 wxWinHashTable 
*wxWinHandleHash 
= NULL
; 
2827 wxWindow
* wxFindWinFromHandle( 
2831     return (wxWindow 
*)wxWinHandleHash
->Get((long)hWnd
); 
2832 } // end of wxFindWinFromHandle 
2834 void wxAssociateWinWithHandle( 
2840     // Adding NULL hWnd is (first) surely a result of an error and 
2841     // (secondly) breaks menu command processing 
2843     wxCHECK_RET( hWnd 
!= (HWND
)NULL
, 
2844                  wxT("attempt to add a NULL hWnd to window list ignored") ); 
2846     wxWindow
*                       pOldWin 
= wxFindWinFromHandle((WXHWND
) hWnd
); 
2848     if (pOldWin 
&& (pOldWin 
!= pWin
)) 
2850         wxString  
Newstr(pWin
->GetClassInfo()->GetClassName()); 
2851         wxString 
Oldstr(pOldWin
->GetClassInfo()->GetClassName()); 
2852         wxLogError( wxT("Bug! New window of class %s has same HWND %X as old window of class %s"), 
2860         wxWinHandleHash
->Put( (long)hWnd
 
2864 } // end of wxAssociateWinWithHandle 
2866 void wxRemoveHandleAssociation( wxWindowOS2
* pWin 
) 
2868     wxWinHandleHash
->Delete((long)pWin
->GetHWND()); 
2869 } // end of wxRemoveHandleAssociation 
2872 // Default destroyer - override if you destroy it in some other way 
2873 // (e.g. with MDI child windows) 
2875 void wxWindowOS2::OS2DestroyWindow() 
2879 bool wxWindowOS2::OS2GetCreateWindowCoords( const wxPoint
& rPos
, 
2880                                             const wxSize
&  rSize
, 
2884                                             int& rnHeight 
) const 
2886     bool bNonDefault 
= false; 
2887     static const int DEFAULT_Y 
= 200; 
2888     static const int DEFAULT_H 
= 250; 
2890     if (rPos
.x 
== wxDefaultCoord
) 
2892         rnX 
= rnY 
= CW_USEDEFAULT
; 
2897         rnY 
= rPos
.y 
== wxDefaultCoord 
? DEFAULT_Y 
: rPos
.y
; 
2900     if (rSize
.x 
== wxDefaultCoord
) 
2902         rnWidth 
= rnHeight 
= CW_USEDEFAULT
; 
2907         rnHeight 
= rSize
.y 
== wxDefaultCoord 
? DEFAULT_H 
: rSize
.y
; 
2911 } // end of wxWindowOS2::OS2GetCreateWindowCoords 
2913 WXHWND 
wxWindowOS2::OS2GetParent() const 
2915     return m_parent 
? m_parent
->GetHWND() : NULL
; 
2918 bool wxWindowOS2::OS2Create( PSZ            zClass
, 
2919                              const wxChar
*  zTitle
, 
2921                              const wxPoint
& rPos
, 
2922                              const wxSize
&  rSize
, 
2924                              WXDWORD        
WXUNUSED(dwExStyle
), 
2933     long                 lControlId 
= 0L; 
2934     wxWindowCreationHook 
vHook(this); 
2935     wxString             
sClassName((wxChar
*)zClass
); 
2936     wxString             
sTitle(zTitle 
? zTitle 
: wxEmptyString
); 
2938     OS2GetCreateWindowCoords( rPos
 
2948         lControlId 
= GetId(); 
2949         if (GetWindowStyleFlag() & wxCLIP_SIBLINGS
) 
2951             dwStyle 
|= WS_CLIPSIBLINGS
; 
2955     // For each class "Foo" we have we also have "FooNR" ("no repaint") class 
2956     // which is the same but without CS_[HV]REDRAW class styles so using it 
2957     // ensures that the window is not fully repainted on each resize 
2959     if (!HasFlag(wxFULL_REPAINT_ON_RESIZE
)) 
2961         sClassName 
+= wxT("NR"); 
2963     m_hWnd 
= (WXHWND
)::WinCreateWindow( (HWND
)OS2GetParent() 
2979         vError 
= ::WinGetLastError(wxGetInstance()); 
2980         sError 
= wxPMErrorToStr(vError
); 
2983     SubclassWin(m_hWnd
); 
2984     SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
)); 
2986     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE
)); 
2988     LONG lColor 
= (LONG
)m_backgroundColour
.GetPixel(); 
2990     if (!::WinSetPresParam( m_hWnd
 
2996         vError 
= ::WinGetLastError(vHabmain
); 
2997         sError 
= wxPMErrorToStr(vError
); 
2998         wxLogError(wxT("Error creating frame. Error: %s\n"), sError
.c_str()); 
3007 } // end of wxWindowOS2::OS2Create 
3009 // =========================================================================== 
3010 // OS2 PM message handlers 
3011 // =========================================================================== 
3013 // --------------------------------------------------------------------------- 
3014 // window creation/destruction 
3015 // --------------------------------------------------------------------------- 
3017 bool wxWindowOS2::HandleCreate( WXLPCREATESTRUCT 
WXUNUSED(vCs
), 
3020     wxWindowCreateEvent             
vEvent((wxWindow
*)this); 
3022     (void)HandleWindowEvent(vEvent
); 
3023     *pbMayCreate 
= true; 
3025 } // end of wxWindowOS2::HandleCreate 
3027 bool wxWindowOS2::HandleDestroy() 
3029     wxWindowDestroyEvent            
vEvent((wxWindow
*)this); 
3030     vEvent
.SetId(GetId()); 
3031     (void)HandleWindowEvent(vEvent
); 
3034     // Delete our drop target if we've got one 
3036 #if wxUSE_DRAG_AND_DROP 
3037     wxDELETE(m_dropTarget
); 
3038 #endif // wxUSE_DRAG_AND_DROP 
3041     // WM_DESTROY handled 
3044 } // end of wxWindowOS2::HandleDestroy 
3046 // --------------------------------------------------------------------------- 
3048 // --------------------------------------------------------------------------- 
3049 void wxWindowOS2::OnSetFocus( 
3050   wxFocusEvent
&                     rEvent
 
3054 } // end of wxWindowOS2::OnSetFocus 
3056 bool wxWindowOS2::HandleActivate( 
3058 , WXHWND                            
WXUNUSED(hActivate
) 
3061     wxActivateEvent                 
vEvent( wxEVT_ACTIVATE
 
3065     vEvent
.SetEventObject(this); 
3066     return HandleWindowEvent(vEvent
); 
3067 } // end of wxWindowOS2::HandleActivate 
3069 bool wxWindowOS2::HandleSetFocus( WXHWND 
WXUNUSED(hWnd
) ) 
3072     // Notify the parent keeping track of focus for the kbd navigation 
3073     // purposes that we got it 
3075     wxChildFocusEvent               
vEventFocus((wxWindow 
*)this); 
3076     (void)HandleWindowEvent(vEventFocus
); 
3084         m_caret
->OnSetFocus(); 
3086 #endif // wxUSE_CARET 
3089     // If it's a wxTextCtrl don't send the event as it will be done 
3090     // after the control gets to process it from EN_FOCUS handler 
3091     if ( wxDynamicCastThis(wxTextCtrl
) ) 
3095 #endif // wxUSE_TEXTCTRL 
3097     wxFocusEvent                    
vEvent(wxEVT_SET_FOCUS
, m_windowId
); 
3099     vEvent
.SetEventObject(this); 
3100     return HandleWindowEvent(vEvent
); 
3101 } // end of wxWindowOS2::HandleSetFocus 
3103 bool wxWindowOS2::HandleKillFocus( WXHWND hWnd 
) 
3111         m_caret
->OnKillFocus(); 
3113 #endif // wxUSE_CARET 
3117     // If it's a wxTextCtrl don't send the event as it will be done 
3118     // after the control gets to process it. 
3120     wxTextCtrl
*                     pCtrl 
= wxDynamicCastThis(wxTextCtrl
); 
3129     // Don't send the event when in the process of being deleted.  This can 
3130     // only cause problems if the event handler tries to access the object. 
3132     if ( m_isBeingDeleted 
) 
3137     wxFocusEvent                    
vEvent( wxEVT_KILL_FOCUS
 
3141     vEvent
.SetEventObject(this); 
3144     // wxFindWinFromHandle() may return NULL, it is ok 
3146     vEvent
.SetWindow(wxFindWinFromHandle(hWnd
)); 
3147     return HandleWindowEvent(vEvent
); 
3148 } // end of wxWindowOS2::HandleKillFocus 
3150 // --------------------------------------------------------------------------- 
3152 // --------------------------------------------------------------------------- 
3154 bool wxWindowOS2::HandleShow( 
3156 , int                               WXUNUSED(nStatus
) 
3159     wxShowEvent                     
vEvent(GetId(), bShow
); 
3161     vEvent
.SetEventObject(this); 
3162     return HandleWindowEvent(vEvent
); 
3163 } // end of wxWindowOS2::HandleShow 
3165 bool wxWindowOS2::HandleInitDialog( WXHWND 
WXUNUSED(hWndFocus
) ) 
3167     wxInitDialogEvent               
vEvent(GetId()); 
3169     vEvent
.SetEventObject(this); 
3170     return HandleWindowEvent(vEvent
); 
3171 } // end of wxWindowOS2::HandleInitDialog 
3173 bool wxWindowOS2::HandleEndDrag(WXWPARAM 
WXUNUSED(wParam
)) 
3175    // TODO: We'll handle drag and drop later 
3179 bool wxWindowOS2::HandleSetCursor( USHORT 
WXUNUSED(vId
), 
3183     // Under OS/2 PM this allows the pointer to be changed 
3184     // as it passes over a control 
3186     ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)hPointer
); 
3188 } // end of wxWindowOS2::HandleSetCursor 
3190 // --------------------------------------------------------------------------- 
3191 // owner drawn stuff 
3192 // --------------------------------------------------------------------------- 
3193 bool wxWindowOS2::OS2OnDrawItem( int vId
, 
3194                                  WXDRAWITEMSTRUCT
* pItemStruct 
) 
3196 #if wxUSE_OWNER_DRAWN 
3197     wxClientDC                      
vDc(this); 
3199 #if wxUSE_MENUS_NATIVE 
3201     // Is it a menu item? 
3207         POWNERITEM                  pMeasureStruct 
= (POWNERITEM
)pItemStruct
; 
3208         wxFrame
*                    pFrame 
= (wxFrame
*)this; 
3209         wxMenuItem
*                 pMenuItem 
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
); 
3210         HDC                         hDC 
= ::GpiQueryDevice(pMeasureStruct
->hps
); 
3211         wxRect                      
vRect( pMeasureStruct
->rclItem
.xLeft
 
3212                                           ,pMeasureStruct
->rclItem
.yBottom
 
3213                                           ,pMeasureStruct
->rclItem
.xRight 
- pMeasureStruct
->rclItem
.xLeft
 
3214                                           ,pMeasureStruct
->rclItem
.yTop 
- pMeasureStruct
->rclItem
.yBottom
 
3217         wxPMDCImpl 
*impl 
= (wxPMDCImpl
*) vDc
.GetImpl(); 
3218         impl
->SetHDC( hDC
, false ); 
3219         impl
->SetHPS( pMeasureStruct
->hps 
); 
3221         // Load the wxWidgets Pallete and set to RGB mode 
3223         if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
 
3227                                       ,(LONG
)wxTheColourDatabase
->m_nSize
 
3228                                       ,(PLONG
)wxTheColourDatabase
->m_palTable
 
3231             vError 
= ::WinGetLastError(vHabmain
); 
3232             sError 
= wxPMErrorToStr(vError
); 
3233             wxLogError(wxT("Unable to set current color table (1). Error: %s\n"), sError
.c_str()); 
3236         // Set the color table to RGB mode 
3238         if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
 
3246             vError 
= ::WinGetLastError(vHabmain
); 
3247             sError 
= wxPMErrorToStr(vError
); 
3248             wxLogError(wxT("Unable to set current color table (2). Error: %s\n"), sError
.c_str()); 
3251         wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE 
); 
3256         if (pMeasureStruct
->fsAttribute 
== pMeasureStruct
->fsAttributeOld
) 
3259             // Entire Item needs to be redrawn (either it has reappeared from 
3260             // behind another window or is being displayed for the first time 
3262             eAction 
= wxOwnerDrawn::wxODDrawAll
; 
3264             if (pMeasureStruct
->fsAttribute 
& MIA_HILITED
) 
3267                 // If it is currently selected we let the system handle it 
3269                 eStatus 
|= wxOwnerDrawn::wxODSelected
; 
3271             if (pMeasureStruct
->fsAttribute 
& MIA_CHECKED
) 
3274                 // If it is currently checked we draw our own 
3276                 eStatus 
|= wxOwnerDrawn::wxODChecked
; 
3277                 pMeasureStruct
->fsAttributeOld 
= pMeasureStruct
->fsAttribute 
&= ~MIA_CHECKED
; 
3279             if (pMeasureStruct
->fsAttribute 
& MIA_DISABLED
) 
3282                 // If it is currently disabled we let the system handle it 
3284                 eStatus 
|= wxOwnerDrawn::wxODDisabled
; 
3287             // Don't really care about framed (indicationg focus) or NoDismiss 
3292             if (pMeasureStruct
->fsAttribute 
& MIA_HILITED
) 
3294                 eAction 
= wxOwnerDrawn::wxODDrawAll
; 
3295                 eStatus 
|= wxOwnerDrawn::wxODSelected
; 
3297                 // Keep the system from trying to highlight with its bogus colors 
3299                 pMeasureStruct
->fsAttributeOld 
= pMeasureStruct
->fsAttribute 
&= ~MIA_HILITED
; 
3301             else if (!(pMeasureStruct
->fsAttribute 
& MIA_HILITED
)) 
3303                 eAction 
= wxOwnerDrawn::wxODDrawAll
; 
3306                 // Keep the system from trying to highlight with its bogus colors 
3308                 pMeasureStruct
->fsAttribute 
= pMeasureStruct
->fsAttributeOld 
&= ~MIA_HILITED
; 
3313                 // For now we don't care about anything else 
3314                 // just ignore the entire message! 
3320         // Now redraw the item 
3322         return(pMenuItem
->OnDrawItem( vDc
 
3324                                      ,(wxOwnerDrawn::wxODAction
)eAction
 
3325                                      ,(wxOwnerDrawn::wxODStatus
)eStatus
 
3328         // leave the fsAttribute and fsOldAttribute unchanged.  If different, 
3329         // the system will do the highlight or fraeming or disabling for us, 
3330         // otherwise, we'd have to do it ourselves. 
3333 #endif // wxUSE_MENUS_NATIVE 
3335     wxWindow
*                       pItem 
= FindItem(vId
); 
3337     if (pItem 
&& pItem
->IsKindOf(CLASSINFO(wxControl
))) 
3339         return ((wxControl 
*)pItem
)->OS2OnDraw(pItemStruct
); 
3343     pItemStruct 
= pItemStruct
; 
3346 } // end of wxWindowOS2::OS2OnDrawItem 
3348 long wxWindowOS2::OS2OnMeasureItem( int lId
, 
3349                                     WXMEASUREITEMSTRUCT
* pItemStruct 
) 
3351 #if wxUSE_OWNER_DRAWN 
3353     // Is it a menu item? 
3355     if (lId 
== 65536) // I really don't like this...has to be a better indicator 
3357         if (IsKindOf(CLASSINFO(wxFrame
))) // we'll assume if Frame then a menu 
3361             POWNERITEM              pMeasureStruct 
= (POWNERITEM
)pItemStruct
; 
3362             wxFrame
*                pFrame 
= (wxFrame
*)this; 
3363             wxMenuItem
*             pMenuItem 
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
); 
3365             wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE 
); 
3368             if (pMenuItem
->OnMeasureItem( &nWidth
 
3374                 pMeasureStruct
->rclItem
.xRight  
= nWidth
; 
3375                 pMeasureStruct
->rclItem
.xLeft   
= 0L; 
3376                 pMeasureStruct
->rclItem
.yTop    
= nHeight
; 
3377                 pMeasureStruct
->rclItem
.yBottom 
= 0L; 
3378                 mRc 
= MRFROM2SHORT(nHeight
, nWidth
); 
3379                 return LONGFROMMR(mRc
); 
3384     wxWindow
*                      pItem 
= FindItem(lId
); 
3386     if (pItem 
&& pItem
->IsKindOf(CLASSINFO(wxControl
))) 
3390         vItem
.idItem 
= (LONG
)pItemStruct
; 
3391         return ((wxControl 
*)pItem
)->OS2OnMeasure((WXMEASUREITEMSTRUCT
*)&vItem
); 
3395     pItemStruct 
= pItemStruct
; 
3396 #endif // wxUSE_OWNER_DRAWN 
3400 // --------------------------------------------------------------------------- 
3401 // colours and palettes 
3402 // --------------------------------------------------------------------------- 
3404 bool wxWindowOS2::HandleSysColorChange() 
3406     wxSysColourChangedEvent         vEvent
; 
3408     vEvent
.SetEventObject(this); 
3409     return HandleWindowEvent(vEvent
); 
3410 } // end of wxWindowOS2::HandleSysColorChange 
3412 bool wxWindowOS2::HandleCtlColor( WXHBRUSH
* WXUNUSED(phBrush
) ) 
3415     // Not much provided with message. So not sure I can do anything with it 
3418 } // end of wxWindowOS2::HandleCtlColor 
3421 // Define for each class of dialog and control 
3422 WXHBRUSH 
wxWindowOS2::OnCtlColor(WXHDC 
WXUNUSED(hDC
), 
3423                                  WXHWND 
WXUNUSED(hWnd
), 
3424                                  WXUINT 
WXUNUSED(nCtlColor
), 
3425                                  WXUINT 
WXUNUSED(message
), 
3426                                  WXWPARAM 
WXUNUSED(wParam
), 
3427                                  WXLPARAM 
WXUNUSED(lParam
)) 
3432 bool wxWindowOS2::HandlePaletteChanged() 
3434     // need to set this to something first 
3435     WXHWND                          hWndPalChange 
= NULLHANDLE
; 
3437     wxPaletteChangedEvent           
vEvent(GetId()); 
3439     vEvent
.SetEventObject(this); 
3440     vEvent
.SetChangedWindow(wxFindWinFromHandle(hWndPalChange
)); 
3442     return HandleWindowEvent(vEvent
); 
3443 } // end of wxWindowOS2::HandlePaletteChanged 
3446 // Responds to colour changes: passes event on to children. 
3448 void wxWindowOS2::OnSysColourChanged( 
3449   wxSysColourChangedEvent
&          rEvent
 
3452     wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); 
3457         // Only propagate to non-top-level windows 
3459         wxWindow
*                   pWin 
= (wxWindow 
*)node
->GetData(); 
3461         if (pWin
->GetParent()) 
3463             wxSysColourChangedEvent vEvent
; 
3465             rEvent
.SetEventObject(pWin
); 
3466             pWin
->HandleWindowEvent(vEvent
); 
3468         node 
= node
->GetNext(); 
3470 } // end of wxWindowOS2::OnSysColourChanged 
3472 // --------------------------------------------------------------------------- 
3474 // --------------------------------------------------------------------------- 
3476 void wxWindow::OnPaint ( 
3477   wxPaintEvent
&                     rEvent
 
3480     HDC                             hDC 
= (HDC
)wxPaintDCImpl::FindDCInCache((wxWindow
*) rEvent
.GetEventObject()); 
3484         OS2DefWindowProc( (WXUINT
)WM_PAINT
 
3489 } // end of wxWindow::OnPaint 
3491 bool wxWindowOS2::HandlePaint() 
3494     wxPaintEvent                    
vEvent(m_windowId
); 
3498     // Create empty region 
3499     // TODO: get HPS somewhere else if possible 
3500     hPS  
= ::WinGetPS(GetHwnd()); 
3501     hRgn 
= ::GpiCreateRegion(hPS
, 0, NULL
); 
3503     if (::WinQueryUpdateRegion(GetHwnd(), hRgn
) == RGN_ERROR
) 
3505          wxLogLastError(wxT("CreateRectRgn")); 
3508     // Get all the rectangles from the region, convert the individual 
3509     // rectangles to "the other" coordinate system and reassemble a 
3510     // region from the rectangles, to be feed into m_updateRegion. 
3513     PRECTL                      pUpdateRects 
= NULL
; 
3514     vRgnData
.ulDirection 
= RECTDIR_LFRT_TOPBOT
; 
3515     if (::GpiQueryRegionRects( hPS          
// Pres space 
3516                               ,hRgn         
// Handle of region to query 
3517                               ,NULL         
// Return all RECTs 
3518                               ,&vRgnData    
// Will contain number or RECTs in region 
3519                               ,NULL         
// NULL to return number of RECTs 
3522         pUpdateRects 
= new RECTL
[vRgnData
.crcReturned
]; 
3523         vRgnData
.crc 
= vRgnData
.crcReturned
; 
3524         vRgnData
.ircStart 
= 1; 
3525         if (::GpiQueryRegionRects( hPS      
// Pres space of source 
3526                                   ,hRgn     
// Handle of source region 
3527                                   ,NULL     
// Return all RECTs 
3528                                   ,&vRgnData 
// Operations set to return rects 
3529                                   ,pUpdateRects 
// Will contain the actual RECTS 
3534             ::WinQueryWindowRect(GetHwnd(), &vRect
); 
3535             height 
= vRect
.yTop
; 
3537             for(size_t i 
= 0; i 
< vRgnData
.crc
; i
++) 
3540                 rectHeight 
= pUpdateRects
[i
].yTop 
- pUpdateRects
[i
].yBottom
; 
3541                 pUpdateRects
[i
].yBottom 
= height 
- pUpdateRects
[i
].yTop
; 
3542                 pUpdateRects
[i
].yTop 
= pUpdateRects
[i
].yBottom 
+ rectHeight
; 
3544             ::GpiSetRegion(hPS
, hRgn
, vRgnData
.crc
, pUpdateRects
); 
3545             delete [] pUpdateRects
; 
3548     m_updateRegion 
= wxRegion(hRgn
, hPS
); 
3550     vEvent
.SetEventObject(this); 
3551     bProcessed 
= HandleWindowEvent(vEvent
); 
3554          IsKindOf(CLASSINFO(wxPanel
)) && 
3555          GetChildren().GetCount() == 0 
3559         // OS/2 needs to process this right here, not by the default proc 
3560         // Window's default proc correctly paints everything, OS/2 does not. 
3561         // For decorative panels that typically have no children, we draw 
3567         hPS 
= ::WinBeginPaint( GetHwnd() 
3573             ::GpiCreateLogColorTable( hPS
 
3577                                      ,(LONG
)wxTheColourDatabase
->m_nSize
 
3578                                      ,(PLONG
)wxTheColourDatabase
->m_palTable
 
3580             ::GpiCreateLogColorTable( hPS
 
3587             if (::WinIsWindowVisible(GetHWND())) 
3588                 ::WinFillRect(hPS
, &vRect
,  GetBackgroundColour().GetPixel()); 
3591                 LINEBUNDLE      vLineBundle
; 
3593                 vLineBundle
.lColor     
= 0x00000000; // Black 
3594                 vLineBundle
.usMixMode  
= FM_OVERPAINT
; 
3595                 vLineBundle
.fxWidth    
= 1; 
3596                 vLineBundle
.lGeomWidth 
= 1; 
3597                 vLineBundle
.usType     
= LINETYPE_SOLID
; 
3598                 vLineBundle
.usEnd      
= 0; 
3599                 vLineBundle
.usJoin     
= 0; 
3602                               ,LBB_COLOR 
| LBB_MIX_MODE 
| LBB_WIDTH 
| LBB_GEOM_WIDTH 
| LBB_TYPE
 
3606                 ::WinQueryWindowRect(GetHwnd(), &vRect
); 
3616     else if (!bProcessed 
&& 
3617              IsKindOf(CLASSINFO(wxPanel
)) 
3621         // Panel with children, usually fills a frame client so no borders. 
3626         hPS 
= ::WinBeginPaint( GetHwnd() 
3632             ::GpiCreateLogColorTable( hPS
 
3636                                      ,(LONG
)wxTheColourDatabase
->m_nSize
 
3637                                      ,(PLONG
)wxTheColourDatabase
->m_palTable
 
3639             ::GpiCreateLogColorTable( hPS
 
3647             if (::WinIsWindowVisible(GetHWND())) 
3648                 ::WinFillRect(hPS
, &vRect
,  GetBackgroundColour().GetPixel()); 
3654 } // end of wxWindowOS2::HandlePaint 
3656 bool wxWindowOS2::HandleEraseBkgnd( WXHDC hDC 
) 
3661     ::WinQueryWindowPos(GetHwnd(), &vSwp
); 
3662     if (vSwp
.fl 
& SWP_MINIMIZE
) 
3665     wxClientDC 
vDC(this); 
3666     wxPMDCImpl 
*impl 
= (wxPMDCImpl
*) vDC
.GetImpl(); 
3668     impl
->SetHPS((HPS
)hDC
); // this is really a PS 
3670     wxEraseEvent 
vEvent(m_windowId
, &vDC
); 
3672     vEvent
.SetEventObject(this); 
3674     rc 
= HandleWindowEvent(vEvent
); 
3676     impl
->SetHPS(NULLHANDLE
); 
3678 } // end of wxWindowOS2::HandleEraseBkgnd 
3680 void wxWindowOS2::OnEraseBackground(wxEraseEvent
& rEvent
) 
3683     wxPMDCImpl 
*impl 
= (wxPMDCImpl
*) rEvent
.GetDC()->GetImpl(); 
3684     HPS     hPS 
= impl
->GetHPS(); 
3686     LONG    lColor 
= m_backgroundColour
.GetPixel(); 
3688     rc 
= ::WinQueryWindowRect(GetHwnd(), &vRect
); 
3689     rc 
= ::WinFillRect(hPS
, &vRect
, lColor
); 
3690 }  // end of wxWindowOS2::OnEraseBackground 
3692 // --------------------------------------------------------------------------- 
3693 // moving and resizing 
3694 // --------------------------------------------------------------------------- 
3696 bool wxWindowOS2::HandleMinimize() 
3698     wxIconizeEvent                  
vEvent(m_windowId
); 
3700     vEvent
.SetEventObject(this); 
3701     return HandleWindowEvent(vEvent
); 
3702 } // end of wxWindowOS2::HandleMinimize 
3704 bool wxWindowOS2::HandleMaximize() 
3706     wxMaximizeEvent                 
vEvent(m_windowId
); 
3708     vEvent
.SetEventObject(this); 
3709     return HandleWindowEvent(vEvent
); 
3710 } // end of wxWindowOS2::HandleMaximize 
3712 bool wxWindowOS2::HandleMove( int nX
, int nY 
) 
3715     wxMoveEvent 
vEvent(pt
, m_windowId
); 
3717     vEvent
.SetEventObject(this); 
3718     return HandleWindowEvent(vEvent
); 
3719 }  // end of wxWindowOS2::HandleMove 
3721 bool wxWindowOS2::HandleSize( int    nWidth
, 
3723                               WXUINT 
WXUNUSED(nFlag
) ) 
3725     wxSize 
sz(nWidth
, nHeight
); 
3726     wxSizeEvent 
vEvent(sz
, m_windowId
); 
3728     vEvent
.SetEventObject(this); 
3729     return HandleWindowEvent(vEvent
); 
3730 } // end of wxWindowOS2::HandleSize 
3732 bool wxWindowOS2::HandleGetMinMaxInfo( PSWP pSwp 
) 
3739             ::WinGetMaxPosition(GetHwnd(), pSwp
); 
3740             m_maxWidth 
= pSwp
->cx
; 
3741             m_maxHeight 
= pSwp
->cy
; 
3745             ::WinGetMinPosition(GetHwnd(), pSwp
, &vPoint
); 
3746             m_minWidth 
= pSwp
->cx
; 
3747             m_minHeight 
= pSwp
->cy
; 
3754 } // end of wxWindowOS2::HandleGetMinMaxInfo 
3756 // --------------------------------------------------------------------------- 
3758 // --------------------------------------------------------------------------- 
3759 bool wxWindowOS2::HandleCommand( WXWORD wId
, 
3763 #if wxUSE_MENUS_NATIVE 
3764     if (wxCurrentPopupMenu
) 
3766         wxMenu
*                     pPopupMenu 
= wxCurrentPopupMenu
; 
3768         wxCurrentPopupMenu 
= NULL
; 
3769         return pPopupMenu
->OS2Command(wCmd
, wId
); 
3771 #endif // wxUSE_MENUS_NATIVE 
3773     wxWindow
*                       pWin 
= FindItem(wId
); 
3777         pWin 
= wxFindWinFromHandle(hControl
); 
3781         return pWin
->OS2Command(wCmd
, wId
); 
3784 } // end of wxWindowOS2::HandleCommand 
3786 bool wxWindowOS2::HandleSysCommand( WXWPARAM wParam
, 
3787                                     WXLPARAM 
WXUNUSED(lParam
) ) 
3790     // 4 bits are reserved 
3792     switch (SHORT1FROMMP(wParam
)) 
3795             return HandleMaximize(); 
3798             return HandleMinimize(); 
3801 } // end of wxWindowOS2::HandleSysCommand 
3803 // --------------------------------------------------------------------------- 
3805 // --------------------------------------------------------------------------- 
3806 //TODO: check against MSW 
3807 void wxWindowOS2::InitMouseEvent( 
3808   wxMouseEvent
&                     rEvent
 
3815     DoGetSize(0, &nHeight
); 
3817     // Convert to wxWidgets standard coordinate system! 
3818     rEvent
.m_y           
= nHeight 
- nY
; 
3819     rEvent
.m_shiftDown   
= ((uFlags 
& KC_SHIFT
) != 0); 
3820     rEvent
.m_controlDown 
= ((uFlags 
& KC_CTRL
) != 0); 
3821     rEvent
.m_altDown     
= ((uFlags 
& KC_ALT
) != 0); 
3822     rEvent
.m_leftDown    
= IsKeyDown(VK_BUTTON1
); 
3823     rEvent
.m_middleDown  
= IsKeyDown(VK_BUTTON3
); 
3824     rEvent
.m_rightDown   
= IsKeyDown(VK_BUTTON2
); 
3825     rEvent
.SetTimestamp(s_currentMsg
.time
); 
3826     rEvent
.SetEventObject(this); 
3827     rEvent
.SetId(GetId()); 
3829 #if wxUSE_MOUSEEVENT_HACK 
3832     m_lastMouseEvent 
= rEvent
.GetEventType(); 
3833 #endif // wxUSE_MOUSEEVENT_HACK 
3834 } // end of wxWindowOS2::InitMouseEvent 
3836 bool wxWindowOS2::HandleMouseEvent( WXUINT uMsg
, 
3841     bool bProcessed 
= false; 
3844     // The mouse events take consecutive IDs from WM_MOUSEFIRST to 
3845     // WM_MOUSELAST, so it's enough to subtract WM_MOUSEMOVE == WM_MOUSEFIRST 
3846     // from the message id and take the value in the table to get wxWin event 
3849     static const wxEventType eventsMouse
[] = 
3864     if ((uMsg 
>= WM_MOUSEMOVE
) && (uMsg 
<= WM_BUTTON3DBLCLK
)) 
3866         wxMouseEvent 
vEvent(eventsMouse
[uMsg 
- WM_MOUSEMOVE
]); 
3868         InitMouseEvent( vEvent
 
3874         bProcessed 
= HandleWindowEvent(vEvent
); 
3877             HPOINTER hCursor 
= (HPOINTER
)GetCursor().GetHCURSOR(); 
3879             if (hCursor 
!= NULLHANDLE
) 
3881                 ::WinSetPointer(HWND_DESKTOP
, hCursor
); 
3887 } // end of wxWindowOS2::HandleMouseEvent 
3889 bool wxWindowOS2::HandleMouseMove( int nX
, 
3893     if (!m_bMouseInWindow
) 
3896         // Generate an ENTER event 
3898         m_bMouseInWindow 
= true; 
3900         wxMouseEvent 
vEvent(wxEVT_ENTER_WINDOW
); 
3902         InitMouseEvent( vEvent
 
3908         (void)HandleWindowEvent(vEvent
); 
3910     return HandleMouseEvent( WM_MOUSEMOVE
 
3915 } // end of wxWindowOS2::HandleMouseMove 
3917 // --------------------------------------------------------------------------- 
3918 // keyboard handling 
3919 // --------------------------------------------------------------------------- 
3922 // Create the key event of the given type for the given key - used by 
3923 // HandleChar and HandleKeyDown/Up 
3925 wxKeyEvent 
wxWindowOS2::CreateKeyEvent( 
3932     wxKeyEvent                      
vEvent(eType
); 
3934     vEvent
.SetId(GetId()); 
3935     vEvent
.m_shiftDown   
= IsShiftDown(); 
3936     vEvent
.m_controlDown 
= IsCtrlDown(); 
3937     vEvent
.m_altDown     
= (HIWORD(lParam
) & KC_ALT
) == KC_ALT
; 
3939     vEvent
.SetEventObject((wxWindow 
*)this); // const_cast 
3940     vEvent
.m_keyCode     
= nId
; 
3941     vEvent
.m_rawCode 
= (wxUint32
)wParam
; 
3942     vEvent
.m_rawFlags 
= (wxUint32
)lParam
; 
3943     vEvent
.SetTimestamp(s_currentMsg
.time
); 
3946     // Translate the position to client coords 
3951     ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
3952     ::WinQueryWindowRect( GetHwnd() 
3956     vPoint
.x 
-= vRect
.xLeft
; 
3957     vPoint
.y 
-= vRect
.yBottom
; 
3959     vEvent
.m_x 
= vPoint
.x
; 
3960     vEvent
.m_y 
= vPoint
.y
; 
3963 } // end of wxWindowOS2::CreateKeyEvent 
3966 // isASCII is true only when we're called from WM_CHAR handler and not from 
3969 bool wxWindowOS2::HandleChar( WXWPARAM 
WXUNUSED(wParam
), 
3973     bool bCtrlDown 
= false; 
3976     if (m_bLastKeydownProcessed
) 
3979         // The key was handled in the EVT_KEY_DOWN.  Handling a key in an 
3980         // EVT_KEY_DOWN handler is meant, by design, to prevent EVT_CHARs 
3981         // from happening, so just bail out at this point. 
3983         m_bLastKeydownProcessed 
= false; 
3989         // If 1 -> 26, translate to either special keycode or just set 
3990         // ctrlDown.  IOW, Ctrl-C should result in keycode == 3 and 
3991         // ControlDown() == true. 
3993         vId 
= SHORT1FROMMP(lParam
); 
3994         if ((vId 
> 0) && (vId 
< 27)) 
4016     else  // we're called from WM_KEYDOWN 
4018         vId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4023     wxKeyEvent 
vEvent(CreateKeyEvent( wxEVT_CHAR
, vId
, lParam 
)); 
4027         vEvent
.m_controlDown 
= true; 
4030     return (HandleWindowEvent(vEvent
)); 
4033 bool wxWindowOS2::HandleKeyDown( WXWPARAM wParam
, 
4036     int nId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4041         // Normal ASCII char 
4043         nId 
= SHORT1FROMMP(lParam
); 
4048         wxKeyEvent  
vEvent(CreateKeyEvent( wxEVT_KEY_DOWN
 
4054         if (HandleWindowEvent(vEvent
)) 
4060 } // end of wxWindowOS2::HandleKeyDown 
4062 bool wxWindowOS2::HandleKeyUp( WXWPARAM wParam
, 
4065     int nId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4070         // Normal ASCII char 
4072         nId 
= CHAR1FROMMP(lParam
); 
4077         wxKeyEvent 
vEvent(CreateKeyEvent( wxEVT_KEY_UP
 
4083         if (HandleWindowEvent(vEvent
)) 
4087 } // end of wxWindowOS2::HandleKeyUp 
4089 // --------------------------------------------------------------------------- 
4091 // --------------------------------------------------------------------------- 
4093 // --------------------------------------------------------------------------- 
4095 // --------------------------------------------------------------------------- 
4097 bool wxWindowOS2::OS2OnScroll( int nOrientation
, 
4104         wxWindow
*                   pChild 
= wxFindWinFromHandle(hControl
); 
4107             return pChild
->OS2OnScroll( nOrientation
 
4114     wxScrollWinEvent                vEvent
; 
4116     vEvent
.SetPosition(wPos
); 
4117     vEvent
.SetOrientation(nOrientation
); 
4118     vEvent
.SetEventObject(this); 
4123             vEvent
.SetEventType(wxEVT_SCROLLWIN_LINEUP
); 
4127             vEvent
.SetEventType(wxEVT_SCROLLWIN_LINEDOWN
); 
4131             vEvent
.SetEventType(wxEVT_SCROLLWIN_PAGEUP
); 
4135             vEvent
.SetEventType(wxEVT_SCROLLWIN_PAGEDOWN
); 
4138         case SB_SLIDERPOSITION
: 
4139             vEvent
.SetEventType(wxEVT_SCROLLWIN_THUMBRELEASE
); 
4142         case SB_SLIDERTRACK
: 
4143             vEvent
.SetEventType(wxEVT_SCROLLWIN_THUMBTRACK
); 
4149     return HandleWindowEvent(vEvent
); 
4150 } // end of wxWindowOS2::OS2OnScroll 
4153 //  Getting the Y position for a window, like a control, is a real 
4154 //  pain.  There are three situations we must deal with in determining 
4155 //  the OS2 to wxWidgets Y coordinate. 
4157 //  1)  The controls are created in a dialog. 
4158 //      This is the easiest since a dialog is created with its original 
4159 //      size so the standard: Y = ParentHeight - (Y + ControlHeight); 
4161 //  2)  The controls are direct children of a frame 
4162 //      In this instance the controls are actually children of the Frame's 
4163 //      client.  During creation the frame's client resizes several times 
4164 //      during creation of the status bar and toolbars.  The CFrame class 
4165 //      will take care of this using its AlterChildPos proc. 
4167 //  3)  The controls are children of a panel, which in turn is a child of 
4169 //      The panel may be one of many, in which case the same treatment 
4170 //      as 1 applies. It may be the only child, though. 
4171 //      This is the nastiest case.  A panel is created as the only child of 
4172 //      the frame and as such, when a frame has only one child, the child is 
4173 //      expanded to fit the entire client area of the frame.  Because the 
4174 //      controls are created BEFORE this occurs their positions are totally 
4175 //      whacked and any call to WinQueryWindowPos will return invalid 
4176 //      coordinates.  So for this situation we have to compare the size of 
4177 //      the panel at control creation time with that of the frame client.  If 
4178 //      they are the same we can use the standard Y position equation.  If 
4179 //      not, then we must use the Frame Client's dimensions to position them 
4180 //      as that will be the eventual size of the panel after the frame resizes 
4183 int wxWindowOS2::GetOS2ParentHeight( wxWindowOS2
* pParent 
) 
4190         if (pParent
->IsKindOf(CLASSINFO(wxDialog
))) 
4191             return(pParent
->GetClientSize().y
); 
4194     // Case 2 -- if we are one of the separately built standard Frame 
4195     //           children, like a statusbar, menubar, or toolbar we want to 
4196     //           use the frame, itself, for positioning.  Otherwise we are 
4197     //           child window and want to use the Frame's client. 
4199         else if (pParent
->IsKindOf(CLASSINFO(wxFrame
))) 
4201             if (IsKindOf(CLASSINFO(wxStatusBar
)) || 
4202                 IsKindOf(CLASSINFO(wxMenuBar
))   || 
4203                 IsKindOf(CLASSINFO(wxToolBar
)) 
4206                 if (IsKindOf(CLASSINFO(wxToolBar
))) 
4208                     wxFrame
*        pFrame 
= wxDynamicCast(GetParent(), wxFrame
); 
4210                     if (pFrame
->GetToolBar() == this) 
4211                         return(pParent
->GetSize().y
); 
4213                         return(pParent
->GetClientSize().y
); 
4216                     return(pParent
->GetSize().y
); 
4219                 return(pParent
->GetClientSize().y
); 
4222         // Case -- this is for any window that is the sole child of a Frame. 
4223         //         The grandparent must exist and it must be of type CFrame 
4224         //         and it's height must be different. Otherwise the standard 
4228             return(pParent
->GetClientSize().y
); 
4230     else // We must be a child of the screen 
4233         wxDisplaySize(NULL
,&nHeight
); 
4236 } // end of wxWindowOS2::GetOS2ParentHeight 
4239 // OS/2 needs a lot extra manipulation to deal with layouts 
4240 // for canvas windows, particularly scrolled ones. 
4242 wxWindowCreationHook::wxWindowCreationHook( 
4243   wxWindow
*                         pWinBeingCreated
 
4246     gpWinBeingCreated 
= pWinBeingCreated
; 
4247 } // end of wxWindowCreationHook::wxWindowCreationHook 
4249 wxWindowCreationHook::~wxWindowCreationHook() 
4251     gpWinBeingCreated 
= NULL
; 
4252 } // end of wxWindowCreationHook::~wxWindowCreationHook 
4254 // =========================================================================== 
4256 // =========================================================================== 
4262 ,wxFont
*                            WXUNUSED(pTheFont
) 
4269     hPS 
=::WinGetPS(hWnd
); 
4271     rc 
= ::GpiQueryFontMetrics(hPS
, sizeof(FONTMETRICS
), &vFM
); 
4275             *pX 
= vFM
.lAveCharWidth
; 
4277             *pY 
= vFM
.lEmHeight 
+ vFM
.lExternalLeading
; 
4286     ::WinReleasePS(hPS
); 
4287 } // end of wxGetCharSize 
4290 // Returns 0 if was a normal ASCII value, not a special key. This indicates that 
4291 // the key should be ignored by WM_KEYDOWN and processed by WM_CHAR instead. 
4293 int wxCharCodeOS2ToWX( 
4301         case VK_BACKTAB
:    nId 
= WXK_BACK
; break; 
4302         case VK_TAB
:        nId 
= WXK_TAB
; break; 
4303         case VK_CLEAR
:      nId 
= WXK_CLEAR
; break; 
4304         case VK_ENTER
:      nId 
= WXK_RETURN
; break; 
4305         case VK_SHIFT
:      nId 
= WXK_SHIFT
; break; 
4306         case VK_CTRL
:       nId 
= WXK_CONTROL
; break; 
4307         case VK_PAUSE
:      nId 
= WXK_PAUSE
; break; 
4308         case VK_SPACE
:      nId 
= WXK_SPACE
; break; 
4309         case VK_PAGEUP
:     nId 
= WXK_PAGEUP
; break; 
4310         case VK_PAGEDOWN
:   nId 
= WXK_PAGEDOWN
; break; 
4311         case VK_ESC
:        nId 
= WXK_ESCAPE
; break; 
4312         case VK_END
:        nId 
= WXK_END
; break; 
4313         case VK_HOME 
:      nId 
= WXK_HOME
; break; 
4314         case VK_LEFT 
:      nId 
= WXK_LEFT
; break; 
4315         case VK_UP
:         nId 
= WXK_UP
; break; 
4316         case VK_RIGHT
:      nId 
= WXK_RIGHT
; break; 
4317         case VK_DOWN 
:      nId 
= WXK_DOWN
; break; 
4318         case VK_PRINTSCRN
:  nId 
= WXK_PRINT
; break; 
4319         case VK_INSERT
:     nId 
= WXK_INSERT
; break; 
4320         case VK_DELETE
:     nId 
= WXK_DELETE
; break; 
4321         case VK_CAPSLOCK
:   nId 
= WXK_CAPITAL
; break; 
4322         case VK_F1
:         nId 
= WXK_F1
; break; 
4323         case VK_F2
:         nId 
= WXK_F2
; break; 
4324         case VK_F3
:         nId 
= WXK_F3
; break; 
4325         case VK_F4
:         nId 
= WXK_F4
; break; 
4326         case VK_F5
:         nId 
= WXK_F5
; break; 
4327         case VK_F6
:         nId 
= WXK_F6
; break; 
4328         case VK_F7
:         nId 
= WXK_F7
; break; 
4329         case VK_F8
:         nId 
= WXK_F8
; break; 
4330         case VK_F9
:         nId 
= WXK_F9
; break; 
4331         case VK_F10
:        nId 
= WXK_F10
; break; 
4332         case VK_F11
:        nId 
= WXK_F11
; break; 
4333         case VK_F12
:        nId 
= WXK_F12
; break; 
4334         case VK_F13
:        nId 
= WXK_F13
; break; 
4335         case VK_F14
:        nId 
= WXK_F14
; break; 
4336         case VK_F15
:        nId 
= WXK_F15
; break; 
4337         case VK_F16
:        nId 
= WXK_F16
; break; 
4338         case VK_F17
:        nId 
= WXK_F17
; break; 
4339         case VK_F18
:        nId 
= WXK_F18
; break; 
4340         case VK_F19
:        nId 
= WXK_F19
; break; 
4341         case VK_F20
:        nId 
= WXK_F20
; break; 
4342         case VK_F21
:        nId 
= WXK_F21
; break; 
4343         case VK_F22
:        nId 
= WXK_F22
; break; 
4344         case VK_F23
:        nId 
= WXK_F23
; break; 
4345         case VK_F24
:        nId 
= WXK_F24
; break; 
4346         case VK_OEM_1
:      nId 
= ';'; break; 
4347         case VK_OEM_PLUS
:   nId 
= '+'; break; 
4348         case VK_OEM_COMMA
:  nId 
= ','; break; 
4349         case VK_OEM_MINUS
:  nId 
= '-'; break; 
4350         case VK_OEM_PERIOD
: nId 
= '.'; break; 
4351         case VK_OEM_2
:      nId 
= '/'; break; 
4352         case VK_OEM_3
:      nId 
= '~'; break; 
4353         case VK_OEM_4
:      nId 
= '['; break; 
4354         case VK_OEM_5
:      nId 
= '\\'; break; 
4355         case VK_OEM_6
:      nId 
= ']'; break; 
4356         case VK_OEM_7
:      nId 
= '\''; break; 
4357         case VK_NUMLOCK
:    nId 
= WXK_NUMLOCK
; break; 
4358         case VK_SCRLLOCK
:   nId 
= WXK_SCROLL
; break; 
4365 } // end of wxCharCodeOS2ToWX 
4367 int wxCharCodeWXToOS2( int nId
, 
4376         case WXK_CLEAR
:     nKeySym 
= VK_CLEAR
; break; 
4377         case WXK_SHIFT
:     nKeySym 
= VK_SHIFT
; break; 
4378         case WXK_CONTROL
:   nKeySym 
= VK_CTRL
; break; 
4379         case WXK_PAUSE
:     nKeySym 
= VK_PAUSE
; break; 
4380         case WXK_PAGEUP
:    nKeySym 
= VK_PAGEUP
; break; 
4381         case WXK_PAGEDOWN
:  nKeySym 
= VK_PAGEDOWN
; break; 
4382         case WXK_END
:       nKeySym 
= VK_END
; break; 
4383         case WXK_HOME 
:     nKeySym 
= VK_HOME
; break; 
4384         case WXK_LEFT 
:     nKeySym 
= VK_LEFT
; break; 
4385         case WXK_UP
:        nKeySym 
= VK_UP
; break; 
4386         case WXK_RIGHT
:     nKeySym 
= VK_RIGHT
; break; 
4387         case WXK_DOWN 
:     nKeySym 
= VK_DOWN
; break; 
4388         case WXK_PRINT
:     nKeySym 
= VK_PRINTSCRN
; break; 
4389         case WXK_INSERT
:    nKeySym 
= VK_INSERT
; break; 
4390         case WXK_DELETE
:    nKeySym 
= VK_DELETE
; break; 
4391         case WXK_F1
:        nKeySym 
= VK_F1
; break; 
4392         case WXK_F2
:        nKeySym 
= VK_F2
; break; 
4393         case WXK_F3
:        nKeySym 
= VK_F3
; break; 
4394         case WXK_F4
:        nKeySym 
= VK_F4
; break; 
4395         case WXK_F5
:        nKeySym 
= VK_F5
; break; 
4396         case WXK_F6
:        nKeySym 
= VK_F6
; break; 
4397         case WXK_F7
:        nKeySym 
= VK_F7
; break; 
4398         case WXK_F8
:        nKeySym 
= VK_F8
; break; 
4399         case WXK_F9
:        nKeySym 
= VK_F9
; break; 
4400         case WXK_F10
:       nKeySym 
= VK_F10
; break; 
4401         case WXK_F11
:       nKeySym 
= VK_F11
; break; 
4402         case WXK_F12
:       nKeySym 
= VK_F12
; break; 
4403         case WXK_F13
:       nKeySym 
= VK_F13
; break; 
4404         case WXK_F14
:       nKeySym 
= VK_F14
; break; 
4405         case WXK_F15
:       nKeySym 
= VK_F15
; break; 
4406         case WXK_F16
:       nKeySym 
= VK_F16
; break; 
4407         case WXK_F17
:       nKeySym 
= VK_F17
; break; 
4408         case WXK_F18
:       nKeySym 
= VK_F18
; break; 
4409         case WXK_F19
:       nKeySym 
= VK_F19
; break; 
4410         case WXK_F20
:       nKeySym 
= VK_F20
; break; 
4411         case WXK_F21
:       nKeySym 
= VK_F21
; break; 
4412         case WXK_F22
:       nKeySym 
= VK_F22
; break; 
4413         case WXK_F23
:       nKeySym 
= VK_F23
; break; 
4414         case WXK_F24
:       nKeySym 
= VK_F24
; break; 
4415         case WXK_NUMLOCK
:   nKeySym 
= VK_NUMLOCK
; break; 
4416         case WXK_SCROLL
:    nKeySym 
= VK_SCRLLOCK
; break; 
4420                 *bIsVirtual 
= false; 
4426 } // end of wxCharCodeWXToOS2 
4429 bool wxGetKeyState(wxKeyCode key
) 
4431     wxASSERT_MSG(key 
!= WXK_LBUTTON 
&& key 
!= WXK_RBUTTON 
&& key 
!= 
4432         WXK_MBUTTON
, wxT("can't use wxGetKeyState() for mouse buttons")); 
4434     const LONG vk 
= wxCharCodeWXToOS2(key
); 
4435     // if the requested key is a LED key, return true if the led is pressed 
4436     if ( key 
== WXK_NUMLOCK 
|| key 
== WXK_CAPITAL 
|| key 
== WXK_SCROLL 
) 
4438         // low order bit means LED is highlighted and high order one means the 
4439         // key is down; for compatibility with the other ports return true if 
4440         // either one is set 
4441         return ::WinGetKeyState(HWND_DESKTOP
, vk
) != 0; 
4446         return IsKeyDown(vk
); 
4451 wxWindow
* wxGetActiveWindow() 
4453     HWND                            hWnd 
= ::WinQueryActiveWindow(HWND_DESKTOP
); 
4457         return wxFindWinFromHandle((WXHWND
)hWnd
); 
4460 } // end of wxGetActiveWindow 
4463 const wxChar
* wxGetMessageName( int nMessage 
) 
4467         case 0x0000: return wxT("WM_NULL"); 
4468         case 0x0001: return wxT("WM_CREATE"); 
4469         case 0x0002: return wxT("WM_DESTROY"); 
4470         case 0x0004: return wxT("WM_ENABLE"); 
4471         case 0x0005: return wxT("WM_SHOW"); 
4472         case 0x0006: return wxT("WM_MOVE"); 
4473         case 0x0007: return wxT("WM_SIZE"); 
4474         case 0x0008: return wxT("WM_ADJUSTWINDOWPOS"); 
4475         case 0x0009: return wxT("WM_CALCVALIDRECTS"); 
4476         case 0x000A: return wxT("WM_SETWINDOWPARAMS"); 
4477         case 0x000B: return wxT("WM_QUERYWINDOWPARAMS"); 
4478         case 0x000C: return wxT("WM_HITTEST"); 
4479         case 0x000D: return wxT("WM_ACTIVATE"); 
4480         case 0x000F: return wxT("WM_SETFOCUS"); 
4481         case 0x0010: return wxT("WM_SETSELECTION"); 
4482         case 0x0011: return wxT("WM_PPAINT"); 
4483         case 0x0012: return wxT("WM_PSETFOCUS"); 
4484         case 0x0013: return wxT("WM_PSYSCOLORCHANGE"); 
4485         case 0x0014: return wxT("WM_PSIZE"); 
4486         case 0x0015: return wxT("WM_PACTIVATE"); 
4487         case 0x0016: return wxT("WM_PCONTROL"); 
4488         case 0x0020: return wxT("WM_COMMAND"); 
4489         case 0x0021: return wxT("WM_SYSCOMMAND"); 
4490         case 0x0022: return wxT("WM_HELP"); 
4491         case 0x0023: return wxT("WM_PAINT"); 
4492         case 0x0024: return wxT("WM_TIMER"); 
4493         case 0x0025: return wxT("WM_SEM1"); 
4494         case 0x0026: return wxT("WM_SEM2"); 
4495         case 0x0027: return wxT("WM_SEM3"); 
4496         case 0x0028: return wxT("WM_SEM4"); 
4497         case 0x0029: return wxT("WM_CLOSE"); 
4498         case 0x002A: return wxT("WM_QUIT"); 
4499         case 0x002B: return wxT("WM_SYSCOLORCHANGE"); 
4500         case 0x002D: return wxT("WM_SYSVALUECHANGE"); 
4501         case 0x002E: return wxT("WM_APPTERMINATENOTIFY"); 
4502         case 0x002F: return wxT("WM_PRESPARAMCHANGED"); 
4503         // Control notification messages 
4504         case 0x0030: return wxT("WM_CONTROL"); 
4505         case 0x0031: return wxT("WM_VSCROLL"); 
4506         case 0x0032: return wxT("WM_HSCROLL"); 
4507         case 0x0033: return wxT("WM_INITMENU"); 
4508         case 0x0034: return wxT("WM_MENUSELECT"); 
4509         case 0x0035: return wxT("WM_MENUSEND"); 
4510         case 0x0036: return wxT("WM_DRAWITEM"); 
4511         case 0x0037: return wxT("WM_MEASUREITEM"); 
4512         case 0x0038: return wxT("WM_CONTROLPOINTER"); 
4513         case 0x003A: return wxT("WM_QUERYDLGCODE"); 
4514         case 0x003B: return wxT("WM_INITDLG"); 
4515         case 0x003C: return wxT("WM_SUBSTITUTESTRING"); 
4516         case 0x003D: return wxT("WM_MATCHMNEMONIC"); 
4517         case 0x003E: return wxT("WM_SAVEAPPLICATION"); 
4518         case 0x0129: return wxT("WM_CTLCOLORCHANGE"); 
4519         case 0x0130: return wxT("WM_QUERYCTLTYPE"); 
4521         case 0x0040: return wxT("WM_FLASHWINDOW"); 
4522         case 0x0041: return wxT("WM_FORMATFRAME"); 
4523         case 0x0042: return wxT("WM_UPDATEFRAME"); 
4524         case 0x0043: return wxT("WM_FOCUSCHANGE"); 
4525         case 0x0044: return wxT("WM_SETBORDERSIZE"); 
4526         case 0x0045: return wxT("WM_TRACKFRAME"); 
4527         case 0x0046: return wxT("WM_MINMAXFRAME"); 
4528         case 0x0047: return wxT("WM_SETICON"); 
4529         case 0x0048: return wxT("WM_QUERYICON"); 
4530         case 0x0049: return wxT("WM_SETACCELTABLE"); 
4531         case 0x004A: return wxT("WM_QUERYACCELTABLE"); 
4532         case 0x004B: return wxT("WM_TRANSLATEACCEL"); 
4533         case 0x004C: return wxT("WM_QUERYTRACKINFO"); 
4534         case 0x004D: return wxT("WM_QUERYBORDERSIZE"); 
4535         case 0x004E: return wxT("WM_NEXTMENU"); 
4536         case 0x004F: return wxT("WM_ERASEBACKGROUND"); 
4537         case 0x0050: return wxT("WM_QUERYFRAMEINFO"); 
4538         case 0x0051: return wxT("WM_QUERYFOCUSCHAIN"); 
4539         case 0x0052: return wxT("WM_OWNERPOSCHANGE"); 
4540         case 0x0053: return wxT("WM_CACLFRAMERECT"); 
4541         case 0x0055: return wxT("WM_WINDOWPOSCHANGED"); 
4542         case 0x0056: return wxT("WM_ADJUSTFRAMEPOS"); 
4543         case 0x0059: return wxT("WM_QUERYFRAMECTLCOUNT"); 
4544         case 0x005B: return wxT("WM_QUERYHELPINFO"); 
4545         case 0x005C: return wxT("WM_SETHELPINFO"); 
4546         case 0x005D: return wxT("WM_ERROR"); 
4547         case 0x005E: return wxT("WM_REALIZEPALETTE"); 
4548         // Clipboard messages 
4549         case 0x0060: return wxT("WM_RENDERFMT"); 
4550         case 0x0061: return wxT("WM_RENDERALLFMTS"); 
4551         case 0x0062: return wxT("WM_DESTROYCLIPBOARD"); 
4552         case 0x0063: return wxT("WM_PAINTCLIPBOARD"); 
4553         case 0x0064: return wxT("WM_SIZECLIPBOARD"); 
4554         case 0x0065: return wxT("WM_HSCROLLCLIPBOARD"); 
4555         case 0x0066: return wxT("WM_VSCROLLCLIPBOARD"); 
4556         case 0x0067: return wxT("WM_DRAWCLIPBOARD"); 
4558         case 0x0070: return wxT("WM_MOUSEMOVE"); 
4559         case 0x0071: return wxT("WM_BUTTON1DOWN"); 
4560         case 0x0072: return wxT("WM_BUTTON1UP"); 
4561         case 0x0073: return wxT("WM_BUTTON1DBLCLK"); 
4562         case 0x0074: return wxT("WM_BUTTON2DOWN"); 
4563         case 0x0075: return wxT("WM_BUTTON2UP"); 
4564         case 0x0076: return wxT("WM_BUTTON2DBLCLK"); 
4565         case 0x0077: return wxT("WM_BUTTON3DOWN"); 
4566         case 0x0078: return wxT("WM_BUTTON3UP"); 
4567         case 0x0079: return wxT("WM_BUTTON3DBLCLK"); 
4568         case 0x007D: return wxT("WM_MOUSEMAP"); 
4569         case 0x007E: return wxT("WM_VRNDISABLED"); 
4570         case 0x007F: return wxT("WM_VRNENABLED"); 
4571         case 0x0410: return wxT("WM_CHORD"); 
4572         case 0x0411: return wxT("WM_BUTTON1MOTIONSTART"); 
4573         case 0x0412: return wxT("WM_BUTTON1MOTIONEND"); 
4574         case 0x0413: return wxT("WM_BUTTON1CLICK"); 
4575         case 0x0414: return wxT("WM_BUTTON2MOTIONSTART"); 
4576         case 0x0415: return wxT("WM_BUTTON2MOTIONEND"); 
4577         case 0x0416: return wxT("WM_BUTTON2CLICK"); 
4578         case 0x0417: return wxT("WM_BUTTON3MOTIONSTART"); 
4579         case 0x0418: return wxT("WM_BUTTON3MOTIONEND"); 
4580         case 0x0419: return wxT("WM_BUTTON3CLICK"); 
4581         case 0x0420: return wxT("WM_BEGINDRAG"); 
4582         case 0x0421: return wxT("WM_ENDDRAG"); 
4583         case 0x0422: return wxT("WM_SINGLESELECT"); 
4584         case 0x0423: return wxT("WM_OPEN"); 
4585         case 0x0424: return wxT("WM_CONTEXTMENU"); 
4586         case 0x0425: return wxT("WM_CONTEXTHELP"); 
4587         case 0x0426: return wxT("WM_TEXTEDIT"); 
4588         case 0x0427: return wxT("WM_BEGINSELECT"); 
4589         case 0x0228: return wxT("WM_ENDSELECT"); 
4590         case 0x0429: return wxT("WM_PICKUP"); 
4591         case 0x04C0: return wxT("WM_PENFIRST"); 
4592         case 0x04FF: return wxT("WM_PENLAST"); 
4593         case 0x0500: return wxT("WM_MMPMFIRST"); 
4594         case 0x05FF: return wxT("WM_MMPMLAST"); 
4595         case 0x0600: return wxT("WM_STDDLGFIRST"); 
4596         case 0x06FF: return wxT("WM_STDDLGLAST"); 
4597         case 0x0BD0: return wxT("WM_BIDI_FIRST"); 
4598         case 0x0BFF: return wxT("WM_BIDI_LAST"); 
4600         case 0x007A: return wxT("WM_CHAR"); 
4601         case 0x007B: return wxT("WM_VIOCHAR"); 
4603         case 0x00A0: return wxT("WM_DDE_INITIATE"); 
4604         case 0x00A1: return wxT("WM_DDE_REQUEST"); 
4605         case 0x00A2: return wxT("WM_DDE_ACK"); 
4606         case 0x00A3: return wxT("WM_DDE_DATA"); 
4607         case 0x00A4: return wxT("WM_DDE_ADVISE"); 
4608         case 0x00A5: return wxT("WM_DDE_UNADVISE"); 
4609         case 0x00A6: return wxT("WM_DDE_POKE"); 
4610         case 0x00A7: return wxT("WM_DDE_EXECUTE"); 
4611         case 0x00A8: return wxT("WM_DDE_TERMINATE"); 
4612         case 0x00A9: return wxT("WM_DDE_INITIATEACK"); 
4613         case 0x00AF: return wxT("WM_DDE_LAST"); 
4615         case 0x0120: return wxT("BM_CLICK"); 
4616         case 0x0121: return wxT("BM_QUERYCHECKINDEX"); 
4617         case 0x0122: return wxT("BM_QUERYHILITE"); 
4618         case 0x0123: return wxT("BM_SETHILITE"); 
4619         case 0x0124: return wxT("BM_QUERYCHECK"); 
4620         case 0x0125: return wxT("BM_SETCHECK"); 
4621         case 0x0126: return wxT("BM_SETDEFAULT"); 
4622         case 0x0128: return wxT("BM_AUTOSIZE"); 
4624         case 0x029A: return wxT("CBID_LIST"); 
4625         case 0x029B: return wxT("CBID_EDIT"); 
4626         case 0x0170: return wxT("CBM_SHOWLIST"); 
4627         case 0x0171: return wxT("CBM_HILITE"); 
4628         case 0x0172: return wxT("CBM_ISLISTSHOWING"); 
4630         case 0x0140: return wxT("EM_QUERYCHANGED"); 
4631         case 0x0141: return wxT("EM_QUERYSEL"); 
4632         case 0x0142: return wxT("EM_SETSEL"); 
4633         case 0x0143: return wxT("EM_SETTEXTLIMIT"); 
4634         case 0x0144: return wxT("EM_CUT"); 
4635         case 0x0145: return wxT("EM_COPY"); 
4636         case 0x0146: return wxT("EM_CLEAR"); 
4637         case 0x0147: return wxT("EM_PASTE"); 
4638         case 0x0148: return wxT("EM_QUERYFIRSTCHAR"); 
4639         case 0x0149: return wxT("EM_SETFIRSTCHAR"); 
4640         case 0x014A: return wxT("EM_QUERYREADONLY"); 
4641         case 0x014B: return wxT("EM_SETREADONLY"); 
4642         case 0x014C: return wxT("EM_SETINSERTMODE"); 
4644         case 0x0160: return wxT("LM_QUERYITEMCOUNT"); 
4645         case 0x0161: return wxT("LM_INSERTITEM"); 
4646         case 0x0162: return wxT("LM_SETOPENINDEX"); 
4647         case 0x0163: return wxT("LM_DELETEITEM"); 
4648         case 0x0164: return wxT("LM_SELECTITEM"); 
4649         case 0x0165: return wxT("LM_QUERYSELECTION"); 
4650         case 0x0166: return wxT("LM_SETITEMTEXT"); 
4651         case 0x0167: return wxT("LM_QUERYITEMTEXTLENGTH"); 
4652         case 0x0168: return wxT("LM_QUERYITEMTEXT"); 
4653         case 0x0169: return wxT("LM_SETITEMHANDLE"); 
4654         case 0x016A: return wxT("LM_QUERYITEMHANDLE"); 
4655         case 0x016B: return wxT("LM_SEARCHSTRING"); 
4656         case 0x016C: return wxT("LM_SETITEMHEIGHT"); 
4657         case 0x016D: return wxT("LM_QUERYTOPINDEX"); 
4658         case 0x016E: return wxT("LM_DELETEALL"); 
4659         case 0x016F: return wxT("LM_INSERTMULITEMS"); 
4660         case 0x0660: return wxT("LM_SETITEMWIDTH"); 
4662         case 0x0180: return wxT("MM_INSERTITEM"); 
4663         case 0x0181: return wxT("MM_DELETEITEM"); 
4664         case 0x0182: return wxT("MM_QUERYITEM"); 
4665         case 0x0183: return wxT("MM_SETITEM"); 
4666         case 0x0184: return wxT("MM_QUERYITEMCOUNT"); 
4667         case 0x0185: return wxT("MM_STARTMENUMODE"); 
4668         case 0x0186: return wxT("MM_ENDMENUMODE"); 
4669         case 0x0188: return wxT("MM_REMOVEITEM"); 
4670         case 0x0189: return wxT("MM_SELECTITEM"); 
4671         case 0x018A: return wxT("MM_QUERYSELITEMID"); 
4672         case 0x018B: return wxT("MM_QUERYITEMTEXT"); 
4673         case 0x018C: return wxT("MM_QUERYITEMTEXTLENGTH"); 
4674         case 0x018D: return wxT("MM_SETITEMHANDLE"); 
4675         case 0x018E: return wxT("MM_SETITEMTEXT"); 
4676         case 0x018F: return wxT("MM_ITEMPOSITIONFROMID"); 
4677         case 0x0190: return wxT("MM_ITEMIDFROMPOSITION"); 
4678         case 0x0191: return wxT("MM_QUERYITEMATTR"); 
4679         case 0x0192: return wxT("MM_SETITEMATTR"); 
4680         case 0x0193: return wxT("MM_ISITEMVALID"); 
4681         case 0x0194: return wxT("MM_QUERYITEMRECT"); 
4682         case 0x0431: return wxT("MM_QUERYDEFAULTITEMID"); 
4683         case 0x0432: return wxT("MM_SETDEFAULTITEMID"); 
4685         case 0x01A0: return wxT("SBM_SETSCROLLBAR"); 
4686         case 0x01A1: return wxT("SBM_SETPOS"); 
4687         case 0x01A2: return wxT("SBM_QUERYPOS"); 
4688         case 0x01A3: return wxT("SBM_QUERYRANGE"); 
4689         case 0x01A6: return wxT("SBM_SETTHUMBSIZE"); 
4692         case 0x0F00: return wxT("WM_HELPBASE"); 
4693         case 0x0FFF: return wxT("WM_HELPTOP"); 
4694         // Beginning of user defined messages 
4695         case 0x1000: return wxT("WM_USER"); 
4697         // wxWidgets user defined types 
4700         // case 0x1000 + 0: return wxT("LVM_GETBKCOLOR"); 
4701         case 0x1000 + 1: return wxT("LVM_SETBKCOLOR"); 
4702         case 0x1000 + 2: return wxT("LVM_GETIMAGELIST"); 
4703         case 0x1000 + 3: return wxT("LVM_SETIMAGELIST"); 
4704         case 0x1000 + 4: return wxT("LVM_GETITEMCOUNT"); 
4705         case 0x1000 + 5: return wxT("LVM_GETITEMA"); 
4706         case 0x1000 + 75: return wxT("LVM_GETITEMW"); 
4707         case 0x1000 + 6: return wxT("LVM_SETITEMA"); 
4708         case 0x1000 + 76: return wxT("LVM_SETITEMW"); 
4709         case 0x1000 + 7: return wxT("LVM_INSERTITEMA"); 
4710         case 0x1000 + 77: return wxT("LVM_INSERTITEMW"); 
4711         case 0x1000 + 8: return wxT("LVM_DELETEITEM"); 
4712         case 0x1000 + 9: return wxT("LVM_DELETEALLITEMS"); 
4713         case 0x1000 + 10: return wxT("LVM_GETCALLBACKMASK"); 
4714         case 0x1000 + 11: return wxT("LVM_SETCALLBACKMASK"); 
4715         case 0x1000 + 12: return wxT("LVM_GETNEXTITEM"); 
4716         case 0x1000 + 13: return wxT("LVM_FINDITEMA"); 
4717         case 0x1000 + 83: return wxT("LVM_FINDITEMW"); 
4718         case 0x1000 + 14: return wxT("LVM_GETITEMRECT"); 
4719         case 0x1000 + 15: return wxT("LVM_SETITEMPOSITION"); 
4720         case 0x1000 + 16: return wxT("LVM_GETITEMPOSITION"); 
4721         case 0x1000 + 17: return wxT("LVM_GETSTRINGWIDTHA"); 
4722         case 0x1000 + 87: return wxT("LVM_GETSTRINGWIDTHW"); 
4723         case 0x1000 + 18: return wxT("LVM_HITTEST"); 
4724         case 0x1000 + 19: return wxT("LVM_ENSUREVISIBLE"); 
4725         case 0x1000 + 20: return wxT("LVM_SCROLL"); 
4726         case 0x1000 + 21: return wxT("LVM_REDRAWITEMS"); 
4727         case 0x1000 + 22: return wxT("LVM_ARRANGE"); 
4728         case 0x1000 + 23: return wxT("LVM_EDITLABELA"); 
4729         case 0x1000 + 118: return wxT("LVM_EDITLABELW"); 
4730         case 0x1000 + 24: return wxT("LVM_GETEDITCONTROL"); 
4731         case 0x1000 + 25: return wxT("LVM_GETCOLUMNA"); 
4732         case 0x1000 + 95: return wxT("LVM_GETCOLUMNW"); 
4733         case 0x1000 + 26: return wxT("LVM_SETCOLUMNA"); 
4734         case 0x1000 + 96: return wxT("LVM_SETCOLUMNW"); 
4735         case 0x1000 + 27: return wxT("LVM_INSERTCOLUMNA"); 
4736         case 0x1000 + 97: return wxT("LVM_INSERTCOLUMNW"); 
4737         case 0x1000 + 28: return wxT("LVM_DELETECOLUMN"); 
4738         case 0x1000 + 29: return wxT("LVM_GETCOLUMNWIDTH"); 
4739         case 0x1000 + 30: return wxT("LVM_SETCOLUMNWIDTH"); 
4740         case 0x1000 + 31: return wxT("LVM_GETHEADER"); 
4741         case 0x1000 + 33: return wxT("LVM_CREATEDRAGIMAGE"); 
4742         case 0x1000 + 34: return wxT("LVM_GETVIEWRECT"); 
4743         case 0x1000 + 35: return wxT("LVM_GETTEXTCOLOR"); 
4744         case 0x1000 + 36: return wxT("LVM_SETTEXTCOLOR"); 
4745         case 0x1000 + 37: return wxT("LVM_GETTEXTBKCOLOR"); 
4746         case 0x1000 + 38: return wxT("LVM_SETTEXTBKCOLOR"); 
4747         case 0x1000 + 39: return wxT("LVM_GETTOPINDEX"); 
4748         case 0x1000 + 40: return wxT("LVM_GETCOUNTPERPAGE"); 
4749         case 0x1000 + 41: return wxT("LVM_GETORIGIN"); 
4750         case 0x1000 + 42: return wxT("LVM_UPDATE"); 
4751         case 0x1000 + 43: return wxT("LVM_SETITEMSTATE"); 
4752         case 0x1000 + 44: return wxT("LVM_GETITEMSTATE"); 
4753         case 0x1000 + 45: return wxT("LVM_GETITEMTEXTA"); 
4754         case 0x1000 + 115: return wxT("LVM_GETITEMTEXTW"); 
4755         case 0x1000 + 46: return wxT("LVM_SETITEMTEXTA"); 
4756         case 0x1000 + 116: return wxT("LVM_SETITEMTEXTW"); 
4757         case 0x1000 + 47: return wxT("LVM_SETITEMCOUNT"); 
4758         case 0x1000 + 48: return wxT("LVM_SORTITEMS"); 
4759         case 0x1000 + 49: return wxT("LVM_SETITEMPOSITION32"); 
4760         case 0x1000 + 50: return wxT("LVM_GETSELECTEDCOUNT"); 
4761         case 0x1000 + 51: return wxT("LVM_GETITEMSPACING"); 
4762         case 0x1000 + 52: return wxT("LVM_GETISEARCHSTRINGA"); 
4763         case 0x1000 + 117: return wxT("LVM_GETISEARCHSTRINGW"); 
4764         case 0x1000 + 53: return wxT("LVM_SETICONSPACING"); 
4765         case 0x1000 + 54: return wxT("LVM_SETEXTENDEDLISTVIEWSTYLE"); 
4766         case 0x1000 + 55: return wxT("LVM_GETEXTENDEDLISTVIEWSTYLE"); 
4767         case 0x1000 + 56: return wxT("LVM_GETSUBITEMRECT"); 
4768         case 0x1000 + 57: return wxT("LVM_SUBITEMHITTEST"); 
4769         case 0x1000 + 58: return wxT("LVM_SETCOLUMNORDERARRAY"); 
4770         case 0x1000 + 59: return wxT("LVM_GETCOLUMNORDERARRAY"); 
4771         case 0x1000 + 60: return wxT("LVM_SETHOTITEM"); 
4772         case 0x1000 + 61: return wxT("LVM_GETHOTITEM"); 
4773         case 0x1000 + 62: return wxT("LVM_SETHOTCURSOR"); 
4774         case 0x1000 + 63: return wxT("LVM_GETHOTCURSOR"); 
4775         case 0x1000 + 64: return wxT("LVM_APPROXIMATEVIEWRECT"); 
4776         case 0x1000 + 65: return wxT("LVM_SETWORKAREA"); 
4779         case 0x1100 + 0: return wxT("TVM_INSERTITEMA"); 
4780         case 0x1100 + 50: return wxT("TVM_INSERTITEMW"); 
4781         case 0x1100 + 1: return wxT("TVM_DELETEITEM"); 
4782         case 0x1100 + 2: return wxT("TVM_EXPAND"); 
4783         case 0x1100 + 4: return wxT("TVM_GETITEMRECT"); 
4784         case 0x1100 + 5: return wxT("TVM_GETCOUNT"); 
4785         case 0x1100 + 6: return wxT("TVM_GETINDENT"); 
4786         case 0x1100 + 7: return wxT("TVM_SETINDENT"); 
4787         case 0x1100 + 8: return wxT("TVM_GETIMAGELIST"); 
4788         case 0x1100 + 9: return wxT("TVM_SETIMAGELIST"); 
4789         case 0x1100 + 10: return wxT("TVM_GETNEXTITEM"); 
4790         case 0x1100 + 11: return wxT("TVM_SELECTITEM"); 
4791         case 0x1100 + 12: return wxT("TVM_GETITEMA"); 
4792         case 0x1100 + 62: return wxT("TVM_GETITEMW"); 
4793         case 0x1100 + 13: return wxT("TVM_SETITEMA"); 
4794         case 0x1100 + 63: return wxT("TVM_SETITEMW"); 
4795         case 0x1100 + 14: return wxT("TVM_EDITLABELA"); 
4796         case 0x1100 + 65: return wxT("TVM_EDITLABELW"); 
4797         case 0x1100 + 15: return wxT("TVM_GETEDITCONTROL"); 
4798         case 0x1100 + 16: return wxT("TVM_GETVISIBLECOUNT"); 
4799         case 0x1100 + 17: return wxT("TVM_HITTEST"); 
4800         case 0x1100 + 18: return wxT("TVM_CREATEDRAGIMAGE"); 
4801         case 0x1100 + 19: return wxT("TVM_SORTCHILDREN"); 
4802         case 0x1100 + 20: return wxT("TVM_ENSUREVISIBLE"); 
4803         case 0x1100 + 21: return wxT("TVM_SORTCHILDRENCB"); 
4804         case 0x1100 + 22: return wxT("TVM_ENDEDITLABELNOW"); 
4805         case 0x1100 + 23: return wxT("TVM_GETISEARCHSTRINGA"); 
4806         case 0x1100 + 64: return wxT("TVM_GETISEARCHSTRINGW"); 
4807         case 0x1100 + 24: return wxT("TVM_SETTOOLTIPS"); 
4808         case 0x1100 + 25: return wxT("TVM_GETTOOLTIPS"); 
4811         case 0x1200 + 0: return wxT("HDM_GETITEMCOUNT"); 
4812         case 0x1200 + 1: return wxT("HDM_INSERTITEMA"); 
4813         case 0x1200 + 10: return wxT("HDM_INSERTITEMW"); 
4814         case 0x1200 + 2: return wxT("HDM_DELETEITEM"); 
4815         case 0x1200 + 3: return wxT("HDM_GETITEMA"); 
4816         case 0x1200 + 11: return wxT("HDM_GETITEMW"); 
4817         case 0x1200 + 4: return wxT("HDM_SETITEMA"); 
4818         case 0x1200 + 12: return wxT("HDM_SETITEMW"); 
4819         case 0x1200 + 5: return wxT("HDM_LAYOUT"); 
4820         case 0x1200 + 6: return wxT("HDM_HITTEST"); 
4821         case 0x1200 + 7: return wxT("HDM_GETITEMRECT"); 
4822         case 0x1200 + 8: return wxT("HDM_SETIMAGELIST"); 
4823         case 0x1200 + 9: return wxT("HDM_GETIMAGELIST"); 
4824         case 0x1200 + 15: return wxT("HDM_ORDERTOINDEX"); 
4825         case 0x1200 + 16: return wxT("HDM_CREATEDRAGIMAGE"); 
4826         case 0x1200 + 17: return wxT("HDM_GETORDERARRAY"); 
4827         case 0x1200 + 18: return wxT("HDM_SETORDERARRAY"); 
4828         case 0x1200 + 19: return wxT("HDM_SETHOTDIVIDER"); 
4831         case 0x1300 + 2: return wxT("TCM_GETIMAGELIST"); 
4832         case 0x1300 + 3: return wxT("TCM_SETIMAGELIST"); 
4833         case 0x1300 + 4: return wxT("TCM_GETITEMCOUNT"); 
4834         case 0x1300 + 5: return wxT("TCM_GETITEMA"); 
4835         case 0x1300 + 60: return wxT("TCM_GETITEMW"); 
4836         case 0x1300 + 6: return wxT("TCM_SETITEMA"); 
4837         case 0x1300 + 61: return wxT("TCM_SETITEMW"); 
4838         case 0x1300 + 7: return wxT("TCM_INSERTITEMA"); 
4839         case 0x1300 + 62: return wxT("TCM_INSERTITEMW"); 
4840         case 0x1300 + 8: return wxT("TCM_DELETEITEM"); 
4841         case 0x1300 + 9: return wxT("TCM_DELETEALLITEMS"); 
4842         case 0x1300 + 10: return wxT("TCM_GETITEMRECT"); 
4843         case 0x1300 + 11: return wxT("TCM_GETCURSEL"); 
4844         case 0x1300 + 12: return wxT("TCM_SETCURSEL"); 
4845         case 0x1300 + 13: return wxT("TCM_HITTEST"); 
4846         case 0x1300 + 14: return wxT("TCM_SETITEMEXTRA"); 
4847         case 0x1300 + 40: return wxT("TCM_ADJUSTRECT"); 
4848         case 0x1300 + 41: return wxT("TCM_SETITEMSIZE"); 
4849         case 0x1300 + 42: return wxT("TCM_REMOVEIMAGE"); 
4850         case 0x1300 + 43: return wxT("TCM_SETPADDING"); 
4851         case 0x1300 + 44: return wxT("TCM_GETROWCOUNT"); 
4852         case 0x1300 + 45: return wxT("TCM_GETTOOLTIPS"); 
4853         case 0x1300 + 46: return wxT("TCM_SETTOOLTIPS"); 
4854         case 0x1300 + 47: return wxT("TCM_GETCURFOCUS"); 
4855         case 0x1300 + 48: return wxT("TCM_SETCURFOCUS"); 
4856         case 0x1300 + 49: return wxT("TCM_SETMINTABWIDTH"); 
4857         case 0x1300 + 50: return wxT("TCM_DESELECTALL"); 
4860         case WM_USER
+1000+1: return wxT("TB_ENABLEBUTTON"); 
4861         case WM_USER
+1000+2: return wxT("TB_CHECKBUTTON"); 
4862         case WM_USER
+1000+3: return wxT("TB_PRESSBUTTON"); 
4863         case WM_USER
+1000+4: return wxT("TB_HIDEBUTTON"); 
4864         case WM_USER
+1000+5: return wxT("TB_INDETERMINATE"); 
4865         case WM_USER
+1000+9: return wxT("TB_ISBUTTONENABLED"); 
4866         case WM_USER
+1000+10: return wxT("TB_ISBUTTONCHECKED"); 
4867         case WM_USER
+1000+11: return wxT("TB_ISBUTTONPRESSED"); 
4868         case WM_USER
+1000+12: return wxT("TB_ISBUTTONHIDDEN"); 
4869         case WM_USER
+1000+13: return wxT("TB_ISBUTTONINDETERMINATE"); 
4870         case WM_USER
+1000+17: return wxT("TB_SETSTATE"); 
4871         case WM_USER
+1000+18: return wxT("TB_GETSTATE"); 
4872         case WM_USER
+1000+19: return wxT("TB_ADDBITMAP"); 
4873         case WM_USER
+1000+20: return wxT("TB_ADDBUTTONS"); 
4874         case WM_USER
+1000+21: return wxT("TB_INSERTBUTTON"); 
4875         case WM_USER
+1000+22: return wxT("TB_DELETEBUTTON"); 
4876         case WM_USER
+1000+23: return wxT("TB_GETBUTTON"); 
4877         case WM_USER
+1000+24: return wxT("TB_BUTTONCOUNT"); 
4878         case WM_USER
+1000+25: return wxT("TB_COMMANDTOINDEX"); 
4879         case WM_USER
+1000+26: return wxT("TB_SAVERESTOREA"); 
4880         case WM_USER
+1000+76: return wxT("TB_SAVERESTOREW"); 
4881         case WM_USER
+1000+27: return wxT("TB_CUSTOMIZE"); 
4882         case WM_USER
+1000+28: return wxT("TB_ADDSTRINGA"); 
4883         case WM_USER
+1000+77: return wxT("TB_ADDSTRINGW"); 
4884         case WM_USER
+1000+29: return wxT("TB_GETITEMRECT"); 
4885         case WM_USER
+1000+30: return wxT("TB_BUTTONSTRUCTSIZE"); 
4886         case WM_USER
+1000+31: return wxT("TB_SETBUTTONSIZE"); 
4887         case WM_USER
+1000+32: return wxT("TB_SETBITMAPSIZE"); 
4888         case WM_USER
+1000+33: return wxT("TB_AUTOSIZE"); 
4889         case WM_USER
+1000+35: return wxT("TB_GETTOOLTIPS"); 
4890         case WM_USER
+1000+36: return wxT("TB_SETTOOLTIPS"); 
4891         case WM_USER
+1000+37: return wxT("TB_SETPARENT"); 
4892         case WM_USER
+1000+39: return wxT("TB_SETROWS"); 
4893         case WM_USER
+1000+40: return wxT("TB_GETROWS"); 
4894         case WM_USER
+1000+42: return wxT("TB_SETCMDID"); 
4895         case WM_USER
+1000+43: return wxT("TB_CHANGEBITMAP"); 
4896         case WM_USER
+1000+44: return wxT("TB_GETBITMAP"); 
4897         case WM_USER
+1000+45: return wxT("TB_GETBUTTONTEXTA"); 
4898         case WM_USER
+1000+75: return wxT("TB_GETBUTTONTEXTW"); 
4899         case WM_USER
+1000+46: return wxT("TB_REPLACEBITMAP"); 
4900         case WM_USER
+1000+47: return wxT("TB_SETINDENT"); 
4901         case WM_USER
+1000+48: return wxT("TB_SETIMAGELIST"); 
4902         case WM_USER
+1000+49: return wxT("TB_GETIMAGELIST"); 
4903         case WM_USER
+1000+50: return wxT("TB_LOADIMAGES"); 
4904         case WM_USER
+1000+51: return wxT("TB_GETRECT"); 
4905         case WM_USER
+1000+52: return wxT("TB_SETHOTIMAGELIST"); 
4906         case WM_USER
+1000+53: return wxT("TB_GETHOTIMAGELIST"); 
4907         case WM_USER
+1000+54: return wxT("TB_SETDISABLEDIMAGELIST"); 
4908         case WM_USER
+1000+55: return wxT("TB_GETDISABLEDIMAGELIST"); 
4909         case WM_USER
+1000+56: return wxT("TB_SETSTYLE"); 
4910         case WM_USER
+1000+57: return wxT("TB_GETSTYLE"); 
4911         case WM_USER
+1000+58: return wxT("TB_GETBUTTONSIZE"); 
4912         case WM_USER
+1000+59: return wxT("TB_SETBUTTONWIDTH"); 
4913         case WM_USER
+1000+60: return wxT("TB_SETMAXTEXTROWS"); 
4914         case WM_USER
+1000+61: return wxT("TB_GETTEXTROWS"); 
4915         case WM_USER
+1000+41: return wxT("TB_GETBITMAPFLAGS"); 
4918     static wxString s_szBuf
; 
4919     s_szBuf
.Printf(wxT("<unknown message = %d>"), nMessage
); 
4920     return s_szBuf
.c_str(); 
4922 } // end of wxGetMessageName 
4924 #endif // __WXDEBUG__ 
4928 static void TranslateKbdEventToMouse( 
4936     // Construct the key mask 
4937     ULONG
&                          fwKeys 
= *pFlags
; 
4939     fwKeys 
= VK_BUTTON2
; 
4940     if ((::WinGetKeyState(HWND_DESKTOP
, VK_CTRL
) & 0x100) != 0) 
4942     if ((::WinGetKeyState(HWND_DESKTOP
, VK_SHIFT
) & 0x100) != 0) 
4946     // Simulate right mouse button click 
4950     ::WinQueryMsgPos(vHabmain
, &vPoint
); 
4954     pWin
->ScreenToClient(pX
, pY
); 
4955 } // end of TranslateKbdEventToMouse 
4958 // Find the wxWindow at the current mouse position, returning the mouse 
4960 wxWindow
* wxFindWindowAtPointer(wxPoint
& WXUNUSED(rPt
)) 
4962     return wxFindWindowAtPoint(wxGetMousePosition()); 
4965 wxWindow
* wxFindWindowAtPoint(const wxPoint
& rPt
) 
4972     HWND      hWndHit 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt2
, FALSE
); 
4973     wxWindow
* pWin 
= wxFindWinFromHandle((WXHWND
)hWndHit
) ; 
4974     HWND      hWnd 
= hWndHit
; 
4977     // Try to find a window with a wxWindow associated with it 
4979     while (!pWin 
&& (hWnd 
!= 0)) 
4981         hWnd 
= ::WinQueryWindow(hWnd
, QW_PARENT
); 
4982         pWin 
= wxFindWinFromHandle((WXHWND
)hWnd
) ; 
4987 // Get the current mouse position. 
4988 wxPoint 
wxGetMousePosition() 
4992     ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
); 
4993     return wxPoint(vPt
.x
, vPt
.y
); 
4996 wxMouseState 
wxGetMouseState() 
4999     wxPoint pt 
= wxGetMousePosition(); 
5002     ms
.SetLeftDown(IsKeyDown(VK_BUTTON1
)); 
5003     ms
.SetMiddleDown(IsKeyDown(VK_BUTTON3
)); 
5004     ms
.SetRightDown(IsKeyDown(VK_BUTTON2
)); 
5005     ms
.SetControlDown(IsCtrlDown()); 
5006     ms
.SetShiftDown(IsShiftDown()); 
5007     ms
.SetAltDown(IsKeyDown(VK_ALT
)|IsKeyDown(VK_ALTGRAF
)); 
5008     ms
.SetMetaDown(IsKeyDown(VK_ALTGRAF
)); 
5013 wxWindowOS2
* FindWindowForMouseEvent( wxWindow
* pWin
, 
5014                                       short*    WXUNUSED(pnX
), 
5015                                       short*    WXUNUSED(pnY
) ) 
5017     HWND   hWnd 
= GetHwndOf(pWin
); 
5018     HWND   hWndUnderMouse
; 
5020     BOOL   rcEnabled 
= FALSE
; 
5021     BOOL   rcVisible 
= FALSE
; 
5023     ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
5024     hWndUnderMouse 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, TRUE
); 
5025     if (hWndUnderMouse 
!= HWND_DESKTOP
) 
5027         wxWindow
*                   pWinUnderMouse 
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
); 
5031             wxWindowList::compatibility_iterator current 
= pWinUnderMouse
->GetChildren().GetFirst(); 
5032             wxWindow
*               pGrandChild 
= NULL
; 
5036             ::WinMapWindowPoints(HWND_DESKTOP
, hWndUnderMouse
, &vPoint
, 1); 
5038             // Find a child window mouse might be under 
5042                 wxWindow
*                   pChild 
= current
->GetData(); 
5044                 vPoint2
.x 
= vPoint
.x
; 
5045                 vPoint2
.y 
= vPoint
.y
; 
5046                 ::WinMapWindowPoints(hWndUnderMouse
, pChild
->GetHWND(), &vPoint2
, 1); 
5047                 ::WinQueryWindowRect(pChild
->GetHWND(), &vRect
); 
5048                 if (::WinPtInRect(vHabmain
, &vRect
, &vPoint2
)) 
5050                     if (pChild
->IsTopLevel()) 
5053                         wxWindowList::compatibility_iterator current2 
=pChild
->GetChildren().GetFirst(); 
5057                             wxWindow
*           pGrandChild 
= current2
->GetData(); 
5059                             vPoint3
.x 
= vPoint2
.x
; 
5060                             vPoint3
.y 
= vPoint2
.y
; 
5061                             ::WinMapWindowPoints( pChild
->GetHWND() 
5062                                                  ,pGrandChild
->GetHWND() 
5066                             ::WinQueryWindowRect(pGrandChild
->GetHWND(), &vRect
); 
5067                             if (::WinPtInRect(vHabmain
, &vRect
, &vPoint3
)) 
5069                                 hWndUnderMouse 
= GetHwndOf(pGrandChild
); 
5070                                 pWinUnderMouse 
= pGrandChild
; 
5073                             current2 
= current2
->GetNext(); 
5078                     hWndUnderMouse 
= GetHwndOf(pChild
); 
5079                     pWinUnderMouse 
= pChild
; 
5080                     rcVisible 
= ::WinIsWindowVisible(hWndUnderMouse
); 
5081                     rcEnabled 
= ::WinIsWindowEnabled(hWndUnderMouse
); 
5082                     if (rcVisible 
&& rcEnabled
) 
5085                 current 
= current
->GetNext(); 
5089     rcVisible 
= ::WinIsWindowVisible(hWndUnderMouse
); 
5090     rcEnabled 
= ::WinIsWindowEnabled(hWndUnderMouse
); 
5094     // Check that we have a child window which is susceptible to receive mouse 
5095     // events: for this it must be shown and enabled 
5097     if ( hWndUnderMouse 
&& 
5098          hWndUnderMouse 
!= hWnd 
&& 
5099          rcVisible 
&& rcEnabled
) 
5101         wxWindow
*                       pWinUnderMouse 
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
); 
5106             // Translate the mouse coords to the other window coords 
5108             pWin 
= pWinUnderMouse
; 
5112 } // end of FindWindowForMouseEvent