3 // Author:      David Webster 
   7 // Copyright:   (c) David Webster 
   8 // Licence:     wxWindows licence 
   9 ///////////////////////////////////////////////////////////////////////////// 
  12 // For compilers that support precompilation, includes "wx.h". 
  14 #include "wx/wxprec.h" 
  20     #include "wx/window.h" 
  25     #include "wx/dcclient.h" 
  29     #include "wx/layout.h" 
  30     #include "wx/checkbox.h" 
  31     #include "wx/combobox.h" 
  32     #include "wx/dialog.h" 
  34     #include "wx/listbox.h" 
  35     #include "wx/button.h" 
  36     #include "wx/bmpbuttn.h" 
  37     #include "wx/msgdlg.h" 
  38     #include "wx/scrolwin.h" 
  39     #include "wx/radiobox.h" 
  40     #include "wx/radiobut.h" 
  41     #include "wx/slider.h" 
  42     #include "wx/statbox.h" 
  43     #include "wx/statusbr.h" 
  44     #include "wx/toolbar.h" 
  45     #include "wx/settings.h" 
  50     #include "wx/ownerdrw.h" 
  53 #if     wxUSE_DRAG_AND_DROP 
  57 #include "wx/menuitem.h" 
  60 #include "wx/os2/private.h" 
  63     #include "wx/tooltip.h" 
  67     #include "wx/notebook.h" 
  78 #include "wx/textctrl.h" 
  83 // Place compiler, OS specific includes here 
  87 // Standard macros -- these are for OS/2 PM, but most GUI's have something similar 
  91 //  SHORT1FROMMP -- LOWORD 
  93     #define GET_X_LPARAM(mp) ((unsigned short)(unsigned long)(mp)) 
  95 //  SHORT2FROMMP -- HIWORD 
  97     #define GET_Y_LPARAM(mp) ((unsigned short)(unsigned long)(mp >> 16)) 
  98 #endif // GET_X_LPARAM 
 100 #ifndef CW_USEDEFAULT 
 101 #  define CW_USEDEFAULT    ((int)0x80000000) 
 105     #define VK_OEM_1        0xBA 
 106     #define VK_OEM_PLUS     0xBB 
 107     #define VK_OEM_COMMA    0xBC 
 108     #define VK_OEM_MINUS    0xBD 
 109     #define VK_OEM_PERIOD   0xBE 
 110     #define VK_OEM_2        0xBF 
 111     #define VK_OEM_3        0xC0 
 112     #define VK_OEM_4        0xDB 
 113     #define VK_OEM_5        0xDC 
 114     #define VK_OEM_6        0xDD 
 115     #define VK_OEM_7        0xDE 
 118 // --------------------------------------------------------------------------- 
 120 // --------------------------------------------------------------------------- 
 123 // The last PM message we got (MT-UNSAFE) 
 127 #if wxUSE_MENUS_NATIVE 
 128 wxMenu
*                   wxCurrentPopupMenu 
= NULL
; 
 129 #endif // wxUSE_MENUS_NATIVE 
 131 wxList
*                   wxWinHandleList 
= NULL
; 
 133 // --------------------------------------------------------------------------- 
 135 // --------------------------------------------------------------------------- 
 138 // the window proc for all our windows; most gui's have something similar 
 140 MRESULT EXPENTRY 
wxWndProc( HWND hWnd
 
 147     const char *wxGetMessageName(int message
); 
 150 wxWindowOS2
* FindWindowForMouseEvent( wxWindow
* pWin
 
 154 void         wxRemoveHandleAssociation(wxWindowOS2
* pWin
); 
 155 void         wxAssociateWinWithHandle( HWND         hWnd
 
 158 wxWindow
* wxFindWinFromHandle(WXHWND hWnd
); 
 161 // get the current state of SHIFT/CTRL keys 
 163 static inline bool IsShiftDown() { return (::WinGetKeyState(HWND_DESKTOP
, VK_SHIFT
) & 0x8000) != 0; } 
 164 static inline bool IsCtrlDown() { return (::WinGetKeyState(HWND_DESKTOP
, VK_CTRL
) & 0x8000) != 0; } 
 166 static wxWindow
*                    gpWinBeingCreated 
= NULL
; 
 168 // --------------------------------------------------------------------------- 
 170 // --------------------------------------------------------------------------- 
 172 // in wxUniv-OS/2 this class is abstract because it doesn't have DoPopupMenu() 
 174 #ifdef __WXUNIVERSAL__ 
 175     IMPLEMENT_ABSTRACT_CLASS(wxWindowOS2
, wxWindowBase
) 
 177     IMPLEMENT_DYNAMIC_CLASS(wxWindow
, wxWindowBase
) 
 178 #endif // __WXUNIVERSAL__/__WXPM__ 
 180 BEGIN_EVENT_TABLE(wxWindowOS2
, wxWindowBase
) 
 181     EVT_ERASE_BACKGROUND(wxWindowOS2::OnEraseBackground
) 
 182     EVT_SYS_COLOUR_CHANGED(wxWindowOS2::OnSysColourChanged
) 
 183     EVT_IDLE(wxWindowOS2::OnIdle
) 
 184     EVT_SET_FOCUS(wxWindowOS2::OnSetFocus
) 
 187 // =========================================================================== 
 189 // =========================================================================== 
 191 // --------------------------------------------------------------------------- 
 192 // wxWindow utility functions 
 193 // --------------------------------------------------------------------------- 
 196 // Find an item given the PM Window id 
 198 wxWindow
* wxWindowOS2::FindItem( 
 203     wxControl
*                      pItem 
= wxDynamicCast(this, wxControl
); 
 208         // I it we or one of our "internal" children? 
 210         if (pItem
->GetId() == lId
 
 211 #ifndef __WXUNIVERSAL__ 
 212             || (pItem
->GetSubcontrols().Index(lId
) != wxNOT_FOUND
) 
 219 #endif // wxUSE_CONTROLS 
 221     wxWindowList::Node
*             pCurrent 
= GetChildren().GetFirst(); 
 225         wxWindow
*                   pChildWin 
= pCurrent
->GetData(); 
 226         wxWindow
*                   pWnd 
= pChildWin
->FindItem(lId
); 
 231         pCurrent 
= pCurrent
->GetNext(); 
 234 } // end of wxWindowOS2::FindItem 
 237 // Find an item given the PM Window handle 
 239 wxWindow
* wxWindowOS2::FindItemByHWND( 
 244     wxWindowList::Node
*             pCurrent 
= GetChildren().GetFirst(); 
 248         wxWindow
*                   pParent 
= pCurrent
->GetData(); 
 251         // Do a recursive search. 
 253         wxWindow
*                   pWnd 
= pParent
->FindItemByHWND(hWnd
); 
 260             || pParent
->IsKindOf(CLASSINFO(wxControl
)) 
 261 #endif // wxUSE_CONTROLS 
 264             wxWindow
*               pItem 
= pCurrent
->GetData(); 
 266             if (pItem
->GetHWND() == hWnd
) 
 270                 if (pItem
->ContainsHWND(hWnd
)) 
 274         pCurrent 
= pCurrent
->GetNext(); 
 277 } // end of wxWindowOS2::FindItemByHWND 
 280 // Default command handler 
 282 bool wxWindowOS2::OS2Command( 
 283   WXUINT                            
WXUNUSED(uParam
) 
 284 , WXWORD                            
WXUNUSED(uId
) 
 290 // ---------------------------------------------------------------------------- 
 291 // constructors and such 
 292 // ---------------------------------------------------------------------------- 
 294 void wxWindowOS2::Init() 
 299     m_bWinCaptured 
= FALSE
; 
 301     m_fnOldWndProc          
= NULL
; 
 303     m_bMouseInWindow        
= FALSE
; 
 304     m_bLastKeydownProcessed 
= FALSE
; 
 305     m_pChildrenDisabled     
= NULL
; 
 312     m_hWndScrollBarHorz 
= 0L; 
 313     m_hWndScrollBarVert 
= 0L; 
 315     memset(&m_vWinSwp
, '\0', sizeof (SWP
)); 
 318     // Pass WM_GETDLGCODE to DefWindowProc() 
 324     m_bBackgroundTransparent 
= FALSE
; 
 327     // As all windows are created with WS_VISIBLE style... 
 331 #if wxUSE_MOUSEEVENT_HACK 
 334     m_nLastMouseEvent 
= -1; 
 335 #endif // wxUSE_MOUSEEVENT_HACK 
 336 } // wxWindowOS2::Init 
 341 wxWindowOS2::~wxWindowOS2() 
 343     m_isBeingDeleted 
= TRUE
; 
 345     for (wxWindow
* pWin 
= GetParent(); pWin
; pWin 
= pWin
->GetParent()) 
 347         wxTopLevelWindow
*           pFrame 
= wxDynamicCast(pWin
, wxTopLevelWindow
); 
 351             if (pFrame
->GetLastFocus() == this) 
 352                 pFrame
->SetLastFocus(NULL
); 
 360         if(!::WinDestroyWindow(GetHWND())) 
 361             wxLogLastError(wxT("DestroyWindow")); 
 363         // remove hWnd <-> wxWindow association 
 365         wxRemoveHandleAssociation(this); 
 367     delete m_pChildrenDisabled
; 
 368 } // end of wxWindowOS2::~wxWindowOS2 
 370 // real construction (Init() must have been called before!) 
 371 bool wxWindowOS2::Create( 
 374 , const wxPoint
&                    rPos
 
 375 , const wxSize
&                     rSize
 
 377 , const wxString
&                   rName
 
 380     HWND                            hParent 
= NULLHANDLE
; 
 381     ULONG                           ulCreateFlags 
= 0; 
 382     WXDWORD                         dwExStyle 
= 0; 
 384     wxCHECK_MSG(pParent
, FALSE
, wxT("can't create wxWindow without parent")); 
 388     // wxGTK doesn't allow to create controls with static box as the parent so 
 389     // this will result in a crash when the program is ported to wxGTK - warn 
 392     // the correct solution is to create the controls as siblings of the 
 395     wxASSERT_MSG( !wxDynamicCast(pParent
, wxStaticBox
), 
 396                   _T("wxStaticBox can't be used as a window parent!") ); 
 397 #endif // wxUSE_STATBOX 
 399     if ( !CreateBase( pParent
 
 411         pParent
->AddChild(this); 
 412         hParent 
= GetWinHwnd(pParent
); 
 414         if ( pParent
->IsKindOf(CLASSINFO(wxGenericScrolledWindow
)) || 
 415              pParent
->IsKindOf(CLASSINFO(wxScrolledWindow
)) 
 417             ulCreateFlags 
|= WS_CLIPSIBLINGS
; 
 421     // Most wxSTYLES are really PM Class specific styles and will be 
 422     // set in those class create procs.  PM's basic windows styles are 
 425     ulCreateFlags 
|=  OS2GetCreateWindowFlags(&dwExStyle
); 
 428 #ifdef __WXUNIVERSAL__ 
 429     // no 3d effects, we draw them ourselves 
 431 #endif // !wxUniversal 
 432     if (lStyle 
& wxPOPUP_WINDOW
) 
 434         ulCreateFlags 
&= ~WS_VISIBLE
; 
 439         ulCreateFlags 
|= WS_VISIBLE
; 
 443     // Generic OS/2 Windows have no Control Data but other classes 
 444     // that call OS2Create may have some. 
 446     return(OS2Create( (PSZ
)wxCanvasClassName
 
 451                      ,NULL         
// Control Data 
 455 } // end of wxWindowOS2::Create 
 457 // --------------------------------------------------------------------------- 
 459 // --------------------------------------------------------------------------- 
 461 void wxWindowOS2::SetFocus() 
 463     HWND                            hWnd 
= GetHwnd(); 
 464     wxCHECK_RET( hWnd
, _T("can't set focus to invalid window") ); 
 467         ::WinSetFocus(HWND_DESKTOP
, hWnd
); 
 468 } // end of wxWindowOS2::SetFocus 
 470 void wxWindowOS2::SetFocusFromKbd() 
 473     // Nothing else to do under OS/2 
 475     wxWindowBase::SetFocusFromKbd(); 
 476 } // end of wxWindowOS2::SetFocus 
 478 wxWindow
* wxWindowBase::FindFocus() 
 480     HWND                            hWnd 
= ::WinQueryFocus(HWND_DESKTOP
); 
 484         return wxFindWinFromHandle((WXHWND
)hWnd
); 
 487 } // wxWindowBase::FindFocus 
 489 bool wxWindowOS2::Enable( 
 493     if (!wxWindowBase::Enable(bEnable
)) 
 496     HWND                            hWnd 
= GetHwnd(); 
 499         ::WinEnableWindow(hWnd
, (BOOL
)bEnable
); 
 502     // The logic below doesn't apply to the top level windows -- otherwise 
 503     // showing a modal dialog would result in total greying out (and ungreying 
 504     // out later) of everything which would be really ugly 
 509     wxWindowList::Node
*             pNode 
= GetChildren().GetFirst(); 
 513         wxWindow
*                   pChild 
= pNode
->GetData(); 
 518             // Enable the child back unless it had been disabled before us 
 520             if (!m_pChildrenDisabled 
|| !m_pChildrenDisabled
->Find(pChild
)) 
 523         else // we're being disabled 
 525             if (pChild
->IsEnabled()) 
 528                 // Disable it as children shouldn't stay enabled while the 
 533             else // child already disabled, remember it 
 536                 // Have we created the list of disabled children already? 
 538                 if (!m_pChildrenDisabled
) 
 539                     m_pChildrenDisabled 
= new wxWindowList
; 
 540                 m_pChildrenDisabled
->Append(pChild
); 
 543         pNode 
= pNode
->GetNext(); 
 545     if (bEnable 
&& m_pChildrenDisabled
) 
 548         // We don't need this list any more, don't keep unused memory 
 550         delete m_pChildrenDisabled
; 
 551         m_pChildrenDisabled 
= NULL
; 
 554 } // end of wxWindowOS2::Enable 
 556 bool wxWindowOS2::Show( 
 560     if (!wxWindowBase::Show(bShow
)) 
 563     HWND                            hWnd 
= GetHwnd(); 
 565     ::WinShowWindow(hWnd
, bShow
); 
 569         ::WinSetWindowPos(hWnd
, HWND_TOP
, 0, 0, 0, 0, SWP_ACTIVATE 
| SWP_ZORDER
); 
 572 } // end of wxWindowOS2::Show 
 574 void wxWindowOS2::Raise() 
 576     ::WinSetWindowPos(GetHwnd(), HWND_TOP
, 0, 0, 0, 0, SWP_ZORDER 
| SWP_ACTIVATE
); 
 577 } // end of wxWindowOS2::Raise 
 579 void wxWindowOS2::Lower() 
 581     ::WinSetWindowPos(GetHwnd(), HWND_BOTTOM
, 0, 0, 0, 0, SWP_ZORDER 
| SWP_DEACTIVATE
); 
 582 } // end of wxWindowOS2::Lower 
 584 void wxWindowOS2::SetTitle( 
 585   const wxString
&                   rTitle
 
 588     ::WinSetWindowText(GetHwnd(), rTitle
.c_str()); 
 589 } // end of wxWindowOS2::SetTitle 
 591 wxString 
wxWindowOS2::GetTitle() const 
 593     return wxGetWindowText(GetHWND()); 
 594 } // end of wxWindowOS2::GetTitle 
 596 void wxWindowOS2::DoCaptureMouse() 
 598     HWND                            hWnd 
= GetHwnd(); 
 600     if (hWnd 
&& !m_bWinCaptured
) 
 602         ::WinSetCapture(HWND_DESKTOP
, hWnd
); 
 603         m_bWinCaptured 
= TRUE
; 
 605 } // end of wxWindowOS2::GetTitle 
 607 void wxWindowOS2::DoReleaseMouse() 
 611         ::WinSetCapture(HWND_DESKTOP
, NULLHANDLE
); 
 612         m_bWinCaptured 
= FALSE
; 
 614 } // end of wxWindowOS2::ReleaseMouse 
 616 /* static */ wxWindow
* wxWindowBase::GetCapture() 
 618     HWND hwnd 
= ::WinQueryCapture(HWND_DESKTOP
); 
 619     return hwnd 
? wxFindWinFromHandle((WXHWND
)hwnd
) : (wxWindow 
*)NULL
; 
 620 } // end of wxWindowBase::GetCapture 
 622 bool wxWindowOS2::SetFont( 
 626     if (!wxWindowBase::SetFont(rFont
)) 
 632     HWND                            hWnd 
= GetHwnd(); 
 638 } // end of wxWindowOS2::SetFont 
 640 bool wxWindowOS2::SetCursor( 
 641   const wxCursor
&                   rCursor
 
 642 ) // check if base implementation is OK 
 644     if ( !wxWindowBase::SetCursor(rCursor
)) 
 650     if ( m_cursor
.Ok() ) { 
 651         HWND                            hWnd 
= GetHwnd(); 
 655         ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
 656         ::WinQueryWindowRect(hWnd
, &vRect
); 
 658         if (::WinPtInRect(vHabmain
, &vRect
, &vPoint
) && !wxIsBusy()) 
 660             ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)m_cursor
.GetHCURSOR()); 
 664 } // end of wxWindowOS2::SetCursor 
 666 void wxWindowOS2::WarpPointer( 
 675     ::WinQueryWindowRect(GetHwnd(), &vRect
); 
 679     ::WinSetPointerPos(HWND_DESKTOP
, (LONG
)nX
, (LONG
)(nY
)); 
 680 } // end of wxWindowOS2::WarpPointer 
 683 // --------------------------------------------------------------------------- 
 685 // --------------------------------------------------------------------------- 
 687 int  wxWindowOS2::GetScrollPos( 
 691     if (nOrient 
== wxHORIZONTAL
) 
 692         return((int)::WinSendMsg(m_hWndScrollBarHorz
, SBM_QUERYPOS
, (MPARAM
)NULL
, (MPARAM
)NULL
)); 
 694         return((int)::WinSendMsg(m_hWndScrollBarVert
, SBM_QUERYPOS
, (MPARAM
)NULL
, (MPARAM
)NULL
)); 
 695 } // end of wxWindowOS2::GetScrollPos 
 697 int wxWindowOS2::GetScrollRange( 
 703     if (nOrient 
== wxHORIZONTAL
) 
 704         mr 
= ::WinSendMsg(m_hWndScrollBarHorz
, SBM_QUERYRANGE
, (MPARAM
)NULL
, (MPARAM
)NULL
); 
 706         mr 
= ::WinSendMsg(m_hWndScrollBarVert
, SBM_QUERYRANGE
, (MPARAM
)NULL
, (MPARAM
)NULL
); 
 707     return((int)SHORT2FROMMR(mr
)); 
 708 } // end of wxWindowOS2::GetScrollRange 
 710 int wxWindowOS2::GetScrollThumb( 
 714     if (nOrient 
== wxHORIZONTAL 
) 
 715         return m_nXThumbSize
; 
 717         return m_nYThumbSize
; 
 718 } // end of wxWindowOS2::GetScrollThumb 
 720 void wxWindowOS2::SetScrollPos( 
 723 , bool                              WXUNUSED(bRefresh
) 
 726     if (nOrient 
== wxHORIZONTAL 
) 
 727         ::WinSendMsg(m_hWndScrollBarHorz
, SBM_SETPOS
, (MPARAM
)nPos
, (MPARAM
)NULL
); 
 729         ::WinSendMsg(m_hWndScrollBarVert
, SBM_SETPOS
, (MPARAM
)nPos
, (MPARAM
)NULL
); 
 730 } // end of wxWindowOS2::SetScrollPos 
 732 void wxWindowOS2::SetScrollbar( 
 737 , bool                              WXUNUSED(bRefresh
) 
 740     HWND                            hWnd 
= GetHwnd(); 
 741     int                             nOldRange 
= nRange 
- nThumbVisible
; 
 742     int                             nRange1 
= nOldRange
; 
 743     int                             nPageSize 
= nThumbVisible
; 
 746     ULONG                           ulStyle 
= WS_VISIBLE 
| WS_SYNCPAINT
; 
 751     wxWindow
*                       pParent 
= GetParent(); 
 753     if (pParent 
&& pParent
->IsKindOf(CLASSINFO(wxFrame
))) 
 757         pFrame 
= wxDynamicCast(pParent
, wxFrame
); 
 758         hWndParent 
= pFrame
->GetFrame(); 
 759         hWndClient 
= GetHwndOf(pParent
); 
 764             hWndParent 
= GetHwndOf(pParent
); 
 766             hWndParent 
= GetHwnd(); 
 767         hWndClient 
= hWndParent
; 
 769     ::WinQueryWindowPos(hWndClient
, &vSwp
); 
 770     ::WinQueryWindowPos(hWnd
, &vSwpOwner
); 
 772     if (nPageSize 
> 1 && nRange 
> 0) 
 774         nRange1 
+= (nPageSize 
- 1); 
 777     vInfo
.cb 
= sizeof(SBCDATA
); 
 779     vInfo
.posLast 
= (SHORT
)nRange1
; 
 780     vInfo
.posThumb 
= nPos
; 
 782     if (nOrient 
== wxHORIZONTAL 
) 
 785         if (m_hWndScrollBarHorz 
== 0L) 
 788             // Since the scrollbars are usually created before the owner is 
 789             // sized either via an OnSize event directly or via sizers or 
 790             // layout constraints, we will initially just use the coords of 
 791             // the parent window (this is usually a frame client window). But 
 792             // the bars themselves, are children of the parent frame (i.e 
 793             // siblings of the frame client.  The owner, however is the actual 
 794             // window being scrolled (or at least the one responsible for 
 795             // handling the scroll events). The owner will be resized later, 
 796             // as it is usually a child of a top level window, and when that 
 797             // is done its scrollbars will be resized and repositioned as well. 
 799             m_hWndScrollBarHorz 
= ::WinCreateWindow( hWndParent
 
 817             // The owner (the scrolled window) is a child of the Frame's 
 818             // client window, usually.  The scrollbars are children of the 
 819             // frame, itself, and thus are positioned relative to the frame's 
 820             // origin, not the frame's client window origin. 
 821             // The starting x position is the same as the starting x position 
 822             // of the owner, but in terms of the parent frame. 
 823             // The starting y position is 20 pels below the origin of the 
 824             // owner in terms of the parent frame. 
 825             // The horz bar is the same width as the owner and 20 pels high. 
 827             if (nRange1 
>= nThumbVisible
) 
 829                 ::WinSetWindowPos( m_hWndScrollBarHorz
 
 831                                   ,vSwp
.x 
+ vSwpOwner
.x
 
 832                                   ,(vSwp
.y 
+ vSwpOwner
.y
) - 20 
 835                                   ,SWP_MOVE 
| SWP_SIZE 
| SWP_SHOW 
| SWP_ACTIVATE 
| SWP_ZORDER
 
 837                 ::WinSendMsg( m_hWndScrollBarHorz
 
 840                              ,MPFROM2SHORT(0, (SHORT
)nRange1
) 
 842                 ::WinSendMsg( m_hWndScrollBarHorz
 
 844                              ,MPFROM2SHORT( (SHORT
)nThumbVisible
 
 851                 ::WinShowWindow(m_hWndScrollBarHorz
, FALSE
); 
 857         if (m_hWndScrollBarVert 
== 0L) 
 860             // Since the scrollbars are usually created before the owner is 
 861             // sized either via an OnSize event directly or via sizers or 
 862             // layout constraints, we will initially just use the coords of 
 863             // the parent window (this is usually a frame client window). But 
 864             // the bars themselves, are children of the parent frame (i.e 
 865             // siblings of the frame client.  The owner, however is the actual 
 866             // window being scrolled (or at least the one responsible for 
 867             // handling the scroll events). The owner will be resized later, 
 868             // as it is usually a child of a top level window, and when that 
 869             // is done its scrollbars will be resized and repositioned as well. 
 871             m_hWndScrollBarVert 
= ::WinCreateWindow( hWndParent
 
 875                                                     ,vSwp
.x 
+ vSwp
.cx 
- 20 
 889             // The owner (the scrolled window) is a child of the Frame's 
 890             // client window, usually.  The scrollbars are children of the 
 891             // frame, itself and thus are positioned relative to the frame's 
 892             // origin, not the frame's client window's origin. 
 893             // Thus, the x position will be frame client's x (usually a few 
 894             // pels inside the parent frame, plus the width of the owner. 
 895             // Since we may be using sizers or layout constraints for multiple 
 896             // child scrolled windows, the y position will be the frame client's 
 897             // y pos plus the scrolled windows y position, yielding the y 
 898             // position of the scrollbar relative to the parent frame (the vert 
 899             // scrollbar is on the right and starts at the bottom of the 
 901             // It is 20 pels wide and the same height as the owner. 
 903             if (nRange1 
>= nThumbVisible
) 
 905                 ::WinSetWindowPos( m_hWndScrollBarVert
 
 907                                   ,vSwp
.x 
+ vSwpOwner
.x 
+ vSwpOwner
.cx
 
 908                                   ,vSwp
.y 
+ vSwpOwner
.y
 
 911                                   ,SWP_ACTIVATE 
| SWP_MOVE 
| SWP_SIZE 
| SWP_SHOW
 
 913                 ::WinSendMsg( m_hWndScrollBarVert
 
 916                              ,MPFROM2SHORT(0, (SHORT
)nRange1
) 
 918                 ::WinSendMsg( m_hWndScrollBarVert
 
 920                              ,MPFROM2SHORT( (SHORT
)nThumbVisible
 
 927                 ::WinShowWindow(m_hWndScrollBarVert
, FALSE
); 
 929         m_nYThumbSize 
= nThumbVisible
; 
 931 } // end of wxWindowOS2::SetScrollbar 
 933 void wxWindowOS2::ScrollWindow( 
 936 , const wxRect
*                     pRect
 
 943         vRect
.xLeft   
= pRect
->x
; 
 944         vRect
.yTop    
= pRect
->y 
+ pRect
->height
; 
 945         vRect
.xRight  
= pRect
->x 
+ pRect
->width
; 
 946         vRect
.yBottom 
= pRect
->y
; 
 950         ::WinQueryWindowRect(GetHwnd(), &vRect
); 
 952     nDy 
*= -1; // flip the sign of Dy as OS/2 is opposite Windows. 
 953     ::WinScrollWindow( GetHwnd() 
 960                       ,SW_SCROLLCHILDREN 
| SW_INVALIDATERGN
 
 963 } // end of wxWindowOS2::ScrollWindow 
 965 // --------------------------------------------------------------------------- 
 967 // --------------------------------------------------------------------------- 
 969 void wxWindowOS2::SubclassWin( 
 973     HWND                            hwnd 
= (HWND
)hWnd
; 
 975     wxCHECK_RET(::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in SubclassWin") ); 
 976     wxAssociateWinWithHandle( hWnd
 
 979     if (!wxCheckWindowWndProc( hWnd
 
 980                               ,(WXFARPROC
)wxWndProc
 
 983         m_fnOldWndProc 
= (WXFARPROC
) ::WinSubclassWindow(hwnd
, (PFNWP
)wxWndProc
); 
 987         m_fnOldWndProc 
= (WXFARPROC
)NULL
; 
 989 } // end of wxWindowOS2::SubclassWin 
 991 void wxWindowOS2::UnsubclassWin() 
 994     // Restore old Window proc 
 996     HWND                            hwnd 
= GetHWND(); 
1000         wxCHECK_RET( ::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in UnsubclassWin") ); 
1002         PFNWP                       fnProc 
= (PFNWP
)::WinQueryWindowPtr(hwnd
, QWP_PFNWP
); 
1004         if ( (m_fnOldWndProc 
!= 0) && (fnProc 
!= (PFNWP
) m_fnOldWndProc
)) 
1006             WinSubclassWindow(hwnd
, (PFNWP
)m_fnOldWndProc
); 
1010 } // end of wxWindowOS2::UnsubclassWin 
1012 bool wxCheckWindowWndProc( 
1014 , WXFARPROC                         fnWndProc
 
1017     static char                     zBuffer
[512]; 
1020     ::WinQueryClassName((HWND
)hWnd
, (LONG
)512, (PCH
)zBuffer
); 
1021     ::WinQueryClassInfo(wxGetInstance(), (PSZ
)zBuffer
, &vCls
); 
1022     return(fnWndProc 
== (WXFARPROC
)vCls
.pfnWindowProc
); 
1023 } // end of WinGuiBase_CheckWindowWndProc 
1025 void wxWindowOS2::SetWindowStyleFlag( 
1029     long                            lFlagsOld 
= GetWindowStyleFlag(); 
1031     if (lFlags 
== lFlagsOld
) 
1035     // Update the internal variable 
1037     wxWindowBase::SetWindowStyleFlag(lFlags
); 
1040     // Now update the Windows style as well if needed - and if the window had 
1041     // been already created 
1047     WXDWORD                         dwExstyleOld
; 
1048     long                            lStyle 
= OS2GetStyle( lFlags
 
1051     long                            lStyleOld 
= OS2GetStyle( lFlagsOld
 
1055     if (lStyle 
!= lStyleOld
) 
1058         // Some flags (e.g. WS_VISIBLE or WS_DISABLED) should not be changed by 
1059         // this function so instead of simply setting the style to the new 
1060         // value we clear the bits which were set in styleOld but are set in 
1061         // the new one and set the ones which were not set before 
1063         long                        lStyleReal 
= ::WinQueryWindowULong(GetHwnd(), QWL_STYLE
); 
1065         lStyleReal 
&= ~lStyleOld
; 
1066         lStyleReal 
|= lStyle
; 
1068         ::WinSetWindowULong(GetHwnd(), QWL_STYLE
, lStyleReal
); 
1070 } // end of wxWindowOS2::SetWindowStyleFlag 
1072 WXDWORD 
wxWindowOS2::OS2GetStyle( 
1074 , WXDWORD
*                          pdwExstyle
 
1077     WXDWORD                         dwStyle 
= 0L; 
1079     if (lFlags 
& wxCLIP_CHILDREN 
) 
1080         dwStyle 
|= WS_CLIPCHILDREN
; 
1082     if (lFlags 
& wxCLIP_SIBLINGS 
) 
1083         dwStyle 
|= WS_CLIPSIBLINGS
; 
1086 } // end of wxWindowMSW::MSWGetStyle 
1089 // Make a Windows extended style from the given wxWidgets window style 
1091 WXDWORD 
wxWindowOS2::MakeExtendedStyle( 
1093 , bool                              bEliminateBorders
 
1097    // Simply fill out with wxWindow extended styles.  We'll conjure 
1098    // something up in OS2Create and all window redrawing pieces later 
1100     WXDWORD                         dwStyle 
= 0; 
1102     if (lStyle 
& wxTRANSPARENT_WINDOW 
) 
1103         dwStyle 
|= wxTRANSPARENT_WINDOW
; 
1105     if (!bEliminateBorders
) 
1107         if (lStyle 
& wxSUNKEN_BORDER
) 
1108             dwStyle 
|= wxSUNKEN_BORDER
; 
1109         if (lStyle 
& wxDOUBLE_BORDER
) 
1110             dwStyle 
|= wxDOUBLE_BORDER
; 
1111         if (lStyle 
& wxRAISED_BORDER 
) 
1112             dwStyle 
|= wxRAISED_BORDER
; 
1113         if (lStyle 
& wxSTATIC_BORDER
) 
1114             dwStyle 
|= wxSTATIC_BORDER
; 
1117 } // end of wxWindowOS2::MakeExtendedStyle 
1120 // Setup background and foreground colours correctly 
1122 void wxWindowOS2::SetupColours() 
1125         SetBackgroundColour(GetParent()->GetBackgroundColour()); 
1126 } // end of wxWindowOS2::SetupColours 
1128 void wxWindowOS2::OnIdle( 
1129   wxIdleEvent
&                      WXUNUSED(rEvent
) 
1133     // Check if we need to send a LEAVE event 
1135     if (m_bMouseInWindow
) 
1139         ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
1140         if (::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, FALSE
) != (HWND
)GetHwnd()) 
1143             // Generate a LEAVE event 
1145             m_bMouseInWindow 
= FALSE
; 
1148             // Unfortunately the mouse button and keyboard state may have changed 
1149             // by the time the OnIdle function is called, so 'state' may be 
1159             wxMouseEvent            
rEvent(wxEVT_LEAVE_WINDOW
); 
1161             InitMouseEvent( rEvent
 
1166             (void)GetEventHandler()->ProcessEvent(rEvent
); 
1169     if (wxUpdateUIEvent::CanUpdate(this)) 
1170         UpdateWindowUI(wxUPDATE_UI_FROMIDLE
); 
1171 } // end of wxWindowOS2::OnIdle 
1174 // Set this window to be the child of 'parent'. 
1176 bool wxWindowOS2::Reparent( 
1180     if (!wxWindowBase::Reparent(pParent
)) 
1183     HWND                            hWndChild 
= GetHwnd(); 
1184     HWND                            hWndParent 
= GetParent() ? GetWinHwnd(GetParent()) : (HWND
)0; 
1186     ::WinSetParent(hWndChild
, hWndParent
, TRUE
); 
1188 } // end of wxWindowOS2::Reparent 
1190 void wxWindowOS2::Update() 
1192     ::WinUpdateWindow(GetHwnd()); 
1193 } // end of wxWindowOS2::Update 
1195 void wxWindowOS2::Freeze() 
1197    ::WinSendMsg(GetHwnd(), WM_VRNDISABLED
, (MPARAM
)0, (MPARAM
)0); 
1198 } // end of wxWindowOS2::Freeze 
1200 void wxWindowOS2::Thaw() 
1202    ::WinSendMsg(GetHwnd(), WM_VRNENABLED
, (MPARAM
)TRUE
, (MPARAM
)0); 
1205     // We need to refresh everything or otherwise he invalidated area is not 
1209 } // end of wxWindowOS2::Thaw 
1211 void wxWindowOS2::Refresh( 
1213 , const wxRect
*                     pRect
 
1216     HWND                            hWnd 
= GetHwnd(); 
1224             vOs2Rect
.xLeft   
= pRect
->x
; 
1225             vOs2Rect
.yBottom 
= pRect
->y
; 
1226             vOs2Rect
.xRight  
= pRect
->x 
+ pRect
->width
; 
1227             vOs2Rect
.yTop    
= pRect
->y 
+ pRect
->height
; 
1229             ::WinInvalidateRect(hWnd
, &vOs2Rect
, bEraseBack
); 
1232             ::WinInvalidateRect(hWnd
, NULL
, bEraseBack
); 
1233         if (m_hWndScrollBarHorz 
!= NULLHANDLE
) 
1234             ::WinInvalidateRect(m_hWndScrollBarHorz
, NULL
, TRUE
); 
1235         if (m_hWndScrollBarVert 
!= NULLHANDLE
) 
1236             ::WinInvalidateRect(m_hWndScrollBarVert
, NULL
, TRUE
); 
1238 } // end of wxWindowOS2::Refresh 
1240 // --------------------------------------------------------------------------- 
1242 // --------------------------------------------------------------------------- 
1244 #if wxUSE_DRAG_AND_DROP 
1245 void wxWindowOS2::SetDropTarget( 
1246   wxDropTarget
*                     pDropTarget
 
1249     m_dropTarget 
= pDropTarget
; 
1250 } // end of wxWindowOS2::SetDropTarget 
1254 // old style file-manager drag&drop support: we retain the old-style 
1255 // DragAcceptFiles in parallel with SetDropTarget. 
1257 void wxWindowOS2::DragAcceptFiles( 
1261     HWND                            hWnd 
= GetHwnd(); 
1263     if (hWnd 
&& bAccept
) 
1264         ::DrgAcceptDroppedFiles(hWnd
, NULL
, NULL
, DO_COPY
, 0L); 
1265 } // end of wxWindowOS2::DragAcceptFiles 
1267 // ---------------------------------------------------------------------------- 
1269 // ---------------------------------------------------------------------------- 
1273 void wxWindowOS2::DoSetToolTip( 
1277     wxWindowBase::DoSetToolTip(pTooltip
); 
1280         m_tooltip
->SetWindow(this); 
1281 } // end of wxWindowOS2::DoSetToolTip 
1283 #endif // wxUSE_TOOLTIPS 
1285 // --------------------------------------------------------------------------- 
1286 // moving and resizing 
1287 // --------------------------------------------------------------------------- 
1290 void wxWindowOS2::DoGetSize( 
1298     if (IsKindOf(CLASSINFO(wxFrame
))) 
1300         wxFrame
*                    pFrame 
= wxDynamicCast(this, wxFrame
); 
1301         hWnd 
= pFrame
->GetFrame(); 
1306     ::WinQueryWindowRect(hWnd
, &vRect
); 
1309         *pWidth 
= vRect
.xRight 
- vRect
.xLeft
; 
1311         // OS/2 PM is backwards from windows 
1312         *pHeight 
= vRect
.yTop 
- vRect
.yBottom
; 
1313 } // end of wxWindowOS2::DoGetSize 
1315 void wxWindowOS2::DoGetPosition( 
1320     HWND                            hWnd 
= GetHwnd(); 
1323     wxWindow
*                       pParent 
= GetParent(); 
1326     // It would seem that WinQueryWindowRect would be the correlary to 
1327     // the WIN32 WinGetRect, but unlike WinGetRect which returns the window 
1328     // origin position in screen coordinates, WinQueryWindowRect returns it 
1329     // relative to itself, i.e. (0,0).  To get the same under PM we must 
1330     // us WinQueryWindowPos.  This call, unlike the WIN32 call, however, 
1331     // returns a position relative to it's parent, so no parent adujstments 
1332     // are needed under OS/2.  Also, windows should be created using 
1333     // wxWindow coordinates, i.e 0,0 is the TOP left so vSwp will already 
1336     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1342     // We may be faking the client origin. So a window that's really at (0, 
1343     // 30) may appear (to wxWin apps) to be at (0, 0). 
1347         wxPoint                     
vPt(pParent
->GetClientAreaOrigin()); 
1357 } // end of wxWindowOS2::DoGetPosition 
1359 void wxWindowOS2::DoScreenToClient( 
1364     HWND                            hWnd 
= GetHwnd(); 
1367     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1373 } // end of wxWindowOS2::DoScreenToClient 
1375 void wxWindowOS2::DoClientToScreen( 
1380     HWND                            hWnd 
= GetHwnd(); 
1383     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1389 } // end of wxWindowOS2::DoClientToScreen 
1392 // Get size *available for subwindows* i.e. excluding menu bar etc. 
1393 // Must be a frame type window 
1395 void wxWindowOS2::DoGetClientSize( 
1400     HWND                            hWnd 
= GetHwnd(); 
1403    ::WinQueryWindowRect(hWnd
, &vRect
); 
1404     if (IsKindOf(CLASSINFO(wxDialog
))) 
1409         // For a Dialog we have to explicitly request the client portion. 
1410         // For a Frame the hWnd IS the client window 
1412         hWndTitle 
= ::WinWindowFromID(hWnd
, FID_TITLEBAR
); 
1413         if (::WinQueryWindowRect(hWndTitle
, &vTitle
)) 
1415             if (vTitle
.yTop 
- vTitle
.yBottom 
== 0) 
1418                 // Dialog has not been created yet, use a default 
1422             vRect
.yTop 
-= (vTitle
.yTop 
- vTitle
.yBottom
); 
1425         ULONG                       uStyle 
= ::WinQueryWindowULong(hWnd
, QWL_STYLE
); 
1428         // Deal with borders 
1430         if (uStyle 
& FCF_DLGBORDER
) 
1437         else if (uStyle 
& FCF_SIZEBORDER
) 
1444         else if (uStyle 
& FCF_BORDER
) 
1451         else // make some kind of adjustment or top sizers ram into the titlebar! 
1460         *pWidth  
= vRect
.xRight 
- vRect
.xLeft
; 
1462         *pHeight 
= vRect
.yTop 
- vRect
.yBottom
; 
1463 } // end of wxWindowOS2::DoGetClientSize 
1465 void wxWindowOS2::DoMoveWindow( 
1473     wxWindow
*                       pParent 
= GetParent(); 
1475     if (pParent 
&& !IsKindOf(CLASSINFO(wxDialog
))) 
1477         int                         nOS2Height 
= GetOS2ParentHeight(pParent
); 
1479         nY 
= nOS2Height 
- (nY 
+ nHeight
); 
1485         ::WinQueryWindowRect(HWND_DESKTOP
, &vRect
); 
1486         nY 
= vRect
.yTop 
- (nY 
+ nHeight
); 
1490     // In the case of a frame whose client is sized, the client cannot be 
1491     // large than its parent frame minus its borders! This usually happens 
1492     // when using an autosizer to size a frame to precisely hold client 
1493     // controls as in the notebook sample. 
1495     // In this case, we may need to resize both a frame and its client so we 
1496     // need a quick calc of the frame border size, then if the frame 
1497     // (less its borders) is smaller than the client, size the frame to 
1498     // encompass the client with the appropriate border size. 
1500     if (IsKindOf(CLASSINFO(wxFrame
))) 
1504         int                         nWidthFrameDelta 
= 0; 
1505         int                         nHeightFrameDelta 
= 0; 
1506         int                         nHeightFrame 
= 0; 
1507         int                         nWidthFrame 
= 0; 
1510         pFrame 
= wxDynamicCast(this, wxFrame
); 
1511         hWndFrame 
= pFrame
->GetFrame(); 
1512         ::WinQueryWindowRect(hWndFrame
, &vRect
); 
1513         ::WinMapWindowPoints(hWndFrame
, HWND_DESKTOP
, (PPOINTL
)&vRect
, 2); 
1515         ::WinCalcFrameRect(hWndFrame
, &vRect
, TRUE
); 
1516         nWidthFrameDelta 
= ((vRect
.xLeft 
- vFRect
.xLeft
) + (vFRect
.xRight 
- vRect
.xRight
)); 
1517         nHeightFrameDelta 
= ((vRect
.yBottom 
- vFRect
.yBottom
) + (vFRect
.yTop 
- vRect
.yTop
)); 
1518         nWidthFrame 
= vFRect
.xRight 
- vFRect
.xLeft
; 
1519         nHeightFrame 
= vFRect
.yTop 
- vFRect
.yBottom
; 
1521         if (nWidth 
== vFRect
.xRight 
- vFRect
.xLeft 
&& 
1522             nHeight 
== vFRect
.yTop 
- vFRect
.yBottom
) 
1525             // In this case the caller is not aware of OS/2's need to size both 
1526             // the frame and it's client and is really only moving the window, 
1527             // not resizeing it.  So move the frame, and back off the sizes 
1528             // for a proper client fit. 
1530             ::WinSetWindowPos( hWndFrame
 
1532                               ,(LONG
)nX 
- (vRect
.xLeft 
- vFRect
.xLeft
) 
1533                               ,(LONG
)nY 
- (vRect
.yBottom 
- vFRect
.yBottom
) 
1538             nX 
+= (vRect
.xLeft 
- vFRect
.xLeft
); 
1539             nY 
+= (vRect
.yBottom 
- vFRect
.yBottom
); 
1540             nWidth 
-= nWidthFrameDelta
; 
1541             nHeight 
-= nHeightFrameDelta
; 
1545             if (nWidth 
> nWidthFrame 
- nHeightFrameDelta 
|| 
1546                 nHeight 
> nHeightFrame 
- nHeightFrameDelta
) 
1548                 ::WinSetWindowPos( hWndFrame
 
1550                                   ,(LONG
)nX 
- (vRect
.xLeft 
- vFRect
.xLeft
) 
1551                                   ,(LONG
)nY 
- (vRect
.yBottom 
- vFRect
.yBottom
) 
1552                                   ,(LONG
)nWidth 
+ nWidthFrameDelta
 
1553                                   ,(LONG
)nHeight 
+ nHeightFrameDelta
 
1554                                   ,SWP_MOVE 
| SWP_SIZE
 
1560     ::WinSetWindowPos( GetHwnd() 
1566                       ,SWP_SIZE 
| SWP_MOVE
 
1568     if (m_vWinSwp
.cx 
== 0 && m_vWinSwp
.cy 
== 0 && m_vWinSwp
.fl 
== 0) 
1572         ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp
); 
1575         int                         nYDiff 
= m_vWinSwp
.cy 
- nHeight
; 
1578         // Handle resizing of scrolled windows.  The target or window to 
1579         // be scrolled is the owner (gets the scroll notificaitons).  The 
1580         // parent is usually the parent frame of the scrolled panel window. 
1581         // In order to show the scrollbars the target window will be shrunk 
1582         // by the size of the scroll bar widths (20) and moved in the X and Y 
1583         // directon.  That value will be computed as part of the diff for 
1584         // moving the children.  Everytime the window is sized the 
1585         // toplevel OnSize is going to resize the panel to fit the client 
1586         // or the whole sizer and will need to me resized. This will send 
1587         // a WM_SIZE out which will be intercepted by the ScrollHelper 
1588         // which will cause the scrollbars to be displayed via the SetScrollbar 
1591         if ( IsKindOf(CLASSINFO(wxGenericScrolledWindow
)) || 
1592              IsKindOf(CLASSINFO(wxScrolledWindow
)) 
1595             int                     nAdjustWidth  
= 0; 
1596             int                     nAdjustHeight 
= 0; 
1599             if (GetScrollBarHorz() == NULLHANDLE 
|| 
1600                 !WinIsWindowShowing(GetScrollBarHorz())) 
1603                 nAdjustHeight 
= 20L; 
1604             if (GetScrollBarVert() == NULLHANDLE 
|| 
1605                 !WinIsWindowShowing(GetScrollBarVert())) 
1609             ::WinQueryWindowPos(GetHWND(), &vSwpScroll
); 
1610             ::WinSetWindowPos( GetHWND() 
1613                               ,vSwpScroll
.y 
+ nAdjustHeight
 
1614                               ,vSwpScroll
.cx 
- nAdjustWidth
 
1615                               ,vSwpScroll
.cy 
- nAdjustHeight
 
1616                               ,SWP_MOVE 
| SWP_SIZE
 
1618             nYDiff 
+= nAdjustHeight
; 
1620         MoveChildren(nYDiff
); 
1621         ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp
); 
1623 } // end of wxWindowOS2::DoMoveWindow 
1626 // Set the size of the window: if the dimensions are positive, just use them, 
1627 // but if any of them is equal to -1, it means that we must find the value for 
1628 // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in 
1629 // which case -1 is a valid value for x and y) 
1631 // If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate 
1632 // the width/height to best suit our contents, otherwise we reuse the current 
1635 void wxWindowOS2::DoSetSize( 
1644     // Get the current size and position... 
1650     wxSize                          
vSize(-1, -1); 
1652     GetPosition(&nCurrentX
, &nCurrentY
); 
1653     GetSize(&nCurrentWidth
, &nCurrentHeight
); 
1656     // ... and don't do anything (avoiding flicker) if it's already ok 
1659     // Must convert Y coords to test for equality under OS/2 
1663     if (nX 
== nCurrentX 
&& nY2 
== nCurrentY 
&& 
1664         nWidth 
== nCurrentWidth 
&& nHeight 
== nCurrentHeight
) 
1669     if (nX 
== -1 && !(nSizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
)) 
1671     if (nY 
== -1 && !(nSizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
)) 
1674     AdjustForParentClientOrigin(nX
, nY
, nSizeFlags
); 
1678         if (nSizeFlags 
& wxSIZE_AUTO_WIDTH
) 
1680             vSize  
= DoGetBestSize(); 
1686             // Just take the current one 
1688             nWidth 
= nCurrentWidth
; 
1694         if (nSizeFlags 
& wxSIZE_AUTO_HEIGHT
) 
1698                 vSize 
= DoGetBestSize(); 
1704             // just take the current one 
1705             nHeight 
= nCurrentHeight
; 
1714 } // end of wxWindowOS2::DoSetSize 
1716 void wxWindowOS2::DoSetClientSize( 
1724     wxWindow
*                       pParent 
= (wxWindow
*)GetParent(); 
1725     HWND                            hParentWnd 
= (HWND
)0; 
1728         hParentWnd 
= (HWND
)pParent
->GetHWND(); 
1730     if (IsKindOf(CLASSINFO(wxFrame
))) 
1732         wxFrame
*                    pFrame 
= wxDynamicCast(this, wxFrame
); 
1733         HWND                        hFrame 
= pFrame
->GetFrame(); 
1738         ::WinQueryWindowRect(GetHwnd(), &vRect2
); 
1739         ::WinQueryWindowRect(hFrame
, &vRect
); 
1740         ::WinQueryWindowRect(hParentWnd
, &vRect3
); 
1741         nActualWidth 
= vRect2
.xRight 
- vRect2
.xLeft 
- vRect
.xRight 
+ nWidth
; 
1742         nActualHeight 
= vRect2
.yTop 
- vRect2
.yBottom 
- vRect
.yTop 
+ nHeight
; 
1744         vPoint
.x 
= vRect2
.xLeft
; 
1745         vPoint
.y 
= vRect2
.yBottom
; 
1748             vPoint
.x 
-= vRect3
.xLeft
; 
1749             vPoint
.y 
-= vRect3
.yBottom
; 
1757         GetPosition(&nX
, &nY
); 
1758         nActualWidth  
= nWidth
; 
1759         nActualHeight 
= nHeight
; 
1764     DoMoveWindow( vPoint
.x
 
1770     wxSizeEvent                     
vEvent( wxSize( nWidth
 
1776     vEvent
.SetEventObject(this); 
1777     GetEventHandler()->ProcessEvent(vEvent
); 
1778 } // end of wxWindowOS2::DoSetClientSize 
1780 wxPoint 
wxWindowOS2::GetClientAreaOrigin() const 
1782     return wxPoint(0, 0); 
1783 } // end of wxWindowOS2::GetClientAreaOrigin 
1785 // --------------------------------------------------------------------------- 
1787 // --------------------------------------------------------------------------- 
1789 int wxWindowOS2::GetCharHeight() const 
1792     FONTMETRICS                     vFontMetrics
; 
1794     hPs 
= ::WinGetPS(GetHwnd()); 
1796     if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
)) 
1798         ::WinReleasePS(hPs
); 
1801     ::WinReleasePS(hPs
); 
1802     return(vFontMetrics
.lMaxAscender 
+ vFontMetrics
.lMaxDescender
); 
1803 } // end of wxWindowOS2::GetCharHeight 
1805 int wxWindowOS2::GetCharWidth() const 
1808     FONTMETRICS                     vFontMetrics
; 
1810     hPs 
= ::WinGetPS(GetHwnd()); 
1812     if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
)) 
1814         ::WinReleasePS(hPs
); 
1817     ::WinReleasePS(hPs
); 
1818     return(vFontMetrics
.lAveCharWidth
); 
1819 } // end of wxWindowOS2::GetCharWidth 
1821 void wxWindowOS2::GetTextExtent( 
1822   const wxString
&                   rString
 
1826 , int*                              pExternalLeading
 
1827 , const wxFont
*                     pTheFont
 
1830     POINTL                          avPoint
[TXTBOX_COUNT
]; 
1835     FONTMETRICS                     vFM
; // metrics structure 
1841     hPS 
= ::WinGetPS(GetHwnd()); 
1843     l 
= rString
.Length(); 
1846         pStr 
= (PCH
)rString
.c_str(); 
1849         // In world coordinates. 
1851         bRc 
= ::GpiQueryTextBox( hPS
 
1854                                 ,TXTBOX_COUNT 
// return maximum information 
1855                                 ,avPoint      
// array of coordinates points 
1859             vPtMin
.x 
= avPoint
[0].x
; 
1860             vPtMax
.x 
= avPoint
[0].x
; 
1861             vPtMin
.y 
= avPoint
[0].y
; 
1862             vPtMax
.y 
= avPoint
[0].y
; 
1863             for (i 
= 1; i 
< 4; i
++) 
1865                 if(vPtMin
.x 
> avPoint
[i
].x
) vPtMin
.x 
= avPoint
[i
].x
; 
1866                 if(vPtMin
.y 
> avPoint
[i
].y
) vPtMin
.y 
= avPoint
[i
].y
; 
1867                 if(vPtMax
.x 
< avPoint
[i
].x
) vPtMax
.x 
= avPoint
[i
].x
; 
1868                 if(vPtMax
.y 
< avPoint
[i
].y
) vPtMax
.y 
= avPoint
[i
].y
; 
1870             bRc 
= ::GpiQueryFontMetrics( hPS
 
1871                                         ,sizeof(FONTMETRICS
) 
1898         *pX 
= (vPtMax
.x 
- vPtMin
.x 
+ 1); 
1900         *pY 
= (vPtMax
.y 
- vPtMin
.y 
+ 1); 
1904             *pDescent 
= vFM
.lMaxDescender
; 
1908     if (pExternalLeading
) 
1911             *pExternalLeading 
= vFM
.lExternalLeading
; 
1913             *pExternalLeading 
= 0; 
1915     ::WinReleasePS(hPS
); 
1916 } // end of wxWindow::GetTextExtent 
1918 bool wxWindowOS2::IsMouseInWindow() const 
1921     // Get the mouse position 
1924     ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
); 
1927     // Find the window which currently has the cursor and go up the window 
1928     // chain until we find this window - or exhaust it 
1930     HWND                            hWnd 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt
, TRUE
); 
1932     while (hWnd 
&& (hWnd 
!= GetHwnd())) 
1933         hWnd 
= ::WinQueryWindow(hWnd
, QW_PARENT
); 
1935     return hWnd 
!= NULL
; 
1936 } // end of wxWindowOS2::IsMouseInWindow 
1939 // --------------------------------------------------------------------------- 
1941 // --------------------------------------------------------------------------- 
1943 #if wxUSE_MENUS_NATIVE 
1944 bool wxWindowOS2::DoPopupMenu( 
1950     HWND                            hWndOwner 
= GetHwnd(); 
1951     HWND                            hWndParent 
= GetHwnd(); 
1952     HWND                            hMenu 
= GetHmenuOf(pMenu
); 
1953     bool                            bIsWaiting 
= TRUE
; 
1955     pMenu
->SetInvokingWindow(this); 
1958     if ( x 
== -1 && y 
== -1 ) 
1960         wxPoint mouse 
= wxGetMousePosition(); 
1961         nX 
= mouse
.x
; nY 
= mouse
.y
; 
1965         DoClientToScreen( &nX
 
1969     wxCurrentPopupMenu 
= pMenu
; 
1971     ::WinPopupMenu( hWndParent
 
1977                    ,PU_HCONSTRAIN 
| PU_VCONSTRAIN 
| PU_MOUSEBUTTON1 
| PU_KEYBOARD
 
1984         if (vMsg
.msg 
== WM_MENUEND 
|| vMsg
.msg 
== WM_COMMAND
) 
1988         ::WinDispatchMsg(vHabmain
, (PQMSG
)&vMsg
); 
1991     wxCurrentPopupMenu 
= NULL
; 
1992     pMenu
->SetInvokingWindow(NULL
); 
1994 } // end of wxWindowOS2::DoPopupMenu 
1995 #endif // wxUSE_MENUS_NATIVE 
1997 // =========================================================================== 
1998 // pre/post message processing 
1999 // =========================================================================== 
2001 MRESULT 
wxWindowOS2::OS2DefWindowProc( 
2008         return (MRESULT
)m_fnOldWndProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
); 
2010         return ::WinDefWindowProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
); 
2011 } // end of wxWindowOS2::OS2DefWindowProc 
2013 bool wxWindowOS2::OS2ProcessMessage( 
2017 // wxUniversal implements tab traversal itself 
2018 #ifndef __WXUNIVERSAL__ 
2019     QMSG
*                           pQMsg 
= (QMSG
*)pMsg
; 
2021     if (m_hWnd 
!= 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL
)) 
2024         // Intercept dialog navigation keys 
2026         bool                        bProcess 
= TRUE
; 
2027         USHORT                      uKeyFlags 
= SHORT1FROMMP(pQMsg
->mp1
); 
2029         if (uKeyFlags 
& KC_KEYUP
) 
2032         if (uKeyFlags 
& KC_ALT
) 
2035         if (!(uKeyFlags 
& KC_VIRTUALKEY
)) 
2040             bool                    bCtrlDown 
= IsCtrlDown(); 
2041             bool                    bShiftDown 
= IsShiftDown(); 
2044             // WM_QUERYDLGCODE: ask the control if it wants the key for itself, 
2045             // don't process it if it's the case (except for Ctrl-Tab/Enter 
2046             // combinations which are always processed) 
2048             ULONG                   ulDlgCode 
= 0; 
2052                 ulDlgCode 
= (ULONG
)::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0); 
2055             bool                    bForward 
= TRUE
; 
2056             bool                    bWindowChange 
= FALSE
; 
2058             switch (SHORT2FROMMP(pQMsg
->mp2
)) 
2061                 // Going to make certain assumptions about specific types of controls 
2062                 // here, so we may have to alter some things later if they prove invalid 
2066                     // Shift tabl will always be a nav-key but tabs may be wanted 
2075                         // Entry Fields want tabs for themselve usually 
2079                             case DLGC_ENTRYFIELD
: 
2089                         // Ctrl-Tab cycles thru notebook pages 
2091                         bWindowChange 
= bCtrlDown
; 
2092                         bForward 
= !bShiftDown
; 
2115                             // ctrl-enter is not processed 
2119                         else if (ulDlgCode 
& DLGC_BUTTON
) 
2122                             // buttons want process Enter themselevs 
2128                             wxButton
*   pBtn 
= wxDynamicCast( GetDefaultItem() 
2132                             if (pBtn 
&& pBtn
->IsEnabled()) 
2135                                 // If we do have a default button, do press it 
2137                                 pBtn
->OS2Command(BN_CLICKED
, 0 /* unused */); 
2140                             else if (!IsTopLevel()) 
2143                                 // if not a top level window, let parent 
2148                             // else: but if it does not it makes sense to make 
2149                             //       it work like a TAB - and that's what we do. 
2150                             //       Note that Ctrl-Enter always works this way. 
2161                 wxNavigationKeyEvent    vEvent
; 
2163                 vEvent
.SetDirection(bForward
); 
2164                 vEvent
.SetWindowChange(bWindowChange
); 
2165                 vEvent
.SetEventObject(this); 
2167                 if (GetEventHandler()->ProcessEvent(vEvent
)) 
2169                     wxButton
*       pBtn 
= wxDynamicCast(FindFocus(), wxButton
); 
2174                         // The button which has focus should be default 
2183         // Let Dialogs process 
2185         if (::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0)); 
2189     pMsg 
= pMsg
; // just shut up the compiler 
2190 #endif // __WXUNIVERSAL__ 
2193 } // end of wxWindowOS2::OS2ProcessMessage 
2195 bool wxWindowOS2::OS2TranslateMessage( 
2199 #if wxUSE_ACCEL && !defined(__WXUNIVERSAL__) 
2200   return m_acceleratorTable
.Translate(m_hWnd
, pMsg
); 
2204 #endif //wxUSE_ACCEL 
2205 } // end of wxWindowOS2::OS2TranslateMessage 
2207 bool wxWindowOS2::OS2ShouldPreProcessMessage( 
2211     // preprocess all messages by default 
2213 } // end of wxWindowOS2::OS2ShouldPreProcessMessage 
2215 // --------------------------------------------------------------------------- 
2216 // message params unpackers 
2217 // --------------------------------------------------------------------------- 
2219 void wxWindowOS2::UnpackCommand( 
2227     *pId 
= LOWORD(wParam
); 
2228     *phWnd 
= NULL
;  // or may be GetHWND() ? 
2229     *pCmd 
= LOWORD(lParam
); 
2230 } // end of wxWindowOS2::UnpackCommand 
2232 void wxWindowOS2::UnpackActivate( 
2239     *pState     
= LOWORD(wParam
); 
2240     *phWnd      
= (WXHWND
)lParam
; 
2241 } // end of wxWindowOS2::UnpackActivate 
2243 void wxWindowOS2::UnpackScroll( 
2254     ulId    
= (ULONG
)LONGFROMMP(wParam
); 
2255     hWnd 
= ::WinWindowFromID(GetHwnd(), ulId
); 
2256     if (hWnd 
== m_hWndScrollBarHorz 
|| hWnd 
== m_hWndScrollBarVert
) 
2257         *phWnd 
= NULLHANDLE
; 
2261     *pPos  
= SHORT1FROMMP(lParam
); 
2262     *pCode 
= SHORT2FROMMP(lParam
); 
2263 } // end of wxWindowOS2::UnpackScroll 
2265 void wxWindowOS2::UnpackMenuSelect( 
2273     *pItem 
= (WXWORD
)LOWORD(wParam
); 
2274     *pFlags 
= HIWORD(wParam
); 
2275     *phMenu 
= (WXHMENU
)lParam
; 
2276 } // end of wxWindowOS2::UnpackMenuSelect 
2278 // --------------------------------------------------------------------------- 
2279 // Main wxWidgets window proc and the window proc for wxWindow 
2280 // --------------------------------------------------------------------------- 
2283 // Hook for new window just as it's being created, when the window isn't yet 
2284 // associated with the handle 
2286 wxWindowOS2
*                         wxWndHook 
= NULL
; 
2291 MRESULT EXPENTRY 
wxWndProc( 
2298     wxWindowOS2
*                    pWnd 
= wxFindWinFromHandle((WXHWND
)hWnd
); 
2301     // When we get the first message for the HWND we just created, we associate 
2302     // it with wxWindow stored in wxWndHook 
2304     if (!pWnd 
&& wxWndHook
) 
2306         wxAssociateWinWithHandle(hWnd
, wxWndHook
); 
2309         pWnd
->SetHWND((WXHWND
)hWnd
); 
2312     MRESULT                         rc 
= (MRESULT
)0; 
2316     // Stop right here if we don't have a valid handle in our wxWindow object. 
2318     if (pWnd 
&& !pWnd
->GetHWND()) 
2320         pWnd
->SetHWND((WXHWND
) hWnd
); 
2321         rc 
= pWnd
->OS2DefWindowProc(ulMsg
, wParam
, lParam 
); 
2328             rc 
= pWnd
->OS2WindowProc(ulMsg
, wParam
, lParam
); 
2329             if ( (pWnd
->GetScrollBarHorz() != NULLHANDLE 
|| 
2330                   pWnd
->GetScrollBarVert() != NULLHANDLE
) && 
2333                 if (pWnd
->GetScrollBarHorz() != NULLHANDLE
) 
2334                     ::WinInvalidateRect(pWnd
->GetScrollBarHorz(), NULL
, TRUE
); 
2335                 if (pWnd
->GetScrollBarVert() != NULLHANDLE
) 
2336                     ::WinInvalidateRect(pWnd
->GetScrollBarVert(), NULL
, TRUE
); 
2340             rc 
= ::WinDefWindowProc(hWnd
, ulMsg
, wParam
, lParam
); 
2344 } // end of wxWndProc 
2347 // We will add (or delete) messages we need to handle at this default 
2350 MRESULT 
wxWindowOS2::OS2WindowProc( 
2357     // Did we process the uMsg? 
2359     bool                            bProcessed 
= FALSE
; 
2363     // For most messages we should return 0 when we do process the message 
2365     mResult 
= (MRESULT
)0; 
2373                 bProcessed 
= HandleCreate( (WXLPCREATESTRUCT
)lParam
 
2379                     // Return 0 to bAllow window creation 
2381                     mResult 
= (MRESULT
)(bMayCreate 
? 0 : -1); 
2392             bProcessed 
= HandleMove( LOWORD(lParam
) 
2398             bProcessed 
= HandleSize( LOWORD(lParam
) 
2404         case WM_WINDOWPOSCHANGED
: 
2407             // Dialogs under OS/2 do not get WM_SIZE events at all. 
2408             // Instead they get this, which can function much like WM_SIZE 
2409             // PSWP contains the new sizes and positioning, PSWP+1 the old 
2410             // We use this because ADJUSTWINDOWPOS comes BEFORE the new 
2411             // position is added and our auto layout does a WinQueryWindowRect 
2412             // to get the CURRENT client size.  That is the size used to position 
2413             // child controls, so we need to already be sized 
2414             // in order to get the child controls positoned properly. 
2416             if (IsKindOf(CLASSINFO(wxDialog
)) || IsKindOf(CLASSINFO(wxFrame
))) 
2418                 PSWP                pSwp 
= (PSWP
)PVOIDFROMMP(wParam
); 
2419                 PSWP                pSwp2 
= pSwp
++; 
2421                 if (!(pSwp
->cx 
== pSwp2
->cx 
&& 
2422                       pSwp
->cy 
== pSwp2
->cy
)) 
2423                     bProcessed 
= HandleSize( pSwp
->cx
 
2427                 if (IsKindOf(CLASSINFO(wxFrame
))) 
2429                     wxFrame
*            pFrame 
= wxDynamicCast(this, wxFrame
); 
2433                         if (pFrame
->GetStatusBar()) 
2434                             pFrame
->PositionStatusBar(); 
2435                         if (pFrame
->GetToolBar()) 
2436                             pFrame
->PositionToolBar(); 
2447                 UnpackActivate( wParam
 
2453                 bProcessed 
= HandleActivate( wState
 
2461             if (SHORT1FROMMP((MPARAM
)lParam
) == TRUE
) 
2462                 bProcessed 
= HandleSetFocus((WXHWND
)(HWND
)wParam
); 
2464                 bProcessed 
= HandleKillFocus((WXHWND
)(HWND
)wParam
); 
2468             bProcessed 
= HandlePaint(); 
2473             // Don't let the DefWindowProc() destroy our window - we'll do it 
2474             // ourselves in ~wxWindow 
2477             mResult 
= (MRESULT
)TRUE
; 
2481             bProcessed 
= HandleShow(wParam 
!= 0, (int)lParam
); 
2485         // Under OS2 PM Joysticks are treated just like mouse events 
2486         // The "Motion" events will be prevelent in joysticks 
2489         case WM_BUTTON1DOWN
: 
2491         case WM_BUTTON1DBLCLK
: 
2492         case WM_BUTTON1MOTIONEND
: 
2493         case WM_BUTTON1MOTIONSTART
: 
2494         case WM_BUTTON2DOWN
: 
2496         case WM_BUTTON2DBLCLK
: 
2497         case WM_BUTTON2MOTIONEND
: 
2498         case WM_BUTTON2MOTIONSTART
: 
2499         case WM_BUTTON3DOWN
: 
2501         case WM_BUTTON3DBLCLK
: 
2502         case WM_BUTTON3MOTIONEND
: 
2503         case WM_BUTTON3MOTIONSTART
: 
2505                 if (uMsg 
== WM_BUTTON1DOWN 
&& AcceptsFocus()) 
2508                 short               nX 
= LOWORD(wParam
); 
2509                 short               nY 
= HIWORD(wParam
); 
2512                 // Redirect the event to a static control if necessary 
2514                 if (this == GetCapture()) 
2516                     bProcessed 
= HandleMouseEvent( uMsg
 
2519                                                   ,(WXUINT
)SHORT2FROMMP(lParam
) 
2524                     wxWindow
*       pWin 
= FindWindowForMouseEvent( this 
2528                     if (!pWin
->IsOfStandardClass()) 
2530                         if (uMsg 
== WM_BUTTON1DOWN 
&& pWin
->AcceptsFocus() ) 
2533                     bProcessed 
= pWin
->HandleMouseEvent( uMsg
 
2536                                                         ,(WXUINT
)SHORT2FROMMP(lParam
) 
2543             bProcessed 
= HandleSysCommand(wParam
, lParam
); 
2550                 UnpackCommand(wParam
, lParam
, &id
, &hwnd
, &cmd
); 
2552                 bProcessed 
= HandleCommand(id
, cmd
, hwnd
); 
2557             // For these messages we must return TRUE if process the message 
2560         case WM_MEASUREITEM
: 
2562                 int                 nIdCtrl 
= (UINT
)wParam
; 
2564                 if ( uMsg 
== WM_DRAWITEM 
) 
2566                     bProcessed 
= OS2OnDrawItem(nIdCtrl
, 
2567                                               (WXDRAWITEMSTRUCT 
*)lParam
); 
2571                     return MRFROMLONG(OS2OnMeasureItem( nIdCtrl
 
2572                                                        ,(WXMEASUREITEMSTRUCT 
*)lParam
 
2577                     mResult 
= (MRESULT
)TRUE
; 
2581         case WM_QUERYDLGCODE
: 
2582             if (!IsOfStandardClass()) 
2586                     mResult 
= (MRESULT
)m_lDlgCode
; 
2591             //else: get the dlg code from the DefWindowProc() 
2596         // In OS/2 PM all keyboard events are of the WM_CHAR type.  Virtual key and key-up 
2597         // and key-down events are obtained from the WM_CHAR params. 
2601                 USHORT                  uKeyFlags 
= SHORT1FROMMP((MPARAM
)wParam
); 
2603                 if (uKeyFlags 
& KC_KEYUP
) 
2605                     //TODO: check if the cast to WXWORD isn't causing trouble 
2606                     bProcessed 
= HandleKeyUp(wParam
, lParam
); 
2609                 else // keydown event 
2611                     m_bLastKeydownProcessed 
= FALSE
; 
2613                     // If this has been processed by an event handler, 
2614                     // return 0 now (we've handled it). DON't RETURN 
2615                     // we still need to process further 
2617                     m_bLastKeydownProcessed 
= HandleKeyDown(wParam
, lParam
); 
2618                     if (uKeyFlags 
& KC_VIRTUALKEY
) 
2620                         USHORT          uVk 
= SHORT2FROMMP((MPARAM
)lParam
); 
2623                         // We consider these message "not interesting" to OnChar 
2636                             // Avoid duplicate messages to OnChar for these ASCII keys: they 
2637                             // will be translated by TranslateMessage() and received in WM_CHAR 
2642                                 // But set processed to FALSE, not TRUE to still pass them to 
2643                                 // the control's default window proc - otherwise built-in 
2644                                 // keyboard handling won't work 
2649                                 bProcessed 
= HandleChar(wParam
, lParam
); 
2653                     else // WM_CHAR -- Always an ASCII character 
2655                         if (m_bLastKeydownProcessed
) 
2658                             // The key was handled in the EVT_KEY_DOWN and handling 
2659                             // a key in an EVT_KEY_DOWN handler is meant, by 
2660                             // design, to prevent EVT_CHARs from happening 
2662                             m_bLastKeydownProcessed 
= FALSE
; 
2665                         else // do generate a CHAR event 
2667                             bProcessed 
= HandleChar(wParam
, lParam
, TRUE
); 
2680                 UnpackScroll( wParam
 
2687                 bProcessed 
= OS2OnScroll( uMsg 
== WM_HSCROLL 
? wxHORIZONTAL
 
2697             switch(SHORT2FROMMP(wParam
)) 
2701                         HWND                hWnd 
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
)); 
2702                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2709                         if (pWin
->IsKindOf(CLASSINFO(wxBitmapButton
))) 
2711                             wxBitmapButton
*     pBitmapButton 
= wxDynamicCast(pWin
, wxBitmapButton
); 
2713                             pBitmapButton
->OS2OnDraw((WXDRAWITEMSTRUCT 
*)lParam
); 
2719                 case BKN_PAGESELECTEDPENDING
: 
2721                         PPAGESELECTNOTIFY  pPage 
= (PPAGESELECTNOTIFY
)lParam
; 
2723                         if ((pPage
->ulPageIdNew 
!= pPage
->ulPageIdCur
) && 
2724                             (pPage
->ulPageIdNew 
> 0L && pPage
->ulPageIdCur 
> 0L)) 
2726                             wxWindowOS2
*        pWin 
= wxFindWinFromHandle(pPage
->hwndBook
); 
2727                             wxNotebookEvent     
vEvent( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
 
2728                                                        ,(int)SHORT1FROMMP(wParam
) 
2729                                                        ,(int)pPage
->ulPageIdNew
 
2730                                                        ,(int)pPage
->ulPageIdCur
 
2737                             if (pWin
->IsKindOf(CLASSINFO(wxNotebook
))) 
2739                                 wxNotebook
*         pNotebook 
= wxDynamicCast(pWin
, wxNotebook
); 
2741                                 vEvent
.SetEventObject(pWin
); 
2742                                 pNotebook
->OnSelChange(vEvent
); 
2753                 case BN_CLICKED
: // Dups as LN_SELECT and CBN_LBSELECT 
2755                         HWND                hWnd 
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
)); 
2756                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2764                         // Simulate a WM_COMMAND here, as wxWidgets expects all control 
2765                         // button clicks to generate WM_COMMAND msgs, not WM_CONTROL 
2767                         if (pWin
->IsKindOf(CLASSINFO(wxRadioBox
))) 
2769                             wxRadioBox
*         pRadioBox 
= wxDynamicCast(pWin
, wxRadioBox
); 
2771                             pRadioBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2772                                                   ,(WXUINT
)SHORT1FROMMP(wParam
) 
2775                         if (pWin
->IsKindOf(CLASSINFO(wxRadioButton
))) 
2777                             wxRadioButton
*      pRadioButton 
= wxDynamicCast(pWin
, wxRadioButton
); 
2779                             pRadioButton
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2780                                                      ,(WXUINT
)SHORT1FROMMP(wParam
) 
2783                         if (pWin
->IsKindOf(CLASSINFO(wxCheckBox
))) 
2785                             wxCheckBox
*         pCheckBox 
= wxDynamicCast(pWin
, wxCheckBox
); 
2787                             pCheckBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2788                                                   ,(WXUINT
)SHORT1FROMMP(wParam
) 
2791                         if (pWin
->IsKindOf(CLASSINFO(wxListBox
))) 
2793                             wxListBox
*          pListBox 
= wxDynamicCast(pWin
, wxListBox
); 
2795                             pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2796                                                  ,(WXUINT
)SHORT1FROMMP(wParam
) 
2798                             if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
) 
2801                         if (pWin
->IsKindOf(CLASSINFO(wxComboBox
))) 
2803                             wxComboBox
*          pComboBox 
= wxDynamicCast(pWin
, wxComboBox
); 
2805                             pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2806                                                   ,(WXUINT
)SHORT1FROMMP(wParam
) 
2813                 case LN_ENTER
:   /* dups as CBN_EFCHANGE */ 
2815                         HWND                hWnd 
= HWNDFROMMP(lParam
); 
2816                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2824                         // Simulate a WM_COMMAND here, as wxWidgets expects all control 
2825                         // button clicks to generate WM_COMMAND msgs, not WM_CONTROL 
2827                         if (pWin
->IsKindOf(CLASSINFO(wxListBox
))) 
2829                             wxListBox
*          pListBox 
= wxDynamicCast(pWin
, wxListBox
); 
2831                             pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2832                                                  ,(WXUINT
)SHORT1FROMMP(wParam
) 
2834                             if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
) 
2838                         if (pWin
->IsKindOf(CLASSINFO(wxComboBox
))) 
2840                             wxComboBox
*          pComboBox 
= wxDynamicCast(pWin
, wxComboBox
); 
2842                             pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2843                                                   ,(WXUINT
)SHORT1FROMMP(wParam
) 
2851                 case SPBN_DOWNARROW
: 
2857                         ::WinSendMsg( HWNDFROMMP(lParam
) 
2860                                      ,MPFROM2SHORT( (USHORT
)10 
2861                                                    ,(USHORT
)SPBQ_UPDATEIFVALID
 
2865                         bProcessed 
= OS2OnScroll( wxVERTICAL
 
2866                                                  ,(int)SHORT2FROMMP(wParam
) 
2873                 case SLN_SLIDERTRACK
: 
2875                         HWND                hWnd 
= ::WinWindowFromID(GetHWND(), SHORT1FROMMP(wParam
)); 
2876                         wxWindowOS2
*        pChild 
= wxFindWinFromHandle(hWnd
); 
2883                         if (pChild
->IsKindOf(CLASSINFO(wxSlider
))) 
2884                             bProcessed 
= OS2OnScroll( wxVERTICAL
 
2885                                                      ,(int)SHORT2FROMMP(wParam
) 
2886                                                      ,(int)LONGFROMMP(lParam
) 
2894 #if defined(__VISAGECPP__) && (__IBMCPP__ >= 400) 
2895         case WM_CTLCOLORCHANGE
: 
2897                 bProcessed 
= HandleCtlColor(&hBrush
); 
2901         case WM_ERASEBACKGROUND
: 
2903             // Returning TRUE to requestw PM to paint the window background 
2904             // in SYSCLR_WINDOW. We don't really want that 
2906             bProcessed 
= HandleEraseBkgnd((WXHDC
)(HPS
)wParam
); 
2907             mResult 
= (MRESULT
)(FALSE
); 
2910             // the return value for this message is ignored 
2911         case WM_SYSCOLORCHANGE
: 
2912             bProcessed 
= HandleSysColorChange(); 
2915         case WM_REALIZEPALETTE
: 
2916             bProcessed 
= HandlePaletteChanged(); 
2919         // move all drag and drops to wxDrg 
2921             bProcessed 
= HandleEndDrag(wParam
); 
2925             bProcessed 
= HandleInitDialog((WXHWND
)(HWND
)wParam
); 
2929                 // we never set focus from here 
2930                 mResult 
= (MRESULT
)FALSE
; 
2934         // wxFrame specific message 
2935         case WM_MINMAXFRAME
: 
2936             bProcessed 
= HandleGetMinMaxInfo((PSWP
)wParam
); 
2939         case WM_SYSVALUECHANGED
: 
2940             // TODO: do something 
2941             mResult 
= (MRESULT
)TRUE
; 
2945         // Comparable to WM_SETPOINTER for windows, only for just controls 
2947         case WM_CONTROLPOINTER
: 
2948             bProcessed 
= HandleSetCursor( SHORT1FROMMP(wParam
) // Control ID 
2949                                          ,(HWND
)lParam         
// Cursor Handle 
2954                 // Returning TRUE stops the DefWindowProc() from further 
2955                 // processing this message - exactly what we need because we've 
2956                 // just set the cursor. 
2958                 mResult 
= (MRESULT
)TRUE
; 
2965         wxLogTrace(wxTraceMessages
, wxT("Forwarding %s to DefWindowProc."), 
2966                    wxGetMessageName(uMsg
)); 
2967 #endif // __WXDEBUG__ 
2968         if (IsKindOf(CLASSINFO(wxFrame
))) 
2969             mResult 
= ::WinDefWindowProc(m_hWnd
, uMsg
, wParam
, lParam
); 
2970         else if (IsKindOf(CLASSINFO(wxDialog
))) 
2971             mResult 
= ::WinDefDlgProc( m_hWnd
, uMsg
, wParam
, lParam
); 
2973             mResult 
= OS2DefWindowProc(uMsg
, wParam
, lParam
); 
2976 } // end of wxWindowOS2::OS2WindowProc 
2978 wxWindow
* wxFindWinFromHandle( 
2982     wxNode
*                         pNode 
= wxWinHandleList
->Find((long)hWnd
); 
2986     return (wxWindow 
*)pNode
->GetData(); 
2987 } // end of wxFindWinFromHandle 
2989 void wxAssociateWinWithHandle( 
2995     // Adding NULL hWnd is (first) surely a result of an error and 
2996     // (secondly) breaks menu command processing 
2998     wxCHECK_RET( hWnd 
!= (HWND
)NULL
, 
2999                  wxT("attempt to add a NULL hWnd to window list ignored") ); 
3002     wxWindow
*                       pOldWin 
= wxFindWinFromHandle((WXHWND
) hWnd
); 
3004     if (pOldWin 
&& (pOldWin 
!= pWin
)) 
3006         wxString                    
str(pWin
->GetClassInfo()->GetClassName()); 
3007         wxLogError( "Bug! Found existing HWND %X for new window of class %s" 
3014         wxWinHandleList
->Append( (long)hWnd
 
3018 } // end of wxAssociateWinWithHandle 
3020 void wxRemoveHandleAssociation( 
3024     wxWinHandleList
->DeleteObject(pWin
); 
3025 } // end of wxRemoveHandleAssociation 
3028 // Default destroyer - override if you destroy it in some other way 
3029 // (e.g. with MDI child windows) 
3031 void wxWindowOS2::OS2DestroyWindow() 
3035 bool wxWindowOS2::OS2GetCreateWindowCoords( 
3037 , const wxSize
&                     rSize
 
3044     bool                            bNonDefault 
= FALSE
; 
3045     static const int                DEFAULT_Y 
= 200; 
3046     static const int                DEFAULT_H 
= 250; 
3050         rnX 
= rnY 
= CW_USEDEFAULT
; 
3055         rnY 
= rPos
.y 
== -1 ? DEFAULT_Y 
: rPos
.y
; 
3060         rnWidth 
= rnHeight 
= CW_USEDEFAULT
; 
3065         rnHeight 
= rSize
.y 
== -1 ? DEFAULT_H 
: rSize
.y
; 
3069 } // end of wxWindowOS2::OS2GetCreateWindowCoords 
3071 WXHWND 
wxWindowOS2::OS2GetParent() const 
3073     return m_parent 
? m_parent
->GetHWND() : NULL
; 
3076 bool wxWindowOS2::OS2Create( 
3078 , const char*                       zTitle
 
3080 , const wxPoint
&                    rPos
 
3081 , const wxSize
&                     rSize
 
3093     long                            lControlId 
= 0L; 
3094     wxWindowCreationHook            
vHook(this); 
3095     wxString                        
sClassName((wxChar
*)zClass
); 
3097     OS2GetCreateWindowCoords( rPos
 
3107         lControlId 
= GetId(); 
3108         if (GetWindowStyleFlag() & wxCLIP_SIBLINGS
) 
3110             dwStyle 
|= WS_CLIPSIBLINGS
; 
3114     // For each class "Foo" we have we also have "FooNR" ("no repaint") class 
3115     // which is the same but without CS_[HV]REDRAW class styles so using it 
3116     // ensures that the window is not fully repainted on each resize 
3118     if (!HasFlag(wxFULL_REPAINT_ON_RESIZE
)) 
3120         sClassName 
+= wxT("NR"); 
3122     m_hWnd 
= (WXHWND
)::WinCreateWindow( (HWND
)OS2GetParent() 
3123                                        ,(PSZ
)sClassName
.c_str() 
3124                                        ,(PSZ
)zTitle 
? zTitle 
: "" 
3138         vError 
= ::WinGetLastError(wxGetInstance()); 
3139         sError 
= wxPMErrorToStr(vError
); 
3142     SubclassWin(m_hWnd
); 
3143     SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
)); 
3145     m_backgroundColour
.Set(wxString("GREY")); 
3147     LONG                            lColor 
= (LONG
)m_backgroundColour
.GetPixel(); 
3149     if (!::WinSetPresParam( m_hWnd
 
3155         vError 
= ::WinGetLastError(vHabmain
); 
3156         sError 
= wxPMErrorToStr(vError
); 
3157         wxLogError("Error creating frame. Error: %s\n", sError
.c_str()); 
3166 } // end of WinGuiBase_Window::OS2Create 
3168 // =========================================================================== 
3169 // OS2 PM message handlers 
3170 // =========================================================================== 
3172 // --------------------------------------------------------------------------- 
3173 // window creation/destruction 
3174 // --------------------------------------------------------------------------- 
3176 bool wxWindowOS2::HandleCreate( 
3177   WXLPCREATESTRUCT                  
WXUNUSED(vCs
) 
3181     wxWindowCreateEvent             
vEvent((wxWindow
*)this); 
3183     (void)GetEventHandler()->ProcessEvent(vEvent
); 
3184     *pbMayCreate 
= TRUE
; 
3186 } // end of wxWindowOS2::HandleCreate 
3188 bool wxWindowOS2::HandleDestroy() 
3190     wxWindowDestroyEvent            
vEvent((wxWindow
*)this); 
3191     vEvent
.SetId(GetId()); 
3192     (void)GetEventHandler()->ProcessEvent(vEvent
); 
3195     // Delete our drop target if we've got one 
3197 #if wxUSE_DRAG_AND_DROP 
3198     if (m_dropTarget 
!= NULL
) 
3200         delete m_dropTarget
; 
3201         m_dropTarget 
= NULL
; 
3203 #endif // wxUSE_DRAG_AND_DROP 
3206     // WM_DESTROY handled 
3209 } // end of wxWindowOS2::HandleDestroy 
3211 // --------------------------------------------------------------------------- 
3213 // --------------------------------------------------------------------------- 
3214 void wxWindowOS2::OnSetFocus( 
3215   wxFocusEvent
&                     rEvent
 
3219 } // end of wxWindowOS2::OnSetFocus 
3221 bool wxWindowOS2::HandleActivate( 
3223 , WXHWND                            
WXUNUSED(hActivate
) 
3226     wxActivateEvent                 
vEvent( wxEVT_ACTIVATE
 
3230     vEvent
.SetEventObject(this); 
3231     return GetEventHandler()->ProcessEvent(vEvent
); 
3232 } // end of wxWindowOS2::HandleActivate 
3234 bool wxWindowOS2::HandleSetFocus( 
3235   WXHWND                            
WXUNUSED(hWnd
) 
3239     // Notify the parent keeping track of focus for the kbd navigation 
3240     // purposes that we got it 
3242     wxChildFocusEvent               
vEventFocus((wxWindow 
*)this); 
3243     (void)GetEventHandler()->ProcessEvent(vEventFocus
); 
3251         m_caret
->OnSetFocus(); 
3253 #endif // wxUSE_CARET 
3256     // If it's a wxTextCtrl don't send the event as it will be done 
3257     // after the control gets to process it from EN_FOCUS handler 
3258     if ( wxDynamicCastThis(wxTextCtrl
) ) 
3262 #endif // wxUSE_TEXTCTRL 
3264     wxFocusEvent                    
vEvent(wxEVT_SET_FOCUS
, m_windowId
); 
3266     vEvent
.SetEventObject(this); 
3267     return GetEventHandler()->ProcessEvent(vEvent
); 
3268 } // end of wxWindowOS2::HandleSetFocus 
3270 bool wxWindowOS2::HandleKillFocus( 
3280         m_caret
->OnKillFocus(); 
3282 #endif // wxUSE_CARET 
3286     // If it's a wxTextCtrl don't send the event as it will be done 
3287     // after the control gets to process it. 
3289     wxTextCtrl
*                     pCtrl 
= wxDynamicCastThis(wxTextCtrl
); 
3298     // Don't send the event when in the process of being deleted.  This can 
3299     // only cause problems if the event handler tries to access the object. 
3301     if ( m_isBeingDeleted 
) 
3306     wxFocusEvent                    
vEvent( wxEVT_KILL_FOCUS
 
3310     vEvent
.SetEventObject(this); 
3313     // wxFindWinFromHandle() may return NULL, it is ok 
3315     vEvent
.SetWindow(wxFindWinFromHandle(hWnd
)); 
3316     return GetEventHandler()->ProcessEvent(vEvent
); 
3317 } // end of wxWindowOS2::HandleKillFocus 
3319 // --------------------------------------------------------------------------- 
3321 // --------------------------------------------------------------------------- 
3323 bool wxWindowOS2::HandleShow( 
3325 , int                               WXUNUSED(nStatus
) 
3328     wxShowEvent                     
vEvent(GetId(), bShow
); 
3330     vEvent
.m_eventObject 
= this; 
3331     return GetEventHandler()->ProcessEvent(vEvent
); 
3332 } // end of wxWindowOS2::HandleShow 
3334 bool wxWindowOS2::HandleInitDialog( 
3335   WXHWND                            
WXUNUSED(hWndFocus
) 
3338     wxInitDialogEvent               
vEvent(GetId()); 
3340     vEvent
.m_eventObject 
= this; 
3341     return GetEventHandler()->ProcessEvent(vEvent
); 
3342 } // end of wxWindowOS2::HandleInitDialog 
3344 bool wxWindowOS2::HandleEndDrag(WXWPARAM 
WXUNUSED(wParam
)) 
3346    // TODO: We'll handle drag and drop later 
3350 bool wxWindowOS2::HandleSetCursor( 
3351   USHORT                            
WXUNUSED(vId
) 
3356     // Under OS/2 PM this allows the pointer to be changed 
3357     // as it passes over a control 
3359     ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)hPointer
); 
3361 } // end of wxWindowOS2::HandleSetCursor 
3363 // --------------------------------------------------------------------------- 
3364 // owner drawn stuff 
3365 // --------------------------------------------------------------------------- 
3366 bool wxWindowOS2::OS2OnDrawItem( 
3368 , WXDRAWITEMSTRUCT
*                 pItemStruct
 
3371 #if wxUSE_OWNER_DRAWN 
3374 #if wxUSE_MENUS_NATIVE 
3376     // Is it a menu item? 
3382         POWNERITEM                  pMeasureStruct 
= (POWNERITEM
)pItemStruct
; 
3383         wxFrame
*                    pFrame 
= (wxFrame
*)this; 
3384         wxMenuItem
*                 pMenuItem 
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
); 
3385         HDC                         hDC 
= ::GpiQueryDevice(pMeasureStruct
->hps
); 
3386         wxRect                      
vRect( pMeasureStruct
->rclItem
.xLeft
 
3387                                           ,pMeasureStruct
->rclItem
.yBottom
 
3388                                           ,pMeasureStruct
->rclItem
.xRight 
- pMeasureStruct
->rclItem
.xLeft
 
3389                                           ,pMeasureStruct
->rclItem
.yTop 
- pMeasureStruct
->rclItem
.yBottom
 
3394         vDc
.SetHPS(pMeasureStruct
->hps
); 
3396         // Load the wxWidgets Pallete and set to RGB mode 
3398         if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
 
3402                                       ,(LONG
)wxTheColourDatabase
->m_nSize
 
3403                                       ,(PLONG
)wxTheColourDatabase
->m_palTable
 
3406             vError 
= ::WinGetLastError(vHabmain
); 
3407             sError 
= wxPMErrorToStr(vError
); 
3408             wxLogError("Unable to set current color table. Error: %s\n", sError
.c_str()); 
3411         // Set the color table to RGB mode 
3413         if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
 
3421             vError 
= ::WinGetLastError(vHabmain
); 
3422             sError 
= wxPMErrorToStr(vError
); 
3423             wxLogError("Unable to set current color table. Error: %s\n", sError
.c_str()); 
3426         wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE 
); 
3432         if (pMeasureStruct
->fsAttribute 
== pMeasureStruct
->fsAttributeOld
) 
3435             // Entire Item needs to be redrawn (either it has reappeared from 
3436             // behind another window or is being displayed for the first time 
3438             eAction 
= wxOwnerDrawn::wxODDrawAll
; 
3440             if (pMeasureStruct
->fsAttribute 
& MIA_HILITED
) 
3443                 // If it is currently selected we let the system handle it 
3445                 eStatus 
|= wxOwnerDrawn::wxODSelected
; 
3447             if (pMeasureStruct
->fsAttribute 
& MIA_CHECKED
) 
3450                 // If it is currently checked we draw our own 
3452                 eStatus 
|= wxOwnerDrawn::wxODChecked
; 
3453                 pMeasureStruct
->fsAttributeOld 
= pMeasureStruct
->fsAttribute 
&= ~MIA_CHECKED
; 
3455             if (pMeasureStruct
->fsAttribute 
& MIA_DISABLED
) 
3458                 // If it is currently disabled we let the system handle it 
3460                 eStatus 
|= wxOwnerDrawn::wxODDisabled
; 
3463             // Don't really care about framed (indicationg focus) or NoDismiss 
3468             if (pMeasureStruct
->fsAttribute 
& MIA_HILITED
) 
3470                 eAction 
= wxOwnerDrawn::wxODDrawAll
; 
3471                 eStatus 
|= wxOwnerDrawn::wxODSelected
; 
3473                 // Keep the system from trying to highlight with its bogus colors 
3475                 pMeasureStruct
->fsAttributeOld 
= pMeasureStruct
->fsAttribute 
&= ~MIA_HILITED
; 
3477             else if (!(pMeasureStruct
->fsAttribute 
& MIA_HILITED
)) 
3479                 eAction 
= wxOwnerDrawn::wxODDrawAll
; 
3482                 // Keep the system from trying to highlight with its bogus colors 
3484                 pMeasureStruct
->fsAttribute 
= pMeasureStruct
->fsAttributeOld 
&= ~MIA_HILITED
; 
3489                 // For now we don't care about anything else 
3490                 // just ignore the entire message! 
3496         // Now redraw the item 
3498         return(pMenuItem
->OnDrawItem( vDc
 
3500                                      ,(wxOwnerDrawn::wxODAction
)eAction
 
3501                                      ,(wxOwnerDrawn::wxODStatus
)eStatus
 
3504         // leave the fsAttribute and fsOldAttribute unchanged.  If different, 
3505         // the system will do the highlight or fraeming or disabling for us, 
3506         // otherwise, we'd have to do it ourselves. 
3509 #endif // wxUSE_MENUS_NATIVE 
3511     wxWindow
*                       pItem 
= FindItem(vId
); 
3513     if (pItem 
&& pItem
->IsKindOf(CLASSINFO(wxControl
))) 
3515         return ((wxControl 
*)pItem
)->OS2OnDraw(pItemStruct
); 
3519     pItemStruct 
= pItemStruct
; 
3522 } // end of wxWindowOS2::OS2OnDrawItem 
3524 long wxWindowOS2::OS2OnMeasureItem( 
3526 , WXMEASUREITEMSTRUCT
*              pItemStruct
 
3529 #if wxUSE_OWNER_DRAWN 
3531     // Is it a menu item? 
3533     if (lId 
== 65536) // I really don't like this...has to be a better indicator 
3535         if (IsKindOf(CLASSINFO(wxFrame
))) // we'll assume if Frame then a menu 
3539             POWNERITEM              pMeasureStruct 
= (POWNERITEM
)pItemStruct
; 
3540             wxFrame
*                pFrame 
= (wxFrame
*)this; 
3541             wxMenuItem
*             pMenuItem 
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
); 
3543             wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE 
); 
3546             if (pMenuItem
->OnMeasureItem( &nWidth
 
3552                 pMeasureStruct
->rclItem
.xRight  
= nWidth
; 
3553                 pMeasureStruct
->rclItem
.xLeft   
= 0L; 
3554                 pMeasureStruct
->rclItem
.yTop    
= nHeight
; 
3555                 pMeasureStruct
->rclItem
.yBottom 
= 0L; 
3556                 mRc 
= MRFROM2SHORT(nHeight
, nWidth
); 
3557                 return LONGFROMMR(mRc
); 
3562     wxWindow
*                      pItem 
= FindItem(lId
); 
3564     if (pItem 
&& pItem
->IsKindOf(CLASSINFO(wxControl
))) 
3568         vItem
.idItem 
= (LONG
)pItemStruct
; 
3569         return ((wxControl 
*)pItem
)->OS2OnMeasure((WXMEASUREITEMSTRUCT
*)&vItem
); 
3573     pItemStruct 
= pItemStruct
; 
3574 #endif // wxUSE_OWNER_DRAWN 
3578 // --------------------------------------------------------------------------- 
3579 // colours and palettes 
3580 // --------------------------------------------------------------------------- 
3582 bool wxWindowOS2::HandleSysColorChange() 
3584     wxSysColourChangedEvent         vEvent
; 
3586     vEvent
.SetEventObject(this); 
3587     return GetEventHandler()->ProcessEvent(vEvent
); 
3588 } // end of wxWindowOS2::HandleSysColorChange 
3590 bool wxWindowOS2::HandleCtlColor( 
3591   WXHBRUSH
*                         WXUNUSED(phBrush
) 
3595     // Not much provided with message. So not sure I can do anything with it 
3598 } // end of wxWindowOS2::HandleCtlColor 
3601 // Define for each class of dialog and control 
3602 WXHBRUSH 
wxWindowOS2::OnCtlColor(WXHDC 
WXUNUSED(hDC
), 
3603                                  WXHWND 
WXUNUSED(hWnd
), 
3604                                  WXUINT 
WXUNUSED(nCtlColor
), 
3605                                  WXUINT 
WXUNUSED(message
), 
3606                                  WXWPARAM 
WXUNUSED(wParam
), 
3607                                  WXLPARAM 
WXUNUSED(lParam
)) 
3612 bool wxWindowOS2::HandlePaletteChanged() 
3614     // need to set this to something first 
3615     WXHWND                          hWndPalChange 
= NULLHANDLE
; 
3617     wxPaletteChangedEvent           
vEvent(GetId()); 
3619     vEvent
.SetEventObject(this); 
3620     vEvent
.SetChangedWindow(wxFindWinFromHandle(hWndPalChange
)); 
3622     return GetEventHandler()->ProcessEvent(vEvent
); 
3623 } // end of wxWindowOS2::HandlePaletteChanged 
3626 // Responds to colour changes: passes event on to children. 
3628 void wxWindowOS2::OnSysColourChanged( 
3629   wxSysColourChangedEvent
&          rEvent
 
3632     wxWindowListNode
*               pNode 
= GetChildren().GetFirst(); 
3637         // Only propagate to non-top-level windows 
3639         wxWindow
*                   pWin 
= (wxWindow 
*)pNode
->GetData(); 
3641         if (pWin
->GetParent()) 
3643             wxSysColourChangedEvent vEvent
; 
3645             rEvent
.m_eventObject 
= pWin
; 
3646             pWin
->GetEventHandler()->ProcessEvent(vEvent
); 
3648         pNode 
= pNode
->GetNext(); 
3650 } // end of wxWindowOS2::OnSysColourChanged 
3652 // --------------------------------------------------------------------------- 
3654 // --------------------------------------------------------------------------- 
3656 void wxWindow::OnPaint ( 
3657   wxPaintEvent
&                     rEvent
 
3660     HDC                             hDC 
= (HDC
)wxPaintDC::FindDCInCache((wxWindow
*) rEvent
.GetEventObject()); 
3664         OS2DefWindowProc( (WXUINT
)WM_PAINT
 
3669 } // end of wxWindow::OnPaint 
3671 bool wxWindowOS2::HandlePaint() 
3674     wxPaintEvent                    
vEvent(m_windowId
); 
3678     // Create empty region 
3679     // TODO: get HPS somewhere else if possible 
3680     hPS  
= ::WinGetPS(GetHwnd()); 
3681     hRgn 
= ::GpiCreateRegion(hPS
, 0, NULL
); 
3683     if (::WinQueryUpdateRegion(GetHwnd(), hRgn
) == RGN_ERROR
) 
3685          wxLogLastError("CreateRectRgn"); 
3689     m_updateRegion 
= wxRegion(hRgn
, hPS
); 
3691     vEvent
.SetEventObject(this); 
3692     bProcessed 
= GetEventHandler()->ProcessEvent(vEvent
); 
3695          IsKindOf(CLASSINFO(wxPanel
)) && 
3696          GetChildren().GetCount() == 0 
3700         // OS/2 needs to process this right here, not by the default proc 
3701         // Window's default proc correctly paints everything, OS/2 does not. 
3702         // For decorative panels that typically have no children, we draw 
3708         hPS 
= ::WinBeginPaint( GetHwnd() 
3714             ::GpiCreateLogColorTable( hPS
 
3718                                      ,(LONG
)wxTheColourDatabase
->m_nSize
 
3719                                      ,(PLONG
)wxTheColourDatabase
->m_palTable
 
3721             ::GpiCreateLogColorTable( hPS
 
3728             if (::WinIsWindowVisible(GetHWND())) 
3729                 ::WinFillRect(hPS
, &vRect
,  GetBackgroundColour().GetPixel()); 
3732                 LINEBUNDLE      vLineBundle
; 
3734                 vLineBundle
.lColor     
= 0x00000000; // Black 
3735                 vLineBundle
.usMixMode  
= FM_OVERPAINT
; 
3736                 vLineBundle
.fxWidth    
= 1; 
3737                 vLineBundle
.lGeomWidth 
= 1; 
3738                 vLineBundle
.usType     
= LINETYPE_SOLID
; 
3739                 vLineBundle
.usEnd      
= 0; 
3740                 vLineBundle
.usJoin     
= 0; 
3743                               ,LBB_COLOR 
| LBB_MIX_MODE 
| LBB_WIDTH 
| LBB_GEOM_WIDTH 
| LBB_TYPE
 
3747                 ::WinQueryWindowRect(GetHwnd(), &vRect
); 
3757     else if (!bProcessed 
&& 
3758              IsKindOf(CLASSINFO(wxPanel
)) 
3762         // Panel with children, usually fills a frame client so no borders. 
3767         hPS 
= ::WinBeginPaint( GetHwnd() 
3773             ::GpiCreateLogColorTable( hPS
 
3777                                      ,(LONG
)wxTheColourDatabase
->m_nSize
 
3778                                      ,(PLONG
)wxTheColourDatabase
->m_palTable
 
3780             ::GpiCreateLogColorTable( hPS
 
3788             if (::WinIsWindowVisible(GetHWND())) 
3789                 ::WinFillRect(hPS
, &vRect
,  GetBackgroundColour().GetPixel()); 
3795 } // end of wxWindowOS2::HandlePaint 
3797 bool wxWindowOS2::HandleEraseBkgnd( 
3804     ::WinQueryWindowPos(GetHwnd(), &vSwp
); 
3805     if (vSwp
.fl 
& SWP_MINIMIZE
) 
3810     vDC
.m_hPS 
= (HPS
)hDC
; // this is really a PS 
3811     vDC
.SetWindow((wxWindow
*)this); 
3814     wxEraseEvent                    
vEvent(m_windowId
, &vDC
); 
3816     vEvent
.SetEventObject(this); 
3818     rc 
= GetEventHandler()->ProcessEvent(vEvent
); 
3821     vDC
.m_hPS 
= NULLHANDLE
; 
3823 } // end of wxWindowOS2::HandleEraseBkgnd 
3825 void wxWindowOS2::OnEraseBackground( 
3826   wxEraseEvent
&                     rEvent
 
3830     HPS                             hPS 
= rEvent
.m_dc
->m_hPS
; 
3832     LONG                            lColor 
= m_backgroundColour
.GetPixel(); 
3834     rc 
= ::WinQueryWindowRect(GetHwnd(), &vRect
); 
3835     rc 
= ::WinFillRect(hPS
, &vRect
, lColor
); 
3836 }  // end of wxWindowOS2::OnEraseBackground 
3838 // --------------------------------------------------------------------------- 
3839 // moving and resizing 
3840 // --------------------------------------------------------------------------- 
3842 bool wxWindowOS2::HandleMinimize() 
3844     wxIconizeEvent                  
vEvent(m_windowId
); 
3846     vEvent
.SetEventObject(this); 
3847     return GetEventHandler()->ProcessEvent(vEvent
); 
3848 } // end of wxWindowOS2::HandleMinimize 
3850 bool wxWindowOS2::HandleMaximize() 
3852     wxMaximizeEvent                 
vEvent(m_windowId
); 
3854     vEvent
.SetEventObject(this); 
3855     return GetEventHandler()->ProcessEvent(vEvent
); 
3856 } // end of wxWindowOS2::HandleMaximize 
3858 bool wxWindowOS2::HandleMove( 
3863     wxMoveEvent                     
vEvent(wxPoint(nX
, nY
), m_windowId
); 
3865     vEvent
.SetEventObject(this); 
3866     return GetEventHandler()->ProcessEvent(vEvent
); 
3867 }  // end of wxWindowOS2::HandleMove 
3869 bool wxWindowOS2::HandleSize( 
3872 , WXUINT                            
WXUNUSED(nFlag
) 
3875     wxSizeEvent                     
vEvent(wxSize(nWidth
, nHeight
), m_windowId
); 
3877     vEvent
.SetEventObject(this); 
3878     return GetEventHandler()->ProcessEvent(vEvent
); 
3879 } // end of wxWindowOS2::HandleSize 
3881 bool wxWindowOS2::HandleGetMinMaxInfo( 
3890             ::WinGetMaxPosition(GetHwnd(), pSwp
); 
3891             m_maxWidth 
= pSwp
->cx
; 
3892             m_maxHeight 
= pSwp
->cy
; 
3896             ::WinGetMinPosition(GetHwnd(), pSwp
, &vPoint
); 
3897             m_minWidth 
= pSwp
->cx
; 
3898             m_minHeight 
= pSwp
->cy
; 
3905 } // end of wxWindowOS2::HandleGetMinMaxInfo 
3907 // --------------------------------------------------------------------------- 
3909 // --------------------------------------------------------------------------- 
3910 bool wxWindowOS2::HandleCommand( 
3916 #if wxUSE_MENUS_NATIVE 
3917     if (wxCurrentPopupMenu
) 
3919         wxMenu
*                     pPopupMenu 
= wxCurrentPopupMenu
; 
3921         wxCurrentPopupMenu 
= NULL
; 
3922         return pPopupMenu
->OS2Command(wCmd
, wId
); 
3924 #endif // wxUSE_MENUS_NATIVE 
3926     wxWindow
*                       pWin 
= FindItem(wId
); 
3930         pWin 
= wxFindWinFromHandle(hControl
); 
3934         return pWin
->OS2Command(wCmd
, wId
); 
3937 } // end of wxWindowOS2::HandleCommand 
3939 bool wxWindowOS2::HandleSysCommand( 
3941 , WXLPARAM                          
WXUNUSED(lParam
) 
3945     // 4 bits are reserved 
3947     switch (SHORT1FROMMP(wParam
)) 
3950             return HandleMaximize(); 
3953             return HandleMinimize(); 
3956 } // end of wxWindowOS2::HandleSysCommand 
3958 // --------------------------------------------------------------------------- 
3960 // --------------------------------------------------------------------------- 
3961 //TODO!!! check against MSW 
3962 void wxWindowOS2::InitMouseEvent( 
3963   wxMouseEvent
&                     rEvent
 
3970     DoGetSize(0, &nHeight
); 
3972     // Convert to wxWidgets standard coordinate system! 
3973     rEvent
.m_y           
= nHeight 
- nY
; 
3974     rEvent
.m_shiftDown   
= ((uFlags 
& KC_SHIFT
) != 0); 
3975     rEvent
.m_controlDown 
= ((uFlags 
& KC_CTRL
) != 0); 
3976     rEvent
.m_altDown     
= ((uFlags 
& KC_ALT
) != 0); 
3977     rEvent
.m_leftDown    
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON1
) & 
3979     rEvent
.m_middleDown  
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON3
) & 
3981     rEvent
.m_rightDown   
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON2
) & 
3983     rEvent
.SetTimestamp(s_currentMsg
.time
); 
3984     rEvent
.m_eventObject 
= this; 
3985     rEvent
.SetId(GetId()); 
3987 #if wxUSE_MOUSEEVENT_HACK 
3990     m_lastMouseEvent 
= rEvent
.GetEventType(); 
3991 #endif // wxUSE_MOUSEEVENT_HACK 
3992 } // end of wxWindowOS2::InitMouseEvent 
3994 bool wxWindowOS2::HandleMouseEvent( 
4001     bool                            bProcessed 
= FALSE
; 
4004     // The mouse events take consecutive IDs from WM_MOUSEFIRST to 
4005     // WM_MOUSELAST, so it's enough to substract WM_MOUSEMOVE == WM_MOUSEFIRST 
4006     // from the message id and take the value in the table to get wxWin event 
4009     static const wxEventType eventsMouse
[] = 
4023     wxMouseEvent                    
vEvent(eventsMouse
[uMsg 
- WM_MOUSEMOVE
]); 
4025     InitMouseEvent( vEvent
 
4031     bProcessed 
= GetEventHandler()->ProcessEvent(vEvent
); 
4034         HPOINTER                    hCursor 
= (HPOINTER
)GetCursor().GetHCURSOR(); 
4036         if (hCursor 
!= NULLHANDLE
) 
4038             ::WinSetPointer(HWND_DESKTOP
, hCursor
); 
4042     return GetEventHandler()->ProcessEvent(vEvent
); 
4043 } // end of wxWindowOS2::HandleMouseEvent 
4045 bool wxWindowOS2::HandleMouseMove( 
4051     if (!m_bMouseInWindow
) 
4054         // Generate an ENTER event 
4056         m_bMouseInWindow 
= TRUE
; 
4058         wxMouseEvent                
vEvent(wxEVT_ENTER_WINDOW
); 
4060         InitMouseEvent( vEvent
 
4066         (void)GetEventHandler()->ProcessEvent(vEvent
); 
4068     return HandleMouseEvent( WM_MOUSEMOVE
 
4073 } // end of wxWindowOS2::HandleMouseMove 
4075 // --------------------------------------------------------------------------- 
4076 // keyboard handling 
4077 // --------------------------------------------------------------------------- 
4080 // Create the key event of the given type for the given key - used by 
4081 // HandleChar and HandleKeyDown/Up 
4083 wxKeyEvent 
wxWindowOS2::CreateKeyEvent( 
4090     wxKeyEvent                      
vEvent(eType
); 
4092     vEvent
.SetId(GetId()); 
4093     vEvent
.m_shiftDown   
= IsShiftDown(); 
4094     vEvent
.m_controlDown 
= IsCtrlDown(); 
4095     vEvent
.m_altDown     
= (HIWORD(lParam
) & KC_ALT
) == KC_ALT
; 
4097     vEvent
.m_eventObject 
= (wxWindow 
*)this; // const_cast 
4098     vEvent
.m_keyCode     
= nId
; 
4099     vEvent
.m_rawCode 
= (wxUint32
)wParam
; 
4100     vEvent
.m_rawFlags 
= (wxUint32
)lParam
; 
4101     vEvent
.SetTimestamp(s_currentMsg
.time
); 
4104     // Translate the position to client coords 
4109     ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
4110     ::WinQueryWindowRect( GetHwnd() 
4114     vPoint
.x 
-= vRect
.xLeft
; 
4115     vPoint
.y 
-= vRect
.yBottom
; 
4117     vEvent
.m_x 
= vPoint
.x
; 
4118     vEvent
.m_y 
= vPoint
.y
; 
4121 } // end of wxWindowOS2::CreateKeyEvent 
4124 // isASCII is TRUE only when we're called from WM_CHAR handler and not from 
4127 bool wxWindowOS2::HandleChar( 
4133     bool                            bCtrlDown 
= FALSE
; 
4136     if (m_bLastKeydownProcessed
) 
4139         // The key was handled in the EVT_KEY_DOWN.  Handling a key in an 
4140         // EVT_KEY_DOWN handler is meant, by design, to prevent EVT_CHARs 
4141         // from happening, so just bail out at this point. 
4143         m_bLastKeydownProcessed 
= FALSE
; 
4149         // If 1 -> 26, translate to either special keycode or just set 
4150         // ctrlDown.  IOW, Ctrl-C should result in keycode == 3 and 
4151         // ControlDown() == TRUE. 
4153         vId 
= SHORT1FROMMP(lParam
); 
4154         if ((vId 
> 0) && (vId 
< 27)) 
4176     else  // we're called from WM_KEYDOWN 
4178         vId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4183     wxKeyEvent                      
vEvent(CreateKeyEvent( wxEVT_CHAR
 
4190         vEvent
.m_controlDown 
= TRUE
; 
4192     return (GetEventHandler()->ProcessEvent(vEvent
)); 
4195 bool wxWindowOS2::HandleKeyDown( 
4200     int                             nId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4205         // Normal ASCII char 
4207         nId 
= SHORT1FROMMP(lParam
); 
4212         wxKeyEvent                  
vEvent(CreateKeyEvent( wxEVT_KEY_DOWN
 
4218         if (GetEventHandler()->ProcessEvent(vEvent
)) 
4224 } // end of wxWindowOS2::HandleKeyDown 
4226 bool wxWindowOS2::HandleKeyUp( 
4231     int                             nId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4236         // Normal ASCII char 
4243         wxKeyEvent                  
vEvent(CreateKeyEvent( wxEVT_KEY_UP
 
4249         if (GetEventHandler()->ProcessEvent(vEvent
)) 
4253 } // end of wxWindowOS2::HandleKeyUp 
4255 // --------------------------------------------------------------------------- 
4257 // --------------------------------------------------------------------------- 
4259 // --------------------------------------------------------------------------- 
4261 // --------------------------------------------------------------------------- 
4263 bool wxWindowOS2::OS2OnScroll( 
4272         wxWindow
*                   pChild 
= wxFindWinFromHandle(hControl
); 
4275             return pChild
->OS2OnScroll( nOrientation
 
4282     wxScrollWinEvent                vEvent
; 
4284     vEvent
.SetPosition(wPos
); 
4285     vEvent
.SetOrientation(nOrientation
); 
4286     vEvent
.m_eventObject 
= this; 
4291             vEvent
.m_eventType 
= wxEVT_SCROLLWIN_LINEUP
; 
4295             vEvent
.m_eventType 
= wxEVT_SCROLLWIN_LINEDOWN
; 
4299             vEvent
.m_eventType 
= wxEVT_SCROLLWIN_PAGEUP
; 
4303             vEvent
.m_eventType 
= wxEVT_SCROLLWIN_PAGEDOWN
; 
4306         case SB_SLIDERPOSITION
: 
4307             vEvent
.m_eventType 
= wxEVT_SCROLLWIN_THUMBRELEASE
; 
4310         case SB_SLIDERTRACK
: 
4311             vEvent
.m_eventType 
= wxEVT_SCROLLWIN_THUMBTRACK
; 
4317     return GetEventHandler()->ProcessEvent(vEvent
); 
4318 } // end of wxWindowOS2::OS2OnScroll 
4320 void wxWindowOS2::MoveChildren( 
4325     // We want to handle top levels ourself, manually 
4327     if (!IsTopLevel() && GetAutoLayout()) 
4335         for (wxWindowList::Node
* pNode 
= GetChildren().GetFirst(); 
4337              pNode 
= pNode
->GetNext()) 
4339             wxWindow
*               pWin 
= pNode
->GetData(); 
4341             ::WinQueryWindowPos( GetHwndOf(pWin
) 
4344             if (pWin
->IsKindOf(CLASSINFO(wxControl
))) 
4349                 // Must deal with controls that have margins like ENTRYFIELD.  The SWP 
4350                 // struct of such a control will have and origin offset from its intended 
4351                 // position by the width of the margins. 
4353                 pCtrl 
= wxDynamicCast(pWin
, wxControl
); 
4354                 vSwp
.y 
-= pCtrl
->GetYComp(); 
4355                 vSwp
.x 
-= pCtrl
->GetXComp(); 
4357             ::WinSetWindowPos( GetHwndOf(pWin
) 
4363                               ,SWP_MOVE 
| SWP_SHOW 
| SWP_ZORDER
 
4365             ::WinQueryWindowPos(GetHwndOf(pWin
), pWin
->GetSwp()); 
4366             if (pWin
->IsKindOf(CLASSINFO(wxRadioBox
))) 
4368                 wxRadioBox
*     pRadioBox
; 
4370                 pRadioBox 
= wxDynamicCast(pWin
, wxRadioBox
); 
4371                 pRadioBox
->AdjustButtons( (int)vSwp
.x
 
4372                                          ,(int)vSwp
.y 
- nDiff
 
4375                                          ,pRadioBox
->GetSizeFlags() 
4378             if (pWin
->IsKindOf(CLASSINFO(wxSlider
))) 
4382                 pSlider 
= wxDynamicCast(pWin
, wxSlider
); 
4383                 pSlider
->AdjustSubControls( (int)vSwp
.x
 
4384                                            ,(int)vSwp
.y 
- nDiff
 
4387                                            ,(int)pSlider
->GetSizeFlags() 
4393 } // end of wxWindowOS2::MoveChildren 
4396 //  Getting the Y position for a window, like a control, is a real 
4397 //  pain.  There are three sitatuions we must deal with in determining 
4398 //  the OS2 to wxWidgets Y coordinate. 
4400 //  1)  The controls are created in a dialog. 
4401 //      This is the easiest since a dialog is created with its original 
4402 //      size so the standard: Y = ParentHeight - (Y + ControlHeight); 
4404 //  2)  The controls are direct children of a frame 
4405 //      In this instance the controls are actually children of the Frame's 
4406 //      client.  During creation the frame's client resizes several times 
4407 //      during creation of the status bar and toolbars.  The CFrame class 
4408 //      will take care of this using its AlterChildPos proc. 
4410 //  3)  The controls are children of a panel, which in turn is a child of 
4412 //      The panel may be one of many, in which case the same treatment 
4413 //      as 1 applies. It may be the only child, though. 
4414 //      This is the nastiest case.  A panel is created as the only child of 
4415 //      the frame and as such, when a frame has only one child, the child is 
4416 //      expanded to fit the entire client area of the frame.  Because the 
4417 //      controls are created BEFORE this occurs their positions are totally 
4418 //      whacked and any call to WinQueryWindowPos will return invalid 
4419 //      coordinates.  So for this situation we have to compare the size of 
4420 //      the panel at control creation time with that of the frame client.  If 
4421 //      they are the same we can use the standard Y position equation.  If 
4422 //      not, then we must use the Frame Client's dimensions to position them 
4423 //      as that will be the eventual size of the panel after the frame resizes 
4426 int wxWindowOS2::GetOS2ParentHeight( 
4427   wxWindowOS2
*               pParent
 
4433     if (pParent
->IsKindOf(CLASSINFO(wxDialog
))) 
4434         return(pParent
->GetClientSize().y
); 
4437     // Case 2 -- if we are one of the separately built standard Frame 
4438     //           children, like a statusbar, menubar, or toolbar we want to 
4439     //           use the frame, itself, for positioning.  Otherwise we are 
4440     //           child window and want to use the Frame's client. 
4442     else if (pParent
->IsKindOf(CLASSINFO(wxFrame
))) 
4444         if (IsKindOf(CLASSINFO(wxStatusBar
)) || 
4445             IsKindOf(CLASSINFO(wxMenuBar
))   || 
4446             IsKindOf(CLASSINFO(wxToolBar
)) 
4449             if (IsKindOf(CLASSINFO(wxToolBar
))) 
4451                 wxFrame
*            pFrame 
= wxDynamicCast(GetParent(), wxFrame
); 
4453                 if (pFrame
->GetToolBar() == this) 
4454                     return(pParent
->GetSize().y
); 
4456                     return(pParent
->GetClientSize().y
); 
4459                 return(pParent
->GetSize().y
); 
4462             return(pParent
->GetClientSize().y
); 
4465     // Case -- this is for any window that is the sole child of a Frame. 
4466     //         The grandparent must exist and it must be of type CFrame 
4467     //         and it's height must be different. Otherwise the standard 
4472         return(pParent
->GetClientSize().y
); 
4475 } // end of wxWindowOS2::GetOS2ParentHeight 
4478 // OS/2 needs a lot extra manipulation to deal with layouts 
4479 // for canvas windows, particularly scrolled ones. 
4481 wxWindowCreationHook::wxWindowCreationHook( 
4482   wxWindow
*                         pWinBeingCreated
 
4485     gpWinBeingCreated 
= pWinBeingCreated
; 
4486 } // end of wxWindowCreationHook::wxWindowCreationHook 
4488 wxWindowCreationHook::~wxWindowCreationHook() 
4490     gpWinBeingCreated 
= NULL
; 
4491 } // end of wxWindowCreationHook::~wxWindowCreationHook 
4493 // =========================================================================== 
4495 // =========================================================================== 
4501 ,wxFont
*                            WXUNUSED(pTheFont
) 
4508     hPS 
=::WinGetPS(hWnd
); 
4510     rc 
= ::GpiQueryFontMetrics(hPS
, sizeof(FONTMETRICS
), &vFM
); 
4514             *pX 
= vFM
.lAveCharWidth
; 
4516             *pY 
= vFM
.lEmHeight 
+ vFM
.lExternalLeading
; 
4525     ::WinReleasePS(hPS
); 
4526 } // end of wxGetCharSize 
4529 // Returns 0 if was a normal ASCII value, not a special key. This indicates that 
4530 // the key should be ignored by WM_KEYDOWN and processed by WM_CHAR instead. 
4532 int wxCharCodeOS2ToWX( 
4540         case VK_BACKTAB
:    nId 
= WXK_BACK
; break; 
4541         case VK_TAB
:        nId 
= WXK_TAB
; break; 
4542         case VK_CLEAR
:      nId 
= WXK_CLEAR
; break; 
4543         case VK_ENTER
:      nId 
= WXK_RETURN
; break; 
4544         case VK_SHIFT
:      nId 
= WXK_SHIFT
; break; 
4545         case VK_CTRL
:       nId 
= WXK_CONTROL
; break; 
4546         case VK_PAUSE
:      nId 
= WXK_PAUSE
; break; 
4547         case VK_SPACE
:      nId 
= WXK_SPACE
; break; 
4548         case VK_ESC
:        nId 
= WXK_ESCAPE
; break; 
4549         case VK_END
:        nId 
= WXK_END
; break; 
4550         case VK_HOME 
:      nId 
= WXK_HOME
; break; 
4551         case VK_LEFT 
:      nId 
= WXK_LEFT
; break; 
4552         case VK_UP
:         nId 
= WXK_UP
; break; 
4553         case VK_RIGHT
:      nId 
= WXK_RIGHT
; break; 
4554         case VK_DOWN 
:      nId 
= WXK_DOWN
; break; 
4555         case VK_PRINTSCRN
:  nId 
= WXK_PRINT
; break; 
4556         case VK_INSERT
:     nId 
= WXK_INSERT
; break; 
4557         case VK_DELETE
:     nId 
= WXK_DELETE
; break; 
4558         case VK_CAPSLOCK
:   nId 
= WXK_CAPITAL
; break; 
4559         case VK_F1
:         nId 
= WXK_F1
; break; 
4560         case VK_F2
:         nId 
= WXK_F2
; break; 
4561         case VK_F3
:         nId 
= WXK_F3
; break; 
4562         case VK_F4
:         nId 
= WXK_F4
; break; 
4563         case VK_F5
:         nId 
= WXK_F5
; break; 
4564         case VK_F6
:         nId 
= WXK_F6
; break; 
4565         case VK_F7
:         nId 
= WXK_F7
; break; 
4566         case VK_F8
:         nId 
= WXK_F8
; break; 
4567         case VK_F9
:         nId 
= WXK_F9
; break; 
4568         case VK_F10
:        nId 
= WXK_F10
; break; 
4569         case VK_F11
:        nId 
= WXK_F11
; break; 
4570         case VK_F12
:        nId 
= WXK_F12
; break; 
4571         case VK_F13
:        nId 
= WXK_F13
; break; 
4572         case VK_F14
:        nId 
= WXK_F14
; break; 
4573         case VK_F15
:        nId 
= WXK_F15
; break; 
4574         case VK_F16
:        nId 
= WXK_F16
; break; 
4575         case VK_F17
:        nId 
= WXK_F17
; break; 
4576         case VK_F18
:        nId 
= WXK_F18
; break; 
4577         case VK_F19
:        nId 
= WXK_F19
; break; 
4578         case VK_F20
:        nId 
= WXK_F20
; break; 
4579         case VK_F21
:        nId 
= WXK_F21
; break; 
4580         case VK_F22
:        nId 
= WXK_F22
; break; 
4581         case VK_F23
:        nId 
= WXK_F23
; break; 
4582         case VK_F24
:        nId 
= WXK_F24
; break; 
4583         case VK_OEM_1
:      nId 
= ';'; break; 
4584         case VK_OEM_PLUS
:   nId 
= '+'; break; 
4585         case VK_OEM_COMMA
:  nId 
= ','; break; 
4586         case VK_OEM_MINUS
:  nId 
= '-'; break; 
4587         case VK_OEM_PERIOD
: nId 
= '.'; break; 
4588         case VK_OEM_2
:      nId 
= '/'; break; 
4589         case VK_OEM_3
:      nId 
= '~'; break; 
4590         case VK_OEM_4
:      nId 
= '['; break; 
4591         case VK_OEM_5
:      nId 
= '\\'; break; 
4592         case VK_OEM_6
:      nId 
= ']'; break; 
4593         case VK_OEM_7
:      nId 
= '\''; break; 
4594         case VK_NUMLOCK
:    nId 
= WXK_NUMLOCK
; break; 
4595         case VK_SCRLLOCK
:   nId 
= WXK_SCROLL
; break; 
4602 } // end of wxCharCodeOS2ToWX 
4604 int wxCharCodeWXToOS2( 
4614         case WXK_CLEAR
:     nKeySym 
= VK_CLEAR
; break; 
4615         case WXK_SHIFT
:     nKeySym 
= VK_SHIFT
; break; 
4616         case WXK_CONTROL
:   nKeySym 
= VK_CTRL
; break; 
4617         case WXK_PAUSE
:     nKeySym 
= VK_PAUSE
; break; 
4618         case WXK_END
:       nKeySym 
= VK_END
; break; 
4619         case WXK_HOME 
:     nKeySym 
= VK_HOME
; break; 
4620         case WXK_LEFT 
:     nKeySym 
= VK_LEFT
; break; 
4621         case WXK_UP
:        nKeySym 
= VK_UP
; break; 
4622         case WXK_RIGHT
:     nKeySym 
= VK_RIGHT
; break; 
4623         case WXK_DOWN 
:     nKeySym 
= VK_DOWN
; break; 
4624         case WXK_PRINT
:     nKeySym 
= VK_PRINTSCRN
; break; 
4625         case WXK_INSERT
:    nKeySym 
= VK_INSERT
; break; 
4626         case WXK_DELETE
:    nKeySym 
= VK_DELETE
; break; 
4627         case WXK_F1
:        nKeySym 
= VK_F1
; break; 
4628         case WXK_F2
:        nKeySym 
= VK_F2
; break; 
4629         case WXK_F3
:        nKeySym 
= VK_F3
; break; 
4630         case WXK_F4
:        nKeySym 
= VK_F4
; break; 
4631         case WXK_F5
:        nKeySym 
= VK_F5
; break; 
4632         case WXK_F6
:        nKeySym 
= VK_F6
; break; 
4633         case WXK_F7
:        nKeySym 
= VK_F7
; break; 
4634         case WXK_F8
:        nKeySym 
= VK_F8
; break; 
4635         case WXK_F9
:        nKeySym 
= VK_F9
; break; 
4636         case WXK_F10
:       nKeySym 
= VK_F10
; break; 
4637         case WXK_F11
:       nKeySym 
= VK_F11
; break; 
4638         case WXK_F12
:       nKeySym 
= VK_F12
; break; 
4639         case WXK_F13
:       nKeySym 
= VK_F13
; break; 
4640         case WXK_F14
:       nKeySym 
= VK_F14
; break; 
4641         case WXK_F15
:       nKeySym 
= VK_F15
; break; 
4642         case WXK_F16
:       nKeySym 
= VK_F16
; break; 
4643         case WXK_F17
:       nKeySym 
= VK_F17
; break; 
4644         case WXK_F18
:       nKeySym 
= VK_F18
; break; 
4645         case WXK_F19
:       nKeySym 
= VK_F19
; break; 
4646         case WXK_F20
:       nKeySym 
= VK_F20
; break; 
4647         case WXK_F21
:       nKeySym 
= VK_F21
; break; 
4648         case WXK_F22
:       nKeySym 
= VK_F22
; break; 
4649         case WXK_F23
:       nKeySym 
= VK_F23
; break; 
4650         case WXK_F24
:       nKeySym 
= VK_F24
; break; 
4651         case WXK_NUMLOCK
:   nKeySym 
= VK_NUMLOCK
; break; 
4652         case WXK_SCROLL
:    nKeySym 
= VK_SCRLLOCK
; break; 
4655             *bIsVirtual 
= FALSE
; 
4661 } // end of wxCharCodeWXToOS2 
4663 wxWindow
* wxGetActiveWindow() 
4665     HWND                            hWnd 
= ::WinQueryActiveWindow(HWND_DESKTOP
); 
4669         return wxFindWinFromHandle((WXHWND
)hWnd
); 
4672 } // end of wxGetActiveWindow 
4675 const char* wxGetMessageName( 
4680         case 0x0000: return "WM_NULL"; 
4681         case 0x0001: return "WM_CREATE"; 
4682         case 0x0002: return "WM_DESTROY"; 
4683         case 0x0004: return "WM_ENABLE"; 
4684         case 0x0005: return "WM_SHOW"; 
4685         case 0x0006: return "WM_MOVE"; 
4686         case 0x0007: return "WM_SIZE"; 
4687         case 0x0008: return "WM_ADJUSTWINDOWPOS"; 
4688         case 0x0009: return "WM_CALCVALIDRECTS"; 
4689         case 0x000A: return "WM_SETWINDOWPARAMS"; 
4690         case 0x000B: return "WM_QUERYWINDOWPARAMS"; 
4691         case 0x000C: return "WM_HITTEST"; 
4692         case 0x000D: return "WM_ACTIVATE"; 
4693         case 0x000F: return "WM_SETFOCUS"; 
4694         case 0x0010: return "WM_SETSELECTION"; 
4695         case 0x0011: return "WM_PPAINT"; 
4696         case 0x0012: return "WM_PSETFOCUS"; 
4697         case 0x0013: return "WM_PSYSCOLORCHANGE"; 
4698         case 0x0014: return "WM_PSIZE"; 
4699         case 0x0015: return "WM_PACTIVATE"; 
4700         case 0x0016: return "WM_PCONTROL"; 
4701         case 0x0020: return "WM_COMMAND"; 
4702         case 0x0021: return "WM_SYSCOMMAND"; 
4703         case 0x0022: return "WM_HELP"; 
4704         case 0x0023: return "WM_PAINT"; 
4705         case 0x0024: return "WM_TIMER"; 
4706         case 0x0025: return "WM_SEM1"; 
4707         case 0x0026: return "WM_SEM2"; 
4708         case 0x0027: return "WM_SEM3"; 
4709         case 0x0028: return "WM_SEM4"; 
4710         case 0x0029: return "WM_CLOSE"; 
4711         case 0x002A: return "WM_QUIT"; 
4712         case 0x002B: return "WM_SYSCOLORCHANGE"; 
4713         case 0x002D: return "WM_SYSVALUECHANGE"; 
4714         case 0x002E: return "WM_APPTERMINATENOTIFY"; 
4715         case 0x002F: return "WM_PRESPARAMCHANGED"; 
4716         // Control notification messages 
4717         case 0x0030: return "WM_CONTROL"; 
4718         case 0x0031: return "WM_VSCROLL"; 
4719         case 0x0032: return "WM_HSCROLL"; 
4720         case 0x0033: return "WM_INITMENU"; 
4721         case 0x0034: return "WM_MENUSELECT"; 
4722         case 0x0035: return "WM_MENUSEND"; 
4723         case 0x0036: return "WM_DRAWITEM"; 
4724         case 0x0037: return "WM_MEASUREITEM"; 
4725         case 0x0038: return "WM_CONTROLPOINTER"; 
4726         case 0x003A: return "WM_QUERYDLGCODE"; 
4727         case 0x003B: return "WM_INITDLG"; 
4728         case 0x003C: return "WM_SUBSTITUTESTRING"; 
4729         case 0x003D: return "WM_MATCHMNEMONIC"; 
4730         case 0x003E: return "WM_SAVEAPPLICATION"; 
4731         case 0x0129: return "WM_CTLCOLORCHANGE"; 
4732         case 0x0130: return "WM_QUERYCTLTYPE"; 
4734         case 0x0040: return "WM_FLASHWINDOW"; 
4735         case 0x0041: return "WM_FORMATFRAME"; 
4736         case 0x0042: return "WM_UPDATEFRAME"; 
4737         case 0x0043: return "WM_FOCUSCHANGE"; 
4738         case 0x0044: return "WM_SETBORDERSIZE"; 
4739         case 0x0045: return "WM_TRACKFRAME"; 
4740         case 0x0046: return "WM_MINMAXFRAME"; 
4741         case 0x0047: return "WM_SETICON"; 
4742         case 0x0048: return "WM_QUERYICON"; 
4743         case 0x0049: return "WM_SETACCELTABLE"; 
4744         case 0x004A: return "WM_QUERYACCELTABLE"; 
4745         case 0x004B: return "WM_TRANSLATEACCEL"; 
4746         case 0x004C: return "WM_QUERYTRACKINFO"; 
4747         case 0x004D: return "WM_QUERYBORDERSIZE"; 
4748         case 0x004E: return "WM_NEXTMENU"; 
4749         case 0x004F: return "WM_ERASEBACKGROUND"; 
4750         case 0x0050: return "WM_QUERYFRAMEINFO"; 
4751         case 0x0051: return "WM_QUERYFOCUSCHAIN"; 
4752         case 0x0052: return "WM_OWNERPOSCHANGE"; 
4753         case 0x0053: return "WM_CACLFRAMERECT"; 
4754         case 0x0055: return "WM_WINDOWPOSCHANGED"; 
4755         case 0x0056: return "WM_ADJUSTFRAMEPOS"; 
4756         case 0x0059: return "WM_QUERYFRAMECTLCOUNT"; 
4757         case 0x005B: return "WM_QUERYHELPINFO"; 
4758         case 0x005C: return "WM_SETHELPINFO"; 
4759         case 0x005D: return "WM_ERROR"; 
4760         case 0x005E: return "WM_REALIZEPALETTE"; 
4761         // Clipboard messages 
4762         case 0x0060: return "WM_RENDERFMT"; 
4763         case 0x0061: return "WM_RENDERALLFMTS"; 
4764         case 0x0062: return "WM_DESTROYCLIPBOARD"; 
4765         case 0x0063: return "WM_PAINTCLIPBOARD"; 
4766         case 0x0064: return "WM_SIZECLIPBOARD"; 
4767         case 0x0065: return "WM_HSCROLLCLIPBOARD"; 
4768         case 0x0066: return "WM_VSCROLLCLIPBOARD"; 
4769         case 0x0067: return "WM_DRAWCLIPBOARD"; 
4771         case 0x0070: return "WM_MOUSEMOVE"; 
4772         case 0x0071: return "WM_BUTTON1DOWN"; 
4773         case 0x0072: return "WM_BUTTON1UP"; 
4774         case 0x0073: return "WM_BUTTON1DBLCLK"; 
4775         case 0x0074: return "WM_BUTTON2DOWN"; 
4776         case 0x0075: return "WM_BUTTON2UP"; 
4777         case 0x0076: return "WM_BUTTON2DBLCLK"; 
4778         case 0x0077: return "WM_BUTTON3DOWN"; 
4779         case 0x0078: return "WM_BUTTON3UP"; 
4780         case 0x0079: return "WM_BUTTON3DBLCLK"; 
4781         case 0x007D: return "WM_MOUSEMAP"; 
4782         case 0x007E: return "WM_VRNDISABLED"; 
4783         case 0x007F: return "WM_VRNENABLED"; 
4784         case 0x0410: return "WM_CHORD"; 
4785         case 0x0411: return "WM_BUTTON1MOTIONSTART"; 
4786         case 0x0412: return "WM_BUTTON1MOTIONEND"; 
4787         case 0x0413: return "WM_BUTTON1CLICK"; 
4788         case 0x0414: return "WM_BUTTON2MOTIONSTART"; 
4789         case 0x0415: return "WM_BUTTON2MOTIONEND"; 
4790         case 0x0416: return "WM_BUTTON2CLICK"; 
4791         case 0x0417: return "WM_BUTTON3MOTIONSTART"; 
4792         case 0x0418: return "WM_BUTTON3MOTIONEND"; 
4793         case 0x0419: return "WM_BUTTON3CLICK"; 
4794         case 0x0420: return "WM_BEGINDRAG"; 
4795         case 0x0421: return "WM_ENDDRAG"; 
4796         case 0x0422: return "WM_SINGLESELECT"; 
4797         case 0x0423: return "WM_OPEN"; 
4798         case 0x0424: return "WM_CONTEXTMENU"; 
4799         case 0x0425: return "WM_CONTEXTHELP"; 
4800         case 0x0426: return "WM_TEXTEDIT"; 
4801         case 0x0427: return "WM_BEGINSELECT"; 
4802         case 0x0228: return "WM_ENDSELECT"; 
4803         case 0x0429: return "WM_PICKUP"; 
4804         case 0x04C0: return "WM_PENFIRST"; 
4805         case 0x04FF: return "WM_PENLAST"; 
4806         case 0x0500: return "WM_MMPMFIRST"; 
4807         case 0x05FF: return "WM_MMPMLAST"; 
4808         case 0x0600: return "WM_STDDLGFIRST"; 
4809         case 0x06FF: return "WM_STDDLGLAST"; 
4810         case 0x0BD0: return "WM_BIDI_FIRST"; 
4811         case 0x0BFF: return "WM_BIDI_LAST"; 
4813         case 0x007A: return "WM_CHAR"; 
4814         case 0x007B: return "WM_VIOCHAR"; 
4816         case 0x00A0: return "WM_DDE_INITIATE"; 
4817         case 0x00A1: return "WM_DDE_REQUEST"; 
4818         case 0x00A2: return "WM_DDE_ACK"; 
4819         case 0x00A3: return "WM_DDE_DATA"; 
4820         case 0x00A4: return "WM_DDE_ADVISE"; 
4821         case 0x00A5: return "WM_DDE_UNADVISE"; 
4822         case 0x00A6: return "WM_DDE_POKE"; 
4823         case 0x00A7: return "WM_DDE_EXECUTE"; 
4824         case 0x00A8: return "WM_DDE_TERMINATE"; 
4825         case 0x00A9: return "WM_DDE_INITIATEACK"; 
4826         case 0x00AF: return "WM_DDE_LAST"; 
4828         case 0x0120: return "BM_CLICK"; 
4829         case 0x0121: return "BM_QUERYCHECKINDEX"; 
4830         case 0x0122: return "BM_QUERYHILITE"; 
4831         case 0x0123: return "BM_SETHILITE"; 
4832         case 0x0124: return "BM_QUERYCHECK"; 
4833         case 0x0125: return "BM_SETCHECK"; 
4834         case 0x0126: return "BM_SETDEFAULT"; 
4835         case 0x0128: return "BM_AUTOSIZE"; 
4837         case 0x029A: return "CBID_LIST"; 
4838         case 0x029B: return "CBID_EDIT"; 
4839         case 0x0170: return "CBM_SHOWLIST"; 
4840         case 0x0171: return "CBM_HILITE"; 
4841         case 0x0172: return "CBM_ISLISTSHOWING"; 
4843         case 0x0140: return "EM_QUERYCHANGED"; 
4844         case 0x0141: return "EM_QUERYSEL"; 
4845         case 0x0142: return "EM_SETSEL"; 
4846         case 0x0143: return "EM_SETTEXTLIMIT"; 
4847         case 0x0144: return "EM_CUT"; 
4848         case 0x0145: return "EM_COPY"; 
4849         case 0x0146: return "EM_CLEAR"; 
4850         case 0x0147: return "EM_PASTE"; 
4851         case 0x0148: return "EM_QUERYFIRSTCHAR"; 
4852         case 0x0149: return "EM_SETFIRSTCHAR"; 
4853         case 0x014A: return "EM_QUERYREADONLY"; 
4854         case 0x014B: return "EM_SETREADONLY"; 
4855         case 0x014C: return "EM_SETINSERTMODE"; 
4857         case 0x0160: return "LM_QUERYITEMCOUNT"; 
4858         case 0x0161: return "LM_INSERTITEM"; 
4859         case 0x0162: return "LM_SETOPENINDEX"; 
4860         case 0x0163: return "LM_DELETEITEM"; 
4861         case 0x0164: return "LM_SELECTITEM"; 
4862         case 0x0165: return "LM_QUERYSELECTION"; 
4863         case 0x0166: return "LM_SETITEMTEXT"; 
4864         case 0x0167: return "LM_QUERYITEMTEXTLENGTH"; 
4865         case 0x0168: return "LM_QUERYITEMTEXT"; 
4866         case 0x0169: return "LM_SETITEMHANDLE"; 
4867         case 0x016A: return "LM_QUERYITEMHANDLE"; 
4868         case 0x016B: return "LM_SEARCHSTRING"; 
4869         case 0x016C: return "LM_SETITEMHEIGHT"; 
4870         case 0x016D: return "LM_QUERYTOPINDEX"; 
4871         case 0x016E: return "LM_DELETEALL"; 
4872         case 0x016F: return "LM_INSERTMULITEMS"; 
4873         case 0x0660: return "LM_SETITEMWIDTH"; 
4875         case 0x0180: return "MM_INSERTITEM"; 
4876         case 0x0181: return "MM_DELETEITEM"; 
4877         case 0x0182: return "MM_QUERYITEM"; 
4878         case 0x0183: return "MM_SETITEM"; 
4879         case 0x0184: return "MM_QUERYITEMCOUNT"; 
4880         case 0x0185: return "MM_STARTMENUMODE"; 
4881         case 0x0186: return "MM_ENDMENUMODE"; 
4882         case 0x0188: return "MM_REMOVEITEM"; 
4883         case 0x0189: return "MM_SELECTITEM"; 
4884         case 0x018A: return "MM_QUERYSELITEMID"; 
4885         case 0x018B: return "MM_QUERYITEMTEXT"; 
4886         case 0x018C: return "MM_QUERYITEMTEXTLENGTH"; 
4887         case 0x018D: return "MM_SETITEMHANDLE"; 
4888         case 0x018E: return "MM_SETITEMTEXT"; 
4889         case 0x018F: return "MM_ITEMPOSITIONFROMID"; 
4890         case 0x0190: return "MM_ITEMIDFROMPOSITION"; 
4891         case 0x0191: return "MM_QUERYITEMATTR"; 
4892         case 0x0192: return "MM_SETITEMATTR"; 
4893         case 0x0193: return "MM_ISITEMVALID"; 
4894         case 0x0194: return "MM_QUERYITEMRECT"; 
4895         case 0x0431: return "MM_QUERYDEFAULTITEMID"; 
4896         case 0x0432: return "MM_SETDEFAULTITEMID"; 
4898         case 0x01A0: return "SBM_SETSCROLLBAR"; 
4899         case 0x01A1: return "SBM_SETPOS"; 
4900         case 0x01A2: return "SBM_QUERYPOS"; 
4901         case 0x01A3: return "SBM_QUERYRANGE"; 
4902         case 0x01A6: return "SBM_SETTHUMBSIZE"; 
4905         case 0x0F00: return "WM_HELPBASE"; 
4906         case 0x0FFF: return "WM_HELPTOP"; 
4907         // Beginning of user defined messages 
4908         case 0x1000: return "WM_USER"; 
4910         // wxWidgets user defined types 
4913         // case 0x1000 + 0: return "LVM_GETBKCOLOR"; 
4914         case 0x1000 + 1: return "LVM_SETBKCOLOR"; 
4915         case 0x1000 + 2: return "LVM_GETIMAGELIST"; 
4916         case 0x1000 + 3: return "LVM_SETIMAGELIST"; 
4917         case 0x1000 + 4: return "LVM_GETITEMCOUNT"; 
4918         case 0x1000 + 5: return "LVM_GETITEMA"; 
4919         case 0x1000 + 75: return "LVM_GETITEMW"; 
4920         case 0x1000 + 6: return "LVM_SETITEMA"; 
4921         case 0x1000 + 76: return "LVM_SETITEMW"; 
4922         case 0x1000 + 7: return "LVM_INSERTITEMA"; 
4923         case 0x1000 + 77: return "LVM_INSERTITEMW"; 
4924         case 0x1000 + 8: return "LVM_DELETEITEM"; 
4925         case 0x1000 + 9: return "LVM_DELETEALLITEMS"; 
4926         case 0x1000 + 10: return "LVM_GETCALLBACKMASK"; 
4927         case 0x1000 + 11: return "LVM_SETCALLBACKMASK"; 
4928         case 0x1000 + 12: return "LVM_GETNEXTITEM"; 
4929         case 0x1000 + 13: return "LVM_FINDITEMA"; 
4930         case 0x1000 + 83: return "LVM_FINDITEMW"; 
4931         case 0x1000 + 14: return "LVM_GETITEMRECT"; 
4932         case 0x1000 + 15: return "LVM_SETITEMPOSITION"; 
4933         case 0x1000 + 16: return "LVM_GETITEMPOSITION"; 
4934         case 0x1000 + 17: return "LVM_GETSTRINGWIDTHA"; 
4935         case 0x1000 + 87: return "LVM_GETSTRINGWIDTHW"; 
4936         case 0x1000 + 18: return "LVM_HITTEST"; 
4937         case 0x1000 + 19: return "LVM_ENSUREVISIBLE"; 
4938         case 0x1000 + 20: return "LVM_SCROLL"; 
4939         case 0x1000 + 21: return "LVM_REDRAWITEMS"; 
4940         case 0x1000 + 22: return "LVM_ARRANGE"; 
4941         case 0x1000 + 23: return "LVM_EDITLABELA"; 
4942         case 0x1000 + 118: return "LVM_EDITLABELW"; 
4943         case 0x1000 + 24: return "LVM_GETEDITCONTROL"; 
4944         case 0x1000 + 25: return "LVM_GETCOLUMNA"; 
4945         case 0x1000 + 95: return "LVM_GETCOLUMNW"; 
4946         case 0x1000 + 26: return "LVM_SETCOLUMNA"; 
4947         case 0x1000 + 96: return "LVM_SETCOLUMNW"; 
4948         case 0x1000 + 27: return "LVM_INSERTCOLUMNA"; 
4949         case 0x1000 + 97: return "LVM_INSERTCOLUMNW"; 
4950         case 0x1000 + 28: return "LVM_DELETECOLUMN"; 
4951         case 0x1000 + 29: return "LVM_GETCOLUMNWIDTH"; 
4952         case 0x1000 + 30: return "LVM_SETCOLUMNWIDTH"; 
4953         case 0x1000 + 31: return "LVM_GETHEADER"; 
4954         case 0x1000 + 33: return "LVM_CREATEDRAGIMAGE"; 
4955         case 0x1000 + 34: return "LVM_GETVIEWRECT"; 
4956         case 0x1000 + 35: return "LVM_GETTEXTCOLOR"; 
4957         case 0x1000 + 36: return "LVM_SETTEXTCOLOR"; 
4958         case 0x1000 + 37: return "LVM_GETTEXTBKCOLOR"; 
4959         case 0x1000 + 38: return "LVM_SETTEXTBKCOLOR"; 
4960         case 0x1000 + 39: return "LVM_GETTOPINDEX"; 
4961         case 0x1000 + 40: return "LVM_GETCOUNTPERPAGE"; 
4962         case 0x1000 + 41: return "LVM_GETORIGIN"; 
4963         case 0x1000 + 42: return "LVM_UPDATE"; 
4964         case 0x1000 + 43: return "LVM_SETITEMSTATE"; 
4965         case 0x1000 + 44: return "LVM_GETITEMSTATE"; 
4966         case 0x1000 + 45: return "LVM_GETITEMTEXTA"; 
4967         case 0x1000 + 115: return "LVM_GETITEMTEXTW"; 
4968         case 0x1000 + 46: return "LVM_SETITEMTEXTA"; 
4969         case 0x1000 + 116: return "LVM_SETITEMTEXTW"; 
4970         case 0x1000 + 47: return "LVM_SETITEMCOUNT"; 
4971         case 0x1000 + 48: return "LVM_SORTITEMS"; 
4972         case 0x1000 + 49: return "LVM_SETITEMPOSITION32"; 
4973         case 0x1000 + 50: return "LVM_GETSELECTEDCOUNT"; 
4974         case 0x1000 + 51: return "LVM_GETITEMSPACING"; 
4975         case 0x1000 + 52: return "LVM_GETISEARCHSTRINGA"; 
4976         case 0x1000 + 117: return "LVM_GETISEARCHSTRINGW"; 
4977         case 0x1000 + 53: return "LVM_SETICONSPACING"; 
4978         case 0x1000 + 54: return "LVM_SETEXTENDEDLISTVIEWSTYLE"; 
4979         case 0x1000 + 55: return "LVM_GETEXTENDEDLISTVIEWSTYLE"; 
4980         case 0x1000 + 56: return "LVM_GETSUBITEMRECT"; 
4981         case 0x1000 + 57: return "LVM_SUBITEMHITTEST"; 
4982         case 0x1000 + 58: return "LVM_SETCOLUMNORDERARRAY"; 
4983         case 0x1000 + 59: return "LVM_GETCOLUMNORDERARRAY"; 
4984         case 0x1000 + 60: return "LVM_SETHOTITEM"; 
4985         case 0x1000 + 61: return "LVM_GETHOTITEM"; 
4986         case 0x1000 + 62: return "LVM_SETHOTCURSOR"; 
4987         case 0x1000 + 63: return "LVM_GETHOTCURSOR"; 
4988         case 0x1000 + 64: return "LVM_APPROXIMATEVIEWRECT"; 
4989         case 0x1000 + 65: return "LVM_SETWORKAREA"; 
4992         case 0x1100 + 0: return "TVM_INSERTITEMA"; 
4993         case 0x1100 + 50: return "TVM_INSERTITEMW"; 
4994         case 0x1100 + 1: return "TVM_DELETEITEM"; 
4995         case 0x1100 + 2: return "TVM_EXPAND"; 
4996         case 0x1100 + 4: return "TVM_GETITEMRECT"; 
4997         case 0x1100 + 5: return "TVM_GETCOUNT"; 
4998         case 0x1100 + 6: return "TVM_GETINDENT"; 
4999         case 0x1100 + 7: return "TVM_SETINDENT"; 
5000         case 0x1100 + 8: return "TVM_GETIMAGELIST"; 
5001         case 0x1100 + 9: return "TVM_SETIMAGELIST"; 
5002         case 0x1100 + 10: return "TVM_GETNEXTITEM"; 
5003         case 0x1100 + 11: return "TVM_SELECTITEM"; 
5004         case 0x1100 + 12: return "TVM_GETITEMA"; 
5005         case 0x1100 + 62: return "TVM_GETITEMW"; 
5006         case 0x1100 + 13: return "TVM_SETITEMA"; 
5007         case 0x1100 + 63: return "TVM_SETITEMW"; 
5008         case 0x1100 + 14: return "TVM_EDITLABELA"; 
5009         case 0x1100 + 65: return "TVM_EDITLABELW"; 
5010         case 0x1100 + 15: return "TVM_GETEDITCONTROL"; 
5011         case 0x1100 + 16: return "TVM_GETVISIBLECOUNT"; 
5012         case 0x1100 + 17: return "TVM_HITTEST"; 
5013         case 0x1100 + 18: return "TVM_CREATEDRAGIMAGE"; 
5014         case 0x1100 + 19: return "TVM_SORTCHILDREN"; 
5015         case 0x1100 + 20: return "TVM_ENSUREVISIBLE"; 
5016         case 0x1100 + 21: return "TVM_SORTCHILDRENCB"; 
5017         case 0x1100 + 22: return "TVM_ENDEDITLABELNOW"; 
5018         case 0x1100 + 23: return "TVM_GETISEARCHSTRINGA"; 
5019         case 0x1100 + 64: return "TVM_GETISEARCHSTRINGW"; 
5020         case 0x1100 + 24: return "TVM_SETTOOLTIPS"; 
5021         case 0x1100 + 25: return "TVM_GETTOOLTIPS"; 
5024         case 0x1200 + 0: return "HDM_GETITEMCOUNT"; 
5025         case 0x1200 + 1: return "HDM_INSERTITEMA"; 
5026         case 0x1200 + 10: return "HDM_INSERTITEMW"; 
5027         case 0x1200 + 2: return "HDM_DELETEITEM"; 
5028         case 0x1200 + 3: return "HDM_GETITEMA"; 
5029         case 0x1200 + 11: return "HDM_GETITEMW"; 
5030         case 0x1200 + 4: return "HDM_SETITEMA"; 
5031         case 0x1200 + 12: return "HDM_SETITEMW"; 
5032         case 0x1200 + 5: return "HDM_LAYOUT"; 
5033         case 0x1200 + 6: return "HDM_HITTEST"; 
5034         case 0x1200 + 7: return "HDM_GETITEMRECT"; 
5035         case 0x1200 + 8: return "HDM_SETIMAGELIST"; 
5036         case 0x1200 + 9: return "HDM_GETIMAGELIST"; 
5037         case 0x1200 + 15: return "HDM_ORDERTOINDEX"; 
5038         case 0x1200 + 16: return "HDM_CREATEDRAGIMAGE"; 
5039         case 0x1200 + 17: return "HDM_GETORDERARRAY"; 
5040         case 0x1200 + 18: return "HDM_SETORDERARRAY"; 
5041         case 0x1200 + 19: return "HDM_SETHOTDIVIDER"; 
5044         case 0x1300 + 2: return "TCM_GETIMAGELIST"; 
5045         case 0x1300 + 3: return "TCM_SETIMAGELIST"; 
5046         case 0x1300 + 4: return "TCM_GETITEMCOUNT"; 
5047         case 0x1300 + 5: return "TCM_GETITEMA"; 
5048         case 0x1300 + 60: return "TCM_GETITEMW"; 
5049         case 0x1300 + 6: return "TCM_SETITEMA"; 
5050         case 0x1300 + 61: return "TCM_SETITEMW"; 
5051         case 0x1300 + 7: return "TCM_INSERTITEMA"; 
5052         case 0x1300 + 62: return "TCM_INSERTITEMW"; 
5053         case 0x1300 + 8: return "TCM_DELETEITEM"; 
5054         case 0x1300 + 9: return "TCM_DELETEALLITEMS"; 
5055         case 0x1300 + 10: return "TCM_GETITEMRECT"; 
5056         case 0x1300 + 11: return "TCM_GETCURSEL"; 
5057         case 0x1300 + 12: return "TCM_SETCURSEL"; 
5058         case 0x1300 + 13: return "TCM_HITTEST"; 
5059         case 0x1300 + 14: return "TCM_SETITEMEXTRA"; 
5060         case 0x1300 + 40: return "TCM_ADJUSTRECT"; 
5061         case 0x1300 + 41: return "TCM_SETITEMSIZE"; 
5062         case 0x1300 + 42: return "TCM_REMOVEIMAGE"; 
5063         case 0x1300 + 43: return "TCM_SETPADDING"; 
5064         case 0x1300 + 44: return "TCM_GETROWCOUNT"; 
5065         case 0x1300 + 45: return "TCM_GETTOOLTIPS"; 
5066         case 0x1300 + 46: return "TCM_SETTOOLTIPS"; 
5067         case 0x1300 + 47: return "TCM_GETCURFOCUS"; 
5068         case 0x1300 + 48: return "TCM_SETCURFOCUS"; 
5069         case 0x1300 + 49: return "TCM_SETMINTABWIDTH"; 
5070         case 0x1300 + 50: return "TCM_DESELECTALL"; 
5073         case WM_USER
+1000+1: return "TB_ENABLEBUTTON"; 
5074         case WM_USER
+1000+2: return "TB_CHECKBUTTON"; 
5075         case WM_USER
+1000+3: return "TB_PRESSBUTTON"; 
5076         case WM_USER
+1000+4: return "TB_HIDEBUTTON"; 
5077         case WM_USER
+1000+5: return "TB_INDETERMINATE"; 
5078         case WM_USER
+1000+9: return "TB_ISBUTTONENABLED"; 
5079         case WM_USER
+1000+10: return "TB_ISBUTTONCHECKED"; 
5080         case WM_USER
+1000+11: return "TB_ISBUTTONPRESSED"; 
5081         case WM_USER
+1000+12: return "TB_ISBUTTONHIDDEN"; 
5082         case WM_USER
+1000+13: return "TB_ISBUTTONINDETERMINATE"; 
5083         case WM_USER
+1000+17: return "TB_SETSTATE"; 
5084         case WM_USER
+1000+18: return "TB_GETSTATE"; 
5085         case WM_USER
+1000+19: return "TB_ADDBITMAP"; 
5086         case WM_USER
+1000+20: return "TB_ADDBUTTONS"; 
5087         case WM_USER
+1000+21: return "TB_INSERTBUTTON"; 
5088         case WM_USER
+1000+22: return "TB_DELETEBUTTON"; 
5089         case WM_USER
+1000+23: return "TB_GETBUTTON"; 
5090         case WM_USER
+1000+24: return "TB_BUTTONCOUNT"; 
5091         case WM_USER
+1000+25: return "TB_COMMANDTOINDEX"; 
5092         case WM_USER
+1000+26: return "TB_SAVERESTOREA"; 
5093         case WM_USER
+1000+76: return "TB_SAVERESTOREW"; 
5094         case WM_USER
+1000+27: return "TB_CUSTOMIZE"; 
5095         case WM_USER
+1000+28: return "TB_ADDSTRINGA"; 
5096         case WM_USER
+1000+77: return "TB_ADDSTRINGW"; 
5097         case WM_USER
+1000+29: return "TB_GETITEMRECT"; 
5098         case WM_USER
+1000+30: return "TB_BUTTONSTRUCTSIZE"; 
5099         case WM_USER
+1000+31: return "TB_SETBUTTONSIZE"; 
5100         case WM_USER
+1000+32: return "TB_SETBITMAPSIZE"; 
5101         case WM_USER
+1000+33: return "TB_AUTOSIZE"; 
5102         case WM_USER
+1000+35: return "TB_GETTOOLTIPS"; 
5103         case WM_USER
+1000+36: return "TB_SETTOOLTIPS"; 
5104         case WM_USER
+1000+37: return "TB_SETPARENT"; 
5105         case WM_USER
+1000+39: return "TB_SETROWS"; 
5106         case WM_USER
+1000+40: return "TB_GETROWS"; 
5107         case WM_USER
+1000+42: return "TB_SETCMDID"; 
5108         case WM_USER
+1000+43: return "TB_CHANGEBITMAP"; 
5109         case WM_USER
+1000+44: return "TB_GETBITMAP"; 
5110         case WM_USER
+1000+45: return "TB_GETBUTTONTEXTA"; 
5111         case WM_USER
+1000+75: return "TB_GETBUTTONTEXTW"; 
5112         case WM_USER
+1000+46: return "TB_REPLACEBITMAP"; 
5113         case WM_USER
+1000+47: return "TB_SETINDENT"; 
5114         case WM_USER
+1000+48: return "TB_SETIMAGELIST"; 
5115         case WM_USER
+1000+49: return "TB_GETIMAGELIST"; 
5116         case WM_USER
+1000+50: return "TB_LOADIMAGES"; 
5117         case WM_USER
+1000+51: return "TB_GETRECT"; 
5118         case WM_USER
+1000+52: return "TB_SETHOTIMAGELIST"; 
5119         case WM_USER
+1000+53: return "TB_GETHOTIMAGELIST"; 
5120         case WM_USER
+1000+54: return "TB_SETDISABLEDIMAGELIST"; 
5121         case WM_USER
+1000+55: return "TB_GETDISABLEDIMAGELIST"; 
5122         case WM_USER
+1000+56: return "TB_SETSTYLE"; 
5123         case WM_USER
+1000+57: return "TB_GETSTYLE"; 
5124         case WM_USER
+1000+58: return "TB_GETBUTTONSIZE"; 
5125         case WM_USER
+1000+59: return "TB_SETBUTTONWIDTH"; 
5126         case WM_USER
+1000+60: return "TB_SETMAXTEXTROWS"; 
5127         case WM_USER
+1000+61: return "TB_GETTEXTROWS"; 
5128         case WM_USER
+1000+41: return "TB_GETBITMAPFLAGS"; 
5131             static char s_szBuf
[128]; 
5132             sprintf(s_szBuf
, "<unknown message = %d>", nMessage
); 
5136 } // end of wxGetMessageName 
5138 #endif // __WXDEBUG__ 
5142 static void TranslateKbdEventToMouse( 
5150     // Construct the key mask 
5151     ULONG
&                          fwKeys 
= *pFlags
; 
5153     fwKeys 
= VK_BUTTON2
; 
5154     if ((::WinGetKeyState(HWND_DESKTOP
, VK_CTRL
) & 0x100) != 0) 
5156     if ((::WinGetKeyState(HWND_DESKTOP
, VK_SHIFT
) & 0x100) != 0) 
5160     // Simulate right mouse button click 
5164     ::WinQueryMsgPos(vHabmain
, &vPoint
); 
5168     pWin
->ScreenToClient(pX
, pY
); 
5169 } // end of TranslateKbdEventToMouse 
5172 // Find the wxWindow at the current mouse position, returning the mouse 
5174 wxWindow
* wxFindWindowAtPointer( 
5175   wxPoint
&                          WXUNUSED(rPt
) 
5178     return wxFindWindowAtPoint(wxGetMousePosition()); 
5181 wxWindow
* wxFindWindowAtPoint( 
5190     HWND                            hWndHit 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt2
, FALSE
); 
5191     wxWindow
*                       pWin 
= wxFindWinFromHandle((WXHWND
)hWndHit
) ; 
5192     HWND                            hWnd 
= hWndHit
; 
5195     // Try to find a window with a wxWindow associated with it 
5197     while (!pWin 
&& (hWnd 
!= 0)) 
5199         hWnd 
= ::WinQueryWindow(hWnd
, QW_PARENT
); 
5200         pWin 
= wxFindWinFromHandle((WXHWND
)hWnd
) ; 
5205 // Get the current mouse position. 
5206 wxPoint 
wxGetMousePosition() 
5210     ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
); 
5211     return wxPoint(vPt
.x
, vPt
.y
); 
5214 wxWindowOS2
* FindWindowForMouseEvent( 
5220     HWND                            hWnd 
= GetHwndOf(pWin
); 
5221     HWND                            hWndUnderMouse
; 
5223     BOOL                            rcEnabled 
= FALSE
; 
5224     BOOL                            rcVisible 
= FALSE
; 
5226     ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
5227     hWndUnderMouse 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, TRUE
); 
5228     if (hWndUnderMouse 
!= HWND_DESKTOP
) 
5230         wxWindow
*                   pWinUnderMouse 
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
); 
5234             wxWindowList::Node
*     pCurrent 
= pWinUnderMouse
->GetChildren().GetFirst(); 
5235             wxWindow
*               pGrandChild 
= NULL
; 
5239             ::WinMapWindowPoints(HWND_DESKTOP
, hWndUnderMouse
, &vPoint
, 1); 
5241             // Find a child window mouse might be under 
5245                 wxWindow
*                   pChild 
= pCurrent
->GetData(); 
5247                 vPoint2
.x 
= vPoint
.x
; 
5248                 vPoint2
.y 
= vPoint
.y
; 
5249                 ::WinMapWindowPoints(hWndUnderMouse
, pChild
->GetHWND(), &vPoint2
, 1); 
5250                 ::WinQueryWindowRect(pChild
->GetHWND(), &vRect
); 
5251                 if (::WinPtInRect(vHabmain
, &vRect
, &vPoint2
)) 
5253                     if (pChild
->IsTopLevel()) 
5256                         wxWindowList::Node
*     pCurrent2 
=pChild
->GetChildren().GetFirst(); 
5260                             wxWindow
*           pGrandChild 
= pCurrent2
->GetData(); 
5262                             vPoint3
.x 
= vPoint2
.x
; 
5263                             vPoint3
.y 
= vPoint2
.y
; 
5264                             ::WinMapWindowPoints( pChild
->GetHWND() 
5265                                                  ,pGrandChild
->GetHWND() 
5269                             ::WinQueryWindowRect(pGrandChild
->GetHWND(), &vRect
); 
5270                             if (::WinPtInRect(vHabmain
, &vRect
, &vPoint3
)) 
5272                                 hWndUnderMouse 
= GetHwndOf(pGrandChild
); 
5273                                 pWinUnderMouse 
= pGrandChild
; 
5276                             pCurrent2 
= pCurrent2
->GetNext(); 
5281                     hWndUnderMouse 
= GetHwndOf(pChild
); 
5282                     pWinUnderMouse 
= pChild
; 
5283                     rcVisible 
= ::WinIsWindowVisible(hWndUnderMouse
); 
5284                     rcEnabled 
= ::WinIsWindowEnabled(hWndUnderMouse
); 
5285                     if (rcVisible 
&& rcEnabled
) 
5288                 pCurrent 
= pCurrent
->GetNext(); 
5292     rcVisible 
= ::WinIsWindowVisible(hWndUnderMouse
); 
5293     rcEnabled 
= ::WinIsWindowEnabled(hWndUnderMouse
); 
5297     // Check that we have a child window which is susceptible to receive mouse 
5298     // events: for this it must be shown and enabled 
5300     if ( hWndUnderMouse 
&& 
5301          hWndUnderMouse 
!= hWnd 
&& 
5302          rcVisible 
&& rcEnabled
) 
5304         wxWindow
*                       pWinUnderMouse 
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
); 
5309             // Translate the mouse coords to the other window coords 
5311             pWin 
= pWinUnderMouse
; 
5315 } // end of FindWindowForMouseEvent