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 // --------------------------------------------------------------------------- 
 133 // --------------------------------------------------------------------------- 
 136 // the window proc for all our windows; most gui's have something similar 
 138 MRESULT EXPENTRY 
wxWndProc( HWND hWnd
 
 145     const char *wxGetMessageName(int message
); 
 148 wxWindowOS2
* FindWindowForMouseEvent( wxWindow
* pWin
 
 152 void         wxRemoveHandleAssociation(wxWindowOS2
* pWin
); 
 153 void         wxAssociateWinWithHandle( HWND         hWnd
 
 156 wxWindow
* wxFindWinFromHandle(WXHWND hWnd
); 
 159 // get the current state of SHIFT/CTRL keys 
 161 static inline bool IsShiftDown() { return (::WinGetKeyState(HWND_DESKTOP
, VK_SHIFT
) & 0x8000) != 0; } 
 162 static inline bool IsCtrlDown() { return (::WinGetKeyState(HWND_DESKTOP
, VK_CTRL
) & 0x8000) != 0; } 
 164 static wxWindow
*                    gpWinBeingCreated 
= NULL
; 
 166 // --------------------------------------------------------------------------- 
 168 // --------------------------------------------------------------------------- 
 170 // in wxUniv-OS/2 this class is abstract because it doesn't have DoPopupMenu() 
 172 #ifdef __WXUNIVERSAL__ 
 173     IMPLEMENT_ABSTRACT_CLASS(wxWindowOS2
, wxWindowBase
) 
 175     IMPLEMENT_DYNAMIC_CLASS(wxWindow
, wxWindowBase
) 
 176 #endif // __WXUNIVERSAL__/__WXPM__ 
 178 BEGIN_EVENT_TABLE(wxWindowOS2
, wxWindowBase
) 
 179     EVT_ERASE_BACKGROUND(wxWindowOS2::OnEraseBackground
) 
 180     EVT_SYS_COLOUR_CHANGED(wxWindowOS2::OnSysColourChanged
) 
 181     EVT_IDLE(wxWindowOS2::OnIdle
) 
 182     EVT_SET_FOCUS(wxWindowOS2::OnSetFocus
) 
 185 // =========================================================================== 
 187 // =========================================================================== 
 189 // --------------------------------------------------------------------------- 
 190 // wxWindow utility functions 
 191 // --------------------------------------------------------------------------- 
 194 // Find an item given the PM Window id 
 196 wxWindow
* wxWindowOS2::FindItem( 
 201     wxControl
*                      pItem 
= wxDynamicCast(this, wxControl
); 
 206         // I it we or one of our "internal" children? 
 208         if (pItem
->GetId() == lId
 
 209 #ifndef __WXUNIVERSAL__ 
 210             || (pItem
->GetSubcontrols().Index(lId
) != wxNOT_FOUND
) 
 217 #endif // wxUSE_CONTROLS 
 219     wxWindowList::compatibility_iterator  current 
= GetChildren().GetFirst(); 
 223         wxWindow
*                   pChildWin 
= current
->GetData(); 
 224         wxWindow
*                   pWnd 
= pChildWin
->FindItem(lId
); 
 229         current 
= current
->GetNext(); 
 232 } // end of wxWindowOS2::FindItem 
 235 // Find an item given the PM Window handle 
 237 wxWindow
* wxWindowOS2::FindItemByHWND( 
 242     wxWindowList::compatibility_iterator current 
= GetChildren().GetFirst(); 
 246         wxWindow
*                   pParent 
= current
->GetData(); 
 249         // Do a recursive search. 
 251         wxWindow
*                   pWnd 
= pParent
->FindItemByHWND(hWnd
); 
 258             || pParent
->IsKindOf(CLASSINFO(wxControl
)) 
 259 #endif // wxUSE_CONTROLS 
 262             wxWindow
*               pItem 
= current
->GetData(); 
 264             if (pItem
->GetHWND() == hWnd
) 
 268                 if (pItem
->ContainsHWND(hWnd
)) 
 272         current 
= current
->GetNext(); 
 275 } // end of wxWindowOS2::FindItemByHWND 
 278 // Default command handler 
 280 bool wxWindowOS2::OS2Command( 
 281   WXUINT                            
WXUNUSED(uParam
) 
 282 , WXWORD                            
WXUNUSED(uId
) 
 288 // ---------------------------------------------------------------------------- 
 289 // constructors and such 
 290 // ---------------------------------------------------------------------------- 
 292 void wxWindowOS2::Init() 
 297     m_bWinCaptured 
= FALSE
; 
 299     m_fnOldWndProc          
= NULL
; 
 301     m_bMouseInWindow        
= FALSE
; 
 302     m_bLastKeydownProcessed 
= FALSE
; 
 303     m_pChildrenDisabled     
= NULL
; 
 310     m_hWndScrollBarHorz 
= 0L; 
 311     m_hWndScrollBarVert 
= 0L; 
 313     memset(&m_vWinSwp
, '\0', sizeof (SWP
)); 
 316     // Pass WM_GETDLGCODE to DefWindowProc() 
 322     m_bBackgroundTransparent 
= FALSE
; 
 325     // As all windows are created with WS_VISIBLE style... 
 329 #if wxUSE_MOUSEEVENT_HACK 
 332     m_nLastMouseEvent 
= -1; 
 333 #endif // wxUSE_MOUSEEVENT_HACK 
 334 } // wxWindowOS2::Init 
 339 wxWindowOS2::~wxWindowOS2() 
 341     m_isBeingDeleted 
= TRUE
; 
 343     for (wxWindow
* pWin 
= GetParent(); pWin
; pWin 
= pWin
->GetParent()) 
 345         wxTopLevelWindow
*           pFrame 
= wxDynamicCast(pWin
, wxTopLevelWindow
); 
 349             if (pFrame
->GetLastFocus() == this) 
 350                 pFrame
->SetLastFocus(NULL
); 
 358         if(!::WinDestroyWindow(GetHWND())) 
 359             wxLogLastError(wxT("DestroyWindow")); 
 361         // remove hWnd <-> wxWindow association 
 363         wxRemoveHandleAssociation(this); 
 365     delete m_pChildrenDisabled
; 
 366 } // end of wxWindowOS2::~wxWindowOS2 
 368 // real construction (Init() must have been called before!) 
 369 bool wxWindowOS2::Create( 
 372 , const wxPoint
&                    rPos
 
 373 , const wxSize
&                     rSize
 
 375 , const wxString
&                   rName
 
 378     HWND                            hParent 
= NULLHANDLE
; 
 379     ULONG                           ulCreateFlags 
= 0; 
 380     WXDWORD                         dwExStyle 
= 0; 
 382     wxCHECK_MSG(pParent
, FALSE
, wxT("can't create wxWindow without parent")); 
 386     // wxGTK doesn't allow to create controls with static box as the parent so 
 387     // this will result in a crash when the program is ported to wxGTK - warn 
 390     // the correct solution is to create the controls as siblings of the 
 393     wxASSERT_MSG( !wxDynamicCast(pParent
, wxStaticBox
), 
 394                   _T("wxStaticBox can't be used as a window parent!") ); 
 395 #endif // wxUSE_STATBOX 
 397     if ( !CreateBase( pParent
 
 409         pParent
->AddChild(this); 
 410         hParent 
= GetWinHwnd(pParent
); 
 412         if ( pParent
->IsKindOf(CLASSINFO(wxGenericScrolledWindow
)) || 
 413              pParent
->IsKindOf(CLASSINFO(wxScrolledWindow
)) 
 415             ulCreateFlags 
|= WS_CLIPSIBLINGS
; 
 419     // Most wxSTYLES are really PM Class specific styles and will be 
 420     // set in those class create procs.  PM's basic windows styles are 
 423     ulCreateFlags 
|=  OS2GetCreateWindowFlags(&dwExStyle
); 
 426 #ifdef __WXUNIVERSAL__ 
 427     // no 3d effects, we draw them ourselves 
 429 #endif // !wxUniversal 
 430     if (lStyle 
& wxPOPUP_WINDOW
) 
 432         ulCreateFlags 
&= ~WS_VISIBLE
; 
 437         ulCreateFlags 
|= WS_VISIBLE
; 
 441     // Generic OS/2 Windows have no Control Data but other classes 
 442     // that call OS2Create may have some. 
 444     return(OS2Create( (PSZ
)wxCanvasClassName
 
 449                      ,NULL         
// Control Data 
 453 } // end of wxWindowOS2::Create 
 455 // --------------------------------------------------------------------------- 
 457 // --------------------------------------------------------------------------- 
 459 void wxWindowOS2::SetFocus() 
 461     HWND                            hWnd 
= GetHwnd(); 
 462     wxCHECK_RET( hWnd
, _T("can't set focus to invalid window") ); 
 465         ::WinSetFocus(HWND_DESKTOP
, hWnd
); 
 466 } // end of wxWindowOS2::SetFocus 
 468 void wxWindowOS2::SetFocusFromKbd() 
 471     // Nothing else to do under OS/2 
 473     wxWindowBase::SetFocusFromKbd(); 
 474 } // end of wxWindowOS2::SetFocus 
 476 wxWindow
* wxWindowBase::DoFindFocus() 
 478     HWND                            hWnd 
= ::WinQueryFocus(HWND_DESKTOP
); 
 482         return wxFindWinFromHandle((WXHWND
)hWnd
); 
 485 } // wxWindowBase::DoFindFocus 
 487 bool wxWindowOS2::Enable( 
 491     if (!wxWindowBase::Enable(bEnable
)) 
 494     HWND                            hWnd 
= GetHwnd(); 
 497         ::WinEnableWindow(hWnd
, (BOOL
)bEnable
); 
 500     // The logic below doesn't apply to the top level windows -- otherwise 
 501     // showing a modal dialog would result in total greying out (and ungreying 
 502     // out later) of everything which would be really ugly 
 507     wxWindowList::compatibility_iterator     node 
= GetChildren().GetFirst(); 
 511         wxWindow
*                   pChild 
= node
->GetData(); 
 516             // Enable the child back unless it had been disabled before us 
 518             if (!m_pChildrenDisabled 
|| !m_pChildrenDisabled
->Find(pChild
)) 
 521         else // we're being disabled 
 523             if (pChild
->IsEnabled()) 
 526                 // Disable it as children shouldn't stay enabled while the 
 531             else // child already disabled, remember it 
 534                 // Have we created the list of disabled children already? 
 536                 if (!m_pChildrenDisabled
) 
 537                     m_pChildrenDisabled 
= new wxWindowList
; 
 538                 m_pChildrenDisabled
->Append(pChild
); 
 541         node 
= node
->GetNext(); 
 543     if (bEnable 
&& m_pChildrenDisabled
) 
 546         // We don't need this list any more, don't keep unused memory 
 548         delete m_pChildrenDisabled
; 
 549         m_pChildrenDisabled 
= NULL
; 
 552 } // end of wxWindowOS2::Enable 
 554 bool wxWindowOS2::Show( 
 558     if (!wxWindowBase::Show(bShow
)) 
 561     HWND                            hWnd 
= GetHwnd(); 
 563     ::WinShowWindow(hWnd
, bShow
); 
 567         ::WinSetWindowPos(hWnd
, HWND_TOP
, 0, 0, 0, 0, SWP_ACTIVATE 
| SWP_ZORDER
); 
 570 } // end of wxWindowOS2::Show 
 572 void wxWindowOS2::Raise() 
 574     ::WinSetWindowPos(GetHwnd(), HWND_TOP
, 0, 0, 0, 0, SWP_ZORDER 
| SWP_ACTIVATE
); 
 575 } // end of wxWindowOS2::Raise 
 577 void wxWindowOS2::Lower() 
 579     ::WinSetWindowPos(GetHwnd(), HWND_BOTTOM
, 0, 0, 0, 0, SWP_ZORDER 
| SWP_DEACTIVATE
); 
 580 } // end of wxWindowOS2::Lower 
 582 void wxWindowOS2::SetTitle( 
 583   const wxString
&                   rTitle
 
 586     ::WinSetWindowText(GetHwnd(), rTitle
.c_str()); 
 587 } // end of wxWindowOS2::SetTitle 
 589 wxString 
wxWindowOS2::GetTitle() const 
 591     return wxGetWindowText(GetHWND()); 
 592 } // end of wxWindowOS2::GetTitle 
 594 void wxWindowOS2::DoCaptureMouse() 
 596     HWND                            hWnd 
= GetHwnd(); 
 598     if (hWnd 
&& !m_bWinCaptured
) 
 600         ::WinSetCapture(HWND_DESKTOP
, hWnd
); 
 601         m_bWinCaptured 
= TRUE
; 
 603 } // end of wxWindowOS2::GetTitle 
 605 void wxWindowOS2::DoReleaseMouse() 
 609         ::WinSetCapture(HWND_DESKTOP
, NULLHANDLE
); 
 610         m_bWinCaptured 
= FALSE
; 
 612 } // end of wxWindowOS2::ReleaseMouse 
 614 /* static */ wxWindow
* wxWindowBase::GetCapture() 
 616     HWND hwnd 
= ::WinQueryCapture(HWND_DESKTOP
); 
 617     return hwnd 
? wxFindWinFromHandle((WXHWND
)hwnd
) : (wxWindow 
*)NULL
; 
 618 } // end of wxWindowBase::GetCapture 
 620 bool wxWindowOS2::SetFont( 
 624     if (!wxWindowBase::SetFont(rFont
)) 
 630     HWND                            hWnd 
= GetHwnd(); 
 636 } // end of wxWindowOS2::SetFont 
 638 bool wxWindowOS2::SetCursor( 
 639   const wxCursor
&                   rCursor
 
 640 ) // check if base implementation is OK 
 642     if ( !wxWindowBase::SetCursor(rCursor
)) 
 648     if ( m_cursor
.Ok() ) { 
 649         HWND                            hWnd 
= GetHwnd(); 
 653         ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
 654         ::WinQueryWindowRect(hWnd
, &vRect
); 
 656         if (::WinPtInRect(vHabmain
, &vRect
, &vPoint
) && !wxIsBusy()) 
 658             ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)m_cursor
.GetHCURSOR()); 
 662 } // end of wxWindowOS2::SetCursor 
 664 void wxWindowOS2::WarpPointer( 
 673     ::WinQueryWindowRect(GetHwnd(), &vRect
); 
 677     ::WinSetPointerPos(HWND_DESKTOP
, (LONG
)nX
, (LONG
)(nY
)); 
 678 } // end of wxWindowOS2::WarpPointer 
 681 // --------------------------------------------------------------------------- 
 683 // --------------------------------------------------------------------------- 
 685 int  wxWindowOS2::GetScrollPos( 
 689     if (nOrient 
== wxHORIZONTAL
) 
 690         return((int)::WinSendMsg(m_hWndScrollBarHorz
, SBM_QUERYPOS
, (MPARAM
)NULL
, (MPARAM
)NULL
)); 
 692         return((int)::WinSendMsg(m_hWndScrollBarVert
, SBM_QUERYPOS
, (MPARAM
)NULL
, (MPARAM
)NULL
)); 
 693 } // end of wxWindowOS2::GetScrollPos 
 695 int wxWindowOS2::GetScrollRange( 
 701     if (nOrient 
== wxHORIZONTAL
) 
 702         mr 
= ::WinSendMsg(m_hWndScrollBarHorz
, SBM_QUERYRANGE
, (MPARAM
)NULL
, (MPARAM
)NULL
); 
 704         mr 
= ::WinSendMsg(m_hWndScrollBarVert
, SBM_QUERYRANGE
, (MPARAM
)NULL
, (MPARAM
)NULL
); 
 705     return((int)SHORT2FROMMR(mr
)); 
 706 } // end of wxWindowOS2::GetScrollRange 
 708 int wxWindowOS2::GetScrollThumb( 
 712     if (nOrient 
== wxHORIZONTAL 
) 
 713         return m_nXThumbSize
; 
 715         return m_nYThumbSize
; 
 716 } // end of wxWindowOS2::GetScrollThumb 
 718 void wxWindowOS2::SetScrollPos( 
 721 , bool                              WXUNUSED(bRefresh
) 
 724     if (nOrient 
== wxHORIZONTAL 
) 
 725         ::WinSendMsg(m_hWndScrollBarHorz
, SBM_SETPOS
, (MPARAM
)nPos
, (MPARAM
)NULL
); 
 727         ::WinSendMsg(m_hWndScrollBarVert
, SBM_SETPOS
, (MPARAM
)nPos
, (MPARAM
)NULL
); 
 728 } // end of wxWindowOS2::SetScrollPos 
 730 void wxWindowOS2::SetScrollbar( 
 735 , bool                              WXUNUSED(bRefresh
) 
 738     HWND                            hWnd 
= GetHwnd(); 
 739     int                             nOldRange 
= nRange 
- nThumbVisible
; 
 740     int                             nRange1 
= nOldRange
; 
 741     int                             nPageSize 
= nThumbVisible
; 
 744     ULONG                           ulStyle 
= WS_VISIBLE 
| WS_SYNCPAINT
; 
 749     wxWindow
*                       pParent 
= GetParent(); 
 751     if (pParent 
&& pParent
->IsKindOf(CLASSINFO(wxFrame
))) 
 755         pFrame 
= wxDynamicCast(pParent
, wxFrame
); 
 756         hWndParent 
= pFrame
->GetFrame(); 
 757         hWndClient 
= GetHwndOf(pParent
); 
 762             hWndParent 
= GetHwndOf(pParent
); 
 764             hWndParent 
= GetHwnd(); 
 765         hWndClient 
= hWndParent
; 
 767     ::WinQueryWindowPos(hWndClient
, &vSwp
); 
 768     ::WinQueryWindowPos(hWnd
, &vSwpOwner
); 
 770     if (nPageSize 
> 1 && nRange 
> 0) 
 772         nRange1 
+= (nPageSize 
- 1); 
 775     vInfo
.cb 
= sizeof(SBCDATA
); 
 777     vInfo
.posLast 
= (SHORT
)nRange1
; 
 778     vInfo
.posThumb 
= nPos
; 
 780     if (nOrient 
== wxHORIZONTAL 
) 
 783         if (m_hWndScrollBarHorz 
== 0L) 
 786             // Since the scrollbars are usually created before the owner is 
 787             // sized either via an OnSize event directly or via sizers or 
 788             // layout constraints, we will initially just use the coords of 
 789             // the parent window (this is usually a frame client window). But 
 790             // the bars themselves, are children of the parent frame (i.e 
 791             // siblings of the frame client.  The owner, however is the actual 
 792             // window being scrolled (or at least the one responsible for 
 793             // handling the scroll events). The owner will be resized later, 
 794             // as it is usually a child of a top level window, and when that 
 795             // is done its scrollbars will be resized and repositioned as well. 
 797             m_hWndScrollBarHorz 
= ::WinCreateWindow( hWndParent
 
 815             // The owner (the scrolled window) is a child of the Frame's 
 816             // client window, usually.  The scrollbars are children of the 
 817             // frame, itself, and thus are positioned relative to the frame's 
 818             // origin, not the frame's client window origin. 
 819             // The starting x position is the same as the starting x position 
 820             // of the owner, but in terms of the parent frame. 
 821             // The starting y position is 20 pels below the origin of the 
 822             // owner in terms of the parent frame. 
 823             // The horz bar is the same width as the owner and 20 pels high. 
 825             if (nRange1 
>= nThumbVisible
) 
 827                 ::WinSetWindowPos( m_hWndScrollBarHorz
 
 829                                   ,vSwp
.x 
+ vSwpOwner
.x
 
 830                                   ,(vSwp
.y 
+ vSwpOwner
.y
) - 20 
 833                                   ,SWP_MOVE 
| SWP_SIZE 
| SWP_SHOW 
| SWP_ACTIVATE 
| SWP_ZORDER
 
 835                 ::WinSendMsg( m_hWndScrollBarHorz
 
 838                              ,MPFROM2SHORT(0, (SHORT
)nRange1
) 
 840                 ::WinSendMsg( m_hWndScrollBarHorz
 
 842                              ,MPFROM2SHORT( (SHORT
)nThumbVisible
 
 849                 ::WinShowWindow(m_hWndScrollBarHorz
, FALSE
); 
 855         if (m_hWndScrollBarVert 
== 0L) 
 858             // Since the scrollbars are usually created before the owner is 
 859             // sized either via an OnSize event directly or via sizers or 
 860             // layout constraints, we will initially just use the coords of 
 861             // the parent window (this is usually a frame client window). But 
 862             // the bars themselves, are children of the parent frame (i.e 
 863             // siblings of the frame client.  The owner, however is the actual 
 864             // window being scrolled (or at least the one responsible for 
 865             // handling the scroll events). The owner will be resized later, 
 866             // as it is usually a child of a top level window, and when that 
 867             // is done its scrollbars will be resized and repositioned as well. 
 869             m_hWndScrollBarVert 
= ::WinCreateWindow( hWndParent
 
 873                                                     ,vSwp
.x 
+ vSwp
.cx 
- 20 
 887             // The owner (the scrolled window) is a child of the Frame's 
 888             // client window, usually.  The scrollbars are children of the 
 889             // frame, itself and thus are positioned relative to the frame's 
 890             // origin, not the frame's client window's origin. 
 891             // Thus, the x position will be frame client's x (usually a few 
 892             // pels inside the parent frame, plus the width of the owner. 
 893             // Since we may be using sizers or layout constraints for multiple 
 894             // child scrolled windows, the y position will be the frame client's 
 895             // y pos plus the scrolled windows y position, yielding the y 
 896             // position of the scrollbar relative to the parent frame (the vert 
 897             // scrollbar is on the right and starts at the bottom of the 
 899             // It is 20 pels wide and the same height as the owner. 
 901             if (nRange1 
>= nThumbVisible
) 
 903                 ::WinSetWindowPos( m_hWndScrollBarVert
 
 905                                   ,vSwp
.x 
+ vSwpOwner
.x 
+ vSwpOwner
.cx
 
 906                                   ,vSwp
.y 
+ vSwpOwner
.y
 
 909                                   ,SWP_ACTIVATE 
| SWP_MOVE 
| SWP_SIZE 
| SWP_SHOW
 
 911                 ::WinSendMsg( m_hWndScrollBarVert
 
 914                              ,MPFROM2SHORT(0, (SHORT
)nRange1
) 
 916                 ::WinSendMsg( m_hWndScrollBarVert
 
 918                              ,MPFROM2SHORT( (SHORT
)nThumbVisible
 
 925                 ::WinShowWindow(m_hWndScrollBarVert
, FALSE
); 
 927         m_nYThumbSize 
= nThumbVisible
; 
 929 } // end of wxWindowOS2::SetScrollbar 
 931 void wxWindowOS2::ScrollWindow( 
 934 , const wxRect
*                     pRect
 
 939     ::WinQueryWindowRect(GetHwnd(), &vRect
); 
 940     int                             height 
= vRect
.yTop
; 
 943         vRect
.xLeft   
= pRect
->x
; 
 944         vRect
.yTop    
= height 
- pRect
->y
; 
 945         vRect
.xRight  
= pRect
->x 
+ pRect
->width
; 
 946         vRect
.yBottom 
= vRect
.yTop 
- pRect
->height
; 
 948     nDy 
*= -1; // flip the sign of Dy as OS/2 is opposite Windows. 
 949     ::WinScrollWindow( GetHwnd() 
 956                       ,SW_SCROLLCHILDREN 
| SW_INVALIDATERGN
 
 958 } // end of wxWindowOS2::ScrollWindow 
 960 // --------------------------------------------------------------------------- 
 962 // --------------------------------------------------------------------------- 
 964 void wxWindowOS2::SubclassWin( 
 968     HWND                            hwnd 
= (HWND
)hWnd
; 
 970     wxCHECK_RET(::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in SubclassWin") ); 
 971     wxAssociateWinWithHandle( hWnd
 
 974     if (!wxCheckWindowWndProc( hWnd
 
 975                               ,(WXFARPROC
)wxWndProc
 
 978         m_fnOldWndProc 
= (WXFARPROC
) ::WinSubclassWindow(hwnd
, (PFNWP
)wxWndProc
); 
 982         m_fnOldWndProc 
= (WXFARPROC
)NULL
; 
 984 } // end of wxWindowOS2::SubclassWin 
 986 void wxWindowOS2::UnsubclassWin() 
 989     // Restore old Window proc 
 991     HWND                            hwnd 
= GetHWND(); 
 995         wxCHECK_RET( ::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in UnsubclassWin") ); 
 997         PFNWP                       fnProc 
= (PFNWP
)::WinQueryWindowPtr(hwnd
, QWP_PFNWP
); 
 999         if ( (m_fnOldWndProc 
!= 0) && (fnProc 
!= (PFNWP
) m_fnOldWndProc
)) 
1001             WinSubclassWindow(hwnd
, (PFNWP
)m_fnOldWndProc
); 
1005 } // end of wxWindowOS2::UnsubclassWin 
1007 bool wxCheckWindowWndProc( 
1009 , WXFARPROC                         fnWndProc
 
1012     static char                     zBuffer
[512]; 
1015     ::WinQueryClassName((HWND
)hWnd
, (LONG
)512, (PCH
)zBuffer
); 
1016     ::WinQueryClassInfo(wxGetInstance(), (PSZ
)zBuffer
, &vCls
); 
1017     return(fnWndProc 
== (WXFARPROC
)vCls
.pfnWindowProc
); 
1018 } // end of WinGuiBase_CheckWindowWndProc 
1020 void wxWindowOS2::SetWindowStyleFlag( 
1024     long                            lFlagsOld 
= GetWindowStyleFlag(); 
1026     if (lFlags 
== lFlagsOld
) 
1030     // Update the internal variable 
1032     wxWindowBase::SetWindowStyleFlag(lFlags
); 
1035     // Now update the Windows style as well if needed - and if the window had 
1036     // been already created 
1042     WXDWORD                         dwExstyleOld
; 
1043     long                            lStyle 
= OS2GetStyle( lFlags
 
1046     long                            lStyleOld 
= OS2GetStyle( lFlagsOld
 
1050     if (lStyle 
!= lStyleOld
) 
1053         // Some flags (e.g. WS_VISIBLE or WS_DISABLED) should not be changed by 
1054         // this function so instead of simply setting the style to the new 
1055         // value we clear the bits which were set in styleOld but are set in 
1056         // the new one and set the ones which were not set before 
1058         long                        lStyleReal 
= ::WinQueryWindowULong(GetHwnd(), QWL_STYLE
); 
1060         lStyleReal 
&= ~lStyleOld
; 
1061         lStyleReal 
|= lStyle
; 
1063         ::WinSetWindowULong(GetHwnd(), QWL_STYLE
, lStyleReal
); 
1065 } // end of wxWindowOS2::SetWindowStyleFlag 
1067 WXDWORD 
wxWindowOS2::OS2GetStyle( 
1069 , WXDWORD
*                          pdwExstyle
 
1072     WXDWORD                         dwStyle 
= 0L; 
1074     if (lFlags 
& wxCLIP_CHILDREN 
) 
1075         dwStyle 
|= WS_CLIPCHILDREN
; 
1077     if (lFlags 
& wxCLIP_SIBLINGS 
) 
1078         dwStyle 
|= WS_CLIPSIBLINGS
; 
1081 } // end of wxWindowMSW::MSWGetStyle 
1084 // Make a Windows extended style from the given wxWidgets window style 
1086 WXDWORD 
wxWindowOS2::MakeExtendedStyle( 
1088 , bool                              bEliminateBorders
 
1092    // Simply fill out with wxWindow extended styles.  We'll conjure 
1093    // something up in OS2Create and all window redrawing pieces later 
1095     WXDWORD                         dwStyle 
= 0; 
1097     if (lStyle 
& wxTRANSPARENT_WINDOW 
) 
1098         dwStyle 
|= wxTRANSPARENT_WINDOW
; 
1100     if (!bEliminateBorders
) 
1102         if (lStyle 
& wxSUNKEN_BORDER
) 
1103             dwStyle 
|= wxSUNKEN_BORDER
; 
1104         if (lStyle 
& wxDOUBLE_BORDER
) 
1105             dwStyle 
|= wxDOUBLE_BORDER
; 
1106         if (lStyle 
& wxRAISED_BORDER 
) 
1107             dwStyle 
|= wxRAISED_BORDER
; 
1108         if (lStyle 
& wxSTATIC_BORDER
) 
1109             dwStyle 
|= wxSTATIC_BORDER
; 
1112 } // end of wxWindowOS2::MakeExtendedStyle 
1115 // Setup background and foreground colours correctly 
1117 void wxWindowOS2::SetupColours() 
1120         SetBackgroundColour(GetParent()->GetBackgroundColour()); 
1121 } // end of wxWindowOS2::SetupColours 
1123 void wxWindowOS2::OnIdle( 
1124   wxIdleEvent
&                      WXUNUSED(rEvent
) 
1128     // Check if we need to send a LEAVE event 
1130     if (m_bMouseInWindow
) 
1134         ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
1135         if (::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, FALSE
) != (HWND
)GetHwnd()) 
1138             // Generate a LEAVE event 
1140             m_bMouseInWindow 
= FALSE
; 
1143             // Unfortunately the mouse button and keyboard state may have changed 
1144             // by the time the OnIdle function is called, so 'state' may be 
1154             wxMouseEvent            
rEvent(wxEVT_LEAVE_WINDOW
); 
1156             InitMouseEvent( rEvent
 
1161             (void)GetEventHandler()->ProcessEvent(rEvent
); 
1164     if (wxUpdateUIEvent::CanUpdate(this)) 
1165         UpdateWindowUI(wxUPDATE_UI_FROMIDLE
); 
1166 } // end of wxWindowOS2::OnIdle 
1169 // Set this window to be the child of 'parent'. 
1171 bool wxWindowOS2::Reparent( 
1175     if (!wxWindowBase::Reparent(pParent
)) 
1178     HWND                            hWndChild 
= GetHwnd(); 
1179     HWND                            hWndParent 
= GetParent() ? GetWinHwnd(GetParent()) : (HWND
)0; 
1181     ::WinSetParent(hWndChild
, hWndParent
, TRUE
); 
1183 } // end of wxWindowOS2::Reparent 
1185 void wxWindowOS2::Update() 
1187     ::WinUpdateWindow(GetHwnd()); 
1188 } // end of wxWindowOS2::Update 
1190 void wxWindowOS2::Freeze() 
1192    ::WinSendMsg(GetHwnd(), WM_VRNDISABLED
, (MPARAM
)0, (MPARAM
)0); 
1193 } // end of wxWindowOS2::Freeze 
1195 void wxWindowOS2::Thaw() 
1197    ::WinSendMsg(GetHwnd(), WM_VRNENABLED
, (MPARAM
)TRUE
, (MPARAM
)0); 
1200     // We need to refresh everything or otherwise he invalidated area is not 
1204 } // end of wxWindowOS2::Thaw 
1206 void wxWindowOS2::Refresh( 
1208 , const wxRect
*                     pRect
 
1211     HWND                            hWnd 
= GetHwnd(); 
1220             ::WinQueryWindowRect(GetHwnd(), &vOs2Rect
); 
1221             height 
= vOs2Rect
.yTop
; 
1222             vOs2Rect
.xLeft   
= pRect
->x
; 
1223             vOs2Rect
.yTop    
= height 
- pRect
->y
; 
1224             vOs2Rect
.xRight  
= pRect
->x 
+ pRect
->width
; 
1225             vOs2Rect
.yBottom 
= vOs2Rect
.yTop 
- pRect
->height
; 
1227             ::WinInvalidateRect(hWnd
, &vOs2Rect
, bEraseBack
); 
1230             ::WinInvalidateRect(hWnd
, NULL
, bEraseBack
); 
1231         if (m_hWndScrollBarHorz 
!= NULLHANDLE
) 
1232             ::WinInvalidateRect(m_hWndScrollBarHorz
, NULL
, TRUE
); 
1233         if (m_hWndScrollBarVert 
!= NULLHANDLE
) 
1234             ::WinInvalidateRect(m_hWndScrollBarVert
, NULL
, TRUE
); 
1236 } // end of wxWindowOS2::Refresh 
1238 // --------------------------------------------------------------------------- 
1240 // --------------------------------------------------------------------------- 
1242 #if wxUSE_DRAG_AND_DROP 
1243 void wxWindowOS2::SetDropTarget( 
1244   wxDropTarget
*                     pDropTarget
 
1247     m_dropTarget 
= pDropTarget
; 
1248 } // end of wxWindowOS2::SetDropTarget 
1252 // old style file-manager drag&drop support: we retain the old-style 
1253 // DragAcceptFiles in parallel with SetDropTarget. 
1255 void wxWindowOS2::DragAcceptFiles( 
1259     HWND                            hWnd 
= GetHwnd(); 
1261     if (hWnd 
&& bAccept
) 
1262         ::DrgAcceptDroppedFiles(hWnd
, NULL
, NULL
, DO_COPY
, 0L); 
1263 } // end of wxWindowOS2::DragAcceptFiles 
1265 // ---------------------------------------------------------------------------- 
1267 // ---------------------------------------------------------------------------- 
1271 void wxWindowOS2::DoSetToolTip( 
1275     wxWindowBase::DoSetToolTip(pTooltip
); 
1278         m_tooltip
->SetWindow(this); 
1279 } // end of wxWindowOS2::DoSetToolTip 
1281 #endif // wxUSE_TOOLTIPS 
1283 // --------------------------------------------------------------------------- 
1284 // moving and resizing 
1285 // --------------------------------------------------------------------------- 
1288 void wxWindowOS2::DoGetSize( 
1296     if (IsKindOf(CLASSINFO(wxFrame
))) 
1298         wxFrame
*                    pFrame 
= wxDynamicCast(this, wxFrame
); 
1299         hWnd 
= pFrame
->GetFrame(); 
1304     ::WinQueryWindowRect(hWnd
, &vRect
); 
1307         *pWidth 
= vRect
.xRight 
- vRect
.xLeft
; 
1309         // OS/2 PM is backwards from windows 
1310         *pHeight 
= vRect
.yTop 
- vRect
.yBottom
; 
1311 } // end of wxWindowOS2::DoGetSize 
1313 void wxWindowOS2::DoGetPosition( 
1318     HWND                            hWnd 
= GetHwnd(); 
1321     wxWindow
*                       pParent 
= GetParent(); 
1324     // It would seem that WinQueryWindowRect would be the correlary to 
1325     // the WIN32 WinGetRect, but unlike WinGetRect which returns the window 
1326     // origin position in screen coordinates, WinQueryWindowRect returns it 
1327     // relative to itself, i.e. (0,0).  To get the same under PM we must 
1328     // us WinQueryWindowPos.  This call, unlike the WIN32 call, however, 
1329     // returns a position relative to it's parent, so no parent adujstments 
1330     // are needed under OS/2.  Also, windows should be created using 
1331     // wxWindow coordinates, i.e 0,0 is the TOP left so vSwp will already 
1334     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1340     // We may be faking the client origin. So a window that's really at (0, 
1341     // 30) may appear (to wxWin apps) to be at (0, 0). 
1345         wxPoint                     
vPt(pParent
->GetClientAreaOrigin()); 
1355 } // end of wxWindowOS2::DoGetPosition 
1357 void wxWindowOS2::DoScreenToClient( 
1362     HWND                            hWnd 
= GetHwnd(); 
1365     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1371 } // end of wxWindowOS2::DoScreenToClient 
1373 void wxWindowOS2::DoClientToScreen( 
1378     HWND                            hWnd 
= GetHwnd(); 
1381     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1387 } // end of wxWindowOS2::DoClientToScreen 
1390 // Get size *available for subwindows* i.e. excluding menu bar etc. 
1391 // Must be a frame type window 
1393 void wxWindowOS2::DoGetClientSize( 
1398     HWND                            hWnd 
= GetHwnd(); 
1401    ::WinQueryWindowRect(hWnd
, &vRect
); 
1402     if (IsKindOf(CLASSINFO(wxDialog
))) 
1407         // For a Dialog we have to explicitly request the client portion. 
1408         // For a Frame the hWnd IS the client window 
1410         hWndTitle 
= ::WinWindowFromID(hWnd
, FID_TITLEBAR
); 
1411         if (::WinQueryWindowRect(hWndTitle
, &vTitle
)) 
1413             if (vTitle
.yTop 
- vTitle
.yBottom 
== 0) 
1416                 // Dialog has not been created yet, use a default 
1420             vRect
.yTop 
-= (vTitle
.yTop 
- vTitle
.yBottom
); 
1423         ULONG                       uStyle 
= ::WinQueryWindowULong(hWnd
, QWL_STYLE
); 
1426         // Deal with borders 
1428         if (uStyle 
& FCF_DLGBORDER
) 
1435         else if (uStyle 
& FCF_SIZEBORDER
) 
1442         else if (uStyle 
& FCF_BORDER
) 
1449         else // make some kind of adjustment or top sizers ram into the titlebar! 
1458         *pWidth  
= vRect
.xRight 
- vRect
.xLeft
; 
1460         *pHeight 
= vRect
.yTop 
- vRect
.yBottom
; 
1461 } // end of wxWindowOS2::DoGetClientSize 
1463 void wxWindowOS2::DoMoveWindow( 
1471     wxWindow
*                       pParent 
= GetParent(); 
1473     /* Due to OS/2's inverted coordinate system, changing the height 
1474        of a window requires repositioning all it's children, e.g. if 
1475        you want a child of height 100 to be at the top left corner of 
1476        the parent you need to position the lower left corner of the 
1477        child at (0, (height of parent - 100)), so, obviously, if the 
1478        height of the parent changes, the child needs to be repositioned. */ 
1480     GetSize(0, &nHeightDelta
); 
1481     nHeightDelta 
= nHeight 
- nHeightDelta
; 
1483     if (pParent 
&& !IsKindOf(CLASSINFO(wxDialog
))) 
1485         int                         nOS2Height 
= GetOS2ParentHeight(pParent
); 
1487         nY 
= nOS2Height 
- (nY 
+ nHeight
); 
1493         ::WinQueryWindowRect(HWND_DESKTOP
, &vRect
); 
1494         nY 
= vRect
.yTop 
- (nY 
+ nHeight
); 
1498     // In the case of a frame whose client is sized, the client cannot be 
1499     // large than its parent frame minus its borders! This usually happens 
1500     // when using an autosizer to size a frame to precisely hold client 
1501     // controls as in the notebook sample. 
1503     // In this case, we may need to resize both a frame and its client so we 
1504     // need a quick calc of the frame border size, then if the frame 
1505     // (less its borders) is smaller than the client, size the frame to 
1506     // encompass the client with the appropriate border size. 
1508     if (IsKindOf(CLASSINFO(wxFrame
))) 
1512         int                         nWidthFrameDelta 
= 0; 
1513         int                         nHeightFrameDelta 
= 0; 
1514         int                         nHeightFrame 
= 0; 
1515         int                         nWidthFrame 
= 0; 
1518         pFrame 
= wxDynamicCast(this, wxFrame
); 
1519         hWndFrame 
= pFrame
->GetFrame(); 
1520         ::WinQueryWindowRect(hWndFrame
, &vRect
); 
1521         ::WinMapWindowPoints(hWndFrame
, HWND_DESKTOP
, (PPOINTL
)&vRect
, 2); 
1523         ::WinCalcFrameRect(hWndFrame
, &vRect
, TRUE
); 
1524         nWidthFrameDelta 
= ((vRect
.xLeft 
- vFRect
.xLeft
) + (vFRect
.xRight 
- vRect
.xRight
)); 
1525         nHeightFrameDelta 
= ((vRect
.yBottom 
- vFRect
.yBottom
) + (vFRect
.yTop 
- vRect
.yTop
)); 
1526         nWidthFrame 
= vFRect
.xRight 
- vFRect
.xLeft
; 
1527         nHeightFrame 
= vFRect
.yTop 
- vFRect
.yBottom
; 
1529         if (nWidth 
== vFRect
.xRight 
- vFRect
.xLeft 
&& 
1530             nHeight 
== vFRect
.yTop 
- vFRect
.yBottom
) 
1533             // In this case the caller is not aware of OS/2's need to size both 
1534             // the frame and it's client and is really only moving the window, 
1535             // not resizeing it.  So move the frame, and back off the sizes 
1536             // for a proper client fit. 
1538             ::WinSetWindowPos( hWndFrame
 
1540                               ,(LONG
)nX 
- (vRect
.xLeft 
- vFRect
.xLeft
) 
1541                               ,(LONG
)nY 
- (vRect
.yBottom 
- vFRect
.yBottom
) 
1546             nX 
+= (vRect
.xLeft 
- vFRect
.xLeft
); 
1547             nY 
+= (vRect
.yBottom 
- vFRect
.yBottom
); 
1548             nWidth 
-= nWidthFrameDelta
; 
1549             nHeight 
-= nHeightFrameDelta
; 
1553             if (nWidth 
> nWidthFrame 
- nHeightFrameDelta 
|| 
1554                 nHeight 
> nHeightFrame 
- nHeightFrameDelta
) 
1556                 ::WinSetWindowPos( hWndFrame
 
1558                                   ,(LONG
)nX 
- (vRect
.xLeft 
- vFRect
.xLeft
) 
1559                                   ,(LONG
)nY 
- (vRect
.yBottom 
- vFRect
.yBottom
) 
1560                                   ,(LONG
)nWidth 
+ nWidthFrameDelta
 
1561                                   ,(LONG
)nHeight 
+ nHeightFrameDelta
 
1562                                   ,SWP_MOVE 
| SWP_SIZE
 
1568     ::WinSetWindowPos( GetHwnd() 
1574                       ,SWP_SIZE 
| SWP_MOVE
 
1576     if (m_vWinSwp
.cx 
== 0 && m_vWinSwp
.cy 
== 0 && m_vWinSwp
.fl 
== 0) 
1580         ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp
); 
1583         int                         nYDiff 
= m_vWinSwp
.cy 
- nHeight
; 
1586         // Handle resizing of scrolled windows.  The target or window to 
1587         // be scrolled is the owner (gets the scroll notificaitons).  The 
1588         // parent is usually the parent frame of the scrolled panel window. 
1589         // In order to show the scrollbars the target window will be shrunk 
1590         // by the size of the scroll bar widths (20) and moved in the X and Y 
1591         // directon.  That value will be computed as part of the diff for 
1592         // moving the children.  Everytime the window is sized the 
1593         // toplevel OnSize is going to resize the panel to fit the client 
1594         // or the whole sizer and will need to me resized. This will send 
1595         // a WM_SIZE out which will be intercepted by the ScrollHelper 
1596         // which will cause the scrollbars to be displayed via the SetScrollbar 
1599         if ( IsKindOf(CLASSINFO(wxGenericScrolledWindow
)) || 
1600              IsKindOf(CLASSINFO(wxScrolledWindow
)) 
1603             int                     nAdjustWidth  
= 0; 
1604             int                     nAdjustHeight 
= 0; 
1607             if (GetScrollBarHorz() == NULLHANDLE 
|| 
1608                 !WinIsWindowShowing(GetScrollBarHorz())) 
1611                 nAdjustHeight 
= 20L; 
1612             if (GetScrollBarVert() == NULLHANDLE 
|| 
1613                 !WinIsWindowShowing(GetScrollBarVert())) 
1617             ::WinQueryWindowPos(GetHWND(), &vSwpScroll
); 
1618             ::WinSetWindowPos( GetHWND() 
1621                               ,vSwpScroll
.y 
+ nAdjustHeight
 
1622                               ,vSwpScroll
.cx 
- nAdjustWidth
 
1623                               ,vSwpScroll
.cy 
- nAdjustHeight
 
1624                               ,SWP_MOVE 
| SWP_SIZE
 
1626             nYDiff 
+= nAdjustHeight
; 
1628         MoveChildren(nYDiff
); 
1629         ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp
); 
1631     MoveChildren(nHeightDelta
); 
1632 } // end of wxWindowOS2::DoMoveWindow 
1635 // Set the size of the window: if the dimensions are positive, just use them, 
1636 // but if any of them is equal to -1, it means that we must find the value for 
1637 // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in 
1638 // which case -1 is a valid value for x and y) 
1640 // If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate 
1641 // the width/height to best suit our contents, otherwise we reuse the current 
1644 void wxWindowOS2::DoSetSize( 
1653     // Get the current size and position... 
1659     wxSize                          
vSize(-1, -1); 
1661     GetPosition(&nCurrentX
, &nCurrentY
); 
1662     GetSize(&nCurrentWidth
, &nCurrentHeight
); 
1665     // ... and don't do anything (avoiding flicker) if it's already ok 
1668     // Must convert Y coords to test for equality under OS/2 
1672     if (nX 
== nCurrentX 
&& nY2 
== nCurrentY 
&& 
1673         nWidth 
== nCurrentWidth 
&& nHeight 
== nCurrentHeight
) 
1678     if (nX 
== -1 && !(nSizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
)) 
1680     if (nY 
== -1 && !(nSizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
)) 
1683     AdjustForParentClientOrigin(nX
, nY
, nSizeFlags
); 
1687         if (nSizeFlags 
& wxSIZE_AUTO_WIDTH
) 
1689             vSize  
= DoGetBestSize(); 
1695             // Just take the current one 
1697             nWidth 
= nCurrentWidth
; 
1703         if (nSizeFlags 
& wxSIZE_AUTO_HEIGHT
) 
1707                 vSize 
= DoGetBestSize(); 
1713             // just take the current one 
1714             nHeight 
= nCurrentHeight
; 
1723 } // end of wxWindowOS2::DoSetSize 
1725 void wxWindowOS2::DoSetClientSize( 
1733     wxWindow
*                       pParent 
= (wxWindow
*)GetParent(); 
1734     HWND                            hParentWnd 
= (HWND
)0; 
1737         hParentWnd 
= (HWND
)pParent
->GetHWND(); 
1739     if (IsKindOf(CLASSINFO(wxFrame
))) 
1741         wxFrame
*                    pFrame 
= wxDynamicCast(this, wxFrame
); 
1742         HWND                        hFrame 
= pFrame
->GetFrame(); 
1747         ::WinQueryWindowRect(GetHwnd(), &vRect2
); 
1748         ::WinQueryWindowRect(hFrame
, &vRect
); 
1749         ::WinQueryWindowRect(hParentWnd
, &vRect3
); 
1750         nActualWidth 
= vRect2
.xRight 
- vRect2
.xLeft 
- vRect
.xRight 
+ nWidth
; 
1751         nActualHeight 
= vRect2
.yTop 
- vRect2
.yBottom 
- vRect
.yTop 
+ nHeight
; 
1753         vPoint
.x 
= vRect2
.xLeft
; 
1754         vPoint
.y 
= vRect2
.yBottom
; 
1757             vPoint
.x 
-= vRect3
.xLeft
; 
1758             vPoint
.y 
-= vRect3
.yBottom
; 
1766         GetPosition(&nX
, &nY
); 
1767         nActualWidth  
= nWidth
; 
1768         nActualHeight 
= nHeight
; 
1773     DoMoveWindow( vPoint
.x
 
1779     wxSizeEvent                     
vEvent( wxSize( nWidth
 
1785     vEvent
.SetEventObject(this); 
1786     GetEventHandler()->ProcessEvent(vEvent
); 
1787 } // end of wxWindowOS2::DoSetClientSize 
1789 // --------------------------------------------------------------------------- 
1791 // --------------------------------------------------------------------------- 
1793 int wxWindowOS2::GetCharHeight() const 
1796     FONTMETRICS                     vFontMetrics
; 
1798     hPs 
= ::WinGetPS(GetHwnd()); 
1800     if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
)) 
1802         ::WinReleasePS(hPs
); 
1805     ::WinReleasePS(hPs
); 
1806     return(vFontMetrics
.lMaxAscender 
+ vFontMetrics
.lMaxDescender
); 
1807 } // end of wxWindowOS2::GetCharHeight 
1809 int wxWindowOS2::GetCharWidth() const 
1812     FONTMETRICS                     vFontMetrics
; 
1814     hPs 
= ::WinGetPS(GetHwnd()); 
1816     if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
)) 
1818         ::WinReleasePS(hPs
); 
1821     ::WinReleasePS(hPs
); 
1822     return(vFontMetrics
.lAveCharWidth
); 
1823 } // end of wxWindowOS2::GetCharWidth 
1825 void wxWindowOS2::GetTextExtent( 
1826   const wxString
&                   rString
 
1830 , int*                              pExternalLeading
 
1831 , const wxFont
*                     pTheFont
 
1834     POINTL                          avPoint
[TXTBOX_COUNT
]; 
1839     FONTMETRICS                     vFM
; // metrics structure 
1845     hPS 
= ::WinGetPS(GetHwnd()); 
1847     l 
= rString
.Length(); 
1850         pStr 
= (PCH
)rString
.c_str(); 
1853         // In world coordinates. 
1855         bRc 
= ::GpiQueryTextBox( hPS
 
1858                                 ,TXTBOX_COUNT 
// return maximum information 
1859                                 ,avPoint      
// array of coordinates points 
1863             vPtMin
.x 
= avPoint
[0].x
; 
1864             vPtMax
.x 
= avPoint
[0].x
; 
1865             vPtMin
.y 
= avPoint
[0].y
; 
1866             vPtMax
.y 
= avPoint
[0].y
; 
1867             for (i 
= 1; i 
< 4; i
++) 
1869                 if(vPtMin
.x 
> avPoint
[i
].x
) vPtMin
.x 
= avPoint
[i
].x
; 
1870                 if(vPtMin
.y 
> avPoint
[i
].y
) vPtMin
.y 
= avPoint
[i
].y
; 
1871                 if(vPtMax
.x 
< avPoint
[i
].x
) vPtMax
.x 
= avPoint
[i
].x
; 
1872                 if(vPtMax
.y 
< avPoint
[i
].y
) vPtMax
.y 
= avPoint
[i
].y
; 
1874             bRc 
= ::GpiQueryFontMetrics( hPS
 
1875                                         ,sizeof(FONTMETRICS
) 
1902         *pX 
= (vPtMax
.x 
- vPtMin
.x 
+ 1); 
1904         *pY 
= (vPtMax
.y 
- vPtMin
.y 
+ 1); 
1908             *pDescent 
= vFM
.lMaxDescender
; 
1912     if (pExternalLeading
) 
1915             *pExternalLeading 
= vFM
.lExternalLeading
; 
1917             *pExternalLeading 
= 0; 
1919     ::WinReleasePS(hPS
); 
1920 } // end of wxWindow::GetTextExtent 
1922 bool wxWindowOS2::IsMouseInWindow() const 
1925     // Get the mouse position 
1928     ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
); 
1931     // Find the window which currently has the cursor and go up the window 
1932     // chain until we find this window - or exhaust it 
1934     HWND                            hWnd 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt
, TRUE
); 
1936     while (hWnd 
&& (hWnd 
!= GetHwnd())) 
1937         hWnd 
= ::WinQueryWindow(hWnd
, QW_PARENT
); 
1939     return hWnd 
!= NULL
; 
1940 } // end of wxWindowOS2::IsMouseInWindow 
1943 // --------------------------------------------------------------------------- 
1945 // --------------------------------------------------------------------------- 
1947 #if wxUSE_MENUS_NATIVE 
1948 bool wxWindowOS2::DoPopupMenu( 
1954     HWND                            hWndOwner 
= GetHwnd(); 
1955     HWND                            hWndParent 
= GetHwnd(); 
1956     HWND                            hMenu 
= GetHmenuOf(pMenu
); 
1957     bool                            bIsWaiting 
= TRUE
; 
1960     // Protect against recursion 
1961     if (wxCurrentPopupMenu
) 
1964     pMenu
->SetInvokingWindow(this); 
1967     if ( nX 
== -1 && nY 
== -1 ) 
1969         wxPoint mouse 
= wxGetMousePosition(); 
1970         nX 
= mouse
.x
; nY 
= mouse
.y
; 
1974         DoClientToScreen( &nX
 
1977         DoGetSize(0,&nHeight
); 
1980     wxCurrentPopupMenu 
= pMenu
; 
1982     ::WinPopupMenu( hWndParent
 
1988                    ,PU_HCONSTRAIN 
| PU_VCONSTRAIN 
| PU_MOUSEBUTTON1 
| PU_KEYBOARD
 
1995         ::WinGetMsg(vHabmain
,&vMsg
, (HWND
)0, 0, 0); 
1996         if (vMsg
.msg 
== WM_COMMAND
) 
1998         ::WinDispatchMsg(vHabmain
, (PQMSG
)&vMsg
); 
2001     wxCurrentPopupMenu 
= NULL
; 
2002     pMenu
->SetInvokingWindow(NULL
); 
2004 } // end of wxWindowOS2::DoPopupMenu 
2005 #endif // wxUSE_MENUS_NATIVE 
2007 // =========================================================================== 
2008 // pre/post message processing 
2009 // =========================================================================== 
2011 MRESULT 
wxWindowOS2::OS2DefWindowProc( 
2018         return (MRESULT
)m_fnOldWndProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
); 
2020         return ::WinDefWindowProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
); 
2021 } // end of wxWindowOS2::OS2DefWindowProc 
2023 bool wxWindowOS2::OS2ProcessMessage( 
2027 // wxUniversal implements tab traversal itself 
2028 #ifndef __WXUNIVERSAL__ 
2029     QMSG
*                           pQMsg 
= (QMSG
*)pMsg
; 
2031     if (m_hWnd 
!= 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL
)) 
2034         // Intercept dialog navigation keys 
2036         bool                        bProcess 
= TRUE
; 
2037         USHORT                      uKeyFlags 
= SHORT1FROMMP(pQMsg
->mp1
); 
2039         if (uKeyFlags 
& KC_KEYUP
) 
2042         if (uKeyFlags 
& KC_ALT
) 
2045         if (!(uKeyFlags 
& KC_VIRTUALKEY
)) 
2050             bool                    bCtrlDown 
= IsCtrlDown(); 
2051             bool                    bShiftDown 
= IsShiftDown(); 
2054             // WM_QUERYDLGCODE: ask the control if it wants the key for itself, 
2055             // don't process it if it's the case (except for Ctrl-Tab/Enter 
2056             // combinations which are always processed) 
2058             ULONG                   ulDlgCode 
= 0; 
2062                 ulDlgCode 
= (ULONG
)::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0); 
2065             bool                    bForward 
= TRUE
; 
2066             bool                    bWindowChange 
= FALSE
; 
2068             switch (SHORT2FROMMP(pQMsg
->mp2
)) 
2071                 // Going to make certain assumptions about specific types of controls 
2072                 // here, so we may have to alter some things later if they prove invalid 
2076                     // Shift tabl will always be a nav-key but tabs may be wanted 
2085                         // Entry Fields want tabs for themselve usually 
2089                             case DLGC_ENTRYFIELD
: 
2099                         // Ctrl-Tab cycles thru notebook pages 
2101                         bWindowChange 
= bCtrlDown
; 
2102                         bForward 
= !bShiftDown
; 
2125                             // ctrl-enter is not processed 
2129                         else if (ulDlgCode 
& DLGC_BUTTON
) 
2132                             // buttons want process Enter themselevs 
2138                             wxButton
*   pBtn 
= wxDynamicCast( GetDefaultItem() 
2142                             if (pBtn 
&& pBtn
->IsEnabled()) 
2145                                 // If we do have a default button, do press it 
2147                                 pBtn
->OS2Command(BN_CLICKED
, 0 /* unused */); 
2150                             else if (!IsTopLevel()) 
2153                                 // if not a top level window, let parent 
2158                             // else: but if it does not it makes sense to make 
2159                             //       it work like a TAB - and that's what we do. 
2160                             //       Note that Ctrl-Enter always works this way. 
2171                 wxNavigationKeyEvent    vEvent
; 
2173                 vEvent
.SetDirection(bForward
); 
2174                 vEvent
.SetWindowChange(bWindowChange
); 
2175                 vEvent
.SetEventObject(this); 
2177                 if (GetEventHandler()->ProcessEvent(vEvent
)) 
2179                     wxButton
*       pBtn 
= wxDynamicCast(FindFocus(), wxButton
); 
2184                         // The button which has focus should be default 
2193         // Let Dialogs process 
2195         if (::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0)); 
2199     pMsg 
= pMsg
; // just shut up the compiler 
2200 #endif // __WXUNIVERSAL__ 
2203 } // end of wxWindowOS2::OS2ProcessMessage 
2205 bool wxWindowOS2::OS2TranslateMessage( 
2209 #if wxUSE_ACCEL && !defined(__WXUNIVERSAL__) 
2210   return m_acceleratorTable
.Translate(m_hWnd
, pMsg
); 
2214 #endif //wxUSE_ACCEL 
2215 } // end of wxWindowOS2::OS2TranslateMessage 
2217 bool wxWindowOS2::OS2ShouldPreProcessMessage( 
2221     // preprocess all messages by default 
2223 } // end of wxWindowOS2::OS2ShouldPreProcessMessage 
2225 // --------------------------------------------------------------------------- 
2226 // message params unpackers 
2227 // --------------------------------------------------------------------------- 
2229 void wxWindowOS2::UnpackCommand( 
2237     *pId 
= LOWORD(wParam
); 
2238     *phWnd 
= NULL
;  // or may be GetHWND() ? 
2239     *pCmd 
= LOWORD(lParam
); 
2240 } // end of wxWindowOS2::UnpackCommand 
2242 void wxWindowOS2::UnpackActivate( 
2249     *pState     
= LOWORD(wParam
); 
2250     *phWnd      
= (WXHWND
)lParam
; 
2251 } // end of wxWindowOS2::UnpackActivate 
2253 void wxWindowOS2::UnpackScroll( 
2264     ulId    
= (ULONG
)LONGFROMMP(wParam
); 
2265     hWnd 
= ::WinWindowFromID(GetHwnd(), ulId
); 
2266     if (hWnd 
== m_hWndScrollBarHorz 
|| hWnd 
== m_hWndScrollBarVert
) 
2267         *phWnd 
= NULLHANDLE
; 
2271     *pPos  
= SHORT1FROMMP(lParam
); 
2272     *pCode 
= SHORT2FROMMP(lParam
); 
2273 } // end of wxWindowOS2::UnpackScroll 
2275 void wxWindowOS2::UnpackMenuSelect( 
2283     *pItem 
= (WXWORD
)LOWORD(wParam
); 
2284     *pFlags 
= HIWORD(wParam
); 
2285     *phMenu 
= (WXHMENU
)lParam
; 
2286 } // end of wxWindowOS2::UnpackMenuSelect 
2288 // --------------------------------------------------------------------------- 
2289 // Main wxWidgets window proc and the window proc for wxWindow 
2290 // --------------------------------------------------------------------------- 
2293 // Hook for new window just as it's being created, when the window isn't yet 
2294 // associated with the handle 
2296 wxWindowOS2
*                         wxWndHook 
= NULL
; 
2301 MRESULT EXPENTRY 
wxWndProc( 
2308     wxWindowOS2
*                    pWnd 
= wxFindWinFromHandle((WXHWND
)hWnd
); 
2311     // When we get the first message for the HWND we just created, we associate 
2312     // it with wxWindow stored in wxWndHook 
2314     if (!pWnd 
&& wxWndHook
) 
2316         wxAssociateWinWithHandle(hWnd
, wxWndHook
); 
2319         pWnd
->SetHWND((WXHWND
)hWnd
); 
2322     MRESULT                         rc 
= (MRESULT
)0; 
2326     // Stop right here if we don't have a valid handle in our wxWindow object. 
2328     if (pWnd 
&& !pWnd
->GetHWND()) 
2330         pWnd
->SetHWND((WXHWND
) hWnd
); 
2331         rc 
= pWnd
->OS2DefWindowProc(ulMsg
, wParam
, lParam 
); 
2338             rc 
= pWnd
->OS2WindowProc(ulMsg
, wParam
, lParam
); 
2339             if ( (pWnd
->GetScrollBarHorz() != NULLHANDLE 
|| 
2340                   pWnd
->GetScrollBarVert() != NULLHANDLE
) && 
2343                 if (pWnd
->GetScrollBarHorz() != NULLHANDLE
) 
2344                     ::WinInvalidateRect(pWnd
->GetScrollBarHorz(), NULL
, TRUE
); 
2345                 if (pWnd
->GetScrollBarVert() != NULLHANDLE
) 
2346                     ::WinInvalidateRect(pWnd
->GetScrollBarVert(), NULL
, TRUE
); 
2350             rc 
= ::WinDefWindowProc(hWnd
, ulMsg
, wParam
, lParam
); 
2354 } // end of wxWndProc 
2357 // We will add (or delete) messages we need to handle at this default 
2360 MRESULT 
wxWindowOS2::OS2WindowProc( 
2367     // Did we process the uMsg? 
2369     bool                            bProcessed 
= FALSE
; 
2373     // For most messages we should return 0 when we do process the message 
2375     mResult 
= (MRESULT
)0; 
2383                 bProcessed 
= HandleCreate( (WXLPCREATESTRUCT
)lParam
 
2389                     // Return 0 to bAllow window creation 
2391                     mResult 
= (MRESULT
)(bMayCreate 
? 0 : -1); 
2402             bProcessed 
= HandleMove( LOWORD(lParam
) 
2408             bProcessed 
= HandleSize( LOWORD(lParam
) 
2414         case WM_WINDOWPOSCHANGED
: 
2417             // Dialogs under OS/2 do not get WM_SIZE events at all. 
2418             // Instead they get this, which can function much like WM_SIZE 
2419             // PSWP contains the new sizes and positioning, PSWP+1 the old 
2420             // We use this because ADJUSTWINDOWPOS comes BEFORE the new 
2421             // position is added and our auto layout does a WinQueryWindowRect 
2422             // to get the CURRENT client size.  That is the size used to position 
2423             // child controls, so we need to already be sized 
2424             // in order to get the child controls positoned properly. 
2426             if (IsKindOf(CLASSINFO(wxDialog
)) || IsKindOf(CLASSINFO(wxFrame
))) 
2428                 PSWP                pSwp 
= (PSWP
)PVOIDFROMMP(wParam
); 
2429                 PSWP                pSwp2 
= pSwp
++; 
2431                 if (!(pSwp
->cx 
== pSwp2
->cx 
&& 
2432                       pSwp
->cy 
== pSwp2
->cy
)) 
2433                     bProcessed 
= HandleSize( pSwp
->cx
 
2437                 if (IsKindOf(CLASSINFO(wxFrame
))) 
2439                     wxFrame
*            pFrame 
= wxDynamicCast(this, wxFrame
); 
2443                         if (pFrame
->GetStatusBar()) 
2444                             pFrame
->PositionStatusBar(); 
2445                         if (pFrame
->GetToolBar()) 
2446                             pFrame
->PositionToolBar(); 
2457                 UnpackActivate( wParam
 
2463                 bProcessed 
= HandleActivate( wState
 
2471             if (SHORT1FROMMP((MPARAM
)lParam
) == TRUE
) 
2472                 bProcessed 
= HandleSetFocus((WXHWND
)(HWND
)wParam
); 
2474                 bProcessed 
= HandleKillFocus((WXHWND
)(HWND
)wParam
); 
2478             bProcessed 
= HandlePaint(); 
2483             // Don't let the DefWindowProc() destroy our window - we'll do it 
2484             // ourselves in ~wxWindow 
2487             mResult 
= (MRESULT
)TRUE
; 
2491             bProcessed 
= HandleShow(wParam 
!= 0, (int)lParam
); 
2495         // Under OS2 PM Joysticks are treated just like mouse events 
2496         // The "Motion" events will be prevelent in joysticks 
2499         case WM_BUTTON1DOWN
: 
2501         case WM_BUTTON1DBLCLK
: 
2502         case WM_BUTTON1MOTIONEND
: 
2503         case WM_BUTTON1MOTIONSTART
: 
2504         case WM_BUTTON2DOWN
: 
2506         case WM_BUTTON2DBLCLK
: 
2507         case WM_BUTTON2MOTIONEND
: 
2508         case WM_BUTTON2MOTIONSTART
: 
2509         case WM_BUTTON3DOWN
: 
2511         case WM_BUTTON3DBLCLK
: 
2512         case WM_BUTTON3MOTIONEND
: 
2513         case WM_BUTTON3MOTIONSTART
: 
2515                 if (uMsg 
== WM_BUTTON1DOWN 
&& AcceptsFocus()) 
2518                 short               nX 
= LOWORD(wParam
); 
2519                 short               nY 
= HIWORD(wParam
); 
2522                 // Redirect the event to a static control if necessary 
2524                 if (this == GetCapture()) 
2526                     bProcessed 
= HandleMouseEvent( uMsg
 
2529                                                   ,(WXUINT
)SHORT2FROMMP(lParam
) 
2534                     wxWindow
*       pWin 
= FindWindowForMouseEvent( this 
2538                     if (!pWin
->IsOfStandardClass()) 
2540                         if (uMsg 
== WM_BUTTON1DOWN 
&& pWin
->AcceptsFocus() ) 
2543                     bProcessed 
= pWin
->HandleMouseEvent( uMsg
 
2546                                                         ,(WXUINT
)SHORT2FROMMP(lParam
) 
2553             bProcessed 
= HandleSysCommand(wParam
, lParam
); 
2560                 UnpackCommand(wParam
, lParam
, &id
, &hwnd
, &cmd
); 
2562                 bProcessed 
= HandleCommand(id
, cmd
, hwnd
); 
2567             // For these messages we must return TRUE if process the message 
2570         case WM_MEASUREITEM
: 
2572                 int                 nIdCtrl 
= (UINT
)wParam
; 
2574                 if ( uMsg 
== WM_DRAWITEM 
) 
2576                     bProcessed 
= OS2OnDrawItem(nIdCtrl
, 
2577                                               (WXDRAWITEMSTRUCT 
*)lParam
); 
2581                     return MRFROMLONG(OS2OnMeasureItem( nIdCtrl
 
2582                                                        ,(WXMEASUREITEMSTRUCT 
*)lParam
 
2587                     mResult 
= (MRESULT
)TRUE
; 
2591         case WM_QUERYDLGCODE
: 
2592             if (!IsOfStandardClass()) 
2596                     mResult 
= (MRESULT
)m_lDlgCode
; 
2601             //else: get the dlg code from the DefWindowProc() 
2606         // In OS/2 PM all keyboard events are of the WM_CHAR type.  Virtual key and key-up 
2607         // and key-down events are obtained from the WM_CHAR params. 
2611                 USHORT                  uKeyFlags 
= SHORT1FROMMP((MPARAM
)wParam
); 
2613                 if (uKeyFlags 
& KC_KEYUP
) 
2615                     //TODO: check if the cast to WXWORD isn't causing trouble 
2616                     bProcessed 
= HandleKeyUp(wParam
, lParam
); 
2619                 else // keydown event 
2621                     m_bLastKeydownProcessed 
= FALSE
; 
2623                     // If this has been processed by an event handler, 
2624                     // return 0 now (we've handled it). DON't RETURN 
2625                     // we still need to process further 
2627                     m_bLastKeydownProcessed 
= HandleKeyDown(wParam
, lParam
); 
2628                     if (uKeyFlags 
& KC_VIRTUALKEY
) 
2630                         USHORT          uVk 
= SHORT2FROMMP((MPARAM
)lParam
); 
2633                         // We consider these message "not interesting" to OnChar 
2646                             // Avoid duplicate messages to OnChar for these ASCII keys: they 
2647                             // will be translated by TranslateMessage() and received in WM_CHAR 
2652                                 // But set processed to FALSE, not TRUE to still pass them to 
2653                                 // the control's default window proc - otherwise built-in 
2654                                 // keyboard handling won't work 
2659                                 bProcessed 
= HandleChar(wParam
, lParam
); 
2663                     else // WM_CHAR -- Always an ASCII character 
2665                         if (m_bLastKeydownProcessed
) 
2668                             // The key was handled in the EVT_KEY_DOWN and handling 
2669                             // a key in an EVT_KEY_DOWN handler is meant, by 
2670                             // design, to prevent EVT_CHARs from happening 
2672                             m_bLastKeydownProcessed 
= FALSE
; 
2675                         else // do generate a CHAR event 
2677                             bProcessed 
= HandleChar(wParam
, lParam
, TRUE
); 
2690                 UnpackScroll( wParam
 
2697                 bProcessed 
= OS2OnScroll( uMsg 
== WM_HSCROLL 
? wxHORIZONTAL
 
2707             switch(SHORT2FROMMP(wParam
)) 
2711                         HWND                hWnd 
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
)); 
2712                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2719                         if (pWin
->IsKindOf(CLASSINFO(wxBitmapButton
))) 
2721                             wxBitmapButton
*     pBitmapButton 
= wxDynamicCast(pWin
, wxBitmapButton
); 
2723                             pBitmapButton
->OS2OnDraw((WXDRAWITEMSTRUCT 
*)lParam
); 
2729                 case BKN_PAGESELECTEDPENDING
: 
2731                         PPAGESELECTNOTIFY  pPage 
= (PPAGESELECTNOTIFY
)lParam
; 
2733                         if ((pPage
->ulPageIdNew 
!= pPage
->ulPageIdCur
) && 
2734                             (pPage
->ulPageIdNew 
> 0L && pPage
->ulPageIdCur 
> 0L)) 
2736                             wxWindowOS2
*        pWin 
= wxFindWinFromHandle(pPage
->hwndBook
); 
2737                             wxNotebookEvent     
vEvent( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
 
2738                                                        ,(int)SHORT1FROMMP(wParam
) 
2739                                                        ,(int)pPage
->ulPageIdNew
 
2740                                                        ,(int)pPage
->ulPageIdCur
 
2747                             if (pWin
->IsKindOf(CLASSINFO(wxNotebook
))) 
2749                                 wxNotebook
*         pNotebook 
= wxDynamicCast(pWin
, wxNotebook
); 
2751                                 vEvent
.SetEventObject(pWin
); 
2752                                 pNotebook
->OnSelChange(vEvent
); 
2763                 case BN_CLICKED
: // Dups as LN_SELECT and CBN_LBSELECT 
2765                         HWND                hWnd 
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
)); 
2766                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2774                         // Simulate a WM_COMMAND here, as wxWidgets expects all control 
2775                         // button clicks to generate WM_COMMAND msgs, not WM_CONTROL 
2777                         if (pWin
->IsKindOf(CLASSINFO(wxRadioBox
))) 
2779                             wxRadioBox
*         pRadioBox 
= wxDynamicCast(pWin
, wxRadioBox
); 
2781                             pRadioBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2782                                                   ,(WXUINT
)SHORT1FROMMP(wParam
) 
2785                         if (pWin
->IsKindOf(CLASSINFO(wxRadioButton
))) 
2787                             wxRadioButton
*      pRadioButton 
= wxDynamicCast(pWin
, wxRadioButton
); 
2789                             pRadioButton
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2790                                                      ,(WXUINT
)SHORT1FROMMP(wParam
) 
2793                         if (pWin
->IsKindOf(CLASSINFO(wxCheckBox
))) 
2795                             wxCheckBox
*         pCheckBox 
= wxDynamicCast(pWin
, wxCheckBox
); 
2797                             pCheckBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2798                                                   ,(WXUINT
)SHORT1FROMMP(wParam
) 
2801                         if (pWin
->IsKindOf(CLASSINFO(wxListBox
))) 
2803                             wxListBox
*          pListBox 
= wxDynamicCast(pWin
, wxListBox
); 
2805                             pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2806                                                  ,(WXUINT
)SHORT1FROMMP(wParam
) 
2808                             if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
) 
2811                         if (pWin
->IsKindOf(CLASSINFO(wxComboBox
))) 
2813                             wxComboBox
*          pComboBox 
= wxDynamicCast(pWin
, wxComboBox
); 
2815                             pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2816                                                   ,(WXUINT
)SHORT1FROMMP(wParam
) 
2823                 case LN_ENTER
:   /* dups as CBN_EFCHANGE */ 
2825                         HWND                hWnd 
= HWNDFROMMP(lParam
); 
2826                         wxWindowOS2
*        pWin 
= wxFindWinFromHandle(hWnd
); 
2834                         // Simulate a WM_COMMAND here, as wxWidgets expects all control 
2835                         // button clicks to generate WM_COMMAND msgs, not WM_CONTROL 
2837                         if (pWin
->IsKindOf(CLASSINFO(wxListBox
))) 
2839                             wxListBox
*          pListBox 
= wxDynamicCast(pWin
, wxListBox
); 
2841                             pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2842                                                  ,(WXUINT
)SHORT1FROMMP(wParam
) 
2844                             if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
) 
2848                         if (pWin
->IsKindOf(CLASSINFO(wxComboBox
))) 
2850                             wxComboBox
*          pComboBox 
= wxDynamicCast(pWin
, wxComboBox
); 
2852                             pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
) 
2853                                                   ,(WXUINT
)SHORT1FROMMP(wParam
) 
2861                 case SPBN_DOWNARROW
: 
2867                         ::WinSendMsg( HWNDFROMMP(lParam
) 
2870                                      ,MPFROM2SHORT( (USHORT
)10 
2871                                                    ,(USHORT
)SPBQ_UPDATEIFVALID
 
2875                         bProcessed 
= OS2OnScroll( wxVERTICAL
 
2876                                                  ,(int)SHORT2FROMMP(wParam
) 
2883                 case SLN_SLIDERTRACK
: 
2885                         HWND                hWnd 
= ::WinWindowFromID(GetHWND(), SHORT1FROMMP(wParam
)); 
2886                         wxWindowOS2
*        pChild 
= wxFindWinFromHandle(hWnd
); 
2893                         if (pChild
->IsKindOf(CLASSINFO(wxSlider
))) 
2894                             bProcessed 
= OS2OnScroll( wxVERTICAL
 
2895                                                      ,(int)SHORT2FROMMP(wParam
) 
2896                                                      ,(int)LONGFROMMP(lParam
) 
2904 #if defined(__VISAGECPP__) && (__IBMCPP__ >= 400) 
2905         case WM_CTLCOLORCHANGE
: 
2907                 bProcessed 
= HandleCtlColor(&hBrush
); 
2911         case WM_ERASEBACKGROUND
: 
2913             // Returning TRUE to requestw PM to paint the window background 
2914             // in SYSCLR_WINDOW. We don't really want that 
2916             bProcessed 
= HandleEraseBkgnd((WXHDC
)(HPS
)wParam
); 
2917             mResult 
= (MRESULT
)(FALSE
); 
2920             // the return value for this message is ignored 
2921         case WM_SYSCOLORCHANGE
: 
2922             bProcessed 
= HandleSysColorChange(); 
2925         case WM_REALIZEPALETTE
: 
2926             bProcessed 
= HandlePaletteChanged(); 
2929         // move all drag and drops to wxDrg 
2931             bProcessed 
= HandleEndDrag(wParam
); 
2935             bProcessed 
= HandleInitDialog((WXHWND
)(HWND
)wParam
); 
2939                 // we never set focus from here 
2940                 mResult 
= (MRESULT
)FALSE
; 
2944         // wxFrame specific message 
2945         case WM_MINMAXFRAME
: 
2946             bProcessed 
= HandleGetMinMaxInfo((PSWP
)wParam
); 
2949         case WM_SYSVALUECHANGED
: 
2950             // TODO: do something 
2951             mResult 
= (MRESULT
)TRUE
; 
2955         // Comparable to WM_SETPOINTER for windows, only for just controls 
2957         case WM_CONTROLPOINTER
: 
2958             bProcessed 
= HandleSetCursor( SHORT1FROMMP(wParam
) // Control ID 
2959                                          ,(HWND
)lParam         
// Cursor Handle 
2964                 // Returning TRUE stops the DefWindowProc() from further 
2965                 // processing this message - exactly what we need because we've 
2966                 // just set the cursor. 
2968                 mResult 
= (MRESULT
)TRUE
; 
2972 #if wxUSE_MENUS_NATIVE 
2974             if (wxCurrentPopupMenu
) 
2976                 if (GetHmenuOf(wxCurrentPopupMenu
) == (HWND
)lParam
) 
2978                     // Break out of msg loop in DoPopupMenu 
2979                     ::WinPostMsg((HWND
)lParam
,WM_COMMAND
,wParam
,0); 
2983 #endif // wxUSE_MENUS_NATIVE 
2989         wxLogTrace(wxTraceMessages
, wxT("Forwarding %s to DefWindowProc."), 
2990                    wxGetMessageName(uMsg
)); 
2991 #endif // __WXDEBUG__ 
2992         if (IsKindOf(CLASSINFO(wxFrame
))) 
2993             mResult 
= ::WinDefWindowProc(m_hWnd
, uMsg
, wParam
, lParam
); 
2994         else if (IsKindOf(CLASSINFO(wxDialog
))) 
2995             mResult 
= ::WinDefDlgProc( m_hWnd
, uMsg
, wParam
, lParam
); 
2997             mResult 
= OS2DefWindowProc(uMsg
, wParam
, lParam
); 
3000 } // end of wxWindowOS2::OS2WindowProc 
3002 // ---------------------------------------------------------------------------- 
3003 // wxWindow <-> HWND map 
3004 // ---------------------------------------------------------------------------- 
3006 wxWinHashTable 
*wxWinHandleHash 
= NULL
; 
3008 wxWindow
* wxFindWinFromHandle( 
3012     return (wxWindow 
*)wxWinHandleHash
->Get((long)hWnd
); 
3013 } // end of wxFindWinFromHandle 
3015 void wxAssociateWinWithHandle( 
3021     // Adding NULL hWnd is (first) surely a result of an error and 
3022     // (secondly) breaks menu command processing 
3024     wxCHECK_RET( hWnd 
!= (HWND
)NULL
, 
3025                  wxT("attempt to add a NULL hWnd to window list ignored") ); 
3028     wxWindow
*                       pOldWin 
= wxFindWinFromHandle((WXHWND
) hWnd
); 
3030     if (pOldWin 
&& (pOldWin 
!= pWin
)) 
3032         wxString                    
str(pWin
->GetClassInfo()->GetClassName()); 
3033         wxLogError( "Bug! Found existing HWND %X for new window of class %s" 
3040         wxWinHandleHash
->Put( (long)hWnd
 
3044 } // end of wxAssociateWinWithHandle 
3046 void wxRemoveHandleAssociation( 
3050     wxWinHandleHash
->Delete((long)pWin
->GetHWND()); 
3051 } // end of wxRemoveHandleAssociation 
3054 // Default destroyer - override if you destroy it in some other way 
3055 // (e.g. with MDI child windows) 
3057 void wxWindowOS2::OS2DestroyWindow() 
3061 bool wxWindowOS2::OS2GetCreateWindowCoords( 
3063 , const wxSize
&                     rSize
 
3070     bool                            bNonDefault 
= FALSE
; 
3071     static const int                DEFAULT_Y 
= 200; 
3072     static const int                DEFAULT_H 
= 250; 
3076         rnX 
= rnY 
= CW_USEDEFAULT
; 
3081         rnY 
= rPos
.y 
== -1 ? DEFAULT_Y 
: rPos
.y
; 
3086         rnWidth 
= rnHeight 
= CW_USEDEFAULT
; 
3091         rnHeight 
= rSize
.y 
== -1 ? DEFAULT_H 
: rSize
.y
; 
3095 } // end of wxWindowOS2::OS2GetCreateWindowCoords 
3097 WXHWND 
wxWindowOS2::OS2GetParent() const 
3099     return m_parent 
? m_parent
->GetHWND() : NULL
; 
3102 bool wxWindowOS2::OS2Create( 
3104 , const char*                       zTitle
 
3106 , const wxPoint
&                    rPos
 
3107 , const wxSize
&                     rSize
 
3119     long                            lControlId 
= 0L; 
3120     wxWindowCreationHook            
vHook(this); 
3121     wxString                        
sClassName((wxChar
*)zClass
); 
3123     OS2GetCreateWindowCoords( rPos
 
3133         lControlId 
= GetId(); 
3134         if (GetWindowStyleFlag() & wxCLIP_SIBLINGS
) 
3136             dwStyle 
|= WS_CLIPSIBLINGS
; 
3140     // For each class "Foo" we have we also have "FooNR" ("no repaint") class 
3141     // which is the same but without CS_[HV]REDRAW class styles so using it 
3142     // ensures that the window is not fully repainted on each resize 
3144     if (!HasFlag(wxFULL_REPAINT_ON_RESIZE
)) 
3146         sClassName 
+= wxT("NR"); 
3148     m_hWnd 
= (WXHWND
)::WinCreateWindow( (HWND
)OS2GetParent() 
3149                                        ,(PSZ
)sClassName
.c_str() 
3150                                        ,(PSZ
)zTitle 
? zTitle 
: "" 
3164         vError 
= ::WinGetLastError(wxGetInstance()); 
3165         sError 
= wxPMErrorToStr(vError
); 
3168     SubclassWin(m_hWnd
); 
3169     SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
)); 
3171     m_backgroundColour
.Set(wxString("GREY")); 
3173     LONG                            lColor 
= (LONG
)m_backgroundColour
.GetPixel(); 
3175     if (!::WinSetPresParam( m_hWnd
 
3181         vError 
= ::WinGetLastError(vHabmain
); 
3182         sError 
= wxPMErrorToStr(vError
); 
3183         wxLogError("Error creating frame. Error: %s\n", sError
.c_str()); 
3192 } // end of WinGuiBase_Window::OS2Create 
3194 // =========================================================================== 
3195 // OS2 PM message handlers 
3196 // =========================================================================== 
3198 // --------------------------------------------------------------------------- 
3199 // window creation/destruction 
3200 // --------------------------------------------------------------------------- 
3202 bool wxWindowOS2::HandleCreate( 
3203   WXLPCREATESTRUCT                  
WXUNUSED(vCs
) 
3207     wxWindowCreateEvent             
vEvent((wxWindow
*)this); 
3209     (void)GetEventHandler()->ProcessEvent(vEvent
); 
3210     *pbMayCreate 
= TRUE
; 
3212 } // end of wxWindowOS2::HandleCreate 
3214 bool wxWindowOS2::HandleDestroy() 
3216     wxWindowDestroyEvent            
vEvent((wxWindow
*)this); 
3217     vEvent
.SetId(GetId()); 
3218     (void)GetEventHandler()->ProcessEvent(vEvent
); 
3221     // Delete our drop target if we've got one 
3223 #if wxUSE_DRAG_AND_DROP 
3224     if (m_dropTarget 
!= NULL
) 
3226         delete m_dropTarget
; 
3227         m_dropTarget 
= NULL
; 
3229 #endif // wxUSE_DRAG_AND_DROP 
3232     // WM_DESTROY handled 
3235 } // end of wxWindowOS2::HandleDestroy 
3237 // --------------------------------------------------------------------------- 
3239 // --------------------------------------------------------------------------- 
3240 void wxWindowOS2::OnSetFocus( 
3241   wxFocusEvent
&                     rEvent
 
3245 } // end of wxWindowOS2::OnSetFocus 
3247 bool wxWindowOS2::HandleActivate( 
3249 , WXHWND                            
WXUNUSED(hActivate
) 
3252     wxActivateEvent                 
vEvent( wxEVT_ACTIVATE
 
3256     vEvent
.SetEventObject(this); 
3257     return GetEventHandler()->ProcessEvent(vEvent
); 
3258 } // end of wxWindowOS2::HandleActivate 
3260 bool wxWindowOS2::HandleSetFocus( 
3261   WXHWND                            
WXUNUSED(hWnd
) 
3265     // Notify the parent keeping track of focus for the kbd navigation 
3266     // purposes that we got it 
3268     wxChildFocusEvent               
vEventFocus((wxWindow 
*)this); 
3269     (void)GetEventHandler()->ProcessEvent(vEventFocus
); 
3277         m_caret
->OnSetFocus(); 
3279 #endif // wxUSE_CARET 
3282     // If it's a wxTextCtrl don't send the event as it will be done 
3283     // after the control gets to process it from EN_FOCUS handler 
3284     if ( wxDynamicCastThis(wxTextCtrl
) ) 
3288 #endif // wxUSE_TEXTCTRL 
3290     wxFocusEvent                    
vEvent(wxEVT_SET_FOCUS
, m_windowId
); 
3292     vEvent
.SetEventObject(this); 
3293     return GetEventHandler()->ProcessEvent(vEvent
); 
3294 } // end of wxWindowOS2::HandleSetFocus 
3296 bool wxWindowOS2::HandleKillFocus( 
3306         m_caret
->OnKillFocus(); 
3308 #endif // wxUSE_CARET 
3312     // If it's a wxTextCtrl don't send the event as it will be done 
3313     // after the control gets to process it. 
3315     wxTextCtrl
*                     pCtrl 
= wxDynamicCastThis(wxTextCtrl
); 
3324     // Don't send the event when in the process of being deleted.  This can 
3325     // only cause problems if the event handler tries to access the object. 
3327     if ( m_isBeingDeleted 
) 
3332     wxFocusEvent                    
vEvent( wxEVT_KILL_FOCUS
 
3336     vEvent
.SetEventObject(this); 
3339     // wxFindWinFromHandle() may return NULL, it is ok 
3341     vEvent
.SetWindow(wxFindWinFromHandle(hWnd
)); 
3342     return GetEventHandler()->ProcessEvent(vEvent
); 
3343 } // end of wxWindowOS2::HandleKillFocus 
3345 // --------------------------------------------------------------------------- 
3347 // --------------------------------------------------------------------------- 
3349 bool wxWindowOS2::HandleShow( 
3351 , int                               WXUNUSED(nStatus
) 
3354     wxShowEvent                     
vEvent(GetId(), bShow
); 
3356     vEvent
.SetEventObject(this); 
3357     return GetEventHandler()->ProcessEvent(vEvent
); 
3358 } // end of wxWindowOS2::HandleShow 
3360 bool wxWindowOS2::HandleInitDialog( 
3361   WXHWND                            
WXUNUSED(hWndFocus
) 
3364     wxInitDialogEvent               
vEvent(GetId()); 
3366     vEvent
.SetEventObject(this); 
3367     return GetEventHandler()->ProcessEvent(vEvent
); 
3368 } // end of wxWindowOS2::HandleInitDialog 
3370 bool wxWindowOS2::HandleEndDrag(WXWPARAM 
WXUNUSED(wParam
)) 
3372    // TODO: We'll handle drag and drop later 
3376 bool wxWindowOS2::HandleSetCursor( 
3377   USHORT                            
WXUNUSED(vId
) 
3382     // Under OS/2 PM this allows the pointer to be changed 
3383     // as it passes over a control 
3385     ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)hPointer
); 
3387 } // end of wxWindowOS2::HandleSetCursor 
3389 // --------------------------------------------------------------------------- 
3390 // owner drawn stuff 
3391 // --------------------------------------------------------------------------- 
3392 bool wxWindowOS2::OS2OnDrawItem( 
3394 , WXDRAWITEMSTRUCT
*                 pItemStruct
 
3397 #if wxUSE_OWNER_DRAWN 
3400 #if wxUSE_MENUS_NATIVE 
3402     // Is it a menu item? 
3408         POWNERITEM                  pMeasureStruct 
= (POWNERITEM
)pItemStruct
; 
3409         wxFrame
*                    pFrame 
= (wxFrame
*)this; 
3410         wxMenuItem
*                 pMenuItem 
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
); 
3411         HDC                         hDC 
= ::GpiQueryDevice(pMeasureStruct
->hps
); 
3412         wxRect                      
vRect( pMeasureStruct
->rclItem
.xLeft
 
3413                                           ,pMeasureStruct
->rclItem
.yBottom
 
3414                                           ,pMeasureStruct
->rclItem
.xRight 
- pMeasureStruct
->rclItem
.xLeft
 
3415                                           ,pMeasureStruct
->rclItem
.yTop 
- pMeasureStruct
->rclItem
.yBottom
 
3420         vDc
.SetHPS(pMeasureStruct
->hps
); 
3422         // Load the wxWidgets Pallete and set to RGB mode 
3424         if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
 
3428                                       ,(LONG
)wxTheColourDatabase
->m_nSize
 
3429                                       ,(PLONG
)wxTheColourDatabase
->m_palTable
 
3432             vError 
= ::WinGetLastError(vHabmain
); 
3433             sError 
= wxPMErrorToStr(vError
); 
3434             wxLogError("Unable to set current color table. Error: %s\n", sError
.c_str()); 
3437         // Set the color table to RGB mode 
3439         if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
 
3447             vError 
= ::WinGetLastError(vHabmain
); 
3448             sError 
= wxPMErrorToStr(vError
); 
3449             wxLogError("Unable to set current color table. Error: %s\n", sError
.c_str()); 
3452         wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE 
); 
3458         if (pMeasureStruct
->fsAttribute 
== pMeasureStruct
->fsAttributeOld
) 
3461             // Entire Item needs to be redrawn (either it has reappeared from 
3462             // behind another window or is being displayed for the first time 
3464             eAction 
= wxOwnerDrawn::wxODDrawAll
; 
3466             if (pMeasureStruct
->fsAttribute 
& MIA_HILITED
) 
3469                 // If it is currently selected we let the system handle it 
3471                 eStatus 
|= wxOwnerDrawn::wxODSelected
; 
3473             if (pMeasureStruct
->fsAttribute 
& MIA_CHECKED
) 
3476                 // If it is currently checked we draw our own 
3478                 eStatus 
|= wxOwnerDrawn::wxODChecked
; 
3479                 pMeasureStruct
->fsAttributeOld 
= pMeasureStruct
->fsAttribute 
&= ~MIA_CHECKED
; 
3481             if (pMeasureStruct
->fsAttribute 
& MIA_DISABLED
) 
3484                 // If it is currently disabled we let the system handle it 
3486                 eStatus 
|= wxOwnerDrawn::wxODDisabled
; 
3489             // Don't really care about framed (indicationg focus) or NoDismiss 
3494             if (pMeasureStruct
->fsAttribute 
& MIA_HILITED
) 
3496                 eAction 
= wxOwnerDrawn::wxODDrawAll
; 
3497                 eStatus 
|= wxOwnerDrawn::wxODSelected
; 
3499                 // Keep the system from trying to highlight with its bogus colors 
3501                 pMeasureStruct
->fsAttributeOld 
= pMeasureStruct
->fsAttribute 
&= ~MIA_HILITED
; 
3503             else if (!(pMeasureStruct
->fsAttribute 
& MIA_HILITED
)) 
3505                 eAction 
= wxOwnerDrawn::wxODDrawAll
; 
3508                 // Keep the system from trying to highlight with its bogus colors 
3510                 pMeasureStruct
->fsAttribute 
= pMeasureStruct
->fsAttributeOld 
&= ~MIA_HILITED
; 
3515                 // For now we don't care about anything else 
3516                 // just ignore the entire message! 
3522         // Now redraw the item 
3524         return(pMenuItem
->OnDrawItem( vDc
 
3526                                      ,(wxOwnerDrawn::wxODAction
)eAction
 
3527                                      ,(wxOwnerDrawn::wxODStatus
)eStatus
 
3530         // leave the fsAttribute and fsOldAttribute unchanged.  If different, 
3531         // the system will do the highlight or fraeming or disabling for us, 
3532         // otherwise, we'd have to do it ourselves. 
3535 #endif // wxUSE_MENUS_NATIVE 
3537     wxWindow
*                       pItem 
= FindItem(vId
); 
3539     if (pItem 
&& pItem
->IsKindOf(CLASSINFO(wxControl
))) 
3541         return ((wxControl 
*)pItem
)->OS2OnDraw(pItemStruct
); 
3545     pItemStruct 
= pItemStruct
; 
3548 } // end of wxWindowOS2::OS2OnDrawItem 
3550 long wxWindowOS2::OS2OnMeasureItem( 
3552 , WXMEASUREITEMSTRUCT
*              pItemStruct
 
3555 #if wxUSE_OWNER_DRAWN 
3557     // Is it a menu item? 
3559     if (lId 
== 65536) // I really don't like this...has to be a better indicator 
3561         if (IsKindOf(CLASSINFO(wxFrame
))) // we'll assume if Frame then a menu 
3565             POWNERITEM              pMeasureStruct 
= (POWNERITEM
)pItemStruct
; 
3566             wxFrame
*                pFrame 
= (wxFrame
*)this; 
3567             wxMenuItem
*             pMenuItem 
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
); 
3569             wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE 
); 
3572             if (pMenuItem
->OnMeasureItem( &nWidth
 
3578                 pMeasureStruct
->rclItem
.xRight  
= nWidth
; 
3579                 pMeasureStruct
->rclItem
.xLeft   
= 0L; 
3580                 pMeasureStruct
->rclItem
.yTop    
= nHeight
; 
3581                 pMeasureStruct
->rclItem
.yBottom 
= 0L; 
3582                 mRc 
= MRFROM2SHORT(nHeight
, nWidth
); 
3583                 return LONGFROMMR(mRc
); 
3588     wxWindow
*                      pItem 
= FindItem(lId
); 
3590     if (pItem 
&& pItem
->IsKindOf(CLASSINFO(wxControl
))) 
3594         vItem
.idItem 
= (LONG
)pItemStruct
; 
3595         return ((wxControl 
*)pItem
)->OS2OnMeasure((WXMEASUREITEMSTRUCT
*)&vItem
); 
3599     pItemStruct 
= pItemStruct
; 
3600 #endif // wxUSE_OWNER_DRAWN 
3604 // --------------------------------------------------------------------------- 
3605 // colours and palettes 
3606 // --------------------------------------------------------------------------- 
3608 bool wxWindowOS2::HandleSysColorChange() 
3610     wxSysColourChangedEvent         vEvent
; 
3612     vEvent
.SetEventObject(this); 
3613     return GetEventHandler()->ProcessEvent(vEvent
); 
3614 } // end of wxWindowOS2::HandleSysColorChange 
3616 bool wxWindowOS2::HandleCtlColor( 
3617   WXHBRUSH
*                         WXUNUSED(phBrush
) 
3621     // Not much provided with message. So not sure I can do anything with it 
3624 } // end of wxWindowOS2::HandleCtlColor 
3627 // Define for each class of dialog and control 
3628 WXHBRUSH 
wxWindowOS2::OnCtlColor(WXHDC 
WXUNUSED(hDC
), 
3629                                  WXHWND 
WXUNUSED(hWnd
), 
3630                                  WXUINT 
WXUNUSED(nCtlColor
), 
3631                                  WXUINT 
WXUNUSED(message
), 
3632                                  WXWPARAM 
WXUNUSED(wParam
), 
3633                                  WXLPARAM 
WXUNUSED(lParam
)) 
3638 bool wxWindowOS2::HandlePaletteChanged() 
3640     // need to set this to something first 
3641     WXHWND                          hWndPalChange 
= NULLHANDLE
; 
3643     wxPaletteChangedEvent           
vEvent(GetId()); 
3645     vEvent
.SetEventObject(this); 
3646     vEvent
.SetChangedWindow(wxFindWinFromHandle(hWndPalChange
)); 
3648     return GetEventHandler()->ProcessEvent(vEvent
); 
3649 } // end of wxWindowOS2::HandlePaletteChanged 
3652 // Responds to colour changes: passes event on to children. 
3654 void wxWindowOS2::OnSysColourChanged( 
3655   wxSysColourChangedEvent
&          rEvent
 
3658     wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); 
3663         // Only propagate to non-top-level windows 
3665         wxWindow
*                   pWin 
= (wxWindow 
*)node
->GetData(); 
3667         if (pWin
->GetParent()) 
3669             wxSysColourChangedEvent vEvent
; 
3671             rEvent
.SetEventObject(pWin
); 
3672             pWin
->GetEventHandler()->ProcessEvent(vEvent
); 
3674         node 
= node
->GetNext(); 
3676 } // end of wxWindowOS2::OnSysColourChanged 
3678 // --------------------------------------------------------------------------- 
3680 // --------------------------------------------------------------------------- 
3682 void wxWindow::OnPaint ( 
3683   wxPaintEvent
&                     rEvent
 
3686     HDC                             hDC 
= (HDC
)wxPaintDC::FindDCInCache((wxWindow
*) rEvent
.GetEventObject()); 
3690         OS2DefWindowProc( (WXUINT
)WM_PAINT
 
3695 } // end of wxWindow::OnPaint 
3697 bool wxWindowOS2::HandlePaint() 
3700     wxPaintEvent                    
vEvent(m_windowId
); 
3704     // Create empty region 
3705     // TODO: get HPS somewhere else if possible 
3706     hPS  
= ::WinGetPS(GetHwnd()); 
3707     hRgn 
= ::GpiCreateRegion(hPS
, 0, NULL
); 
3709     if (::WinQueryUpdateRegion(GetHwnd(), hRgn
) == RGN_ERROR
) 
3711          wxLogLastError("CreateRectRgn"); 
3715     // Get all the rectangles from the region, convert the individual 
3716     // rectangles to "the other" coordinate system and reassemble a 
3717     // region from the rectangles, to be feed into m_updateRegion. 
3719     // FIXME: This is a bad hack since OS/2 API specifies that rectangles 
3720     //          passed into GpiSetRegion must not have Bottom > Top, 
3721     //          however, at first sight, it _seems_ to work nonetheless. 
3724     PRECTL                      pUpdateRects 
= NULL
; 
3725     vRgnData
.ulDirection 
= RECTDIR_LFRT_TOPBOT
; 
3726     if (::GpiQueryRegionRects( hPS          
// Pres space 
3727                               ,hRgn         
// Handle of region to query 
3728                               ,NULL         
// Return all RECTs 
3729                               ,&vRgnData    
// Will contain number or RECTs in region 
3730                               ,NULL         
// NULL to return number of RECTs 
3733         pUpdateRects 
= new RECTL
[vRgnData
.crcReturned
]; 
3734         vRgnData
.crc 
= vRgnData
.crcReturned
; 
3735         vRgnData
.ircStart 
= 1; 
3736         if (::GpiQueryRegionRects( hPS      
// Pres space of source 
3737                                   ,hRgn     
// Handle of source region 
3738                                   ,NULL     
// Return all RECTs 
3739                                   ,&vRgnData 
// Operations set to return rects 
3740                                   ,pUpdateRects 
// Will contain the actual RECTS 
3745             ::WinQueryWindowRect(GetHwnd(), &vRect
); 
3746             height 
= vRect
.yTop
; 
3748             for(size_t i 
= 0; i 
< vRgnData
.crc
; i
++) 
3751                 rectHeight 
= pUpdateRects
[i
].yTop 
- pUpdateRects
[i
].yBottom
; 
3752                 pUpdateRects
[i
].yTop 
= height 
- pUpdateRects
[i
].yTop
; 
3753                 pUpdateRects
[i
].yBottom 
= pUpdateRects
[i
].yTop 
+ rectHeight
; 
3755             ::GpiSetRegion(hPS
, hRgn
, vRgnData
.crc
, pUpdateRects
); 
3756             delete [] pUpdateRects
; 
3760     m_updateRegion 
= wxRegion(hRgn
, hPS
); 
3762     vEvent
.SetEventObject(this); 
3763     bProcessed 
= GetEventHandler()->ProcessEvent(vEvent
); 
3766          IsKindOf(CLASSINFO(wxPanel
)) && 
3767          GetChildren().GetCount() == 0 
3771         // OS/2 needs to process this right here, not by the default proc 
3772         // Window's default proc correctly paints everything, OS/2 does not. 
3773         // For decorative panels that typically have no children, we draw 
3779         hPS 
= ::WinBeginPaint( GetHwnd() 
3785             ::GpiCreateLogColorTable( hPS
 
3789                                      ,(LONG
)wxTheColourDatabase
->m_nSize
 
3790                                      ,(PLONG
)wxTheColourDatabase
->m_palTable
 
3792             ::GpiCreateLogColorTable( hPS
 
3799             if (::WinIsWindowVisible(GetHWND())) 
3800                 ::WinFillRect(hPS
, &vRect
,  GetBackgroundColour().GetPixel()); 
3803                 LINEBUNDLE      vLineBundle
; 
3805                 vLineBundle
.lColor     
= 0x00000000; // Black 
3806                 vLineBundle
.usMixMode  
= FM_OVERPAINT
; 
3807                 vLineBundle
.fxWidth    
= 1; 
3808                 vLineBundle
.lGeomWidth 
= 1; 
3809                 vLineBundle
.usType     
= LINETYPE_SOLID
; 
3810                 vLineBundle
.usEnd      
= 0; 
3811                 vLineBundle
.usJoin     
= 0; 
3814                               ,LBB_COLOR 
| LBB_MIX_MODE 
| LBB_WIDTH 
| LBB_GEOM_WIDTH 
| LBB_TYPE
 
3818                 ::WinQueryWindowRect(GetHwnd(), &vRect
); 
3828     else if (!bProcessed 
&& 
3829              IsKindOf(CLASSINFO(wxPanel
)) 
3833         // Panel with children, usually fills a frame client so no borders. 
3838         hPS 
= ::WinBeginPaint( GetHwnd() 
3844             ::GpiCreateLogColorTable( hPS
 
3848                                      ,(LONG
)wxTheColourDatabase
->m_nSize
 
3849                                      ,(PLONG
)wxTheColourDatabase
->m_palTable
 
3851             ::GpiCreateLogColorTable( hPS
 
3859             if (::WinIsWindowVisible(GetHWND())) 
3860                 ::WinFillRect(hPS
, &vRect
,  GetBackgroundColour().GetPixel()); 
3866 } // end of wxWindowOS2::HandlePaint 
3868 bool wxWindowOS2::HandleEraseBkgnd( 
3875     ::WinQueryWindowPos(GetHwnd(), &vSwp
); 
3876     if (vSwp
.fl 
& SWP_MINIMIZE
) 
3881     vDC
.m_hPS 
= (HPS
)hDC
; // this is really a PS 
3882     vDC
.SetWindow((wxWindow
*)this); 
3885     wxEraseEvent                    
vEvent(m_windowId
, &vDC
); 
3887     vEvent
.SetEventObject(this); 
3889     rc 
= GetEventHandler()->ProcessEvent(vEvent
); 
3892     vDC
.m_hPS 
= NULLHANDLE
; 
3894 } // end of wxWindowOS2::HandleEraseBkgnd 
3896 void wxWindowOS2::OnEraseBackground( 
3897   wxEraseEvent
&                     rEvent
 
3901     HPS                             hPS 
= rEvent
.m_dc
->m_hPS
; 
3903     LONG                            lColor 
= m_backgroundColour
.GetPixel(); 
3905     rc 
= ::WinQueryWindowRect(GetHwnd(), &vRect
); 
3906     rc 
= ::WinFillRect(hPS
, &vRect
, lColor
); 
3907 }  // end of wxWindowOS2::OnEraseBackground 
3909 // --------------------------------------------------------------------------- 
3910 // moving and resizing 
3911 // --------------------------------------------------------------------------- 
3913 bool wxWindowOS2::HandleMinimize() 
3915     wxIconizeEvent                  
vEvent(m_windowId
); 
3917     vEvent
.SetEventObject(this); 
3918     return GetEventHandler()->ProcessEvent(vEvent
); 
3919 } // end of wxWindowOS2::HandleMinimize 
3921 bool wxWindowOS2::HandleMaximize() 
3923     wxMaximizeEvent                 
vEvent(m_windowId
); 
3925     vEvent
.SetEventObject(this); 
3926     return GetEventHandler()->ProcessEvent(vEvent
); 
3927 } // end of wxWindowOS2::HandleMaximize 
3929 bool wxWindowOS2::HandleMove( 
3934     wxMoveEvent                     
vEvent(wxPoint(nX
, nY
), m_windowId
); 
3936     vEvent
.SetEventObject(this); 
3937     return GetEventHandler()->ProcessEvent(vEvent
); 
3938 }  // end of wxWindowOS2::HandleMove 
3940 bool wxWindowOS2::HandleSize( 
3943 , WXUINT                            
WXUNUSED(nFlag
) 
3946     wxSizeEvent                     
vEvent(wxSize(nWidth
, nHeight
), m_windowId
); 
3948     vEvent
.SetEventObject(this); 
3949     return GetEventHandler()->ProcessEvent(vEvent
); 
3950 } // end of wxWindowOS2::HandleSize 
3952 bool wxWindowOS2::HandleGetMinMaxInfo( 
3961             ::WinGetMaxPosition(GetHwnd(), pSwp
); 
3962             m_maxWidth 
= pSwp
->cx
; 
3963             m_maxHeight 
= pSwp
->cy
; 
3967             ::WinGetMinPosition(GetHwnd(), pSwp
, &vPoint
); 
3968             m_minWidth 
= pSwp
->cx
; 
3969             m_minHeight 
= pSwp
->cy
; 
3976 } // end of wxWindowOS2::HandleGetMinMaxInfo 
3978 // --------------------------------------------------------------------------- 
3980 // --------------------------------------------------------------------------- 
3981 bool wxWindowOS2::HandleCommand( 
3987 #if wxUSE_MENUS_NATIVE 
3988     if (wxCurrentPopupMenu
) 
3990         wxMenu
*                     pPopupMenu 
= wxCurrentPopupMenu
; 
3992         wxCurrentPopupMenu 
= NULL
; 
3993         return pPopupMenu
->OS2Command(wCmd
, wId
); 
3995 #endif // wxUSE_MENUS_NATIVE 
3997     wxWindow
*                       pWin 
= FindItem(wId
); 
4001         pWin 
= wxFindWinFromHandle(hControl
); 
4005         return pWin
->OS2Command(wCmd
, wId
); 
4008 } // end of wxWindowOS2::HandleCommand 
4010 bool wxWindowOS2::HandleSysCommand( 
4012 , WXLPARAM                          
WXUNUSED(lParam
) 
4016     // 4 bits are reserved 
4018     switch (SHORT1FROMMP(wParam
)) 
4021             return HandleMaximize(); 
4024             return HandleMinimize(); 
4027 } // end of wxWindowOS2::HandleSysCommand 
4029 // --------------------------------------------------------------------------- 
4031 // --------------------------------------------------------------------------- 
4032 //TODO!!! check against MSW 
4033 void wxWindowOS2::InitMouseEvent( 
4034   wxMouseEvent
&                     rEvent
 
4041     DoGetSize(0, &nHeight
); 
4043     // Convert to wxWidgets standard coordinate system! 
4044     rEvent
.m_y           
= nHeight 
- nY
; 
4045     rEvent
.m_shiftDown   
= ((uFlags 
& KC_SHIFT
) != 0); 
4046     rEvent
.m_controlDown 
= ((uFlags 
& KC_CTRL
) != 0); 
4047     rEvent
.m_altDown     
= ((uFlags 
& KC_ALT
) != 0); 
4048     rEvent
.m_leftDown    
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON1
) & 
4050     rEvent
.m_middleDown  
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON3
) & 
4052     rEvent
.m_rightDown   
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON2
) & 
4054     rEvent
.SetTimestamp(s_currentMsg
.time
); 
4055     rEvent
.SetEventObject(this); 
4056     rEvent
.SetId(GetId()); 
4058 #if wxUSE_MOUSEEVENT_HACK 
4061     m_lastMouseEvent 
= rEvent
.GetEventType(); 
4062 #endif // wxUSE_MOUSEEVENT_HACK 
4063 } // end of wxWindowOS2::InitMouseEvent 
4065 bool wxWindowOS2::HandleMouseEvent( 
4072     bool                            bProcessed 
= FALSE
; 
4075     // The mouse events take consecutive IDs from WM_MOUSEFIRST to 
4076     // WM_MOUSELAST, so it's enough to subtract WM_MOUSEMOVE == WM_MOUSEFIRST 
4077     // from the message id and take the value in the table to get wxWin event 
4080     static const wxEventType eventsMouse
[] = 
4095     if ((uMsg 
>= WM_MOUSEMOVE
) && (uMsg 
<= WM_BUTTON3DBLCLK
)) 
4097         wxMouseEvent               
vEvent(eventsMouse
[uMsg 
- WM_MOUSEMOVE
]); 
4099         InitMouseEvent( vEvent
 
4105         bProcessed 
= GetEventHandler()->ProcessEvent(vEvent
); 
4108             HPOINTER               hCursor 
= (HPOINTER
)GetCursor().GetHCURSOR(); 
4110             if (hCursor 
!= NULLHANDLE
) 
4112                 ::WinSetPointer(HWND_DESKTOP
, hCursor
); 
4118 } // end of wxWindowOS2::HandleMouseEvent 
4120 bool wxWindowOS2::HandleMouseMove( 
4126     if (!m_bMouseInWindow
) 
4129         // Generate an ENTER event 
4131         m_bMouseInWindow 
= TRUE
; 
4133         wxMouseEvent                
vEvent(wxEVT_ENTER_WINDOW
); 
4135         InitMouseEvent( vEvent
 
4141         (void)GetEventHandler()->ProcessEvent(vEvent
); 
4143     return HandleMouseEvent( WM_MOUSEMOVE
 
4148 } // end of wxWindowOS2::HandleMouseMove 
4150 // --------------------------------------------------------------------------- 
4151 // keyboard handling 
4152 // --------------------------------------------------------------------------- 
4155 // Create the key event of the given type for the given key - used by 
4156 // HandleChar and HandleKeyDown/Up 
4158 wxKeyEvent 
wxWindowOS2::CreateKeyEvent( 
4165     wxKeyEvent                      
vEvent(eType
); 
4167     vEvent
.SetId(GetId()); 
4168     vEvent
.m_shiftDown   
= IsShiftDown(); 
4169     vEvent
.m_controlDown 
= IsCtrlDown(); 
4170     vEvent
.m_altDown     
= (HIWORD(lParam
) & KC_ALT
) == KC_ALT
; 
4172     vEvent
.SetEventObject((wxWindow 
*)this); // const_cast 
4173     vEvent
.m_keyCode     
= nId
; 
4174     vEvent
.m_rawCode 
= (wxUint32
)wParam
; 
4175     vEvent
.m_rawFlags 
= (wxUint32
)lParam
; 
4176     vEvent
.SetTimestamp(s_currentMsg
.time
); 
4179     // Translate the position to client coords 
4184     ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
4185     ::WinQueryWindowRect( GetHwnd() 
4189     vPoint
.x 
-= vRect
.xLeft
; 
4190     vPoint
.y 
-= vRect
.yBottom
; 
4192     vEvent
.m_x 
= vPoint
.x
; 
4193     vEvent
.m_y 
= vPoint
.y
; 
4196 } // end of wxWindowOS2::CreateKeyEvent 
4199 // isASCII is TRUE only when we're called from WM_CHAR handler and not from 
4202 bool wxWindowOS2::HandleChar( 
4208     bool                            bCtrlDown 
= FALSE
; 
4211     if (m_bLastKeydownProcessed
) 
4214         // The key was handled in the EVT_KEY_DOWN.  Handling a key in an 
4215         // EVT_KEY_DOWN handler is meant, by design, to prevent EVT_CHARs 
4216         // from happening, so just bail out at this point. 
4218         m_bLastKeydownProcessed 
= FALSE
; 
4224         // If 1 -> 26, translate to either special keycode or just set 
4225         // ctrlDown.  IOW, Ctrl-C should result in keycode == 3 and 
4226         // ControlDown() == TRUE. 
4228         vId 
= SHORT1FROMMP(lParam
); 
4229         if ((vId 
> 0) && (vId 
< 27)) 
4251     else  // we're called from WM_KEYDOWN 
4253         vId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4258     wxKeyEvent                      
vEvent(CreateKeyEvent( wxEVT_CHAR
 
4265         vEvent
.m_controlDown 
= TRUE
; 
4267     return (GetEventHandler()->ProcessEvent(vEvent
)); 
4270 bool wxWindowOS2::HandleKeyDown( 
4275     int                             nId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4280         // Normal ASCII char 
4282         nId 
= SHORT1FROMMP(lParam
); 
4287         wxKeyEvent                  
vEvent(CreateKeyEvent( wxEVT_KEY_DOWN
 
4293         if (GetEventHandler()->ProcessEvent(vEvent
)) 
4299 } // end of wxWindowOS2::HandleKeyDown 
4301 bool wxWindowOS2::HandleKeyUp( 
4306     int                             nId 
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
)); 
4311         // Normal ASCII char 
4318         wxKeyEvent                  
vEvent(CreateKeyEvent( wxEVT_KEY_UP
 
4324         if (GetEventHandler()->ProcessEvent(vEvent
)) 
4328 } // end of wxWindowOS2::HandleKeyUp 
4330 // --------------------------------------------------------------------------- 
4332 // --------------------------------------------------------------------------- 
4334 // --------------------------------------------------------------------------- 
4336 // --------------------------------------------------------------------------- 
4338 bool wxWindowOS2::OS2OnScroll( 
4347         wxWindow
*                   pChild 
= wxFindWinFromHandle(hControl
); 
4350             return pChild
->OS2OnScroll( nOrientation
 
4357     wxScrollWinEvent                vEvent
; 
4359     vEvent
.SetPosition(wPos
); 
4360     vEvent
.SetOrientation(nOrientation
); 
4361     vEvent
.SetEventObject(this); 
4366             vEvent
.SetEventType(wxEVT_SCROLLWIN_LINEUP
); 
4370             vEvent
.SetEventType(wxEVT_SCROLLWIN_LINEDOWN
); 
4374             vEvent
.SetEventType(wxEVT_SCROLLWIN_PAGEUP
); 
4378             vEvent
.SetEventType(wxEVT_SCROLLWIN_PAGEDOWN
); 
4381         case SB_SLIDERPOSITION
: 
4382             vEvent
.SetEventType(wxEVT_SCROLLWIN_THUMBRELEASE
); 
4385         case SB_SLIDERTRACK
: 
4386             vEvent
.SetEventType(wxEVT_SCROLLWIN_THUMBTRACK
); 
4392     return GetEventHandler()->ProcessEvent(vEvent
); 
4393 } // end of wxWindowOS2::OS2OnScroll 
4395 void wxWindowOS2::MoveChildren( 
4400     // We want to handle top levels ourself, manually 
4402     if (!IsTopLevel() && GetAutoLayout()) 
4410         for (wxWindowList::compatibility_iterator node 
= GetChildren().GetFirst(); 
4412              node 
= node
->GetNext()) 
4414             wxWindow
*               pWin 
= node
->GetData(); 
4416             ::WinQueryWindowPos( GetHwndOf(pWin
) 
4419             if (pWin
->IsKindOf(CLASSINFO(wxControl
))) 
4424                 // Must deal with controls that have margins like ENTRYFIELD.  The SWP 
4425                 // struct of such a control will have and origin offset from its intended 
4426                 // position by the width of the margins. 
4428                 pCtrl 
= wxDynamicCast(pWin
, wxControl
); 
4429                 vSwp
.y 
-= pCtrl
->GetYComp(); 
4430                 vSwp
.x 
-= pCtrl
->GetXComp(); 
4432             ::WinSetWindowPos( GetHwndOf(pWin
) 
4440             ::WinQueryWindowPos(GetHwndOf(pWin
), pWin
->GetSwp()); 
4441             if (pWin
->IsKindOf(CLASSINFO(wxRadioBox
))) 
4443                 wxRadioBox
*     pRadioBox
; 
4445                 pRadioBox 
= wxDynamicCast(pWin
, wxRadioBox
); 
4446                 pRadioBox
->AdjustButtons( (int)vSwp
.x
 
4447                                          ,(int)vSwp
.y 
- nDiff
 
4450                                          ,pRadioBox
->GetSizeFlags() 
4453             if (pWin
->IsKindOf(CLASSINFO(wxSlider
))) 
4457                 pSlider 
= wxDynamicCast(pWin
, wxSlider
); 
4458                 pSlider
->AdjustSubControls( (int)vSwp
.x
 
4459                                            ,(int)vSwp
.y 
- nDiff
 
4462                                            ,(int)pSlider
->GetSizeFlags() 
4468 } // end of wxWindowOS2::MoveChildren 
4471 //  Getting the Y position for a window, like a control, is a real 
4472 //  pain.  There are three sitatuions we must deal with in determining 
4473 //  the OS2 to wxWidgets Y coordinate. 
4475 //  1)  The controls are created in a dialog. 
4476 //      This is the easiest since a dialog is created with its original 
4477 //      size so the standard: Y = ParentHeight - (Y + ControlHeight); 
4479 //  2)  The controls are direct children of a frame 
4480 //      In this instance the controls are actually children of the Frame's 
4481 //      client.  During creation the frame's client resizes several times 
4482 //      during creation of the status bar and toolbars.  The CFrame class 
4483 //      will take care of this using its AlterChildPos proc. 
4485 //  3)  The controls are children of a panel, which in turn is a child of 
4487 //      The panel may be one of many, in which case the same treatment 
4488 //      as 1 applies. It may be the only child, though. 
4489 //      This is the nastiest case.  A panel is created as the only child of 
4490 //      the frame and as such, when a frame has only one child, the child is 
4491 //      expanded to fit the entire client area of the frame.  Because the 
4492 //      controls are created BEFORE this occurs their positions are totally 
4493 //      whacked and any call to WinQueryWindowPos will return invalid 
4494 //      coordinates.  So for this situation we have to compare the size of 
4495 //      the panel at control creation time with that of the frame client.  If 
4496 //      they are the same we can use the standard Y position equation.  If 
4497 //      not, then we must use the Frame Client's dimensions to position them 
4498 //      as that will be the eventual size of the panel after the frame resizes 
4501 int wxWindowOS2::GetOS2ParentHeight( 
4502   wxWindowOS2
*               pParent
 
4508     if (pParent
->IsKindOf(CLASSINFO(wxDialog
))) 
4509         return(pParent
->GetClientSize().y
); 
4512     // Case 2 -- if we are one of the separately built standard Frame 
4513     //           children, like a statusbar, menubar, or toolbar we want to 
4514     //           use the frame, itself, for positioning.  Otherwise we are 
4515     //           child window and want to use the Frame's client. 
4517     else if (pParent
->IsKindOf(CLASSINFO(wxFrame
))) 
4519         if (IsKindOf(CLASSINFO(wxStatusBar
)) || 
4520             IsKindOf(CLASSINFO(wxMenuBar
))   || 
4521             IsKindOf(CLASSINFO(wxToolBar
)) 
4524             if (IsKindOf(CLASSINFO(wxToolBar
))) 
4526                 wxFrame
*            pFrame 
= wxDynamicCast(GetParent(), wxFrame
); 
4528                 if (pFrame
->GetToolBar() == this) 
4529                     return(pParent
->GetSize().y
); 
4531                     return(pParent
->GetClientSize().y
); 
4534                 return(pParent
->GetSize().y
); 
4537             return(pParent
->GetClientSize().y
); 
4540     // Case -- this is for any window that is the sole child of a Frame. 
4541     //         The grandparent must exist and it must be of type CFrame 
4542     //         and it's height must be different. Otherwise the standard 
4547         return(pParent
->GetClientSize().y
); 
4550 } // end of wxWindowOS2::GetOS2ParentHeight 
4553 // OS/2 needs a lot extra manipulation to deal with layouts 
4554 // for canvas windows, particularly scrolled ones. 
4556 wxWindowCreationHook::wxWindowCreationHook( 
4557   wxWindow
*                         pWinBeingCreated
 
4560     gpWinBeingCreated 
= pWinBeingCreated
; 
4561 } // end of wxWindowCreationHook::wxWindowCreationHook 
4563 wxWindowCreationHook::~wxWindowCreationHook() 
4565     gpWinBeingCreated 
= NULL
; 
4566 } // end of wxWindowCreationHook::~wxWindowCreationHook 
4568 // =========================================================================== 
4570 // =========================================================================== 
4576 ,wxFont
*                            WXUNUSED(pTheFont
) 
4583     hPS 
=::WinGetPS(hWnd
); 
4585     rc 
= ::GpiQueryFontMetrics(hPS
, sizeof(FONTMETRICS
), &vFM
); 
4589             *pX 
= vFM
.lAveCharWidth
; 
4591             *pY 
= vFM
.lEmHeight 
+ vFM
.lExternalLeading
; 
4600     ::WinReleasePS(hPS
); 
4601 } // end of wxGetCharSize 
4604 // Returns 0 if was a normal ASCII value, not a special key. This indicates that 
4605 // the key should be ignored by WM_KEYDOWN and processed by WM_CHAR instead. 
4607 int wxCharCodeOS2ToWX( 
4615         case VK_BACKTAB
:    nId 
= WXK_BACK
; break; 
4616         case VK_TAB
:        nId 
= WXK_TAB
; break; 
4617         case VK_CLEAR
:      nId 
= WXK_CLEAR
; break; 
4618         case VK_ENTER
:      nId 
= WXK_RETURN
; break; 
4619         case VK_SHIFT
:      nId 
= WXK_SHIFT
; break; 
4620         case VK_CTRL
:       nId 
= WXK_CONTROL
; break; 
4621         case VK_PAUSE
:      nId 
= WXK_PAUSE
; break; 
4622         case VK_SPACE
:      nId 
= WXK_SPACE
; break; 
4623         case VK_ESC
:        nId 
= WXK_ESCAPE
; break; 
4624         case VK_END
:        nId 
= WXK_END
; break; 
4625         case VK_HOME 
:      nId 
= WXK_HOME
; break; 
4626         case VK_LEFT 
:      nId 
= WXK_LEFT
; break; 
4627         case VK_UP
:         nId 
= WXK_UP
; break; 
4628         case VK_RIGHT
:      nId 
= WXK_RIGHT
; break; 
4629         case VK_DOWN 
:      nId 
= WXK_DOWN
; break; 
4630         case VK_PRINTSCRN
:  nId 
= WXK_PRINT
; break; 
4631         case VK_INSERT
:     nId 
= WXK_INSERT
; break; 
4632         case VK_DELETE
:     nId 
= WXK_DELETE
; break; 
4633         case VK_CAPSLOCK
:   nId 
= WXK_CAPITAL
; break; 
4634         case VK_F1
:         nId 
= WXK_F1
; break; 
4635         case VK_F2
:         nId 
= WXK_F2
; break; 
4636         case VK_F3
:         nId 
= WXK_F3
; break; 
4637         case VK_F4
:         nId 
= WXK_F4
; break; 
4638         case VK_F5
:         nId 
= WXK_F5
; break; 
4639         case VK_F6
:         nId 
= WXK_F6
; break; 
4640         case VK_F7
:         nId 
= WXK_F7
; break; 
4641         case VK_F8
:         nId 
= WXK_F8
; break; 
4642         case VK_F9
:         nId 
= WXK_F9
; break; 
4643         case VK_F10
:        nId 
= WXK_F10
; break; 
4644         case VK_F11
:        nId 
= WXK_F11
; break; 
4645         case VK_F12
:        nId 
= WXK_F12
; break; 
4646         case VK_F13
:        nId 
= WXK_F13
; break; 
4647         case VK_F14
:        nId 
= WXK_F14
; break; 
4648         case VK_F15
:        nId 
= WXK_F15
; break; 
4649         case VK_F16
:        nId 
= WXK_F16
; break; 
4650         case VK_F17
:        nId 
= WXK_F17
; break; 
4651         case VK_F18
:        nId 
= WXK_F18
; break; 
4652         case VK_F19
:        nId 
= WXK_F19
; break; 
4653         case VK_F20
:        nId 
= WXK_F20
; break; 
4654         case VK_F21
:        nId 
= WXK_F21
; break; 
4655         case VK_F22
:        nId 
= WXK_F22
; break; 
4656         case VK_F23
:        nId 
= WXK_F23
; break; 
4657         case VK_F24
:        nId 
= WXK_F24
; break; 
4658         case VK_OEM_1
:      nId 
= ';'; break; 
4659         case VK_OEM_PLUS
:   nId 
= '+'; break; 
4660         case VK_OEM_COMMA
:  nId 
= ','; break; 
4661         case VK_OEM_MINUS
:  nId 
= '-'; break; 
4662         case VK_OEM_PERIOD
: nId 
= '.'; break; 
4663         case VK_OEM_2
:      nId 
= '/'; break; 
4664         case VK_OEM_3
:      nId 
= '~'; break; 
4665         case VK_OEM_4
:      nId 
= '['; break; 
4666         case VK_OEM_5
:      nId 
= '\\'; break; 
4667         case VK_OEM_6
:      nId 
= ']'; break; 
4668         case VK_OEM_7
:      nId 
= '\''; break; 
4669         case VK_NUMLOCK
:    nId 
= WXK_NUMLOCK
; break; 
4670         case VK_SCRLLOCK
:   nId 
= WXK_SCROLL
; break; 
4677 } // end of wxCharCodeOS2ToWX 
4679 int wxCharCodeWXToOS2( 
4689         case WXK_CLEAR
:     nKeySym 
= VK_CLEAR
; break; 
4690         case WXK_SHIFT
:     nKeySym 
= VK_SHIFT
; break; 
4691         case WXK_CONTROL
:   nKeySym 
= VK_CTRL
; break; 
4692         case WXK_PAUSE
:     nKeySym 
= VK_PAUSE
; break; 
4693         case WXK_END
:       nKeySym 
= VK_END
; break; 
4694         case WXK_HOME 
:     nKeySym 
= VK_HOME
; break; 
4695         case WXK_LEFT 
:     nKeySym 
= VK_LEFT
; break; 
4696         case WXK_UP
:        nKeySym 
= VK_UP
; break; 
4697         case WXK_RIGHT
:     nKeySym 
= VK_RIGHT
; break; 
4698         case WXK_DOWN 
:     nKeySym 
= VK_DOWN
; break; 
4699         case WXK_PRINT
:     nKeySym 
= VK_PRINTSCRN
; break; 
4700         case WXK_INSERT
:    nKeySym 
= VK_INSERT
; break; 
4701         case WXK_DELETE
:    nKeySym 
= VK_DELETE
; break; 
4702         case WXK_F1
:        nKeySym 
= VK_F1
; break; 
4703         case WXK_F2
:        nKeySym 
= VK_F2
; break; 
4704         case WXK_F3
:        nKeySym 
= VK_F3
; break; 
4705         case WXK_F4
:        nKeySym 
= VK_F4
; break; 
4706         case WXK_F5
:        nKeySym 
= VK_F5
; break; 
4707         case WXK_F6
:        nKeySym 
= VK_F6
; break; 
4708         case WXK_F7
:        nKeySym 
= VK_F7
; break; 
4709         case WXK_F8
:        nKeySym 
= VK_F8
; break; 
4710         case WXK_F9
:        nKeySym 
= VK_F9
; break; 
4711         case WXK_F10
:       nKeySym 
= VK_F10
; break; 
4712         case WXK_F11
:       nKeySym 
= VK_F11
; break; 
4713         case WXK_F12
:       nKeySym 
= VK_F12
; break; 
4714         case WXK_F13
:       nKeySym 
= VK_F13
; break; 
4715         case WXK_F14
:       nKeySym 
= VK_F14
; break; 
4716         case WXK_F15
:       nKeySym 
= VK_F15
; break; 
4717         case WXK_F16
:       nKeySym 
= VK_F16
; break; 
4718         case WXK_F17
:       nKeySym 
= VK_F17
; break; 
4719         case WXK_F18
:       nKeySym 
= VK_F18
; break; 
4720         case WXK_F19
:       nKeySym 
= VK_F19
; break; 
4721         case WXK_F20
:       nKeySym 
= VK_F20
; break; 
4722         case WXK_F21
:       nKeySym 
= VK_F21
; break; 
4723         case WXK_F22
:       nKeySym 
= VK_F22
; break; 
4724         case WXK_F23
:       nKeySym 
= VK_F23
; break; 
4725         case WXK_F24
:       nKeySym 
= VK_F24
; break; 
4726         case WXK_NUMLOCK
:   nKeySym 
= VK_NUMLOCK
; break; 
4727         case WXK_SCROLL
:    nKeySym 
= VK_SCRLLOCK
; break; 
4730             *bIsVirtual 
= FALSE
; 
4736 } // end of wxCharCodeWXToOS2 
4738 wxWindow
* wxGetActiveWindow() 
4740     HWND                            hWnd 
= ::WinQueryActiveWindow(HWND_DESKTOP
); 
4744         return wxFindWinFromHandle((WXHWND
)hWnd
); 
4747 } // end of wxGetActiveWindow 
4750 const char* wxGetMessageName( 
4755         case 0x0000: return "WM_NULL"; 
4756         case 0x0001: return "WM_CREATE"; 
4757         case 0x0002: return "WM_DESTROY"; 
4758         case 0x0004: return "WM_ENABLE"; 
4759         case 0x0005: return "WM_SHOW"; 
4760         case 0x0006: return "WM_MOVE"; 
4761         case 0x0007: return "WM_SIZE"; 
4762         case 0x0008: return "WM_ADJUSTWINDOWPOS"; 
4763         case 0x0009: return "WM_CALCVALIDRECTS"; 
4764         case 0x000A: return "WM_SETWINDOWPARAMS"; 
4765         case 0x000B: return "WM_QUERYWINDOWPARAMS"; 
4766         case 0x000C: return "WM_HITTEST"; 
4767         case 0x000D: return "WM_ACTIVATE"; 
4768         case 0x000F: return "WM_SETFOCUS"; 
4769         case 0x0010: return "WM_SETSELECTION"; 
4770         case 0x0011: return "WM_PPAINT"; 
4771         case 0x0012: return "WM_PSETFOCUS"; 
4772         case 0x0013: return "WM_PSYSCOLORCHANGE"; 
4773         case 0x0014: return "WM_PSIZE"; 
4774         case 0x0015: return "WM_PACTIVATE"; 
4775         case 0x0016: return "WM_PCONTROL"; 
4776         case 0x0020: return "WM_COMMAND"; 
4777         case 0x0021: return "WM_SYSCOMMAND"; 
4778         case 0x0022: return "WM_HELP"; 
4779         case 0x0023: return "WM_PAINT"; 
4780         case 0x0024: return "WM_TIMER"; 
4781         case 0x0025: return "WM_SEM1"; 
4782         case 0x0026: return "WM_SEM2"; 
4783         case 0x0027: return "WM_SEM3"; 
4784         case 0x0028: return "WM_SEM4"; 
4785         case 0x0029: return "WM_CLOSE"; 
4786         case 0x002A: return "WM_QUIT"; 
4787         case 0x002B: return "WM_SYSCOLORCHANGE"; 
4788         case 0x002D: return "WM_SYSVALUECHANGE"; 
4789         case 0x002E: return "WM_APPTERMINATENOTIFY"; 
4790         case 0x002F: return "WM_PRESPARAMCHANGED"; 
4791         // Control notification messages 
4792         case 0x0030: return "WM_CONTROL"; 
4793         case 0x0031: return "WM_VSCROLL"; 
4794         case 0x0032: return "WM_HSCROLL"; 
4795         case 0x0033: return "WM_INITMENU"; 
4796         case 0x0034: return "WM_MENUSELECT"; 
4797         case 0x0035: return "WM_MENUSEND"; 
4798         case 0x0036: return "WM_DRAWITEM"; 
4799         case 0x0037: return "WM_MEASUREITEM"; 
4800         case 0x0038: return "WM_CONTROLPOINTER"; 
4801         case 0x003A: return "WM_QUERYDLGCODE"; 
4802         case 0x003B: return "WM_INITDLG"; 
4803         case 0x003C: return "WM_SUBSTITUTESTRING"; 
4804         case 0x003D: return "WM_MATCHMNEMONIC"; 
4805         case 0x003E: return "WM_SAVEAPPLICATION"; 
4806         case 0x0129: return "WM_CTLCOLORCHANGE"; 
4807         case 0x0130: return "WM_QUERYCTLTYPE"; 
4809         case 0x0040: return "WM_FLASHWINDOW"; 
4810         case 0x0041: return "WM_FORMATFRAME"; 
4811         case 0x0042: return "WM_UPDATEFRAME"; 
4812         case 0x0043: return "WM_FOCUSCHANGE"; 
4813         case 0x0044: return "WM_SETBORDERSIZE"; 
4814         case 0x0045: return "WM_TRACKFRAME"; 
4815         case 0x0046: return "WM_MINMAXFRAME"; 
4816         case 0x0047: return "WM_SETICON"; 
4817         case 0x0048: return "WM_QUERYICON"; 
4818         case 0x0049: return "WM_SETACCELTABLE"; 
4819         case 0x004A: return "WM_QUERYACCELTABLE"; 
4820         case 0x004B: return "WM_TRANSLATEACCEL"; 
4821         case 0x004C: return "WM_QUERYTRACKINFO"; 
4822         case 0x004D: return "WM_QUERYBORDERSIZE"; 
4823         case 0x004E: return "WM_NEXTMENU"; 
4824         case 0x004F: return "WM_ERASEBACKGROUND"; 
4825         case 0x0050: return "WM_QUERYFRAMEINFO"; 
4826         case 0x0051: return "WM_QUERYFOCUSCHAIN"; 
4827         case 0x0052: return "WM_OWNERPOSCHANGE"; 
4828         case 0x0053: return "WM_CACLFRAMERECT"; 
4829         case 0x0055: return "WM_WINDOWPOSCHANGED"; 
4830         case 0x0056: return "WM_ADJUSTFRAMEPOS"; 
4831         case 0x0059: return "WM_QUERYFRAMECTLCOUNT"; 
4832         case 0x005B: return "WM_QUERYHELPINFO"; 
4833         case 0x005C: return "WM_SETHELPINFO"; 
4834         case 0x005D: return "WM_ERROR"; 
4835         case 0x005E: return "WM_REALIZEPALETTE"; 
4836         // Clipboard messages 
4837         case 0x0060: return "WM_RENDERFMT"; 
4838         case 0x0061: return "WM_RENDERALLFMTS"; 
4839         case 0x0062: return "WM_DESTROYCLIPBOARD"; 
4840         case 0x0063: return "WM_PAINTCLIPBOARD"; 
4841         case 0x0064: return "WM_SIZECLIPBOARD"; 
4842         case 0x0065: return "WM_HSCROLLCLIPBOARD"; 
4843         case 0x0066: return "WM_VSCROLLCLIPBOARD"; 
4844         case 0x0067: return "WM_DRAWCLIPBOARD"; 
4846         case 0x0070: return "WM_MOUSEMOVE"; 
4847         case 0x0071: return "WM_BUTTON1DOWN"; 
4848         case 0x0072: return "WM_BUTTON1UP"; 
4849         case 0x0073: return "WM_BUTTON1DBLCLK"; 
4850         case 0x0074: return "WM_BUTTON2DOWN"; 
4851         case 0x0075: return "WM_BUTTON2UP"; 
4852         case 0x0076: return "WM_BUTTON2DBLCLK"; 
4853         case 0x0077: return "WM_BUTTON3DOWN"; 
4854         case 0x0078: return "WM_BUTTON3UP"; 
4855         case 0x0079: return "WM_BUTTON3DBLCLK"; 
4856         case 0x007D: return "WM_MOUSEMAP"; 
4857         case 0x007E: return "WM_VRNDISABLED"; 
4858         case 0x007F: return "WM_VRNENABLED"; 
4859         case 0x0410: return "WM_CHORD"; 
4860         case 0x0411: return "WM_BUTTON1MOTIONSTART"; 
4861         case 0x0412: return "WM_BUTTON1MOTIONEND"; 
4862         case 0x0413: return "WM_BUTTON1CLICK"; 
4863         case 0x0414: return "WM_BUTTON2MOTIONSTART"; 
4864         case 0x0415: return "WM_BUTTON2MOTIONEND"; 
4865         case 0x0416: return "WM_BUTTON2CLICK"; 
4866         case 0x0417: return "WM_BUTTON3MOTIONSTART"; 
4867         case 0x0418: return "WM_BUTTON3MOTIONEND"; 
4868         case 0x0419: return "WM_BUTTON3CLICK"; 
4869         case 0x0420: return "WM_BEGINDRAG"; 
4870         case 0x0421: return "WM_ENDDRAG"; 
4871         case 0x0422: return "WM_SINGLESELECT"; 
4872         case 0x0423: return "WM_OPEN"; 
4873         case 0x0424: return "WM_CONTEXTMENU"; 
4874         case 0x0425: return "WM_CONTEXTHELP"; 
4875         case 0x0426: return "WM_TEXTEDIT"; 
4876         case 0x0427: return "WM_BEGINSELECT"; 
4877         case 0x0228: return "WM_ENDSELECT"; 
4878         case 0x0429: return "WM_PICKUP"; 
4879         case 0x04C0: return "WM_PENFIRST"; 
4880         case 0x04FF: return "WM_PENLAST"; 
4881         case 0x0500: return "WM_MMPMFIRST"; 
4882         case 0x05FF: return "WM_MMPMLAST"; 
4883         case 0x0600: return "WM_STDDLGFIRST"; 
4884         case 0x06FF: return "WM_STDDLGLAST"; 
4885         case 0x0BD0: return "WM_BIDI_FIRST"; 
4886         case 0x0BFF: return "WM_BIDI_LAST"; 
4888         case 0x007A: return "WM_CHAR"; 
4889         case 0x007B: return "WM_VIOCHAR"; 
4891         case 0x00A0: return "WM_DDE_INITIATE"; 
4892         case 0x00A1: return "WM_DDE_REQUEST"; 
4893         case 0x00A2: return "WM_DDE_ACK"; 
4894         case 0x00A3: return "WM_DDE_DATA"; 
4895         case 0x00A4: return "WM_DDE_ADVISE"; 
4896         case 0x00A5: return "WM_DDE_UNADVISE"; 
4897         case 0x00A6: return "WM_DDE_POKE"; 
4898         case 0x00A7: return "WM_DDE_EXECUTE"; 
4899         case 0x00A8: return "WM_DDE_TERMINATE"; 
4900         case 0x00A9: return "WM_DDE_INITIATEACK"; 
4901         case 0x00AF: return "WM_DDE_LAST"; 
4903         case 0x0120: return "BM_CLICK"; 
4904         case 0x0121: return "BM_QUERYCHECKINDEX"; 
4905         case 0x0122: return "BM_QUERYHILITE"; 
4906         case 0x0123: return "BM_SETHILITE"; 
4907         case 0x0124: return "BM_QUERYCHECK"; 
4908         case 0x0125: return "BM_SETCHECK"; 
4909         case 0x0126: return "BM_SETDEFAULT"; 
4910         case 0x0128: return "BM_AUTOSIZE"; 
4912         case 0x029A: return "CBID_LIST"; 
4913         case 0x029B: return "CBID_EDIT"; 
4914         case 0x0170: return "CBM_SHOWLIST"; 
4915         case 0x0171: return "CBM_HILITE"; 
4916         case 0x0172: return "CBM_ISLISTSHOWING"; 
4918         case 0x0140: return "EM_QUERYCHANGED"; 
4919         case 0x0141: return "EM_QUERYSEL"; 
4920         case 0x0142: return "EM_SETSEL"; 
4921         case 0x0143: return "EM_SETTEXTLIMIT"; 
4922         case 0x0144: return "EM_CUT"; 
4923         case 0x0145: return "EM_COPY"; 
4924         case 0x0146: return "EM_CLEAR"; 
4925         case 0x0147: return "EM_PASTE"; 
4926         case 0x0148: return "EM_QUERYFIRSTCHAR"; 
4927         case 0x0149: return "EM_SETFIRSTCHAR"; 
4928         case 0x014A: return "EM_QUERYREADONLY"; 
4929         case 0x014B: return "EM_SETREADONLY"; 
4930         case 0x014C: return "EM_SETINSERTMODE"; 
4932         case 0x0160: return "LM_QUERYITEMCOUNT"; 
4933         case 0x0161: return "LM_INSERTITEM"; 
4934         case 0x0162: return "LM_SETOPENINDEX"; 
4935         case 0x0163: return "LM_DELETEITEM"; 
4936         case 0x0164: return "LM_SELECTITEM"; 
4937         case 0x0165: return "LM_QUERYSELECTION"; 
4938         case 0x0166: return "LM_SETITEMTEXT"; 
4939         case 0x0167: return "LM_QUERYITEMTEXTLENGTH"; 
4940         case 0x0168: return "LM_QUERYITEMTEXT"; 
4941         case 0x0169: return "LM_SETITEMHANDLE"; 
4942         case 0x016A: return "LM_QUERYITEMHANDLE"; 
4943         case 0x016B: return "LM_SEARCHSTRING"; 
4944         case 0x016C: return "LM_SETITEMHEIGHT"; 
4945         case 0x016D: return "LM_QUERYTOPINDEX"; 
4946         case 0x016E: return "LM_DELETEALL"; 
4947         case 0x016F: return "LM_INSERTMULITEMS"; 
4948         case 0x0660: return "LM_SETITEMWIDTH"; 
4950         case 0x0180: return "MM_INSERTITEM"; 
4951         case 0x0181: return "MM_DELETEITEM"; 
4952         case 0x0182: return "MM_QUERYITEM"; 
4953         case 0x0183: return "MM_SETITEM"; 
4954         case 0x0184: return "MM_QUERYITEMCOUNT"; 
4955         case 0x0185: return "MM_STARTMENUMODE"; 
4956         case 0x0186: return "MM_ENDMENUMODE"; 
4957         case 0x0188: return "MM_REMOVEITEM"; 
4958         case 0x0189: return "MM_SELECTITEM"; 
4959         case 0x018A: return "MM_QUERYSELITEMID"; 
4960         case 0x018B: return "MM_QUERYITEMTEXT"; 
4961         case 0x018C: return "MM_QUERYITEMTEXTLENGTH"; 
4962         case 0x018D: return "MM_SETITEMHANDLE"; 
4963         case 0x018E: return "MM_SETITEMTEXT"; 
4964         case 0x018F: return "MM_ITEMPOSITIONFROMID"; 
4965         case 0x0190: return "MM_ITEMIDFROMPOSITION"; 
4966         case 0x0191: return "MM_QUERYITEMATTR"; 
4967         case 0x0192: return "MM_SETITEMATTR"; 
4968         case 0x0193: return "MM_ISITEMVALID"; 
4969         case 0x0194: return "MM_QUERYITEMRECT"; 
4970         case 0x0431: return "MM_QUERYDEFAULTITEMID"; 
4971         case 0x0432: return "MM_SETDEFAULTITEMID"; 
4973         case 0x01A0: return "SBM_SETSCROLLBAR"; 
4974         case 0x01A1: return "SBM_SETPOS"; 
4975         case 0x01A2: return "SBM_QUERYPOS"; 
4976         case 0x01A3: return "SBM_QUERYRANGE"; 
4977         case 0x01A6: return "SBM_SETTHUMBSIZE"; 
4980         case 0x0F00: return "WM_HELPBASE"; 
4981         case 0x0FFF: return "WM_HELPTOP"; 
4982         // Beginning of user defined messages 
4983         case 0x1000: return "WM_USER"; 
4985         // wxWidgets user defined types 
4988         // case 0x1000 + 0: return "LVM_GETBKCOLOR"; 
4989         case 0x1000 + 1: return "LVM_SETBKCOLOR"; 
4990         case 0x1000 + 2: return "LVM_GETIMAGELIST"; 
4991         case 0x1000 + 3: return "LVM_SETIMAGELIST"; 
4992         case 0x1000 + 4: return "LVM_GETITEMCOUNT"; 
4993         case 0x1000 + 5: return "LVM_GETITEMA"; 
4994         case 0x1000 + 75: return "LVM_GETITEMW"; 
4995         case 0x1000 + 6: return "LVM_SETITEMA"; 
4996         case 0x1000 + 76: return "LVM_SETITEMW"; 
4997         case 0x1000 + 7: return "LVM_INSERTITEMA"; 
4998         case 0x1000 + 77: return "LVM_INSERTITEMW"; 
4999         case 0x1000 + 8: return "LVM_DELETEITEM"; 
5000         case 0x1000 + 9: return "LVM_DELETEALLITEMS"; 
5001         case 0x1000 + 10: return "LVM_GETCALLBACKMASK"; 
5002         case 0x1000 + 11: return "LVM_SETCALLBACKMASK"; 
5003         case 0x1000 + 12: return "LVM_GETNEXTITEM"; 
5004         case 0x1000 + 13: return "LVM_FINDITEMA"; 
5005         case 0x1000 + 83: return "LVM_FINDITEMW"; 
5006         case 0x1000 + 14: return "LVM_GETITEMRECT"; 
5007         case 0x1000 + 15: return "LVM_SETITEMPOSITION"; 
5008         case 0x1000 + 16: return "LVM_GETITEMPOSITION"; 
5009         case 0x1000 + 17: return "LVM_GETSTRINGWIDTHA"; 
5010         case 0x1000 + 87: return "LVM_GETSTRINGWIDTHW"; 
5011         case 0x1000 + 18: return "LVM_HITTEST"; 
5012         case 0x1000 + 19: return "LVM_ENSUREVISIBLE"; 
5013         case 0x1000 + 20: return "LVM_SCROLL"; 
5014         case 0x1000 + 21: return "LVM_REDRAWITEMS"; 
5015         case 0x1000 + 22: return "LVM_ARRANGE"; 
5016         case 0x1000 + 23: return "LVM_EDITLABELA"; 
5017         case 0x1000 + 118: return "LVM_EDITLABELW"; 
5018         case 0x1000 + 24: return "LVM_GETEDITCONTROL"; 
5019         case 0x1000 + 25: return "LVM_GETCOLUMNA"; 
5020         case 0x1000 + 95: return "LVM_GETCOLUMNW"; 
5021         case 0x1000 + 26: return "LVM_SETCOLUMNA"; 
5022         case 0x1000 + 96: return "LVM_SETCOLUMNW"; 
5023         case 0x1000 + 27: return "LVM_INSERTCOLUMNA"; 
5024         case 0x1000 + 97: return "LVM_INSERTCOLUMNW"; 
5025         case 0x1000 + 28: return "LVM_DELETECOLUMN"; 
5026         case 0x1000 + 29: return "LVM_GETCOLUMNWIDTH"; 
5027         case 0x1000 + 30: return "LVM_SETCOLUMNWIDTH"; 
5028         case 0x1000 + 31: return "LVM_GETHEADER"; 
5029         case 0x1000 + 33: return "LVM_CREATEDRAGIMAGE"; 
5030         case 0x1000 + 34: return "LVM_GETVIEWRECT"; 
5031         case 0x1000 + 35: return "LVM_GETTEXTCOLOR"; 
5032         case 0x1000 + 36: return "LVM_SETTEXTCOLOR"; 
5033         case 0x1000 + 37: return "LVM_GETTEXTBKCOLOR"; 
5034         case 0x1000 + 38: return "LVM_SETTEXTBKCOLOR"; 
5035         case 0x1000 + 39: return "LVM_GETTOPINDEX"; 
5036         case 0x1000 + 40: return "LVM_GETCOUNTPERPAGE"; 
5037         case 0x1000 + 41: return "LVM_GETORIGIN"; 
5038         case 0x1000 + 42: return "LVM_UPDATE"; 
5039         case 0x1000 + 43: return "LVM_SETITEMSTATE"; 
5040         case 0x1000 + 44: return "LVM_GETITEMSTATE"; 
5041         case 0x1000 + 45: return "LVM_GETITEMTEXTA"; 
5042         case 0x1000 + 115: return "LVM_GETITEMTEXTW"; 
5043         case 0x1000 + 46: return "LVM_SETITEMTEXTA"; 
5044         case 0x1000 + 116: return "LVM_SETITEMTEXTW"; 
5045         case 0x1000 + 47: return "LVM_SETITEMCOUNT"; 
5046         case 0x1000 + 48: return "LVM_SORTITEMS"; 
5047         case 0x1000 + 49: return "LVM_SETITEMPOSITION32"; 
5048         case 0x1000 + 50: return "LVM_GETSELECTEDCOUNT"; 
5049         case 0x1000 + 51: return "LVM_GETITEMSPACING"; 
5050         case 0x1000 + 52: return "LVM_GETISEARCHSTRINGA"; 
5051         case 0x1000 + 117: return "LVM_GETISEARCHSTRINGW"; 
5052         case 0x1000 + 53: return "LVM_SETICONSPACING"; 
5053         case 0x1000 + 54: return "LVM_SETEXTENDEDLISTVIEWSTYLE"; 
5054         case 0x1000 + 55: return "LVM_GETEXTENDEDLISTVIEWSTYLE"; 
5055         case 0x1000 + 56: return "LVM_GETSUBITEMRECT"; 
5056         case 0x1000 + 57: return "LVM_SUBITEMHITTEST"; 
5057         case 0x1000 + 58: return "LVM_SETCOLUMNORDERARRAY"; 
5058         case 0x1000 + 59: return "LVM_GETCOLUMNORDERARRAY"; 
5059         case 0x1000 + 60: return "LVM_SETHOTITEM"; 
5060         case 0x1000 + 61: return "LVM_GETHOTITEM"; 
5061         case 0x1000 + 62: return "LVM_SETHOTCURSOR"; 
5062         case 0x1000 + 63: return "LVM_GETHOTCURSOR"; 
5063         case 0x1000 + 64: return "LVM_APPROXIMATEVIEWRECT"; 
5064         case 0x1000 + 65: return "LVM_SETWORKAREA"; 
5067         case 0x1100 + 0: return "TVM_INSERTITEMA"; 
5068         case 0x1100 + 50: return "TVM_INSERTITEMW"; 
5069         case 0x1100 + 1: return "TVM_DELETEITEM"; 
5070         case 0x1100 + 2: return "TVM_EXPAND"; 
5071         case 0x1100 + 4: return "TVM_GETITEMRECT"; 
5072         case 0x1100 + 5: return "TVM_GETCOUNT"; 
5073         case 0x1100 + 6: return "TVM_GETINDENT"; 
5074         case 0x1100 + 7: return "TVM_SETINDENT"; 
5075         case 0x1100 + 8: return "TVM_GETIMAGELIST"; 
5076         case 0x1100 + 9: return "TVM_SETIMAGELIST"; 
5077         case 0x1100 + 10: return "TVM_GETNEXTITEM"; 
5078         case 0x1100 + 11: return "TVM_SELECTITEM"; 
5079         case 0x1100 + 12: return "TVM_GETITEMA"; 
5080         case 0x1100 + 62: return "TVM_GETITEMW"; 
5081         case 0x1100 + 13: return "TVM_SETITEMA"; 
5082         case 0x1100 + 63: return "TVM_SETITEMW"; 
5083         case 0x1100 + 14: return "TVM_EDITLABELA"; 
5084         case 0x1100 + 65: return "TVM_EDITLABELW"; 
5085         case 0x1100 + 15: return "TVM_GETEDITCONTROL"; 
5086         case 0x1100 + 16: return "TVM_GETVISIBLECOUNT"; 
5087         case 0x1100 + 17: return "TVM_HITTEST"; 
5088         case 0x1100 + 18: return "TVM_CREATEDRAGIMAGE"; 
5089         case 0x1100 + 19: return "TVM_SORTCHILDREN"; 
5090         case 0x1100 + 20: return "TVM_ENSUREVISIBLE"; 
5091         case 0x1100 + 21: return "TVM_SORTCHILDRENCB"; 
5092         case 0x1100 + 22: return "TVM_ENDEDITLABELNOW"; 
5093         case 0x1100 + 23: return "TVM_GETISEARCHSTRINGA"; 
5094         case 0x1100 + 64: return "TVM_GETISEARCHSTRINGW"; 
5095         case 0x1100 + 24: return "TVM_SETTOOLTIPS"; 
5096         case 0x1100 + 25: return "TVM_GETTOOLTIPS"; 
5099         case 0x1200 + 0: return "HDM_GETITEMCOUNT"; 
5100         case 0x1200 + 1: return "HDM_INSERTITEMA"; 
5101         case 0x1200 + 10: return "HDM_INSERTITEMW"; 
5102         case 0x1200 + 2: return "HDM_DELETEITEM"; 
5103         case 0x1200 + 3: return "HDM_GETITEMA"; 
5104         case 0x1200 + 11: return "HDM_GETITEMW"; 
5105         case 0x1200 + 4: return "HDM_SETITEMA"; 
5106         case 0x1200 + 12: return "HDM_SETITEMW"; 
5107         case 0x1200 + 5: return "HDM_LAYOUT"; 
5108         case 0x1200 + 6: return "HDM_HITTEST"; 
5109         case 0x1200 + 7: return "HDM_GETITEMRECT"; 
5110         case 0x1200 + 8: return "HDM_SETIMAGELIST"; 
5111         case 0x1200 + 9: return "HDM_GETIMAGELIST"; 
5112         case 0x1200 + 15: return "HDM_ORDERTOINDEX"; 
5113         case 0x1200 + 16: return "HDM_CREATEDRAGIMAGE"; 
5114         case 0x1200 + 17: return "HDM_GETORDERARRAY"; 
5115         case 0x1200 + 18: return "HDM_SETORDERARRAY"; 
5116         case 0x1200 + 19: return "HDM_SETHOTDIVIDER"; 
5119         case 0x1300 + 2: return "TCM_GETIMAGELIST"; 
5120         case 0x1300 + 3: return "TCM_SETIMAGELIST"; 
5121         case 0x1300 + 4: return "TCM_GETITEMCOUNT"; 
5122         case 0x1300 + 5: return "TCM_GETITEMA"; 
5123         case 0x1300 + 60: return "TCM_GETITEMW"; 
5124         case 0x1300 + 6: return "TCM_SETITEMA"; 
5125         case 0x1300 + 61: return "TCM_SETITEMW"; 
5126         case 0x1300 + 7: return "TCM_INSERTITEMA"; 
5127         case 0x1300 + 62: return "TCM_INSERTITEMW"; 
5128         case 0x1300 + 8: return "TCM_DELETEITEM"; 
5129         case 0x1300 + 9: return "TCM_DELETEALLITEMS"; 
5130         case 0x1300 + 10: return "TCM_GETITEMRECT"; 
5131         case 0x1300 + 11: return "TCM_GETCURSEL"; 
5132         case 0x1300 + 12: return "TCM_SETCURSEL"; 
5133         case 0x1300 + 13: return "TCM_HITTEST"; 
5134         case 0x1300 + 14: return "TCM_SETITEMEXTRA"; 
5135         case 0x1300 + 40: return "TCM_ADJUSTRECT"; 
5136         case 0x1300 + 41: return "TCM_SETITEMSIZE"; 
5137         case 0x1300 + 42: return "TCM_REMOVEIMAGE"; 
5138         case 0x1300 + 43: return "TCM_SETPADDING"; 
5139         case 0x1300 + 44: return "TCM_GETROWCOUNT"; 
5140         case 0x1300 + 45: return "TCM_GETTOOLTIPS"; 
5141         case 0x1300 + 46: return "TCM_SETTOOLTIPS"; 
5142         case 0x1300 + 47: return "TCM_GETCURFOCUS"; 
5143         case 0x1300 + 48: return "TCM_SETCURFOCUS"; 
5144         case 0x1300 + 49: return "TCM_SETMINTABWIDTH"; 
5145         case 0x1300 + 50: return "TCM_DESELECTALL"; 
5148         case WM_USER
+1000+1: return "TB_ENABLEBUTTON"; 
5149         case WM_USER
+1000+2: return "TB_CHECKBUTTON"; 
5150         case WM_USER
+1000+3: return "TB_PRESSBUTTON"; 
5151         case WM_USER
+1000+4: return "TB_HIDEBUTTON"; 
5152         case WM_USER
+1000+5: return "TB_INDETERMINATE"; 
5153         case WM_USER
+1000+9: return "TB_ISBUTTONENABLED"; 
5154         case WM_USER
+1000+10: return "TB_ISBUTTONCHECKED"; 
5155         case WM_USER
+1000+11: return "TB_ISBUTTONPRESSED"; 
5156         case WM_USER
+1000+12: return "TB_ISBUTTONHIDDEN"; 
5157         case WM_USER
+1000+13: return "TB_ISBUTTONINDETERMINATE"; 
5158         case WM_USER
+1000+17: return "TB_SETSTATE"; 
5159         case WM_USER
+1000+18: return "TB_GETSTATE"; 
5160         case WM_USER
+1000+19: return "TB_ADDBITMAP"; 
5161         case WM_USER
+1000+20: return "TB_ADDBUTTONS"; 
5162         case WM_USER
+1000+21: return "TB_INSERTBUTTON"; 
5163         case WM_USER
+1000+22: return "TB_DELETEBUTTON"; 
5164         case WM_USER
+1000+23: return "TB_GETBUTTON"; 
5165         case WM_USER
+1000+24: return "TB_BUTTONCOUNT"; 
5166         case WM_USER
+1000+25: return "TB_COMMANDTOINDEX"; 
5167         case WM_USER
+1000+26: return "TB_SAVERESTOREA"; 
5168         case WM_USER
+1000+76: return "TB_SAVERESTOREW"; 
5169         case WM_USER
+1000+27: return "TB_CUSTOMIZE"; 
5170         case WM_USER
+1000+28: return "TB_ADDSTRINGA"; 
5171         case WM_USER
+1000+77: return "TB_ADDSTRINGW"; 
5172         case WM_USER
+1000+29: return "TB_GETITEMRECT"; 
5173         case WM_USER
+1000+30: return "TB_BUTTONSTRUCTSIZE"; 
5174         case WM_USER
+1000+31: return "TB_SETBUTTONSIZE"; 
5175         case WM_USER
+1000+32: return "TB_SETBITMAPSIZE"; 
5176         case WM_USER
+1000+33: return "TB_AUTOSIZE"; 
5177         case WM_USER
+1000+35: return "TB_GETTOOLTIPS"; 
5178         case WM_USER
+1000+36: return "TB_SETTOOLTIPS"; 
5179         case WM_USER
+1000+37: return "TB_SETPARENT"; 
5180         case WM_USER
+1000+39: return "TB_SETROWS"; 
5181         case WM_USER
+1000+40: return "TB_GETROWS"; 
5182         case WM_USER
+1000+42: return "TB_SETCMDID"; 
5183         case WM_USER
+1000+43: return "TB_CHANGEBITMAP"; 
5184         case WM_USER
+1000+44: return "TB_GETBITMAP"; 
5185         case WM_USER
+1000+45: return "TB_GETBUTTONTEXTA"; 
5186         case WM_USER
+1000+75: return "TB_GETBUTTONTEXTW"; 
5187         case WM_USER
+1000+46: return "TB_REPLACEBITMAP"; 
5188         case WM_USER
+1000+47: return "TB_SETINDENT"; 
5189         case WM_USER
+1000+48: return "TB_SETIMAGELIST"; 
5190         case WM_USER
+1000+49: return "TB_GETIMAGELIST"; 
5191         case WM_USER
+1000+50: return "TB_LOADIMAGES"; 
5192         case WM_USER
+1000+51: return "TB_GETRECT"; 
5193         case WM_USER
+1000+52: return "TB_SETHOTIMAGELIST"; 
5194         case WM_USER
+1000+53: return "TB_GETHOTIMAGELIST"; 
5195         case WM_USER
+1000+54: return "TB_SETDISABLEDIMAGELIST"; 
5196         case WM_USER
+1000+55: return "TB_GETDISABLEDIMAGELIST"; 
5197         case WM_USER
+1000+56: return "TB_SETSTYLE"; 
5198         case WM_USER
+1000+57: return "TB_GETSTYLE"; 
5199         case WM_USER
+1000+58: return "TB_GETBUTTONSIZE"; 
5200         case WM_USER
+1000+59: return "TB_SETBUTTONWIDTH"; 
5201         case WM_USER
+1000+60: return "TB_SETMAXTEXTROWS"; 
5202         case WM_USER
+1000+61: return "TB_GETTEXTROWS"; 
5203         case WM_USER
+1000+41: return "TB_GETBITMAPFLAGS"; 
5206             static char s_szBuf
[128]; 
5207             sprintf(s_szBuf
, "<unknown message = %d>", nMessage
); 
5211 } // end of wxGetMessageName 
5213 #endif // __WXDEBUG__ 
5217 static void TranslateKbdEventToMouse( 
5225     // Construct the key mask 
5226     ULONG
&                          fwKeys 
= *pFlags
; 
5228     fwKeys 
= VK_BUTTON2
; 
5229     if ((::WinGetKeyState(HWND_DESKTOP
, VK_CTRL
) & 0x100) != 0) 
5231     if ((::WinGetKeyState(HWND_DESKTOP
, VK_SHIFT
) & 0x100) != 0) 
5235     // Simulate right mouse button click 
5239     ::WinQueryMsgPos(vHabmain
, &vPoint
); 
5243     pWin
->ScreenToClient(pX
, pY
); 
5244 } // end of TranslateKbdEventToMouse 
5247 // Find the wxWindow at the current mouse position, returning the mouse 
5249 wxWindow
* wxFindWindowAtPointer( 
5250   wxPoint
&                          WXUNUSED(rPt
) 
5253     return wxFindWindowAtPoint(wxGetMousePosition()); 
5256 wxWindow
* wxFindWindowAtPoint( 
5265     HWND                            hWndHit 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt2
, FALSE
); 
5266     wxWindow
*                       pWin 
= wxFindWinFromHandle((WXHWND
)hWndHit
) ; 
5267     HWND                            hWnd 
= hWndHit
; 
5270     // Try to find a window with a wxWindow associated with it 
5272     while (!pWin 
&& (hWnd 
!= 0)) 
5274         hWnd 
= ::WinQueryWindow(hWnd
, QW_PARENT
); 
5275         pWin 
= wxFindWinFromHandle((WXHWND
)hWnd
) ; 
5280 // Get the current mouse position. 
5281 wxPoint 
wxGetMousePosition() 
5285     ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
); 
5286     return wxPoint(vPt
.x
, vPt
.y
); 
5289 wxWindowOS2
* FindWindowForMouseEvent( 
5295     HWND                            hWnd 
= GetHwndOf(pWin
); 
5296     HWND                            hWndUnderMouse
; 
5298     BOOL                            rcEnabled 
= FALSE
; 
5299     BOOL                            rcVisible 
= FALSE
; 
5301     ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
5302     hWndUnderMouse 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, TRUE
); 
5303     if (hWndUnderMouse 
!= HWND_DESKTOP
) 
5305         wxWindow
*                   pWinUnderMouse 
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
); 
5309             wxWindowList::compatibility_iterator current 
= pWinUnderMouse
->GetChildren().GetFirst(); 
5310             wxWindow
*               pGrandChild 
= NULL
; 
5314             ::WinMapWindowPoints(HWND_DESKTOP
, hWndUnderMouse
, &vPoint
, 1); 
5316             // Find a child window mouse might be under 
5320                 wxWindow
*                   pChild 
= current
->GetData(); 
5322                 vPoint2
.x 
= vPoint
.x
; 
5323                 vPoint2
.y 
= vPoint
.y
; 
5324                 ::WinMapWindowPoints(hWndUnderMouse
, pChild
->GetHWND(), &vPoint2
, 1); 
5325                 ::WinQueryWindowRect(pChild
->GetHWND(), &vRect
); 
5326                 if (::WinPtInRect(vHabmain
, &vRect
, &vPoint2
)) 
5328                     if (pChild
->IsTopLevel()) 
5331                         wxWindowList::compatibility_iterator current2 
=pChild
->GetChildren().GetFirst(); 
5335                             wxWindow
*           pGrandChild 
= current2
->GetData(); 
5337                             vPoint3
.x 
= vPoint2
.x
; 
5338                             vPoint3
.y 
= vPoint2
.y
; 
5339                             ::WinMapWindowPoints( pChild
->GetHWND() 
5340                                                  ,pGrandChild
->GetHWND() 
5344                             ::WinQueryWindowRect(pGrandChild
->GetHWND(), &vRect
); 
5345                             if (::WinPtInRect(vHabmain
, &vRect
, &vPoint3
)) 
5347                                 hWndUnderMouse 
= GetHwndOf(pGrandChild
); 
5348                                 pWinUnderMouse 
= pGrandChild
; 
5351                             current2 
= current2
->GetNext(); 
5356                     hWndUnderMouse 
= GetHwndOf(pChild
); 
5357                     pWinUnderMouse 
= pChild
; 
5358                     rcVisible 
= ::WinIsWindowVisible(hWndUnderMouse
); 
5359                     rcEnabled 
= ::WinIsWindowEnabled(hWndUnderMouse
); 
5360                     if (rcVisible 
&& rcEnabled
) 
5363                 current 
= current
->GetNext(); 
5367     rcVisible 
= ::WinIsWindowVisible(hWndUnderMouse
); 
5368     rcEnabled 
= ::WinIsWindowEnabled(hWndUnderMouse
); 
5372     // Check that we have a child window which is susceptible to receive mouse 
5373     // events: for this it must be shown and enabled 
5375     if ( hWndUnderMouse 
&& 
5376          hWndUnderMouse 
!= hWnd 
&& 
5377          rcVisible 
&& rcEnabled
) 
5379         wxWindow
*                       pWinUnderMouse 
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
); 
5384             // Translate the mouse coords to the other window coords 
5386             pWin 
= pWinUnderMouse
; 
5390 } // end of FindWindowForMouseEvent