1 ///////////////////////////////////////////////////////////////////////////// 
   4 // Author:      David Webster 
   8 // Copyright:   (c) David Webster 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  13 // For compilers that support precompilation, includes "wx.h". 
  15 #include "wx/wxprec.h" 
  21     #include "wx/window.h" 
  26     #include "wx/dcclient.h" 
  30     #include "wx/layout.h" 
  31     #include "wx/dialog.h" 
  33     #include "wx/listbox.h" 
  34     #include "wx/button.h" 
  35     #include "wx/msgdlg.h" 
  41     #include "wx/ownerdrw.h" 
  44 #if     wxUSE_DRAG_AND_DROP 
  48 #include "wx/menuitem.h" 
  51 #include "wx/os2/private.h" 
  54     #include "wx/tooltip.h" 
  65 #include "wx/textctrl.h" 
  70 // Place compiler, OS specific includes here 
  74 // Standard macros -- these are for OS/2 PM, but most GUI's have something similar 
  78 //  SHORT1FROMMP -- LOWORD 
  80     #define GET_X_LPARAM(mp) ((unsigned short)(unsigned long)(mp)) 
  82 //  SHORT2FROMMP -- HIWORD 
  84     #define GET_Y_LPARAM(mp) ((unsigned short)(unsigned long)(mp >> 16)) 
  85 #endif // GET_X_LPARAM 
  88 #  define CW_USEDEFAULT    ((int)0x80000000) 
  91 // --------------------------------------------------------------------------- 
  93 // --------------------------------------------------------------------------- 
  96 // The last Windows message we got (MT-UNSAFE) 
 100 wxMenu
*                   wxCurrentPopupMenu 
= NULL
; 
 101 extern wxList WXDLLEXPORT wxPendingDelete
; 
 102 #if !defined(__VISAGECPP__) || (__IBMCPP__ < 400) 
 103 extern wxChar             wxCanvasClassName
[]; 
 105 wxList
*                   wxWinHandleList 
= NULL
; 
 107 // --------------------------------------------------------------------------- 
 109 // --------------------------------------------------------------------------- 
 112 // the window proc for all our windows; most gui's have something similar 
 114 MRESULT EXPENTRY 
wxWndProc( HWND hWnd
 
 121     const char *wxGetMessageName(int message
); 
 124 void      wxRemoveHandleAssociation(wxWindow
* pWin
); 
 125 void      wxAssociateWinWithHandle( HWND      hWnd
 
 128 wxWindow
* wxFindWinFromHandle(WXHWND hWnd
); 
 131 // This magical function is used to translate VK_APPS key presses to right 
 134 static void TranslateKbdEventToMouse( wxWindow
* pWin
 
 141 // get the current state of SHIFT/CTRL keys 
 143 static inline bool IsShiftDown() { return (::WinGetKeyState(HWND_DESKTOP
, VK_SHIFT
) & 0x8000) != 0; } 
 144 static inline bool IsCtrlDown() { return (::WinGetKeyState(HWND_DESKTOP
, VK_CTRL
) & 0x8000) != 0; } 
 145 // --------------------------------------------------------------------------- 
 147 // --------------------------------------------------------------------------- 
 149     IMPLEMENT_DYNAMIC_CLASS(wxWindow
, wxWindowBase
) 
 151 BEGIN_EVENT_TABLE(wxWindow
, wxWindowBase
) 
 152     EVT_ERASE_BACKGROUND(wxWindow::OnEraseBackground
) 
 153     EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged
) 
 154     EVT_INIT_DIALOG(wxWindow::OnInitDialog
) 
 155     EVT_IDLE(wxWindow::OnIdle
) 
 156     EVT_SET_FOCUS(wxWindow::OnSetFocus
) 
 159 // =========================================================================== 
 161 // =========================================================================== 
 164 // Find an item given the PM Window id 
 166 wxWindow
* wxWindow::FindItem( 
 170     wxControl
*                      pItem 
= wxDynamicCast( this 
 177         // I it we or one of our "internal" children? 
 179         if (pItem
->GetId() == lId 
|| 
 180              (pItem
->GetSubcontrols().Index(lId
) != wxNOT_FOUND
)) 
 186     wxWindowList::Node
*             pCurrent 
= GetChildren().GetFirst(); 
 190         wxWindow
*                   pChildWin 
= pCurrent
->GetData(); 
 191         wxWindow
*                   pWnd 
= pChildWin
->FindItem(lId
); 
 196         pCurrent 
= pCurrent
->GetNext(); 
 199 } // end of wxWindow::FindItem 
 202 // Find an item given the PM Window handle 
 204 wxWindow
* wxWindow::FindItemByHWND( 
 209     wxWindowList::Node
*             pCurrent 
= GetChildren().GetFirst(); 
 213         wxWindow
*                   pParent 
= pCurrent
->GetData(); 
 216         // Do a recursive search. 
 218         wxWindow
*                   pWnd 
= pParent
->FindItemByHWND(hWnd
); 
 223         if (!bControlOnly 
|| pParent
->IsKindOf(CLASSINFO(wxControl
))) 
 225             wxWindow
*               pItem 
= pCurrent
->GetData(); 
 227             if (pItem
->GetHWND() == hWnd
) 
 231                 if (pItem
->ContainsHWND(hWnd
)) 
 235         pCurrent 
= pCurrent
->GetNext(); 
 238 } // end of wxWindow::FindItemByHWND 
 241 // Default command handler 
 243 bool wxWindow::OS2Command( 
 244   WXUINT                            
WXUNUSED(uParam
) 
 245 , WXWORD                            
WXUNUSED(uId
) 
 251 // ---------------------------------------------------------------------------- 
 252 // constructors and such 
 253 // ---------------------------------------------------------------------------- 
 255 void wxWindow::Init() 
 265     m_bDoubleClickAllowed 
= 0; 
 266     m_bWinCaptured 
= FALSE
; 
 268     m_isBeingDeleted 
= FALSE
; 
 271     m_bMouseInWindow 
= FALSE
; 
 278     m_hWndScrollBarHorz 
= 0L; 
 279     m_hWndScrollBarVert 
= 0L; 
 282     // Pass WM_GETDLGCODE to DefWindowProc() 
 287     m_bBackgroundTransparent 
= FALSE
; 
 290     // As all windows are created with WS_VISIBLE style... 
 294 #if wxUSE_MOUSEEVENT_HACK 
 297     m_nLastMouseEvent 
= -1; 
 298 #endif // wxUSE_MOUSEEVENT_HACK 
 304 wxWindow::~wxWindow() 
 306     m_isBeingDeleted 
= TRUE
; 
 308     OS2DetachWindowMenu(); 
 310         m_parent
->RemoveChild(this); 
 315         if(!::WinDestroyWindow(GetHWND())) 
 316             wxLogLastError(wxT("DestroyWindow")); 
 318         // remove hWnd <-> wxWindow association 
 320         wxRemoveHandleAssociation(this); 
 322 } // end of wxWindow::~wxWindow 
 324 bool wxWindow::Create( 
 327 , const wxPoint
&                    rPos
 
 328 , const wxSize
&                     rSize
 
 330 , const wxString
&                   rName
 
 333     HWND                            hParent 
= NULLHANDLE
; 
 334     wxPoint                         vPos 
= rPos
; // The OS/2 position 
 335     ULONG                           ulCreateFlags 
= 0L; 
 337     wxCHECK_MSG(pParent
, FALSE
, wxT("can't create wxWindow without parent")); 
 339     if ( !CreateBase( pParent
 
 353         pParent
->AddChild(this); 
 354         hParent 
= GetWinHwnd(pParent
); 
 356         // OS2 uses normal coordinates, no bassackwards Windows ones 
 358         if (pParent
->IsKindOf(CLASSINFO(wxGenericScrolledWindow
)) || 
 359             pParent
->IsKindOf(CLASSINFO(wxScrolledWindow
)) 
 362             wxWindow
*               pGrandParent 
= NULL
; 
 364             pGrandParent 
= pParent
->GetParent(); 
 366                 nTempy 
= pGrandParent
->GetSize().y 
- (vPos
.y 
+ rSize
.y
); 
 368                 nTempy 
= pParent
->GetSize().y 
- (vPos
.y 
+ rSize
.y
); 
 371             nTempy 
= pParent
->GetSize().y 
- (vPos
.y 
+ rSize
.y
); 
 375             nTempy 
= pParent
->GetSize().y 
+ (vPos
.y 
+ rSize
.y
); 
 376             pParent
->SetSize(0, 0, pParent
->GetSize().x
, nTempy
); 
 377             nTempy 
= pParent
->GetSize().y 
- (vPos
.y 
+ rSize
.y
); 
 381         if ( pParent
->IsKindOf(CLASSINFO(wxGenericScrolledWindow
)) || 
 382              pParent
->IsKindOf(CLASSINFO(wxScrolledWindow
)) 
 384             ulCreateFlags 
|= WS_CLIPSIBLINGS
; 
 390         ::WinQueryWindowRect(HWND_DESKTOP
, &vRect
); 
 391         hParent 
= HWND_DESKTOP
; 
 392         vPos
.y 
= vRect
.yTop 
- (vPos
.y 
+ rSize
.y
); 
 396     // Most wxSTYLES are really PM Class specific styles and will be 
 397     // set in those class create procs.  PM's basic windows styles are 
 400     ulCreateFlags 
|=  WS_VISIBLE
; 
 403     if (lStyle 
& wxCLIP_SIBLINGS
) 
 404         ulCreateFlags 
|= WS_CLIPSIBLINGS
; 
 406     if (lStyle 
& wxCLIP_CHILDREN 
) 
 407         ulCreateFlags 
|= WS_CLIPCHILDREN
; 
 410     // Empty stuff for now since PM has no custome 3D effects 
 411     // Doesn't mean someone cannot make some up though 
 414     WXDWORD                         dwExStyle 
= Determine3DEffects(WS_EX_CLIENTEDGE
, &bWant3D
); 
 417     // Generic OS/2 Windows are created with no owner, no Z Order, no Control data, 
 418     // and no presentation parameters 
 421               ,(PSZ
)wxCanvasClassName
 
 426               ,WidthDefault(rSize
.x
) 
 427               ,HeightDefault(rSize
.y
) 
 434 } // end of wxWindow::Create 
 436 // --------------------------------------------------------------------------- 
 438 // --------------------------------------------------------------------------- 
 440 void wxWindow::SetFocus() 
 442     HWND                            hWnd 
= GetHwnd(); 
 445         ::WinSetFocus(HWND_DESKTOP
, hWnd
); 
 446 } // end of wxWindow::SetFocus 
 448 wxWindow
* wxWindowBase::FindFocus() 
 450     HWND                            hWnd 
= ::WinQueryFocus(HWND_DESKTOP
); 
 454         return wxFindWinFromHandle((WXHWND
)hWnd
); 
 457 } // wxWindowBase::FindFocus 
 459 bool wxWindow::Enable( 
 463     if (!wxWindowBase::Enable(bEnable
)) 
 466     HWND                            hWnd 
= GetHwnd(); 
 469         ::WinEnableWindow(hWnd
, (BOOL
)bEnable
); 
 471     wxWindowList::Node
*             pNode 
= GetChildren().GetFirst(); 
 475         wxWindow
*                   pChild 
= pNode
->GetData(); 
 477         pChild
->Enable(bEnable
); 
 478         pNode 
= pNode
->GetNext(); 
 481 } // end of wxWindow::Enable 
 487     if (!wxWindowBase::Show(bShow
)) 
 490     HWND                            hWnd 
= GetHwnd(); 
 492     ::WinShowWindow(hWnd
, bShow
); 
 496         ::WinSetWindowPos(hWnd
, HWND_TOP
, 0, 0, 0, 0, SWP_ACTIVATE 
| SWP_ZORDER
); 
 499 } // end of wxWindow::Show 
 501 void wxWindow::Raise() 
 503     ::WinSetWindowPos(GetHwnd(), HWND_TOP
, 0, 0, 0, 0, SWP_ZORDER 
| SWP_ACTIVATE
); 
 504 } // end of wxWindow::Raise 
 506 void wxWindow::Lower() 
 508     ::WinSetWindowPos(GetHwnd(), HWND_BOTTOM
, 0, 0, 0, 0, SWP_ZORDER 
| SWP_DEACTIVATE
); 
 509 } // end of wxWindow::Lower 
 511 void wxWindow::SetTitle( 
 512   const wxString
&                   rTitle
 
 515     ::WinSetWindowText(GetHwnd(), rTitle
.c_str()); 
 516 } // end of wxWindow::SetTitle 
 518 wxString 
wxWindow::GetTitle() const 
 520     return wxGetWindowText(GetHWND()); 
 521 } // end of wxWindow::GetTitle 
 523 void wxWindow::CaptureMouse() 
 525     HWND                            hWnd 
= GetHwnd(); 
 527     if (hWnd 
&& !m_bWinCaptured
) 
 529         ::WinSetCapture(HWND_DESKTOP
, hWnd
); 
 530         m_bWinCaptured 
= TRUE
; 
 532 } // end of wxWindow::GetTitle 
 534 void wxWindow::ReleaseMouse() 
 538         ::WinSetCapture(HWND_DESKTOP
, NULLHANDLE
); 
 539         m_bWinCaptured 
= FALSE
; 
 541 } // end of wxWindow::ReleaseMouse 
 543 bool wxWindow::SetFont( 
 547     if (!wxWindowBase::SetFont(rFont
)) 
 553     HWND                            hWnd 
= GetHwnd(); 
 559         sprintf(zFont
, "%d.%s", rFont
.GetPointSize(), rFont
.GetFaceName().c_str()); 
 560         return(::WinSetPresParam(hWnd
, PP_FONTNAMESIZE
, strlen(zFont
), (PVOID
)zFont
)); 
 565 bool wxWindow::SetCursor( 
 566   const wxCursor
&                   rCursor
 
 567 ) // check if base implementation is OK 
 569     if ( !wxWindowBase::SetCursor(rCursor
)) 
 575     wxASSERT_MSG( m_cursor
.Ok(), 
 576                   wxT("cursor must be valid after call to the base version")); 
 578     HWND                            hWnd 
= GetHwnd(); 
 584     hPS 
= ::WinGetPS(hWnd
); 
 586     ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
 587     ::WinQueryWindowRect(hWnd
, &vRect
); 
 589     hRGN 
= ::GpiCreateRegion(hPS
, 1L, &vRect
); 
 591     if ((::GpiPtInRegion(hPS
, hRGN
, &vPoint
) == PRGN_INSIDE
) && !wxIsBusy()) 
 593         ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)m_cursor
.GetHCURSOR()); 
 596 } // end of wxWindow::SetCursor 
 598 void wxWindow::WarpPointer( 
 607     ::WinQueryWindowRect(GetHwnd(), &vRect
); 
 611     ::WinSetPointerPos(HWND_DESKTOP
, (LONG
)nX
, (LONG
)(nY
)); 
 612 } // end of wxWindow::WarpPointer 
 614 #if WXWIN_COMPATIBILITY 
 615 void wxWindow::OS2DeviceToLogical (float *x
, float *y
) const 
 618 #endif // WXWIN_COMPATIBILITY 
 620 // --------------------------------------------------------------------------- 
 622 // --------------------------------------------------------------------------- 
 624 #if WXWIN_COMPATIBILITY 
 625 void wxWindow::SetScrollRange( 
 631     int                             nRange1 
= nRange
; 
 632     int                             nPageSize 
= GetScrollPage(nOrient
); 
 634     if (nPpageSize 
> 1 && nRange 
> 0) 
 636         nRange1 
+= (nPageSize 
- 1); 
 639     if (nOrient 
== wxHORIZONTAL
) 
 641         ::WinSendMsg(m_hWndScrollBarHorz
, SBM_SETSCROLLBAR
, (MPARAM
)0, MPFROM2SHORT(0, (SHORT
)nRange1
)); 
 642         ::WinSendMsg(m_hWndScrollBarHorz
, SBM_SETTHUMBSIZE
, MPFROM2SHORT((SHORT
)nThumbVisible
, (SHORT
)nRange1
), (MPARAM
)0); 
 646         ::WinSendMsg(m_hWndScrollBarVert
, SBM_SETSCROLLBAR
, (MPARAM
)0, MPFROM2SHORT(0, (SHORT
)nRange1
)); 
 647         ::WinSendMsg(m_hWndScrollBarVert
, SBM_SETTHUMBSIZE
, MPFROM2SHORT((SHORT
)nThumbVisible
, (SHORT
)nRange1
), (MPARAM
)0); 
 649 } // end of wxWindow::SetScrollRange 
 651 void wxWindow::SetScrollPage( 
 657     if (nOrient 
== wxHORIZONTAL 
) 
 658         m_nXThumbSize 
= nPage
; 
 660         m_nYThumbSize 
= nPage
; 
 661 } // end of wxWindow::SetScrollPage 
 663 int wxWindow::OldGetScrollRange( 
 668     HWND                            hWnd 
= GetHwnd(); 
 672         mRc 
= WinSendMsg(hWnd
, SBM_QUERYRANGE
, (MPARAM
)0L, (MPARAM
)0L); 
 673         return(SHORT2FROMMR(mRc
)); 
 676 } // end of wxWindow::OldGetScrollRange 
 678 int  wxWindow::GetScrollPage( 
 682     if (nOrient 
== wxHORIZONTAL
) 
 683         return m_nXThumbSize
; 
 685         return m_nYThumbSize
; 
 686 } // end of wxWindow::GetScrollPage 
 687 #endif // WXWIN_COMPATIBILITY 
 689 int  wxWindow::GetScrollPos( 
 693     if (nOrient 
== wxHORIZONTAL
) 
 694         return((int)::WinSendMsg(m_hWndScrollBarHorz
, SBM_QUERYPOS
, (MPARAM
)NULL
, (MPARAM
)NULL
)); 
 696         return((int)::WinSendMsg(m_hWndScrollBarVert
, SBM_QUERYPOS
, (MPARAM
)NULL
, (MPARAM
)NULL
)); 
 697 } // end of wxWindow::GetScrollPos 
 699 int wxWindow::GetScrollRange( 
 705     if (nOrient 
== wxHORIZONTAL
) 
 706         mr 
= ::WinSendMsg(m_hWndScrollBarHorz
, SBM_QUERYRANGE
, (MPARAM
)NULL
, (MPARAM
)NULL
); 
 708         mr 
= ::WinSendMsg(m_hWndScrollBarVert
, SBM_QUERYRANGE
, (MPARAM
)NULL
, (MPARAM
)NULL
); 
 709     return((int)SHORT2FROMMR(mr
)); 
 710 } // end of wxWindow::GetScrollRange 
 712 int wxWindow::GetScrollThumb( 
 716     if (nOrient 
== wxHORIZONTAL 
) 
 717         return m_nXThumbSize
; 
 719         return m_nYThumbSize
; 
 720 } // end of wxWindow::GetScrollThumb 
 722 void wxWindow::SetScrollPos( 
 728     if (nOrient 
== wxHORIZONTAL 
) 
 729         ::WinSendMsg(m_hWndScrollBarHorz
, SBM_SETPOS
, (MPARAM
)nPos
, (MPARAM
)NULL
); 
 731         ::WinSendMsg(m_hWndScrollBarVert
, SBM_SETPOS
, (MPARAM
)nPos
, (MPARAM
)NULL
); 
 732 } // end of wxWindow::SetScrollPos( 
 734 void wxWindow::SetScrollbar( 
 742     int                             nOldRange 
= nRange 
- nThumbVisible
; 
 743     int                             nRange1 
= nOldRange
; 
 744     int                             nPageSize 
= nThumbVisible
; 
 746     HWND                            hWnd 
= GetHwnd(); 
 747     ULONG                           ulStyle 
= WS_VISIBLE 
| WS_SYNCPAINT
; 
 750     ::WinQueryWindowRect(hWnd
, &vRect
); 
 751     if (nPageSize 
> 1 && nRange 
> 0) 
 753         nRange1 
+= (nPageSize 
- 1); 
 756     vInfo
.cb 
= sizeof(SBCDATA
); 
 758     vInfo
.posLast 
= (SHORT
)nRange1
; 
 759     vInfo
.posThumb 
= nPos
; 
 761     if (nOrient 
== wxHORIZONTAL 
) 
 764         if (m_hWndScrollBarHorz 
== 0L) 
 767             // We create the scrollbars with the desktop so that they are not 
 768             // registered as child windows of the window in order that child 
 769             // windows may be scrolled without scrolling the scrollbars themselves! 
 771             m_hWndScrollBarHorz 
= ::WinCreateWindow( hWnd
 
 777                                                     ,vRect
.xRight 
- vRect
.xLeft
 
 791             // Only want to resize the scrollbar if it changes, otherwise 
 792             // we'd probably end up in a recursive loop until we crash the call stack 
 793             // because this method is called in a ScrolledWindow OnSize event and SWP_MOVE | SWP_SIZE 
 794             // generates those events. 
 796             ::WinQueryWindowRect(m_hWndScrollBarHorz
, &vRect2
); 
 797             if (!(vRect2
.xLeft 
== vRect
.xLeft     
&& 
 798                   vRect2
.xRight 
== vRect
.xRight   
&& 
 799                   vRect2
.yBottom 
== vRect
.yBottom 
&& 
 800                   vRect2
.yTop 
== vRect
.yTop
 
 803                 ::WinSetWindowPos( m_hWndScrollBarHorz
 
 807                                   ,vRect
.xRight 
- vRect
.xLeft
 
 809                                   ,SWP_ACTIVATE 
| SWP_MOVE 
| SWP_SIZE 
| SWP_SHOW
 
 812             ::WinSendMsg(m_hWndScrollBarHorz
, SBM_SETSCROLLBAR
, (MPARAM
)nPos
, MPFROM2SHORT(0, (SHORT
)nRange1
)); 
 813             ::WinSendMsg(m_hWndScrollBarHorz
, SBM_SETTHUMBSIZE
, MPFROM2SHORT((SHORT
)nThumbVisible
, (SHORT
)nRange1
), (MPARAM
)0); 
 819         if (m_hWndScrollBarVert 
== 0L) 
 821             m_hWndScrollBarVert 
= ::WinCreateWindow( hWnd
 
 828                                                     ,vRect
.yTop 
- (vRect
.yBottom 
+ 20) 
 841             // Only want to resize the scrollbar if it changes, otherwise 
 842             // we'd probably end up in a recursive loop until we crash the call stack 
 843             // because this method is called in a ScrolledWindow OnSize event and SWP_MOVE | SWP_SIZE 
 844             // generates those events. 
 846             ::WinQueryWindowRect(m_hWndScrollBarVert
, &vRect2
); 
 847             if (!(vRect2
.xLeft 
== vRect
.xLeft     
&& 
 848                   vRect2
.xRight 
== vRect
.xRight   
&& 
 849                   vRect2
.yBottom 
== vRect
.yBottom 
&& 
 850                   vRect2
.yTop 
== vRect
.yTop
 
 853                 ::WinSetWindowPos( m_hWndScrollBarVert
 
 858                                   ,vRect
.yTop 
- (vRect
.yBottom 
+ 20) 
 859                                   ,SWP_ACTIVATE 
| SWP_MOVE 
| SWP_SIZE 
| SWP_SHOW
 
 862             ::WinSendMsg(m_hWndScrollBarVert
, SBM_SETSCROLLBAR
, (MPARAM
)nPos
, MPFROM2SHORT(0, (SHORT
)nRange1
)); 
 863             ::WinSendMsg(m_hWndScrollBarVert
, SBM_SETTHUMBSIZE
, MPFROM2SHORT((SHORT
)nThumbVisible
, (SHORT
)nRange1
), (MPARAM
)0); 
 865         m_nYThumbSize 
= nThumbVisible
; 
 867 } // end of wxWindow::SetScrollbar 
 869 void wxWindow::ScrollWindow( 
 872 , const wxRect
*                     pRect
 
 878     nDy 
*= -1; // flip the sign of Dy as OS/2 is opposite wxWin. 
 881         vRect2
.xLeft   
= pRect
->x
; 
 882         vRect2
.yTop    
= pRect
->y 
+ pRect
->height
; 
 883         vRect2
.xRight  
= pRect
->x 
+ pRect
->width
; 
 884         vRect2
.yBottom 
= pRect
->y
; 
 888         ::WinQueryWindowRect(GetHwnd(), &vRect2
); 
 889         ::WinQueryWindowRect(m_hWndScrollBarHorz
, &vRect
); 
 890         vRect2
.yBottom 
+= vRect
.yTop 
- vRect
.yBottom
; 
 891         ::WinQueryWindowRect(m_hWndScrollBarVert
, &vRect
); 
 892         vRect2
.xRight 
-= vRect
.xRight 
- vRect
.xLeft
; 
 896         ::WinScrollWindow( GetHwnd() 
 906         ::WinScrollWindow( GetHwnd() 
 918     wxWindowList::Node
*             pCurrent 
= GetChildren().GetFirst(); 
 923         wxWindow
*                   pChildWin 
= pCurrent
->GetData(); 
 925         if (pChildWin
->GetHWND() != NULLHANDLE
) 
 927             ::WinQueryWindowPos(pChildWin
->GetHWND(), &vSwp
); 
 928             ::WinQueryWindowRect(pChildWin
->GetHWND(), &vRect
); 
 929             if (pChildWin
->GetHWND() == m_hWndScrollBarVert 
|| 
 930                 pChildWin
->GetHWND() == m_hWndScrollBarHorz
) 
 932                 ::WinSetWindowPos( pChildWin
->GetHWND() 
 938                                   ,SWP_MOVE 
| SWP_SHOW 
| SWP_ZORDER
 
 943                 ::WinSetWindowPos( pChildWin
->GetHWND() 
 949                                   ,SWP_MOVE 
| SWP_ZORDER
 
 951                 ::WinInvalidateRect(pChildWin
->GetHWND(), &vRect
, FALSE
); 
 954         pCurrent 
= pCurrent
->GetNext(); 
 956 } // end of wxWindow::ScrollWindow 
 958 // --------------------------------------------------------------------------- 
 960 // --------------------------------------------------------------------------- 
 962 void wxWindow::SubclassWin( 
 966     HWND                            hwnd 
= (HWND
)hWnd
; 
 968     wxASSERT_MSG( !m_fnOldWndProc
, wxT("subclassing window twice?") ); 
 969     wxCHECK_RET(::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in SubclassWin") ); 
 970     m_fnOldWndProc 
= (WXFARPROC
) ::WinSubclassWindow(hwnd
, (PFNWP
)wxWndProc
); 
 971 } // end of wxWindow::SubclassWin 
 973 void wxWindow::UnsubclassWin() 
 976     // Restore old Window proc 
 978     HWND                            hwnd 
= GetHWND(); 
 982         wxCHECK_RET( ::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in UnsubclassWin") ); 
 984         PFNWP                       fnProc 
= (PFNWP
)::WinQueryWindowPtr(hwnd
, QWP_PFNWP
); 
 986         if ( (m_fnOldWndProc 
!= 0) && (fnProc 
!= (PFNWP
) m_fnOldWndProc
)) 
 988             WinSubclassWindow(hwnd
, (PFNWP
)m_fnOldWndProc
); 
 992 } // end of wxWindow::UnsubclassWin 
 995 // Make a Windows extended style from the given wxWindows window style 
 997 WXDWORD 
wxWindow::MakeExtendedStyle( 
 999 , bool                              bEliminateBorders
 
1003    // PM does not support extended style 
1005     WXDWORD                         exStyle 
= 0; 
1007 } // end of wxWindow::MakeExtendedStyle 
1010 // Determines whether native 3D effects or CTL3D should be used, 
1011 // applying a default border style if required, and returning an extended 
1012 // style to pass to CreateWindowEx. 
1014 WXDWORD 
wxWindow::Determine3DEffects( 
1015   WXDWORD                           dwDefaultBorderStyle
 
1019     WXDWORD                         dwStyle 
= 0L; 
1022     // Native PM does not have any specialize 3D effects like WIN32 does 
1026 } // end of wxWindow::Determine3DEffects 
1028 #if WXWIN_COMPATIBILITY 
1029 void wxWindow::OnCommand( 
1031 , wxCommandEvent
&                   rEvent
 
1034     if (GetEventHandler()->ProcessEvent(rEvent
)) 
1037         m_parent
->GetEventHandler()->OnCommand( rWin
 
1040 } // end of wxWindow::OnCommand 
1042 wxObject
* wxWindow::GetChild( 
1047     // Return a pointer to the Nth object in the Panel 
1049     wxNode
*                         pNode 
= GetChildren().First(); 
1052     while (pNode 
&& n
--) 
1053         pNode 
= pNode
->Next(); 
1056         wxObject
*                   pObj 
= (wxObject
*)pNode
->Data(); 
1061 } // end of wxWindow::GetChild 
1063 #endif // WXWIN_COMPATIBILITY 
1066 // Setup background and foreground colours correctly 
1068 void wxWindow::SetupColours() 
1071         SetBackgroundColour(GetParent()->GetBackgroundColour()); 
1072 } // end of wxWindow::SetupColours 
1074 void wxWindow::OnIdle( 
1079     // Check if we need to send a LEAVE event 
1081     if (m_bMouseInWindow
) 
1085         ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
1086         if (::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, FALSE
) != (HWND
)GetHwnd()) 
1089             // Generate a LEAVE event 
1091             m_bMouseInWindow 
= FALSE
; 
1094             // Unfortunately the mouse button and keyboard state may have changed 
1095             // by the time the OnIdle function is called, so 'state' may be 
1100             if (::WinGetKeyState(HWND_DESKTOP
, VK_SHIFT
) != 0) 
1102             if (::WinGetKeyState(HWND_DESKTOP
, VK_CTRL
) != 0); 
1105             wxMouseEvent            
rEvent(wxEVT_LEAVE_WINDOW
); 
1107             InitMouseEvent( rEvent
 
1112             (void)GetEventHandler()->ProcessEvent(rEvent
); 
1116 } // end of wxWindow::OnIdle 
1119 // Set this window to be the child of 'parent'. 
1121 bool wxWindow::Reparent( 
1125     if (!wxWindowBase::Reparent(pParent
)) 
1128     HWND                            hWndChild 
= GetHwnd(); 
1129     HWND                            hWndParent 
= GetParent() ? GetWinHwnd(GetParent()) : (HWND
)0; 
1131     ::WinSetParent(hWndChild
, hWndParent
, TRUE
); 
1133 } // end of wxWindow::Reparent 
1135 void wxWindow::Clear() 
1137     wxClientDC                      
vDc(this); 
1138     wxBrush                         
vBrush( GetBackgroundColour() 
1142     vDc
.SetBackground(vBrush
); 
1144 } // end of wxWindow::Clear 
1146 void wxWindow::Refresh( 
1148 , const wxRect
*                     pRect
 
1151     HWND                            hWnd 
= GetHwnd(); 
1159             vOs2Rect
.xLeft   
= pRect
->x
; 
1160             vOs2Rect
.yTop    
= pRect
->y
; 
1161             vOs2Rect
.xRight  
= pRect
->x 
+ pRect
->width
; 
1162             vOs2Rect
.yBottom 
= pRect
->y 
+ pRect
->height
; 
1164             ::WinInvalidateRect(hWnd
, &vOs2Rect
, bEraseBack
); 
1167             ::WinInvalidateRect(hWnd
, NULL
, bEraseBack
); 
1169 } // end of wxWindow::Refresh 
1171 // --------------------------------------------------------------------------- 
1173 // --------------------------------------------------------------------------- 
1175 #if wxUSE_DRAG_AND_DROP 
1176 void wxWindow::SetDropTarget( 
1177   wxDropTarget
*                     pDropTarget
 
1180     if (m_dropTarget 
!= 0) 
1182         m_dropTarget
->Revoke(m_hWnd
); 
1183         delete m_dropTarget
; 
1185     m_dropTarget 
= pDropTarget
; 
1186     if (m_dropTarget 
!= 0) 
1187         m_dropTarget
->Register(m_hWnd
); 
1188 } // end of wxWindow::SetDropTarget 
1192 // old style file-manager drag&drop support: we retain the old-style 
1193 // DragAcceptFiles in parallel with SetDropTarget. 
1195 void wxWindow::DragAcceptFiles( 
1199     HWND                            hWnd 
= GetHwnd(); 
1201     if (hWnd 
&& bAccept
) 
1202         ::DrgAcceptDroppedFiles(hWnd
, NULL
, NULL
, DO_COPY
, 0L); 
1203 } // end of wxWindow::DragAcceptFiles 
1205 // ---------------------------------------------------------------------------- 
1207 // ---------------------------------------------------------------------------- 
1211 void wxWindow::DoSetToolTip( 
1215     wxWindowBase::DoSetToolTip(pTooltip
); 
1218         m_tooltip
->SetWindow(this); 
1219 } // end of wxWindow::DoSetToolTip 
1221 #endif // wxUSE_TOOLTIPS 
1223 // --------------------------------------------------------------------------- 
1224 // moving and resizing 
1225 // --------------------------------------------------------------------------- 
1228 void wxWindow::DoGetSize( 
1233     HWND                            hWnd 
= GetHwnd(); 
1236     ::WinQueryWindowRect(hWnd
, &vRect
); 
1239         *pWidth 
= vRect
.xRight 
- vRect
.xLeft
; 
1241         // OS/2 PM is backwards from windows 
1242         *pHeight 
= vRect
.yTop 
- vRect
.yBottom
; 
1243 } // end of wxWindow::DoGetSize 
1245 void wxWindow::DoGetPosition( 
1250     HWND                            hWnd 
= GetHwnd(); 
1254     ::WinQueryWindowRect(hWnd
, &vRect
); 
1256     vPoint
.x 
= vRect
.xLeft
; 
1257     vPoint
.y 
= vRect
.yBottom
; 
1260     // We do the adjustments with respect to the parent only for the "real" 
1261     // children, not for the dialogs/frames 
1265         HWND                        hParentWnd 
= 0; 
1266         wxWindow
*                   pParent 
= GetParent(); 
1269             hParentWnd 
= GetWinHwnd(pParent
); 
1272         // Since we now have the absolute screen coords, if there's a parent we 
1273         // must subtract its bottom left corner 
1279             ::WinQueryWindowRect(hParentWnd
, &vRect2
); 
1280             vPoint
.x 
-= vRect
.xLeft
; 
1281             vPoint
.y 
-= vRect
.yBottom
; 
1285         // We may be faking the client origin. So a window that's really at (0, 
1286         // 30) may appear (to wxWin apps) to be at (0, 0). 
1288         wxPoint                     
vPt(pParent
->GetClientAreaOrigin()); 
1298 } // end of wxWindow::DoGetPosition 
1300 void wxWindow::DoScreenToClient( 
1305     HWND                            hWnd 
= GetHwnd(); 
1308     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1314 } // end of wxWindow::DoScreenToClient 
1316 void wxWindow::DoClientToScreen( 
1321     HWND                            hWnd 
= GetHwnd(); 
1324     ::WinQueryWindowPos(hWnd
, &vSwp
); 
1330 } // end of wxWindow::DoClientToScreen 
1333 // Get size *available for subwindows* i.e. excluding menu bar etc. 
1334 // Must be a frame type window 
1336 void wxWindow::DoGetClientSize( 
1341     HWND                            hWnd 
= GetHwnd(); 
1345     if (IsKindOf(CLASSINFO(wxFrame
))) 
1346         hWndClient 
= ::WinWindowFromID(GetHwnd(), FID_CLIENT
); 
1348         hWndClient 
= NULLHANDLE
; 
1349     if( hWndClient 
== NULLHANDLE
) 
1350        ::WinQueryWindowRect(GetHwnd(), &vRect
); 
1352        ::WinQueryWindowRect(hWndClient
, &vRect
); 
1355         *pWidth  
= vRect
.xRight
; 
1357         *pHeight 
= vRect
.yTop
; 
1358 } // end of wxWindow::DoGetClientSize 
1360 void wxWindow::DoMoveWindow( 
1367     if ( !::WinSetWindowPos( GetHwnd() 
1373                             ,SWP_SIZE 
| SWP_MOVE
 
1376         wxLogLastError("MoveWindow"); 
1378 } // end of wxWindow::DoMoveWindow 
1381 // Set the size of the window: if the dimensions are positive, just use them, 
1382 // but if any of them is equal to -1, it means that we must find the value for 
1383 // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in 
1384 // which case -1 is a valid value for x and y) 
1386 // If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate 
1387 // the width/height to best suit our contents, otherwise we reuse the current 
1390 void wxWindow::DoSetSize( 
1399     // Get the current size and position... 
1405     wxSize                          
vSize(-1, -1); 
1407     GetPosition( &nCurrentX
 
1410     GetSize( &nCurrentWidth
 
1415     // ... and don't do anything (avoiding flicker) if it's already ok 
1417     if ( nX 
== nCurrentX 
&& 
1419          nWidth 
== nCurrentWidth 
&& 
1420          nHeight 
== nCurrentHeight
 
1426     if (nX 
== -1 && !(nSizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
)) 
1428     if (nY 
== -1 && !(nSizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
)) 
1431     AdjustForParentClientOrigin( nX
 
1438         if (nSizeFlags 
& wxSIZE_AUTO_WIDTH
) 
1440             vSize  
= DoGetBestSize(); 
1446             // Just take the current one 
1448             nWidth 
= nCurrentWidth
; 
1454         if (nSizeFlags 
& wxSIZE_AUTO_HEIGHT
) 
1458                 vSize 
= DoGetBestSize(); 
1464             // just take the current one 
1465             nHeight 
= nCurrentHeight
; 
1474 } // end of wxWindow::DoSetSize 
1476 void wxWindow::DoSetClientSize( 
1481     wxWindow
*                       pParent 
= GetParent(); 
1482     HWND                            hWnd 
= GetHwnd(); 
1483     HWND                            hParentWnd 
= (HWND
)0; 
1484     HWND                            hClientWnd 
= (HWND
)0; 
1489     hClientWnd 
= ::WinWindowFromID(GetHwnd(), FID_CLIENT
); 
1490     ::WinQueryWindowRect(hClientWnd
, &vRect2
); 
1493         hParentWnd 
= (HWND
) pParent
->GetHWND(); 
1495     ::WinQueryWindowRect(hWnd
, &vRect
); 
1496     ::WinQueryWindowRect(hParentWnd
, &vRect3
); 
1498     // Find the difference between the entire window (title bar and all) 
1499     // and the client area; add this to the new client size to move the 
1500     // window. OS/2 is backward from windows on height 
1502     int                             nActualWidth 
= vRect2
.xRight 
- vRect2
.xLeft 
- vRect
.xRight 
+ nWidth
; 
1503     int                             nActualHeight 
= vRect2
.yTop 
- vRect2
.yBottom 
- vRect
.yTop 
+ nHeight
; 
1506     // If there's a parent, must subtract the parent's bottom left corner 
1507     // since MoveWindow moves relative to the parent 
1511     vPoint
.x 
= vRect2
.xLeft
; 
1512     vPoint
.y 
= vRect2
.yBottom
; 
1515         vPoint
.x 
-= vRect3
.xLeft
; 
1516         vPoint
.y 
-= vRect3
.yBottom
; 
1519     DoMoveWindow( vPoint
.x
 
1525     wxSizeEvent                     
vEvent( wxSize( nWidth
 
1531     vEvent
.SetEventObject(this); 
1532     GetEventHandler()->ProcessEvent(vEvent
); 
1533 } // end of wxWindow::DoSetClientSize 
1535 wxPoint 
wxWindow::GetClientAreaOrigin() const 
1537     return wxPoint(0, 0); 
1538 } // end of wxWindow::GetClientAreaOrigin 
1540 void wxWindow::AdjustForParentClientOrigin( 
1547     // Don't do it for the dialogs/frames - they float independently of their 
1552         wxWindow
*                   pParent 
= GetParent(); 
1554         if (!(nSizeFlags 
& wxSIZE_NO_ADJUSTMENTS
) && pParent
) 
1556             wxPoint                 
vPoint(pParent
->GetClientAreaOrigin()); 
1561 } // end of wxWindow::AdjustForParentClientOrigin 
1563 // --------------------------------------------------------------------------- 
1565 // --------------------------------------------------------------------------- 
1567 int wxWindow::GetCharHeight() const 
1570     FONTMETRICS                     vFontMetrics
; 
1573     hPs 
= ::WinGetPS(GetHwnd()); 
1575     if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
)) 
1577         ::WinReleasePS(hPs
); 
1580     ::WinReleasePS(hPs
); 
1581     return(vFontMetrics
.lMaxAscender 
+ vFontMetrics
.lMaxDescender
); 
1582 } // end of wxWindow::GetCharHeight 
1584 int wxWindow::GetCharWidth() const 
1587     FONTMETRICS                     vFontMetrics
; 
1589     hPs 
= ::WinGetPS(GetHwnd()); 
1591     if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
)) 
1593         ::WinReleasePS(hPs
); 
1596     ::WinReleasePS(hPs
); 
1597     return(vFontMetrics
.lAveCharWidth
); 
1598 } // end of wxWindow::GetCharWidth 
1600 void wxWindow::GetTextExtent( 
1601   const wxString
&                   rString
 
1605 , int*                              pExternalLeading
 
1606 , const wxFont
*                     pTheFont
 
1609     const wxFont
*                   pFontToUse 
= pTheFont
; 
1612     hPs 
= ::WinGetPS(GetHwnd()); 
1614 // TODO: Will have to play with fonts later 
1617         pFontToUse = &m_font; 
1620     HFONT                           hFfontOld = 0; 
1622     if (pFontToUse && pFontToUse->Ok()) 
1625         hFnt = (HFONT)((wxFont *)pFontToUse)->GetResourceHandle(); // const_cast 
1627             hFontOld = (HFONT)SelectObject(dc,fnt); 
1632     GetTextExtentPoint(dc, string, (int)string.Length(), &sizeRect); 
1633     GetTextMetrics(dc, &tm); 
1635     if ( fontToUse && fnt && hfontOld ) 
1636         SelectObject(dc, hfontOld); 
1638     ReleaseDC(hWnd, dc); 
1645         *descent = tm.tmDescent; 
1646     if ( externalLeading ) 
1647         *externalLeading = tm.tmExternalLeading; 
1649     ::WinReleasePS(hPs
); 
1652 #if wxUSE_CARET && WXWIN_COMPATIBILITY 
1653 // --------------------------------------------------------------------------- 
1654 // Caret manipulation 
1655 // --------------------------------------------------------------------------- 
1657 void wxWindow::CreateCaret( 
1662     SetCaret(new wxCaret( this 
1666 } // end of wxWindow::CreateCaret 
1668 void wxWindow::CreateCaret( 
1669   const wxBitmap
*                   pBitmap
 
1672     wxFAIL_MSG("not implemented"); 
1673 } // end of wxWindow::CreateCaret 
1675 void wxWindow::ShowCaret( 
1679     wxCHECK_RET( m_caret
, "no caret to show" ); 
1681     m_caret
->Show(bShow
); 
1682 } // end of wxWindow::ShowCaret 
1684 void wxWindow::DestroyCaret() 
1687 } // end of wxWindow::DestroyCaret 
1689 void wxWindow::SetCaretPos( 
1693     wxCHECK_RET( m_caret
, "no caret to move" ); 
1698 } // end of wxWindow::SetCaretPos 
1700 void wxWindow::GetCaretPos( 
1705     wxCHECK_RET( m_caret
, "no caret to get position of" ); 
1707     m_caret
->GetPosition( pX
 
1710 } // end of wxWindow::GetCaretPos 
1712 #endif //wxUSE_CARET 
1714 // --------------------------------------------------------------------------- 
1716 // --------------------------------------------------------------------------- 
1718 bool wxWindow::DoPopupMenu( 
1724     HWND                            hWnd 
= GetHwnd(); 
1725     HWND                            hWndParent 
= GetParent() ? GetWinHwnd(GetParent()) : (HWND
)0; 
1726     HWND                            hMenu 
= GetHmenuOf(pMenu
); 
1728     pMenu
->SetInvokingWindow(this); 
1731     DoClientToScreen( &nX
 
1734     wxCurrentPopupMenu 
= pMenu
; 
1736     ::WinPopupMenu( hWndParent
 
1742                    ,PU_MOUSEBUTTON2DOWN 
| PU_MOUSEBUTTON2 
| PU_KEYBOARD
 
1745     wxCurrentPopupMenu 
= NULL
; 
1747     pMenu
->SetInvokingWindow(NULL
); 
1749 } // end of wxWindow::DoPopupMenu 
1751 // =========================================================================== 
1752 // pre/post message processing 
1753 // =========================================================================== 
1755 MRESULT 
wxWindow::OS2DefWindowProc( 
1762         return (MRESULT
)m_fnOldWndProc(GetHWND(), (ULONG
)uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
); 
1764         return ::WinDefWindowProc(GetHWND(), (ULONG
)uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
); 
1765 } // end of wxWindow::OS2DefWindowProc 
1767 bool wxWindow::OS2ProcessMessage( 
1771     QMSG
*                           pQMsg 
= (QMSG
*)pMsg
; 
1773     if (m_hWnd 
!= 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL
)) 
1776         // Intercept dialog navigation keys 
1778         bool                        bProcess 
= TRUE
; 
1779         USHORT                      uKeyFlags 
= SHORT1FROMMP(pQMsg
->mp1
); 
1781         if (uKeyFlags 
& KC_KEYUP
) 
1784         if (uKeyFlags 
& KC_ALT
) 
1787         if (!(uKeyFlags 
& KC_VIRTUALKEY
)) 
1792             bool                    bCtrlDown 
= IsCtrlDown(); 
1793             bool                    bShiftDown 
= IsShiftDown(); 
1796             // WM_QUERYDLGCODE: ask the control if it wants the key for itself, 
1797             // don't process it if it's the case (except for Ctrl-Tab/Enter 
1798             // combinations which are always processed) 
1800             ULONG                   ulDlgCode 
= 0; 
1804                 ulDlgCode 
= (ULONG
)::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0); 
1807             bool                    bForward 
= TRUE
; 
1808             bool                    bWindowChange 
= FALSE
; 
1810             switch (SHORT2FROMMP(pQMsg
->mp2
)) 
1813                 // Going to make certain assumptions about specific types of controls 
1814                 // here, so we may have to alter some things later if they prove invalid 
1818                     // Shift tabl will always be a nav-key but tabs may be wanted 
1827                         // Entry Fields want tabs for themselve usually 
1831                             case DLGC_ENTRYFIELD
: 
1841                         // Ctrl-Tab cycles thru notebook pages 
1843                         bWindowChange 
= bCtrlDown
; 
1844                         bForward 
= !bShiftDown
; 
1867                             // ctrl-enter is not processed 
1871                         else if (ulDlgCode 
& DLGC_BUTTON
) 
1874                             // buttons want process Enter themselevs 
1880                             wxPanel
*    pPanel 
= wxDynamicCast(this, wxPanel
); 
1881                             wxButton
*   pBtn 
= NULL
; 
1886                                 // Panel may have a default button which should 
1887                                 // be activated by Enter 
1889                                 pBtn 
= pPanel
->GetDefaultItem(); 
1892                             if (pBtn 
&& pBtn
->IsEnabled()) 
1895                                 // If we do have a default button, do press it 
1897                                 pBtn
->OS2Command(BN_CLICKED
, 0 /* unused */); 
1900                             // else: but if it does not it makes sense to make 
1901                             //       it work like a TAB - and that's what we do. 
1902                             //       Note that Ctrl-Enter always works this way. 
1913                 wxNavigationKeyEvent    vEvent
; 
1915                 vEvent
.SetDirection(bForward
); 
1916                 vEvent
.SetWindowChange(bWindowChange
); 
1917                 vEvent
.SetEventObject(this); 
1919                 if (GetEventHandler()->ProcessEvent(vEvent
)) 
1921                     wxButton
*       pBtn 
= wxDynamicCast(FindFocus(), wxButton
); 
1926                         // The button which has focus should be default 
1935         // Let Dialogs process 
1937         if (::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0)); 
1944         // relay mouse move events to the tooltip control 
1945         QMSG
*                       pQMsg 
= (QMSG
*)pMsg
; 
1947         if (pQMsg
->msg 
== WM_MOUSEMOVE 
) 
1948             m_tooltip
->RelayEvent(pMsg
); 
1950 #endif // wxUSE_TOOLTIPS 
1953 } // end of wxWindow::OS2ProcessMessage 
1955 bool wxWindow::OS2TranslateMessage( 
1960   return m_acceleratorTable
.Translate(m_hWnd
, pMsg
); 
1963 #endif //wxUSE_ACCEL 
1964 } // end of wxWindow::OS2TranslateMessage 
1966 // --------------------------------------------------------------------------- 
1967 // message params unpackers 
1968 // --------------------------------------------------------------------------- 
1970 void wxWindow::UnpackCommand( 
1978     *pId 
= LOWORD(wParam
); 
1979     *phWnd 
= NULL
;  // or may be GetHWND() ? 
1980     *pCmd 
= LOWORD(lParam
); 
1981 } // end of wxWindow::UnpackCommand 
1983 void wxWindow::UnpackActivate( 
1990     *pState     
= LOWORD(wParam
); 
1991     *phWnd      
= (WXHWND
)lParam
; 
1992 } // end of wxWindow::UnpackActivate 
1994 void wxWindow::UnpackScroll( 
2005     ulId    
= (ULONG
)LONGFROMMP(wParam
); 
2006     hWnd 
= ::WinWindowFromID(GetHwnd(), ulId
); 
2007     if (hWnd 
== m_hWndScrollBarHorz 
|| hWnd 
== m_hWndScrollBarVert
) 
2008         *phWnd 
= NULLHANDLE
; 
2012     *pPos  
= SHORT1FROMMP(lParam
); 
2013     *pCode 
= SHORT2FROMMP(lParam
); 
2014 } // end of wxWindow::UnpackScroll 
2016 void wxWindow::UnpackMenuSelect( 
2024     *pItem 
= (WXWORD
)LOWORD(wParam
); 
2025     *pFlags 
= HIWORD(wParam
); 
2026     *phMenu 
= (WXHMENU
)lParam
; 
2027 } // end of wxWindow::UnpackMenuSelect 
2029 // --------------------------------------------------------------------------- 
2030 // Main wxWindows window proc and the window proc for wxWindow 
2031 // --------------------------------------------------------------------------- 
2034 // Hook for new window just as it's being created, when the window isn't yet 
2035 // associated with the handle 
2037 wxWindow
*                           wxWndHook 
= NULL
; 
2042 MRESULT EXPENTRY 
wxWndProc( 
2050     // Trace all ulMsgs - useful for the debugging 
2053     wxLogTrace(wxTraceMessages
, wxT("Processing %s(wParam=%8lx, lParam=%8lx)"), 
2054                wxGetMessageName(ulMsg
), wParam
, lParam
); 
2055 #endif // __WXDEBUG__ 
2057     wxWindow
*                       pWnd 
= wxFindWinFromHandle((WXHWND
)hWnd
); 
2060     // When we get the first message for the HWND we just created, we associate 
2061     // it with wxWindow stored in wxWndHook 
2063     if (!pWnd 
&& wxWndHook
) 
2065         wxAssociateWinWithHandle(hWnd
, wxWndHook
); 
2068         pWnd
->SetHWND((WXHWND
)hWnd
); 
2071     MRESULT                         rc 
= (MRESULT
)0; 
2075     // Stop right here if we don't have a valid handle in our wxWindow object. 
2077     if (pWnd 
&& !pWnd
->GetHWND()) 
2079         pWnd
->SetHWND((WXHWND
) hWnd
); 
2080         rc 
= pWnd
->OS2DefWindowProc(ulMsg
, wParam
, lParam 
); 
2086             rc 
= pWnd
->OS2WindowProc(ulMsg
, wParam
, lParam
); 
2088             rc 
= ::WinDefWindowProc(hWnd
, ulMsg
, wParam
, lParam
); 
2092 } // end of wxWndProc 
2095 // We will add (or delete) messages we need to handle at this default 
2098 MRESULT 
wxWindow::OS2WindowProc( 
2105     // Did we process the uMsg? 
2107     bool                            bProcessed 
= FALSE
; 
2114     // For most messages we should return 0 when we do process the message 
2116     mResult 
= (MRESULT
)0; 
2124                 bProcessed 
= HandleCreate( (WXLPCREATESTRUCT
)lParam
 
2130                     // Return 0 to bAllow window creation 
2132                     mResult 
= (MRESULT
)(bMayCreate 
? 0 : -1); 
2143             bProcessed 
= HandleMove( LOWORD(lParam
) 
2149             bProcessed 
= HandleSize( LOWORD(lParam
) 
2160                 UnpackActivate( wParam
 
2166                 bProcessed 
= HandleActivate( wState
 
2174             if (SHORT1FROMMP((MPARAM
)lParam
) == TRUE
) 
2175                 bProcessed 
= HandleSetFocus((WXHWND
)(HWND
)wParam
); 
2177                 bProcessed 
= HandleKillFocus((WXHWND
)(HWND
)wParam
); 
2181             bProcessed 
= HandlePaint(); 
2186             // Don't let the DefWindowProc() destroy our window - we'll do it 
2187             // ourselves in ~wxWindow 
2190             mResult 
= (MRESULT
)TRUE
; 
2194             bProcessed 
= HandleShow(wParam 
!= 0, (int)lParam
); 
2198         // Under OS2 PM Joysticks are treated just like mouse events 
2199         // The "Motion" events will be prevelent in joysticks 
2202         case WM_BUTTON1DOWN
: 
2204         case WM_BUTTON1DBLCLK
: 
2205         case WM_BUTTON1MOTIONEND
: 
2206         case WM_BUTTON1MOTIONSTART
: 
2207         case WM_BUTTON2DOWN
: 
2209         case WM_BUTTON2DBLCLK
: 
2210         case WM_BUTTON2MOTIONEND
: 
2211         case WM_BUTTON2MOTIONSTART
: 
2212         case WM_BUTTON3DOWN
: 
2214         case WM_BUTTON3DBLCLK
: 
2215         case WM_BUTTON3MOTIONEND
: 
2216         case WM_BUTTON3MOTIONSTART
: 
2218                 short x 
= LOWORD(lParam
); 
2219                 short y 
= HIWORD(lParam
); 
2221                 bProcessed 
= HandleMouseEvent(uMsg
, x
, y
, (WXUINT
)wParam
); 
2225             bProcessed 
= HandleSysCommand(wParam
, lParam
); 
2232                 UnpackCommand(wParam
, lParam
, &id
, &hwnd
, &cmd
); 
2234                 bProcessed 
= HandleCommand(id
, cmd
, hwnd
); 
2239             // For these messages we must return TRUE if process the message 
2242         case WM_MEASUREITEM
: 
2244                 int                 nIdCtrl 
= (UINT
)wParam
; 
2246                 if ( uMsg 
== WM_DRAWITEM 
) 
2248                     bProcessed 
= OS2OnDrawItem(nIdCtrl
, 
2249                                               (WXDRAWITEMSTRUCT 
*)lParam
); 
2253                     bProcessed 
= OS2OnMeasureItem(nIdCtrl
, 
2254                                                  (WXMEASUREITEMSTRUCT 
*)lParam
); 
2258                     mResult 
= (MRESULT
)TRUE
; 
2262         case WM_QUERYDLGCODE
: 
2265                 mResult 
= (MRESULT
)m_lDlgCode
; 
2269             //else: get the dlg code from the DefWindowProc() 
2274         // In OS/2 PM all keyboard events are of the WM_CHAR type.  Virtual key and key-up 
2275         // and key-down events are obtained from the WM_CHAR params. 
2279                 USHORT                  uKeyFlags 
= SHORT1FROMMP((MPARAM
)wParam
); 
2281                 if (uKeyFlags 
& KC_KEYUP
) 
2283                     bProcessed 
= HandleKeyUp((WXDWORD
)wParam
, lParam
); 
2286                 else // keydown event 
2289                     // If this has been processed by an event handler, 
2290                     // return 0 now (we've handled it). DON't RETURN 
2291                     // we still need to process further 
2293                     HandleKeyDown((WXDWORD
)wParam
, lParam
); 
2294                     if (uKeyFlags 
& KC_VIRTUALKEY
) 
2296                         USHORT          uVk 
= SHORT2FROMMP((MPARAM
)lParam
); 
2299                         // We consider these message "not interesting" to OnChar 
2301                         if (uVk 
== VK_SHIFT 
|| uVk 
== VK_CTRL 
) 
2309                             // Avoid duplicate messages to OnChar for these ASCII keys: they 
2310                             // will be translated by TranslateMessage() and received in WM_CHAR 
2316                                 // But set processed to FALSE, not TRUE to still pass them to 
2317                                 // the control's default window proc - otherwise built-in 
2318                                 // keyboard handling won't work 
2327                                 bProcessed 
= HandleChar((WXDWORD
)wParam
, lParam
); 
2331                     else // WM_CHAR -- Always an ASCII character 
2333                         bProcessed 
= HandleChar((WXDWORD
)wParam
, lParam
, TRUE
); 
2345                 UnpackScroll( wParam
 
2352                 bProcessed 
= OS2OnScroll( uMsg 
== WM_HSCROLL 
? wxHORIZONTAL
 
2361 #if defined(__VISAGECPP__) && (__IBMCPP__ >= 400) 
2362         case WM_CTLCOLORCHANGE
: 
2364                 bProcessed 
= HandleCtlColor(&hBrush
); 
2368         case WM_ERASEBACKGROUND
: 
2370             // Returning TRUE to requestw PM to paint the window background 
2371             // in SYSCLR_WINDOW. We don't really want that 
2373             bProcessed 
= HandleEraseBkgnd((WXHDC
)(HPS
)wParam
); 
2374             mResult 
= (MRESULT
)(FALSE
); 
2378         // Instead of CTLCOLOR messages PM sends QUERYWINDOWPARAMS to 
2379         // things such as colors and fonts and such 
2381         case WM_QUERYWINDOWPARAMS
: 
2383                 PWNDPARAMS          pWndParams 
= (PWNDPARAMS
)wParam
; 
2385                 bProcessed 
= HandleWindowParams( pWndParams
 
2391             // the return value for this message is ignored 
2392         case WM_SYSCOLORCHANGE
: 
2393             bProcessed 
= HandleSysColorChange(); 
2396         case WM_REALIZEPALETTE
: 
2397             bProcessed 
= HandlePaletteChanged(); 
2400         case WM_PRESPARAMCHANGED
: 
2401             bProcessed 
= HandlePresParamChanged(wParam
); 
2405         // move all drag and drops to wxDrg 
2407             bProcessed 
= HandleEndDrag(wParam
); 
2411             bProcessed 
= HandleInitDialog((WXHWND
)(HWND
)wParam
); 
2415                 // we never set focus from here 
2420         // wxFrame specific message 
2421         case WM_MINMAXFRAME
: 
2422             bProcessed 
= HandleGetMinMaxInfo((PSWP
)wParam
); 
2425         case WM_SYSVALUECHANGED
: 
2426             // TODO: do something 
2427             mResult 
= (MRESULT
)TRUE
; 
2431         // Comparable to WM_SETPOINTER for windows, only for just controls 
2433         case WM_CONTROLPOINTER
: 
2434             bProcessed 
= HandleSetCursor( SHORT1FROMMP(wParam
) // Control ID 
2435                                          ,(HWND
)lParam         
// Cursor Handle 
2440                 // Returning TRUE stops the DefWindowProc() from further 
2441                 // processing this message - exactly what we need because we've 
2442                 // just set the cursor. 
2444                 mResult 
= (MRESULT
)TRUE
; 
2451         wxLogTrace(wxTraceMessages
, wxT("Forwarding %s to DefWindowProc."), 
2452                    wxGetMessageName(uMsg
)); 
2453 #endif // __WXDEBUG__ 
2454         if (IsKindOf(CLASSINFO(wxFrame
))) 
2455             mResult 
= ::WinDefWindowProc(m_hWnd
, uMsg
, wParam
, lParam
); 
2457             mResult 
= OS2DefWindowProc(uMsg
, wParam
, lParam
); 
2460 } // end of wxWindow::OS2WindowProc 
2463 // Dialog window proc 
2471     if (uMsg 
== WM_INITDLG
) 
2474         // For this message, returning TRUE tells system to set focus to the 
2475         // first control in the dialog box 
2477         return (MRESULT
)TRUE
; 
2482         // For all the other ones, FALSE means that we didn't process the 
2487 } // end of wxDlgProc 
2489 wxWindow
* wxFindWinFromHandle( 
2493     wxNode
*                         pNode 
= wxWinHandleList
->Find((long)hWnd
); 
2497     return (wxWindow 
*)pNode
->Data(); 
2498 } // end of wxFindWinFromHandle 
2500 void wxAssociateWinWithHandle( 
2506     // Adding NULL hWnd is (first) surely a result of an error and 
2507     // (secondly) breaks menu command processing 
2509     wxCHECK_RET( hWnd 
!= (HWND
)NULL
, 
2510                  wxT("attempt to add a NULL hWnd to window list ignored") ); 
2513     wxWindow
*                       pOldWin 
= wxFindWinFromHandle((WXHWND
) hWnd
); 
2515     if (pOldWin 
&& (pOldWin 
!= pWin
)) 
2517         wxString                    
str(pWin
->GetClassInfo()->GetClassName()); 
2518         wxLogError( "Bug! Found existing HWND %X for new window of class %s" 
2525         wxWinHandleList
->Append( (long)hWnd
 
2529 } // end of wxAssociateWinWithHandle 
2531 void wxRemoveHandleAssociation( 
2535     wxWinHandleList
->DeleteObject(pWin
); 
2536 } // end of wxRemoveHandleAssociation 
2539 // Default destroyer - override if you destroy it in some other way 
2540 // (e.g. with MDI child windows) 
2542 void wxWindow::OS2DestroyWindow() 
2546 void wxWindow::OS2DetachWindowMenu() 
2550         HMENU                       hMenu 
= (HMENU
)m_hMenu
; 
2552         int                         nN 
= (int)::WinSendMsg(hMenu
, MM_QUERYITEMCOUNT
, 0, 0); 
2555         for (i 
= 0; i 
< nN
; i
++) 
2558             int                      nChars 
= (int)::WinSendMsg( hMenu
 
2560                                                                 ,MPFROM2SHORT(i
, nN
) 
2565                 wxLogLastError(wxT("GetMenuString")); 
2569             if (wxStrcmp(zBuf
, wxT("&Window")) == 0) 
2571                 ::WinSendMsg(hMenu
, MM_DELETEITEM
, MPFROM2SHORT(i
, TRUE
), 0); 
2576 } // end of wxWindow::OS2DetachWindowMenu 
2578 bool wxWindow::OS2Create( 
2581 , const wxChar
*                     zTitle
 
2589 , unsigned long                     ulId
 
2599     long                            lHeight1 
= 20L; 
2601     int                             nNeedsubclass 
= 0; 
2602     PCSZ                            pszClass 
= zClass
; 
2605     // Find parent's size, if it exists, to set up a possible default 
2606     // panel size the size of the parent window 
2621     // check to see if the new window is a standard control 
2623     if ((ULONG
)zClass 
== (ULONG
)WC_BUTTON 
|| 
2624         (ULONG
)zClass 
== (ULONG
)WC_COMBOBOX 
|| 
2625         (ULONG
)zClass 
== (ULONG
)WC_CONTAINER 
|| 
2626         (ULONG
)zClass 
== (ULONG
)WC_ENTRYFIELD 
|| 
2627         (ULONG
)zClass 
== (ULONG
)WC_FRAME 
|| 
2628         (ULONG
)zClass 
== (ULONG
)WC_LISTBOX 
|| 
2629         (ULONG
)zClass 
== (ULONG
)WC_MENU 
|| 
2630         (ULONG
)zClass 
== (ULONG
)WC_NOTEBOOK 
|| 
2631         (ULONG
)zClass 
== (ULONG
)WC_SCROLLBAR 
|| 
2632         (ULONG
)zClass 
== (ULONG
)WC_SPINBUTTON 
|| 
2633         (ULONG
)zClass 
== (ULONG
)WC_STATIC 
|| 
2634         (ULONG
)zClass 
== (ULONG
)WC_TITLEBAR 
|| 
2635         (ULONG
)zClass 
== (ULONG
)WC_VALUESET
 
2642         // no standard controls 
2643         if(wxString (wxT("wxFrameClass")) == wxString(zClass
) ) 
2645             pszClass 
=  WC_FRAME
; 
2652                 nControlId 
= FID_CLIENT
; 
2657     // We will either have a registered class via string name or a standard PM Class via a long 
2659     m_hWnd 
= (WXHWND
)::WinCreateWindow( (HWND
)hParent
 
2661                                        ,(PSZ
)zTitle 
? zTitle 
: wxT("") 
2675         vError 
= ::WinGetLastError(vHabmain
); 
2676         sError 
= wxPMErrorToStr(vError
); 
2677         wxLogError("Can't create window of class %s!. Error: %s\n", zClass
, sError
); 
2680     ::WinSetWindowULong(m_hWnd
, QWL_USER
, (ULONG
) this); 
2684     wxNode
*                         pNode 
= wxWinHandleList
->Member(this); 
2688         HWND                        hWnd 
= (HWND
)pNode
->GetKeyInteger(); 
2690         if (hWnd 
!= (HWND
)m_hWnd
) 
2693             wxLogError("A second HWND association is being added for the same window!"); 
2697     wxAssociateWinWithHandle((HWND
)m_hWnd
 
2701     // Now need to subclass window. 
2705          wxAssociateWinWithHandle((HWND
)m_hWnd
,this); 
2709         SubclassWin(GetHWND()); 
2712 } // end of wxWindow::OS2Create 
2714 // =========================================================================== 
2715 // OS2 PM message handlers 
2716 // =========================================================================== 
2718 // --------------------------------------------------------------------------- 
2719 // window creation/destruction 
2720 // --------------------------------------------------------------------------- 
2722 bool wxWindow::HandleCreate( 
2723   WXLPCREATESTRUCT                  vCs
 
2727     wxWindowCreateEvent             
vEvent(this); 
2729     (void)GetEventHandler()->ProcessEvent(vEvent
); 
2730     *pbMayCreate 
= TRUE
; 
2732 } // end of wxWindow::HandleCreate 
2734 bool wxWindow::HandleDestroy() 
2736     wxWindowDestroyEvent            
vEvent(this); 
2738     (void)GetEventHandler()->ProcessEvent(vEvent
); 
2741     // Delete our drop target if we've got one 
2743 #if wxUSE_DRAG_AND_DROP 
2744     if (m_dropTarget 
!= NULL
) 
2746         m_dropTarget
->Revoke(m_hWnd
); 
2747         delete m_dropTarget
; 
2748         m_dropTarget 
= NULL
; 
2750 #endif // wxUSE_DRAG_AND_DROP 
2753     // WM_DESTROY handled 
2756 } // end of wxWindow::HandleDestroy 
2758 // --------------------------------------------------------------------------- 
2760 // --------------------------------------------------------------------------- 
2761 void wxWindow::OnSetFocus( 
2762   wxFocusEvent
&                     rEvent
 
2766     // Panel wants to track the window which was the last to have focus in it, 
2767     // so we want to set ourselves as the window which last had focus 
2769     // Notice that it's also important to do it upwards the tree becaus 
2770     // otherwise when the top level panel gets focus, it won't set it back to 
2771     // us, but to some other sibling 
2773     wxWindow
*                       pWin 
= this; 
2777         wxWindow
*                   pParent 
= pWin
->GetParent(); 
2778         wxPanel
*                    pPanel 
= wxDynamicCast( pParent
 
2783             pPanel
->SetLastFocus(pWin
); 
2788     wxLogTrace(_T("focus"), _T("%s (0x%08x) gets focus"), 
2789                GetClassInfo()->GetClassName(), GetHandle()); 
2792 } // end of wxWindow::OnSetFocus 
2794 bool wxWindow::HandleActivate( 
2796 , WXHWND                            
WXUNUSED(hActivate
) 
2799     wxActivateEvent                 
vEvent( wxEVT_ACTIVATE
 
2803     vEvent
.SetEventObject(this); 
2804     return GetEventHandler()->ProcessEvent(vEvent
); 
2805 } // end of wxWindow::HandleActivate 
2807 bool wxWindow::HandleSetFocus( 
2808   WXHWND                            
WXUNUSED(hWnd
) 
2817         m_caret
->OnSetFocus(); 
2819 #endif // wxUSE_CARET 
2822     // Panel wants to track the window which was the last to have focus in it 
2824     wxPanel
*                        pPanel 
= wxDynamicCast( GetParent() 
2829         pPanel
->SetLastFocus(this); 
2832     wxFocusEvent                    
vEvent(wxEVT_SET_FOCUS
, m_windowId
); 
2834     vEvent
.SetEventObject(this); 
2835     return GetEventHandler()->ProcessEvent(vEvent
); 
2836 } // end of wxWindow::HandleSetFocus 
2838 bool wxWindow::HandleKillFocus( 
2839   WXHWND                            
WXUNUSED(hWnd
) 
2848         m_caret
->OnKillFocus(); 
2850 #endif // wxUSE_CARET 
2852     wxFocusEvent                    
vEvent( wxEVT_KILL_FOCUS
 
2856     vEvent
.SetEventObject(this); 
2857     return GetEventHandler()->ProcessEvent(vEvent
); 
2858 } // end of wxWindow::HandleKillFocus 
2860 // --------------------------------------------------------------------------- 
2862 // --------------------------------------------------------------------------- 
2864 bool wxWindow::HandleShow( 
2869     wxShowEvent                     
vEvent( GetId() 
2873     vEvent
.m_eventObject 
= this; 
2874     return GetEventHandler()->ProcessEvent(vEvent
); 
2875 } // end of wxWindow::HandleShow 
2877 bool wxWindow::HandleInitDialog( 
2878   WXHWND                            
WXUNUSED(hWndFocus
) 
2881     wxInitDialogEvent               
vEvent(GetId()); 
2883     vEvent
.m_eventObject 
= this; 
2884     return GetEventHandler()->ProcessEvent(vEvent
); 
2885 } // end of wxWindow::HandleInitDialog 
2887 bool wxWindow::HandleEndDrag(WXWPARAM wParam
) 
2889    // TODO: We'll handle drag and drop later 
2893 bool wxWindow::HandleSetCursor( 
2899     // Under OS/2 PM this allows the pointer to be changed 
2900     // as it passes over a control 
2902     ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)hPointer
); 
2904 } // end of wxWindow::HandleSetCursor 
2906 // --------------------------------------------------------------------------- 
2907 // owner drawn stuff 
2908 // --------------------------------------------------------------------------- 
2909 bool wxWindow::OS2OnDrawItem( 
2911 , WXDRAWITEMSTRUCT
*                 pItemStruct
 
2916 #if wxUSE_OWNER_DRAWN 
2918     // Is it a menu item? 
2924         POWNERITEM                  pMeasureStruct 
= (POWNERITEM
)pItemStruct
; 
2925         wxFrame
*                    pFrame 
= (wxFrame
*)this; 
2926         wxMenuItem
*                 pMenuItem 
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
); 
2927         HDC                         hDC 
= ::GpiQueryDevice(pMeasureStruct
->hps
); 
2928         wxRect                      
vRect( pMeasureStruct
->rclItem
.xLeft
 
2929                                           ,pMeasureStruct
->rclItem
.yBottom
 
2930                                           ,pMeasureStruct
->rclItem
.xRight 
- pMeasureStruct
->rclItem
.xLeft
 
2931                                           ,pMeasureStruct
->rclItem
.yTop 
- pMeasureStruct
->rclItem
.yBottom
 
2936         vDc
.SetHPS(pMeasureStruct
->hps
); 
2938         // Load the wxWindows Pallete and set to RGB mode 
2940         if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
 
2944                                       ,(LONG
)wxTheColourDatabase
->m_nSize
 
2945                                       ,(PLONG
)wxTheColourDatabase
->m_palTable
 
2948             vError 
= ::WinGetLastError(vHabmain
); 
2949             sError 
= wxPMErrorToStr(vError
); 
2950             wxLogError("Unable to set current color table. Error: %s\n", sError
); 
2953         // Set the color table to RGB mode 
2955         if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
 
2963             vError 
= ::WinGetLastError(vHabmain
); 
2964             sError 
= wxPMErrorToStr(vError
); 
2965             wxLogError("Unable to set current color table. Error: %s\n", sError
); 
2968         wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE 
); 
2974         if (pMeasureStruct
->fsAttribute 
== pMeasureStruct
->fsAttributeOld
) 
2977             // Entire Item needs to be redrawn (either it has reappeared from 
2978             // behind another window or is being displayed for the first time 
2980             eAction 
= wxOwnerDrawn::wxODDrawAll
; 
2982             if (pMeasureStruct
->fsAttribute 
& MIA_HILITED
) 
2985                 // If it is currently selected we let the system handle it 
2987                 eStatus 
|= wxOwnerDrawn::wxODSelected
; 
2989             if (pMeasureStruct
->fsAttribute 
& MIA_CHECKED
) 
2992                 // If it is currently checked we draw our own 
2994                 eStatus 
|= wxOwnerDrawn::wxODChecked
; 
2995                 pMeasureStruct
->fsAttributeOld 
= pMeasureStruct
->fsAttribute 
&= ~MIA_CHECKED
; 
2997             if (pMeasureStruct
->fsAttribute 
& MIA_DISABLED
) 
3000                 // If it is currently disabled we let the system handle it 
3002                 eStatus 
|= wxOwnerDrawn::wxODDisabled
; 
3005             // Don't really care about framed (indicationg focus) or NoDismiss 
3010             if (pMeasureStruct
->fsAttribute 
& MIA_HILITED
) 
3012                 eAction 
= wxOwnerDrawn::wxODDrawAll
; 
3013                 eStatus 
|= wxOwnerDrawn::wxODSelected
; 
3015                 // Keep the system from trying to highlight with its bogus colors 
3017                 pMeasureStruct
->fsAttributeOld 
= pMeasureStruct
->fsAttribute 
&= ~MIA_HILITED
; 
3019             else if (!(pMeasureStruct
->fsAttribute 
& MIA_HILITED
)) 
3021                 eAction 
= wxOwnerDrawn::wxODDrawAll
; 
3024                 // Keep the system from trying to highlight with its bogus colors 
3026                 pMeasureStruct
->fsAttribute 
= pMeasureStruct
->fsAttributeOld 
&= ~MIA_HILITED
; 
3031                 // For now we don't care about anything else 
3032                 // just ignore the entire message! 
3038         // Now redraw the item 
3040         return(pMenuItem
->OnDrawItem( vDc
 
3042                                      ,(wxOwnerDrawn::wxODAction
)eAction
 
3043                                      ,(wxOwnerDrawn::wxODStatus
)eStatus
 
3046         // leave the fsAttribute and fsOldAttribute unchanged.  If different, 
3047         // the system will do the highlight or fraeming or disabling for us, 
3048         // otherwise, we'd have to do it ourselves. 
3052     wxWindow
*                       pItem 
= FindItem(vId
); 
3054     if (pItem 
&& pItem
->IsKindOf(CLASSINFO(wxControl
))) 
3056         return ((wxControl 
*)pItem
)->OS2OnDraw(pItemStruct
); 
3060 } // end of wxWindow::OS2OnDrawItem 
3062 bool wxWindow::OS2OnMeasureItem( 
3064 , WXMEASUREITEMSTRUCT
*              pItemStruct
 
3068     // Is it a menu item? 
3070     if (lId 
== 65536) // I really don't like this...has to be a better indicator 
3072         if (IsKindOf(CLASSINFO(wxFrame
))) // we'll assume if Frame then a menu 
3076             POWNERITEM              pMeasureStruct 
= (POWNERITEM
)pItemStruct
; 
3077             wxFrame
*                pFrame 
= (wxFrame
*)this; 
3078             wxMenuItem
*             pMenuItem 
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
); 
3080             wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE 
); 
3083             if (pMenuItem
->OnMeasureItem( &nWidth
 
3087                 pMeasureStruct
->rclItem
.xRight  
= nWidth
; 
3088                 pMeasureStruct
->rclItem
.xLeft   
= 0L; 
3089                 pMeasureStruct
->rclItem
.yTop    
= nHeight
; 
3090                 pMeasureStruct
->rclItem
.yBottom 
= 0L; 
3096     wxWindow
*                      pItem 
= FindItem(lId
); 
3098     if (pItem 
&& pItem
->IsKindOf(CLASSINFO(wxControl
))) 
3100         return ((wxControl 
*)pItem
)->OS2OnMeasure(pItemStruct
); 
3105 // --------------------------------------------------------------------------- 
3106 // colours and palettes 
3107 // --------------------------------------------------------------------------- 
3109 bool wxWindow::HandleSysColorChange() 
3111     wxSysColourChangedEvent         vEvent
; 
3113     vEvent
.SetEventObject(this); 
3114     return GetEventHandler()->ProcessEvent(vEvent
); 
3115 } // end of wxWindow::HandleSysColorChange 
3117 bool wxWindow::HandleCtlColor( 
3122     // Not much provided with message. So not sure I can do anything with it 
3125 } // end of wxWindow::HandleCtlColor 
3127 bool wxWindow::HandleWindowParams( 
3128   PWNDPARAMS                        pWndParams
 
3132 // TODO: I'll do something here, just not sure what yet 
3136 // Define for each class of dialog and control 
3137 WXHBRUSH 
wxWindow::OnCtlColor(WXHDC hDC
, 
3147 bool wxWindow::HandlePaletteChanged() 
3149     // need to set this to something first 
3150     WXHWND                          hWndPalChange 
= NULLHANDLE
; 
3152     wxPaletteChangedEvent           
vEvent(GetId()); 
3154     vEvent
.SetEventObject(this); 
3155     vEvent
.SetChangedWindow(wxFindWinFromHandle(hWndPalChange
)); 
3157     return GetEventHandler()->ProcessEvent(vEvent
); 
3158 } // end of wxWindow::HandlePaletteChanged 
3160 bool wxWindow::HandlePresParamChanged( 
3165     // TODO:  Once again I'll do something here when I need it 
3167     //wxQueryNewPaletteEvent event(GetId()); 
3168     //event.SetEventObject(this); 
3169     // if the background is erased 
3170 //            bProcessed = HandleEraseBkgnd((WXHDC)(HDC)wParam); 
3172     return FALSE
; //GetEventHandler()->ProcessEvent(event) && event.GetPaletteRealized(); 
3176 // Responds to colour changes: passes event on to children. 
3178 void wxWindow::OnSysColourChanged( 
3179   wxSysColourChangedEvent
&          rEvent
 
3182     wxNode
*                         pNode 
= GetChildren().First(); 
3187         // Only propagate to non-top-level windows 
3189         wxWindow
*                   pWin 
= (wxWindow 
*)pNode
->Data(); 
3191         if (pWin
->GetParent()) 
3193             wxSysColourChangedEvent vEvent
; 
3195             rEvent
.m_eventObject 
= pWin
; 
3196             pWin
->GetEventHandler()->ProcessEvent(vEvent
); 
3198         pNode 
= pNode
->Next(); 
3200 } // end of wxWindow::OnSysColourChanged 
3202 // --------------------------------------------------------------------------- 
3204 // --------------------------------------------------------------------------- 
3206 bool wxWindow::HandlePaint() 
3208     HRGN                            hRgn 
= NULLHANDLE
; 
3209     wxPaintEvent                    vEvent
; 
3213     if (::WinQueryUpdateRegion(GetHwnd(), hRgn
) == RGN_NULL
) 
3215          wxLogLastError("CreateRectRgn"); 
3219     m_updateRegion 
= wxRegion(hRgn
); 
3220     vEvent
.SetEventObject(this); 
3221     if (!GetEventHandler()->ProcessEvent(vEvent
)) 
3225         hPS 
= ::WinBeginPaint( GetHwnd() 
3231             ::GpiCreateLogColorTable( hPS
 
3235                                      ,(LONG
)wxTheColourDatabase
->m_nSize
 
3236                                      ,(PLONG
)wxTheColourDatabase
->m_palTable
 
3238             ::GpiCreateLogColorTable( hPS
 
3246             ::WinFillRect(hPS
, &vRect
,  GetBackgroundColour().GetPixel()); 
3250     return (GetEventHandler()->ProcessEvent(vEvent
)); 
3251 } // end of wxWindow::HandlePaint 
3253 bool wxWindow::HandleEraseBkgnd( 
3259     ::WinQueryWindowPos(GetHwnd(), &vSwp
); 
3260     if (vSwp
.fl 
& SWP_MINIMIZE
) 
3265     vDC
.m_hPS 
= (HPS
)hDC
; // this is really a PS 
3266     vDC
.SetWindow(this); 
3269     wxEraseEvent                    
vEvent(m_windowId
, &vDC
); 
3271     vEvent
.SetEventObject(this); 
3273     bool                            rc 
= GetEventHandler()->ProcessEvent(vEvent
); 
3276     vDC
.m_hPS 
= NULLHANDLE
; 
3278 } // end of wxWindow::HandleEraseBkgnd 
3280 void wxWindow::OnEraseBackground( 
3281   wxEraseEvent
&                     rEvent
 
3285     HPS                             hPS 
= rEvent
.m_dc
->m_hPS
; 
3287     ::WinQueryWindowRect(GetHwnd(), &vRect
); 
3288     ::WinFillRect(hPS
, &vRect
,  m_backgroundColour
.GetPixel()); 
3289 }  // end of wxWindow::OnEraseBackground 
3291 // --------------------------------------------------------------------------- 
3292 // moving and resizing 
3293 // --------------------------------------------------------------------------- 
3295 bool wxWindow::HandleMinimize() 
3297     wxIconizeEvent                  
vEvent(m_windowId
); 
3299     vEvent
.SetEventObject(this); 
3300     return GetEventHandler()->ProcessEvent(vEvent
); 
3301 } // end of wxWindow::HandleMinimize 
3303 bool wxWindow::HandleMaximize() 
3305     wxMaximizeEvent                 
vEvent(m_windowId
); 
3307     vEvent
.SetEventObject(this); 
3308     return GetEventHandler()->ProcessEvent(vEvent
); 
3309 } // end of wxWindow::HandleMaximize 
3311 bool wxWindow::HandleMove( 
3316     wxMoveEvent                     
vEvent( wxPoint( nX
 
3322     vEvent
.SetEventObject(this); 
3323     return GetEventHandler()->ProcessEvent(vEvent
); 
3324 }  // end of wxWindow::HandleMove 
3326 bool wxWindow::HandleSize( 
3329 , WXUINT                            
WXUNUSED(nFlag
) 
3332     wxSizeEvent                     
vEvent( wxSize( nWidth
 
3338     vEvent
.SetEventObject(this); 
3339     return GetEventHandler()->ProcessEvent(vEvent
); 
3340 } // end of wxWindow::HandleSize 
3342 bool wxWindow::HandleGetMinMaxInfo( 
3352             ::WinGetMaxPosition(GetHwnd(), pSwp
); 
3353             m_maxWidth 
= pSwp
->cx
; 
3354             m_maxHeight 
= pSwp
->cy
; 
3358             ::WinGetMinPosition(GetHwnd(), pSwp
, &vPoint
); 
3359             m_minWidth 
= pSwp
->cx
; 
3360             m_minHeight 
= pSwp
->cy
; 
3367 } // end of wxWindow::HandleGetMinMaxInfo 
3369 // --------------------------------------------------------------------------- 
3371 // --------------------------------------------------------------------------- 
3372 bool wxWindow::HandleCommand( 
3378     if (wxCurrentPopupMenu
) 
3380         wxMenu
*                     pPopupMenu 
= wxCurrentPopupMenu
; 
3382         wxCurrentPopupMenu 
= NULL
; 
3383         return pPopupMenu
->OS2Command(wCmd
, wId
); 
3386     wxWindow
*                       pWin 
= FindItem(wId
); 
3390         pWin 
= wxFindWinFromHandle(hControl
); 
3394         return pWin
->OS2Command( wCmd
 
3398 } // end of wxWindow::HandleCommand 
3400 bool wxWindow::HandleSysCommand( 
3406     // 4 bits are reserved 
3408     switch (SHORT1FROMMP(wParam
)) 
3411             return HandleMaximize(); 
3414             return HandleMinimize(); 
3417 } // end of wxWindow::HandleSysCommand 
3419 // --------------------------------------------------------------------------- 
3421 // --------------------------------------------------------------------------- 
3423 void wxWindow::InitMouseEvent( 
3424   wxMouseEvent
&                     rEvent
 
3432     rEvent
.m_shiftDown   
= ((uFlags 
& VK_SHIFT
) != 0); 
3433     rEvent
.m_controlDown 
= ((uFlags 
& VK_CTRL
) != 0); 
3434     rEvent
.m_leftDown    
= ((uFlags 
& VK_BUTTON1
) != 0); 
3435     rEvent
.m_middleDown  
= ((uFlags 
& VK_BUTTON3
) != 0); 
3436     rEvent
.m_rightDown   
= ((uFlags 
& VK_BUTTON2
) != 0); 
3437     rEvent
.SetTimestamp(s_currentMsg
.time
); 
3438     rEvent
.m_eventObject 
= this; 
3440 #if wxUSE_MOUSEEVENT_HACK 
3443     m_lastMouseEvent 
= rEvent
.GetEventType(); 
3444 #endif // wxUSE_MOUSEEVENT_HACK 
3445 } // end of wxWindow::InitMouseEvent 
3447 bool wxWindow::HandleMouseEvent( 
3455     // The mouse events take consecutive IDs from WM_MOUSEFIRST to 
3456     // WM_MOUSELAST, so it's enough to substract WM_MOUSEMOVE == WM_MOUSEFIRST 
3457     // from the message id and take the value in the table to get wxWin event 
3460     static const wxEventType eventsMouse
[] = 
3474     wxMouseEvent                    
vEvent(eventsMouse
[uMsg 
- WM_MOUSEMOVE
]); 
3476     InitMouseEvent( vEvent
 
3482     return GetEventHandler()->ProcessEvent(vEvent
); 
3483 } // end of wxWindow::HandleMouseEvent 
3485 bool wxWindow::HandleMouseMove( 
3491     if (!m_bMouseInWindow
) 
3494         // Generate an ENTER event 
3496         m_bMouseInWindow 
= TRUE
; 
3498         wxMouseEvent                
vEvent(wxEVT_ENTER_WINDOW
); 
3500         InitMouseEvent( vEvent
 
3506         (void)GetEventHandler()->ProcessEvent(vEvent
); 
3508     return HandleMouseEvent( WM_MOUSEMOVE
 
3513 } // end of wxWindow::HandleMouseMove 
3515 // --------------------------------------------------------------------------- 
3516 // keyboard handling 
3517 // --------------------------------------------------------------------------- 
3520 // Create the key event of the given type for the given key - used by 
3521 // HandleChar and HandleKeyDown/Up 
3523 wxKeyEvent 
wxWindow::CreateKeyEvent( 
3529     wxKeyEvent                      
vEvent(eType
); 
3531     vEvent
.SetId(GetId()); 
3532     vEvent
.m_shiftDown   
= IsShiftDown(); 
3533     vEvent
.m_controlDown 
= IsCtrlDown(); 
3534     vEvent
.m_altDown     
= (HIWORD(lParam
) & KC_ALT
) == KC_ALT
; 
3536     vEvent
.m_eventObject 
= (wxWindow 
*)this; // const_cast 
3537     vEvent
.m_keyCode     
= nId
; 
3538     vEvent
.SetTimestamp(s_currentMsg
.time
); 
3541     // Translate the position to client coords 
3546     ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
); 
3547     ::WinQueryWindowRect( GetHwnd() 
3551     vPoint
.x 
-= vRect
.xLeft
; 
3552     vPoint
.y 
-= vRect
.yBottom
; 
3554     vEvent
.m_x 
= vPoint
.x
; 
3555     vEvent
.m_y 
= vPoint
.y
; 
3558 } // end of wxWindow::CreateKeyEvent 
3561 // isASCII is TRUE only when we're called from WM_CHAR handler and not from 
3564 bool wxWindow::HandleChar( 
3570     bool                            bCtrlDown 
= FALSE
; 
3576         // If 1 -> 26, translate to CTRL plus a letter. 
3579         if ((vId 
> 0) && (vId 
< 27)) 
3601     else if ( (vId 
= wxCharCodeOS2ToWX(wParam
)) == 0) 
3604         // It's ASCII and will be processed here only when called from 
3605         // WM_CHAR (i.e. when isASCII = TRUE), don't process it now 
3612         wxKeyEvent                  
vEvent(CreateKeyEvent( wxEVT_CHAR
 
3619             vEvent
.m_controlDown 
= TRUE
; 
3622         if (GetEventHandler()->ProcessEvent(vEvent
)) 
3628 bool wxWindow::HandleKeyDown( 
3633     int                             nId 
= wxCharCodeOS2ToWX(wParam
); 
3638         // Normal ASCII char 
3645         wxKeyEvent                  
vEvent(CreateKeyEvent( wxEVT_KEY_DOWN
 
3650         if (GetEventHandler()->ProcessEvent(vEvent
)) 
3656 } // end of wxWindow::HandleKeyDown 
3658 bool wxWindow::HandleKeyUp( 
3663     int                             nId 
= wxCharCodeOS2ToWX(wParam
); 
3668         // Normal ASCII char 
3675         wxKeyEvent                  
vEvent(CreateKeyEvent( wxEVT_KEY_UP
 
3680         if (GetEventHandler()->ProcessEvent(vEvent
)) 
3684 } // end of wxWindow::HandleKeyUp 
3686 // --------------------------------------------------------------------------- 
3688 // --------------------------------------------------------------------------- 
3690 // --------------------------------------------------------------------------- 
3692 // --------------------------------------------------------------------------- 
3694 bool wxWindow::OS2OnScroll( 
3703         wxWindow
*                   pChild 
= wxFindWinFromHandle(hControl
); 
3706             return pChild
->OS2OnScroll( nOrientation
 
3713     wxScrollWinEvent                vEvent
; 
3715     vEvent
.SetPosition(wPos
); 
3716     vEvent
.SetOrientation(nOrientation
); 
3717     vEvent
.m_eventObject 
= this; 
3722             vEvent
.m_eventType 
= wxEVT_SCROLLWIN_LINEUP
; 
3726             vEvent
.m_eventType 
= wxEVT_SCROLLWIN_LINEDOWN
; 
3730             vEvent
.m_eventType 
= wxEVT_SCROLLWIN_PAGEUP
; 
3734             vEvent
.m_eventType 
= wxEVT_SCROLLWIN_PAGEDOWN
; 
3737         case SB_SLIDERPOSITION
: 
3738             vEvent
.m_eventType 
= wxEVT_SCROLLWIN_THUMBRELEASE
; 
3741         case SB_SLIDERTRACK
: 
3742             vEvent
.m_eventType 
= wxEVT_SCROLLWIN_THUMBTRACK
; 
3748     return GetEventHandler()->ProcessEvent(vEvent
); 
3749 } // end of wxWindow::OS2OnScroll 
3751 // =========================================================================== 
3753 // =========================================================================== 
3762   // TODO: we'll do this later 
3763 } // end of wxGetCharSize 
3766 // Returns 0 if was a normal ASCII value, not a special key. This indicates that 
3767 // the key should be ignored by WM_KEYDOWN and processed by WM_CHAR instead. 
3769 int wxCharCodeOS2ToWX( 
3777         case VK_BACKTAB
:    nId 
= WXK_BACK
; break; 
3778         case VK_TAB
:        nId 
= WXK_TAB
; break; 
3779         case VK_CLEAR
:      nId 
= WXK_CLEAR
; break; 
3780         case VK_ENTER
:      nId 
= WXK_RETURN
; break; 
3781         case VK_SHIFT
:      nId 
= WXK_SHIFT
; break; 
3782         case VK_CTRL
:       nId 
= WXK_CONTROL
; break; 
3783         case VK_PAUSE
:      nId 
= WXK_PAUSE
; break; 
3784         case VK_SPACE
:      nId 
= WXK_SPACE
; break; 
3785         case VK_ESC
:        nId 
= WXK_ESCAPE
; break; 
3786         case VK_END
:        nId 
= WXK_END
; break; 
3787         case VK_HOME 
:      nId 
= WXK_HOME
; break; 
3788         case VK_LEFT 
:      nId 
= WXK_LEFT
; break; 
3789         case VK_UP
:         nId 
= WXK_UP
; break; 
3790         case VK_RIGHT
:      nId 
= WXK_RIGHT
; break; 
3791         case VK_DOWN 
:      nId 
= WXK_DOWN
; break; 
3792         case VK_PRINTSCRN
:  nId 
= WXK_PRINT
; break; 
3793         case VK_INSERT
:     nId 
= WXK_INSERT
; break; 
3794         case VK_DELETE
:     nId 
= WXK_DELETE
; break; 
3795         case VK_F1
:         nId 
= WXK_F1
; break; 
3796         case VK_F2
:         nId 
= WXK_F2
; break; 
3797         case VK_F3
:         nId 
= WXK_F3
; break; 
3798         case VK_F4
:         nId 
= WXK_F4
; break; 
3799         case VK_F5
:         nId 
= WXK_F5
; break; 
3800         case VK_F6
:         nId 
= WXK_F6
; break; 
3801         case VK_F7
:         nId 
= WXK_F7
; break; 
3802         case VK_F8
:         nId 
= WXK_F8
; break; 
3803         case VK_F9
:         nId 
= WXK_F9
; break; 
3804         case VK_F10
:        nId 
= WXK_F10
; break; 
3805         case VK_F11
:        nId 
= WXK_F11
; break; 
3806         case VK_F12
:        nId 
= WXK_F12
; break; 
3807         case VK_F13
:        nId 
= WXK_F13
; break; 
3808         case VK_F14
:        nId 
= WXK_F14
; break; 
3809         case VK_F15
:        nId 
= WXK_F15
; break; 
3810         case VK_F16
:        nId 
= WXK_F16
; break; 
3811         case VK_F17
:        nId 
= WXK_F17
; break; 
3812         case VK_F18
:        nId 
= WXK_F18
; break; 
3813         case VK_F19
:        nId 
= WXK_F19
; break; 
3814         case VK_F20
:        nId 
= WXK_F20
; break; 
3815         case VK_F21
:        nId 
= WXK_F21
; break; 
3816         case VK_F22
:        nId 
= WXK_F22
; break; 
3817         case VK_F23
:        nId 
= WXK_F23
; break; 
3818         case VK_F24
:        nId 
= WXK_F24
; break; 
3819         case VK_NUMLOCK
:    nId 
= WXK_NUMLOCK
; break; 
3820         case VK_SCRLLOCK
:   nId 
= WXK_SCROLL
; break; 
3827 } // end of wxCharCodeOS2ToWX 
3829 int wxCharCodeWXToOS2( 
3839         case WXK_CLEAR
:     nKeySym 
= VK_CLEAR
; break; 
3840         case WXK_SHIFT
:     nKeySym 
= VK_SHIFT
; break; 
3841         case WXK_CONTROL
:   nKeySym 
= VK_CTRL
; break; 
3842         case WXK_PAUSE
:     nKeySym 
= VK_PAUSE
; break; 
3843         case WXK_END
:       nKeySym 
= VK_END
; break; 
3844         case WXK_HOME 
:     nKeySym 
= VK_HOME
; break; 
3845         case WXK_LEFT 
:     nKeySym 
= VK_LEFT
; break; 
3846         case WXK_UP
:        nKeySym 
= VK_UP
; break; 
3847         case WXK_RIGHT
:     nKeySym 
= VK_RIGHT
; break; 
3848         case WXK_DOWN 
:     nKeySym 
= VK_DOWN
; break; 
3849         case WXK_PRINT
:     nKeySym 
= VK_PRINTSCRN
; break; 
3850         case WXK_INSERT
:    nKeySym 
= VK_INSERT
; break; 
3851         case WXK_DELETE
:    nKeySym 
= VK_DELETE
; break; 
3852         case WXK_F1
:        nKeySym 
= VK_F1
; break; 
3853         case WXK_F2
:        nKeySym 
= VK_F2
; break; 
3854         case WXK_F3
:        nKeySym 
= VK_F3
; break; 
3855         case WXK_F4
:        nKeySym 
= VK_F4
; break; 
3856         case WXK_F5
:        nKeySym 
= VK_F5
; break; 
3857         case WXK_F6
:        nKeySym 
= VK_F6
; break; 
3858         case WXK_F7
:        nKeySym 
= VK_F7
; break; 
3859         case WXK_F8
:        nKeySym 
= VK_F8
; break; 
3860         case WXK_F9
:        nKeySym 
= VK_F9
; break; 
3861         case WXK_F10
:       nKeySym 
= VK_F10
; break; 
3862         case WXK_F11
:       nKeySym 
= VK_F11
; break; 
3863         case WXK_F12
:       nKeySym 
= VK_F12
; break; 
3864         case WXK_F13
:       nKeySym 
= VK_F13
; break; 
3865         case WXK_F14
:       nKeySym 
= VK_F14
; break; 
3866         case WXK_F15
:       nKeySym 
= VK_F15
; break; 
3867         case WXK_F16
:       nKeySym 
= VK_F16
; break; 
3868         case WXK_F17
:       nKeySym 
= VK_F17
; break; 
3869         case WXK_F18
:       nKeySym 
= VK_F18
; break; 
3870         case WXK_F19
:       nKeySym 
= VK_F19
; break; 
3871         case WXK_F20
:       nKeySym 
= VK_F20
; break; 
3872         case WXK_F21
:       nKeySym 
= VK_F21
; break; 
3873         case WXK_F22
:       nKeySym 
= VK_F22
; break; 
3874         case WXK_F23
:       nKeySym 
= VK_F23
; break; 
3875         case WXK_F24
:       nKeySym 
= VK_F24
; break; 
3876         case WXK_NUMLOCK
:   nKeySym 
= VK_NUMLOCK
; break; 
3877         case WXK_SCROLL
:    nKeySym 
= VK_SCRLLOCK
; break; 
3880             *bIsVirtual 
= FALSE
; 
3886 } // end of wxCharCodeWXToOS2 
3888 wxWindow
* wxGetActiveWindow() 
3890     HWND                            hWnd 
= ::WinQueryActiveWindow(HWND_DESKTOP
); 
3894         return wxFindWinFromHandle((WXHWND
)hWnd
); 
3897 } // end of wxGetActiveWindow 
3900 const char* wxGetMessageName( 
3905         case 0x0000: return "WM_NULL"; 
3906         case 0x0001: return "WM_CREATE"; 
3907         case 0x0002: return "WM_DESTROY"; 
3908         case 0x0004: return "WM_ENABLE"; 
3909         case 0x0005: return "WM_SHOW"; 
3910         case 0x0006: return "WM_MOVE"; 
3911         case 0x0007: return "WM_SIZE"; 
3912         case 0x0008: return "WM_ADJUSTWINDOWPOS"; 
3913         case 0x0009: return "WM_CALCVALIDRECTS"; 
3914         case 0x000A: return "WM_SETWINDOWPARAMS"; 
3915         case 0x000B: return "WM_QUERYWINDOWPARAMS"; 
3916         case 0x000C: return "WM_HITTEST"; 
3917         case 0x000D: return "WM_ACTIVATE"; 
3918         case 0x000F: return "WM_SETFOCUS"; 
3919         case 0x0010: return "WM_SETSELECTION"; 
3920         case 0x0011: return "WM_PPAINT"; 
3921         case 0x0012: return "WM_PSETFOCUS"; 
3922         case 0x0013: return "WM_PSYSCOLORCHANGE"; 
3923         case 0x0014: return "WM_PSIZE"; 
3924         case 0x0015: return "WM_PACTIVATE"; 
3925         case 0x0016: return "WM_PCONTROL"; 
3926         case 0x0020: return "WM_COMMAND"; 
3927         case 0x0021: return "WM_SYSCOMMAND"; 
3928         case 0x0022: return "WM_HELP"; 
3929         case 0x0023: return "WM_PAINT"; 
3930         case 0x0024: return "WM_TIMER"; 
3931         case 0x0025: return "WM_SEM1"; 
3932         case 0x0026: return "WM_SEM2"; 
3933         case 0x0027: return "WM_SEM3"; 
3934         case 0x0028: return "WM_SEM4"; 
3935         case 0x0029: return "WM_CLOSE"; 
3936         case 0x002A: return "WM_QUIT"; 
3937         case 0x002B: return "WM_SYSCOLORCHANGE"; 
3938         case 0x002D: return "WM_SYSVALUECHANGE"; 
3939         case 0x002E: return "WM_APPTERMINATENOTIFY"; 
3940         case 0x002F: return "WM_PRESPARAMCHANGED"; 
3941         // Control notification messages 
3942         case 0x0030: return "WM_CONTROL"; 
3943         case 0x0031: return "WM_VSCROLL"; 
3944         case 0x0032: return "WM_HSCROLL"; 
3945         case 0x0033: return "WM_INITMENU"; 
3946         case 0x0034: return "WM_MENUSELECT"; 
3947         case 0x0035: return "WM_MENUSEND"; 
3948         case 0x0036: return "WM_DRAWITEM"; 
3949         case 0x0037: return "WM_MEASUREITEM"; 
3950         case 0x0038: return "WM_CONTROLPOINTER"; 
3951         case 0x003A: return "WM_QUERYDLGCODE"; 
3952         case 0x003B: return "WM_INITDLG"; 
3953         case 0x003C: return "WM_SUBSTITUTESTRING"; 
3954         case 0x003D: return "WM_MATCHMNEMONIC"; 
3955         case 0x003E: return "WM_SAVEAPPLICATION"; 
3956         case 0x0129: return "WM_CTLCOLORCHANGE"; 
3957         case 0x0130: return "WM_QUERYCTLTYPE"; 
3959         case 0x0040: return "WM_FLASHWINDOW"; 
3960         case 0x0041: return "WM_FORMATFRAME"; 
3961         case 0x0042: return "WM_UPDATEFRAME"; 
3962         case 0x0043: return "WM_FOCUSCHANGE"; 
3963         case 0x0044: return "WM_SETBORDERSIZE"; 
3964         case 0x0045: return "WM_TRACKFRAME"; 
3965         case 0x0046: return "WM_MINMAXFRAME"; 
3966         case 0x0047: return "WM_SETICON"; 
3967         case 0x0048: return "WM_QUERYICON"; 
3968         case 0x0049: return "WM_SETACCELTABLE"; 
3969         case 0x004A: return "WM_QUERYACCELTABLE"; 
3970         case 0x004B: return "WM_TRANSLATEACCEL"; 
3971         case 0x004C: return "WM_QUERYTRACKINFO"; 
3972         case 0x004D: return "WM_QUERYBORDERSIZE"; 
3973         case 0x004E: return "WM_NEXTMENU"; 
3974         case 0x004F: return "WM_ERASEBACKGROUND"; 
3975         case 0x0050: return "WM_QUERYFRAMEINFO"; 
3976         case 0x0051: return "WM_QUERYFOCUSCHAIN"; 
3977         case 0x0052: return "WM_OWNERPOSCHANGE"; 
3978         case 0x0053: return "WM_CACLFRAMERECT"; 
3979         case 0x0055: return "WM_WINDOWPOSCHANGED"; 
3980         case 0x0056: return "WM_ADJUSTFRAMEPOS"; 
3981         case 0x0059: return "WM_QUERYFRAMECTLCOUNT"; 
3982         case 0x005B: return "WM_QUERYHELPINFO"; 
3983         case 0x005C: return "WM_SETHELPINFO"; 
3984         case 0x005D: return "WM_ERROR"; 
3985         case 0x005E: return "WM_REALIZEPALETTE"; 
3986         // Clipboard messages 
3987         case 0x0060: return "WM_RENDERFMT"; 
3988         case 0x0061: return "WM_RENDERALLFMTS"; 
3989         case 0x0062: return "WM_DESTROYCLIPBOARD"; 
3990         case 0x0063: return "WM_PAINTCLIPBOARD"; 
3991         case 0x0064: return "WM_SIZECLIPBOARD"; 
3992         case 0x0065: return "WM_HSCROLLCLIPBOARD"; 
3993         case 0x0066: return "WM_VSCROLLCLIPBOARD"; 
3994         case 0x0067: return "WM_DRAWCLIPBOARD"; 
3996         case 0x0070: return "WM_MOUSEMOVE"; 
3997         case 0x0071: return "WM_BUTTON1DOWN"; 
3998         case 0x0072: return "WM_BUTTON1UP"; 
3999         case 0x0073: return "WM_BUTTON1DBLCLK"; 
4000         case 0x0074: return "WM_BUTTON2DOWN"; 
4001         case 0x0075: return "WM_BUTTON2UP"; 
4002         case 0x0076: return "WM_BUTTON2DBLCLK"; 
4003         case 0x0077: return "WM_BUTTON3DOWN"; 
4004         case 0x0078: return "WM_BUTTON3UP"; 
4005         case 0x0079: return "WM_BUTTON3DBLCLK"; 
4006         case 0x007D: return "WM_MOUSEMAP"; 
4007         case 0x007E: return "WM_VRNDISABLED"; 
4008         case 0x007F: return "WM_VRNENABLED"; 
4009         case 0x0410: return "WM_CHORD"; 
4010         case 0x0411: return "WM_BUTTON1MOTIONSTART"; 
4011         case 0x0412: return "WM_BUTTON1MOTIONEND"; 
4012         case 0x0413: return "WM_BUTTON1CLICK"; 
4013         case 0x0414: return "WM_BUTTON2MOTIONSTART"; 
4014         case 0x0415: return "WM_BUTTON2MOTIONEND"; 
4015         case 0x0416: return "WM_BUTTON2CLICK"; 
4016         case 0x0417: return "WM_BUTTON3MOTIONSTART"; 
4017         case 0x0418: return "WM_BUTTON3MOTIONEND"; 
4018         case 0x0419: return "WM_BUTTON3CLICK"; 
4019         case 0x0420: return "WM_BEGINDRAG"; 
4020         case 0x0421: return "WM_ENDDRAG"; 
4021         case 0x0422: return "WM_SINGLESELECT"; 
4022         case 0x0423: return "WM_OPEN"; 
4023         case 0x0424: return "WM_CONTEXTMENU"; 
4024         case 0x0425: return "WM_CONTEXTHELP"; 
4025         case 0x0426: return "WM_TEXTEDIT"; 
4026         case 0x0427: return "WM_BEGINSELECT"; 
4027         case 0x0228: return "WM_ENDSELECT"; 
4028         case 0x0429: return "WM_PICKUP"; 
4029         case 0x04C0: return "WM_PENFIRST"; 
4030         case 0x04FF: return "WM_PENLAST"; 
4031         case 0x0500: return "WM_MMPMFIRST"; 
4032         case 0x05FF: return "WM_MMPMLAST"; 
4033         case 0x0600: return "WM_STDDLGFIRST"; 
4034         case 0x06FF: return "WM_STDDLGLAST"; 
4035         case 0x0BD0: return "WM_BIDI_FIRST"; 
4036         case 0x0BFF: return "WM_BIDI_LAST"; 
4038         case 0x007A: return "WM_CHAR"; 
4039         case 0x007B: return "WM_VIOCHAR"; 
4041         case 0x00A0: return "WM_DDE_INITIATE"; 
4042         case 0x00A1: return "WM_DDE_REQUEST"; 
4043         case 0x00A2: return "WM_DDE_ACK"; 
4044         case 0x00A3: return "WM_DDE_DATA"; 
4045         case 0x00A4: return "WM_DDE_ADVISE"; 
4046         case 0x00A5: return "WM_DDE_UNADVISE"; 
4047         case 0x00A6: return "WM_DDE_POKE"; 
4048         case 0x00A7: return "WM_DDE_EXECUTE"; 
4049         case 0x00A8: return "WM_DDE_TERMINATE"; 
4050         case 0x00A9: return "WM_DDE_INITIATEACK"; 
4051         case 0x00AF: return "WM_DDE_LAST"; 
4053         case 0x0120: return "BM_CLICK"; 
4054         case 0x0121: return "BM_QUERYCHECKINDEX"; 
4055         case 0x0122: return "BM_QUERYHILITE"; 
4056         case 0x0123: return "BM_SETHILITE"; 
4057         case 0x0124: return "BM_QUERYCHECK"; 
4058         case 0x0125: return "BM_SETCHECK"; 
4059         case 0x0126: return "BM_SETDEFAULT"; 
4060         case 0x0128: return "BM_AUTOSIZE"; 
4062         case 0x029A: return "CBID_LIST"; 
4063         case 0x029B: return "CBID_EDIT"; 
4064         case 0x0170: return "CBM_SHOWLIST"; 
4065         case 0x0171: return "CBM_HILITE"; 
4066         case 0x0172: return "CBM_ISLISTSHOWING"; 
4068         case 0x0140: return "EM_QUERYCHANGED"; 
4069         case 0x0141: return "EM_QUERYSEL"; 
4070         case 0x0142: return "EM_SETSEL"; 
4071         case 0x0143: return "EM_SETTEXTLIMIT"; 
4072         case 0x0144: return "EM_CUT"; 
4073         case 0x0145: return "EM_COPY"; 
4074         case 0x0146: return "EM_CLEAR"; 
4075         case 0x0147: return "EM_PASTE"; 
4076         case 0x0148: return "EM_QUERYFIRSTCHAR"; 
4077         case 0x0149: return "EM_SETFIRSTCHAR"; 
4078         case 0x014A: return "EM_QUERYREADONLY"; 
4079         case 0x014B: return "EM_SETREADONLY"; 
4080         case 0x014C: return "EM_SETINSERTMODE"; 
4082         case 0x0160: return "LM_QUERYITEMCOUNT"; 
4083         case 0x0161: return "LM_INSERTITEM"; 
4084         case 0x0162: return "LM_SETOPENINDEX"; 
4085         case 0x0163: return "LM_DELETEITEM"; 
4086         case 0x0164: return "LM_SELECTITEM"; 
4087         case 0x0165: return "LM_QUERYSELECTION"; 
4088         case 0x0166: return "LM_SETITEMTEXT"; 
4089         case 0x0167: return "LM_QUERYITEMTEXTLENGTH"; 
4090         case 0x0168: return "LM_QUERYITEMTEXT"; 
4091         case 0x0169: return "LM_SETITEMHANDLE"; 
4092         case 0x016A: return "LM_QUERYITEMHANDLE"; 
4093         case 0x016B: return "LM_SEARCHSTRING"; 
4094         case 0x016C: return "LM_SETITEMHEIGHT"; 
4095         case 0x016D: return "LM_QUERYTOPINDEX"; 
4096         case 0x016E: return "LM_DELETEALL"; 
4097         case 0x016F: return "LM_INSERTMULITEMS"; 
4098         case 0x0660: return "LM_SETITEMWIDTH"; 
4100         case 0x0180: return "MM_INSERTITEM"; 
4101         case 0x0181: return "MM_DELETEITEM"; 
4102         case 0x0182: return "MM_QUERYITEM"; 
4103         case 0x0183: return "MM_SETITEM"; 
4104         case 0x0184: return "MM_QUERYITEMCOUNT"; 
4105         case 0x0185: return "MM_STARTMENUMODE"; 
4106         case 0x0186: return "MM_ENDMENUMODE"; 
4107         case 0x0188: return "MM_REMOVEITEM"; 
4108         case 0x0189: return "MM_SELECTITEM"; 
4109         case 0x018A: return "MM_QUERYSELITEMID"; 
4110         case 0x018B: return "MM_QUERYITEMTEXT"; 
4111         case 0x018C: return "MM_QUERYITEMTEXTLENGTH"; 
4112         case 0x018D: return "MM_SETITEMHANDLE"; 
4113         case 0x018E: return "MM_SETITEMTEXT"; 
4114         case 0x018F: return "MM_ITEMPOSITIONFROMID"; 
4115         case 0x0190: return "MM_ITEMIDFROMPOSITION"; 
4116         case 0x0191: return "MM_QUERYITEMATTR"; 
4117         case 0x0192: return "MM_SETITEMATTR"; 
4118         case 0x0193: return "MM_ISITEMVALID"; 
4119         case 0x0194: return "MM_QUERYITEMRECT"; 
4120         case 0x0431: return "MM_QUERYDEFAULTITEMID"; 
4121         case 0x0432: return "MM_SETDEFAULTITEMID"; 
4123         case 0x01A0: return "SBM_SETSCROLLBAR"; 
4124         case 0x01A1: return "SBM_SETPOS"; 
4125         case 0x01A2: return "SBM_QUERYPOS"; 
4126         case 0x01A3: return "SBM_QUERYRANGE"; 
4127         case 0x01A6: return "SBM_SETTHUMBSIZE"; 
4130         case 0x0F00: return "WM_HELPBASE"; 
4131         case 0x0FFF: return "WM_HELPTOP"; 
4132         // Beginning of user defined messages 
4133         case 0x1000: return "WM_USER"; 
4135         // wxWindows user defined types 
4138         // case 0x1000 + 0: return "LVM_GETBKCOLOR"; 
4139         case 0x1000 + 1: return "LVM_SETBKCOLOR"; 
4140         case 0x1000 + 2: return "LVM_GETIMAGELIST"; 
4141         case 0x1000 + 3: return "LVM_SETIMAGELIST"; 
4142         case 0x1000 + 4: return "LVM_GETITEMCOUNT"; 
4143         case 0x1000 + 5: return "LVM_GETITEMA"; 
4144         case 0x1000 + 75: return "LVM_GETITEMW"; 
4145         case 0x1000 + 6: return "LVM_SETITEMA"; 
4146         case 0x1000 + 76: return "LVM_SETITEMW"; 
4147         case 0x1000 + 7: return "LVM_INSERTITEMA"; 
4148         case 0x1000 + 77: return "LVM_INSERTITEMW"; 
4149         case 0x1000 + 8: return "LVM_DELETEITEM"; 
4150         case 0x1000 + 9: return "LVM_DELETEALLITEMS"; 
4151         case 0x1000 + 10: return "LVM_GETCALLBACKMASK"; 
4152         case 0x1000 + 11: return "LVM_SETCALLBACKMASK"; 
4153         case 0x1000 + 12: return "LVM_GETNEXTITEM"; 
4154         case 0x1000 + 13: return "LVM_FINDITEMA"; 
4155         case 0x1000 + 83: return "LVM_FINDITEMW"; 
4156         case 0x1000 + 14: return "LVM_GETITEMRECT"; 
4157         case 0x1000 + 15: return "LVM_SETITEMPOSITION"; 
4158         case 0x1000 + 16: return "LVM_GETITEMPOSITION"; 
4159         case 0x1000 + 17: return "LVM_GETSTRINGWIDTHA"; 
4160         case 0x1000 + 87: return "LVM_GETSTRINGWIDTHW"; 
4161         case 0x1000 + 18: return "LVM_HITTEST"; 
4162         case 0x1000 + 19: return "LVM_ENSUREVISIBLE"; 
4163         case 0x1000 + 20: return "LVM_SCROLL"; 
4164         case 0x1000 + 21: return "LVM_REDRAWITEMS"; 
4165         case 0x1000 + 22: return "LVM_ARRANGE"; 
4166         case 0x1000 + 23: return "LVM_EDITLABELA"; 
4167         case 0x1000 + 118: return "LVM_EDITLABELW"; 
4168         case 0x1000 + 24: return "LVM_GETEDITCONTROL"; 
4169         case 0x1000 + 25: return "LVM_GETCOLUMNA"; 
4170         case 0x1000 + 95: return "LVM_GETCOLUMNW"; 
4171         case 0x1000 + 26: return "LVM_SETCOLUMNA"; 
4172         case 0x1000 + 96: return "LVM_SETCOLUMNW"; 
4173         case 0x1000 + 27: return "LVM_INSERTCOLUMNA"; 
4174         case 0x1000 + 97: return "LVM_INSERTCOLUMNW"; 
4175         case 0x1000 + 28: return "LVM_DELETECOLUMN"; 
4176         case 0x1000 + 29: return "LVM_GETCOLUMNWIDTH"; 
4177         case 0x1000 + 30: return "LVM_SETCOLUMNWIDTH"; 
4178         case 0x1000 + 31: return "LVM_GETHEADER"; 
4179         case 0x1000 + 33: return "LVM_CREATEDRAGIMAGE"; 
4180         case 0x1000 + 34: return "LVM_GETVIEWRECT"; 
4181         case 0x1000 + 35: return "LVM_GETTEXTCOLOR"; 
4182         case 0x1000 + 36: return "LVM_SETTEXTCOLOR"; 
4183         case 0x1000 + 37: return "LVM_GETTEXTBKCOLOR"; 
4184         case 0x1000 + 38: return "LVM_SETTEXTBKCOLOR"; 
4185         case 0x1000 + 39: return "LVM_GETTOPINDEX"; 
4186         case 0x1000 + 40: return "LVM_GETCOUNTPERPAGE"; 
4187         case 0x1000 + 41: return "LVM_GETORIGIN"; 
4188         case 0x1000 + 42: return "LVM_UPDATE"; 
4189         case 0x1000 + 43: return "LVM_SETITEMSTATE"; 
4190         case 0x1000 + 44: return "LVM_GETITEMSTATE"; 
4191         case 0x1000 + 45: return "LVM_GETITEMTEXTA"; 
4192         case 0x1000 + 115: return "LVM_GETITEMTEXTW"; 
4193         case 0x1000 + 46: return "LVM_SETITEMTEXTA"; 
4194         case 0x1000 + 116: return "LVM_SETITEMTEXTW"; 
4195         case 0x1000 + 47: return "LVM_SETITEMCOUNT"; 
4196         case 0x1000 + 48: return "LVM_SORTITEMS"; 
4197         case 0x1000 + 49: return "LVM_SETITEMPOSITION32"; 
4198         case 0x1000 + 50: return "LVM_GETSELECTEDCOUNT"; 
4199         case 0x1000 + 51: return "LVM_GETITEMSPACING"; 
4200         case 0x1000 + 52: return "LVM_GETISEARCHSTRINGA"; 
4201         case 0x1000 + 117: return "LVM_GETISEARCHSTRINGW"; 
4202         case 0x1000 + 53: return "LVM_SETICONSPACING"; 
4203         case 0x1000 + 54: return "LVM_SETEXTENDEDLISTVIEWSTYLE"; 
4204         case 0x1000 + 55: return "LVM_GETEXTENDEDLISTVIEWSTYLE"; 
4205         case 0x1000 + 56: return "LVM_GETSUBITEMRECT"; 
4206         case 0x1000 + 57: return "LVM_SUBITEMHITTEST"; 
4207         case 0x1000 + 58: return "LVM_SETCOLUMNORDERARRAY"; 
4208         case 0x1000 + 59: return "LVM_GETCOLUMNORDERARRAY"; 
4209         case 0x1000 + 60: return "LVM_SETHOTITEM"; 
4210         case 0x1000 + 61: return "LVM_GETHOTITEM"; 
4211         case 0x1000 + 62: return "LVM_SETHOTCURSOR"; 
4212         case 0x1000 + 63: return "LVM_GETHOTCURSOR"; 
4213         case 0x1000 + 64: return "LVM_APPROXIMATEVIEWRECT"; 
4214         case 0x1000 + 65: return "LVM_SETWORKAREA"; 
4217         case 0x1100 + 0: return "TVM_INSERTITEMA"; 
4218         case 0x1100 + 50: return "TVM_INSERTITEMW"; 
4219         case 0x1100 + 1: return "TVM_DELETEITEM"; 
4220         case 0x1100 + 2: return "TVM_EXPAND"; 
4221         case 0x1100 + 4: return "TVM_GETITEMRECT"; 
4222         case 0x1100 + 5: return "TVM_GETCOUNT"; 
4223         case 0x1100 + 6: return "TVM_GETINDENT"; 
4224         case 0x1100 + 7: return "TVM_SETINDENT"; 
4225         case 0x1100 + 8: return "TVM_GETIMAGELIST"; 
4226         case 0x1100 + 9: return "TVM_SETIMAGELIST"; 
4227         case 0x1100 + 10: return "TVM_GETNEXTITEM"; 
4228         case 0x1100 + 11: return "TVM_SELECTITEM"; 
4229         case 0x1100 + 12: return "TVM_GETITEMA"; 
4230         case 0x1100 + 62: return "TVM_GETITEMW"; 
4231         case 0x1100 + 13: return "TVM_SETITEMA"; 
4232         case 0x1100 + 63: return "TVM_SETITEMW"; 
4233         case 0x1100 + 14: return "TVM_EDITLABELA"; 
4234         case 0x1100 + 65: return "TVM_EDITLABELW"; 
4235         case 0x1100 + 15: return "TVM_GETEDITCONTROL"; 
4236         case 0x1100 + 16: return "TVM_GETVISIBLECOUNT"; 
4237         case 0x1100 + 17: return "TVM_HITTEST"; 
4238         case 0x1100 + 18: return "TVM_CREATEDRAGIMAGE"; 
4239         case 0x1100 + 19: return "TVM_SORTCHILDREN"; 
4240         case 0x1100 + 20: return "TVM_ENSUREVISIBLE"; 
4241         case 0x1100 + 21: return "TVM_SORTCHILDRENCB"; 
4242         case 0x1100 + 22: return "TVM_ENDEDITLABELNOW"; 
4243         case 0x1100 + 23: return "TVM_GETISEARCHSTRINGA"; 
4244         case 0x1100 + 64: return "TVM_GETISEARCHSTRINGW"; 
4245         case 0x1100 + 24: return "TVM_SETTOOLTIPS"; 
4246         case 0x1100 + 25: return "TVM_GETTOOLTIPS"; 
4249         case 0x1200 + 0: return "HDM_GETITEMCOUNT"; 
4250         case 0x1200 + 1: return "HDM_INSERTITEMA"; 
4251         case 0x1200 + 10: return "HDM_INSERTITEMW"; 
4252         case 0x1200 + 2: return "HDM_DELETEITEM"; 
4253         case 0x1200 + 3: return "HDM_GETITEMA"; 
4254         case 0x1200 + 11: return "HDM_GETITEMW"; 
4255         case 0x1200 + 4: return "HDM_SETITEMA"; 
4256         case 0x1200 + 12: return "HDM_SETITEMW"; 
4257         case 0x1200 + 5: return "HDM_LAYOUT"; 
4258         case 0x1200 + 6: return "HDM_HITTEST"; 
4259         case 0x1200 + 7: return "HDM_GETITEMRECT"; 
4260         case 0x1200 + 8: return "HDM_SETIMAGELIST"; 
4261         case 0x1200 + 9: return "HDM_GETIMAGELIST"; 
4262         case 0x1200 + 15: return "HDM_ORDERTOINDEX"; 
4263         case 0x1200 + 16: return "HDM_CREATEDRAGIMAGE"; 
4264         case 0x1200 + 17: return "HDM_GETORDERARRAY"; 
4265         case 0x1200 + 18: return "HDM_SETORDERARRAY"; 
4266         case 0x1200 + 19: return "HDM_SETHOTDIVIDER"; 
4269         case 0x1300 + 2: return "TCM_GETIMAGELIST"; 
4270         case 0x1300 + 3: return "TCM_SETIMAGELIST"; 
4271         case 0x1300 + 4: return "TCM_GETITEMCOUNT"; 
4272         case 0x1300 + 5: return "TCM_GETITEMA"; 
4273         case 0x1300 + 60: return "TCM_GETITEMW"; 
4274         case 0x1300 + 6: return "TCM_SETITEMA"; 
4275         case 0x1300 + 61: return "TCM_SETITEMW"; 
4276         case 0x1300 + 7: return "TCM_INSERTITEMA"; 
4277         case 0x1300 + 62: return "TCM_INSERTITEMW"; 
4278         case 0x1300 + 8: return "TCM_DELETEITEM"; 
4279         case 0x1300 + 9: return "TCM_DELETEALLITEMS"; 
4280         case 0x1300 + 10: return "TCM_GETITEMRECT"; 
4281         case 0x1300 + 11: return "TCM_GETCURSEL"; 
4282         case 0x1300 + 12: return "TCM_SETCURSEL"; 
4283         case 0x1300 + 13: return "TCM_HITTEST"; 
4284         case 0x1300 + 14: return "TCM_SETITEMEXTRA"; 
4285         case 0x1300 + 40: return "TCM_ADJUSTRECT"; 
4286         case 0x1300 + 41: return "TCM_SETITEMSIZE"; 
4287         case 0x1300 + 42: return "TCM_REMOVEIMAGE"; 
4288         case 0x1300 + 43: return "TCM_SETPADDING"; 
4289         case 0x1300 + 44: return "TCM_GETROWCOUNT"; 
4290         case 0x1300 + 45: return "TCM_GETTOOLTIPS"; 
4291         case 0x1300 + 46: return "TCM_SETTOOLTIPS"; 
4292         case 0x1300 + 47: return "TCM_GETCURFOCUS"; 
4293         case 0x1300 + 48: return "TCM_SETCURFOCUS"; 
4294         case 0x1300 + 49: return "TCM_SETMINTABWIDTH"; 
4295         case 0x1300 + 50: return "TCM_DESELECTALL"; 
4298         case WM_USER
+1000+1: return "TB_ENABLEBUTTON"; 
4299         case WM_USER
+1000+2: return "TB_CHECKBUTTON"; 
4300         case WM_USER
+1000+3: return "TB_PRESSBUTTON"; 
4301         case WM_USER
+1000+4: return "TB_HIDEBUTTON"; 
4302         case WM_USER
+1000+5: return "TB_INDETERMINATE"; 
4303         case WM_USER
+1000+9: return "TB_ISBUTTONENABLED"; 
4304         case WM_USER
+1000+10: return "TB_ISBUTTONCHECKED"; 
4305         case WM_USER
+1000+11: return "TB_ISBUTTONPRESSED"; 
4306         case WM_USER
+1000+12: return "TB_ISBUTTONHIDDEN"; 
4307         case WM_USER
+1000+13: return "TB_ISBUTTONINDETERMINATE"; 
4308         case WM_USER
+1000+17: return "TB_SETSTATE"; 
4309         case WM_USER
+1000+18: return "TB_GETSTATE"; 
4310         case WM_USER
+1000+19: return "TB_ADDBITMAP"; 
4311         case WM_USER
+1000+20: return "TB_ADDBUTTONS"; 
4312         case WM_USER
+1000+21: return "TB_INSERTBUTTON"; 
4313         case WM_USER
+1000+22: return "TB_DELETEBUTTON"; 
4314         case WM_USER
+1000+23: return "TB_GETBUTTON"; 
4315         case WM_USER
+1000+24: return "TB_BUTTONCOUNT"; 
4316         case WM_USER
+1000+25: return "TB_COMMANDTOINDEX"; 
4317         case WM_USER
+1000+26: return "TB_SAVERESTOREA"; 
4318         case WM_USER
+1000+76: return "TB_SAVERESTOREW"; 
4319         case WM_USER
+1000+27: return "TB_CUSTOMIZE"; 
4320         case WM_USER
+1000+28: return "TB_ADDSTRINGA"; 
4321         case WM_USER
+1000+77: return "TB_ADDSTRINGW"; 
4322         case WM_USER
+1000+29: return "TB_GETITEMRECT"; 
4323         case WM_USER
+1000+30: return "TB_BUTTONSTRUCTSIZE"; 
4324         case WM_USER
+1000+31: return "TB_SETBUTTONSIZE"; 
4325         case WM_USER
+1000+32: return "TB_SETBITMAPSIZE"; 
4326         case WM_USER
+1000+33: return "TB_AUTOSIZE"; 
4327         case WM_USER
+1000+35: return "TB_GETTOOLTIPS"; 
4328         case WM_USER
+1000+36: return "TB_SETTOOLTIPS"; 
4329         case WM_USER
+1000+37: return "TB_SETPARENT"; 
4330         case WM_USER
+1000+39: return "TB_SETROWS"; 
4331         case WM_USER
+1000+40: return "TB_GETROWS"; 
4332         case WM_USER
+1000+42: return "TB_SETCMDID"; 
4333         case WM_USER
+1000+43: return "TB_CHANGEBITMAP"; 
4334         case WM_USER
+1000+44: return "TB_GETBITMAP"; 
4335         case WM_USER
+1000+45: return "TB_GETBUTTONTEXTA"; 
4336         case WM_USER
+1000+75: return "TB_GETBUTTONTEXTW"; 
4337         case WM_USER
+1000+46: return "TB_REPLACEBITMAP"; 
4338         case WM_USER
+1000+47: return "TB_SETINDENT"; 
4339         case WM_USER
+1000+48: return "TB_SETIMAGELIST"; 
4340         case WM_USER
+1000+49: return "TB_GETIMAGELIST"; 
4341         case WM_USER
+1000+50: return "TB_LOADIMAGES"; 
4342         case WM_USER
+1000+51: return "TB_GETRECT"; 
4343         case WM_USER
+1000+52: return "TB_SETHOTIMAGELIST"; 
4344         case WM_USER
+1000+53: return "TB_GETHOTIMAGELIST"; 
4345         case WM_USER
+1000+54: return "TB_SETDISABLEDIMAGELIST"; 
4346         case WM_USER
+1000+55: return "TB_GETDISABLEDIMAGELIST"; 
4347         case WM_USER
+1000+56: return "TB_SETSTYLE"; 
4348         case WM_USER
+1000+57: return "TB_GETSTYLE"; 
4349         case WM_USER
+1000+58: return "TB_GETBUTTONSIZE"; 
4350         case WM_USER
+1000+59: return "TB_SETBUTTONWIDTH"; 
4351         case WM_USER
+1000+60: return "TB_SETMAXTEXTROWS"; 
4352         case WM_USER
+1000+61: return "TB_GETTEXTROWS"; 
4353         case WM_USER
+1000+41: return "TB_GETBITMAPFLAGS"; 
4356             static char s_szBuf
[128]; 
4357             sprintf(s_szBuf
, "<unknown message = %d>", nMessage
); 
4361 } // end of wxGetMessageName 
4363 #endif // __WXDEBUG__ 
4365 static void TranslateKbdEventToMouse( 
4373     // Construct the key mask 
4374     ULONG
&                          fwKeys 
= *pFlags
; 
4376     fwKeys 
= VK_BUTTON2
; 
4377     if ((::WinGetKeyState(HWND_DESKTOP
, VK_CTRL
) & 0x100) != 0) 
4379     if ((::WinGetKeyState(HWND_DESKTOP
, VK_SHIFT
) & 0x100) != 0) 
4383     // Simulate right mouse button click 
4387     ::WinQueryMsgPos(vHabmain
, &vPoint
); 
4391     pWin
->ScreenToClient(pX
, pY
); 
4392 } // end of TranslateKbdEventToMouse 
4394 // Find the wxWindow at the current mouse position, returning the mouse 
4396 wxWindow
* wxFindWindowAtPointer( 
4400     return wxFindWindowAtPoint(wxGetMousePosition()); 
4403 wxWindow
* wxFindWindowAtPoint( 
4412     HWND                            hWndHit 
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt2
, FALSE
); 
4413     wxWindow
*                       pWin 
= wxFindWinFromHandle((WXHWND
)hWndHit
) ; 
4414     HWND                            hWnd 
= hWndHit
; 
4417     // Try to find a window with a wxWindow associated with it 
4419     while (!pWin 
&& (hWnd 
!= 0)) 
4421         hWnd 
= ::WinQueryWindow(hWnd
, QW_PARENT
); 
4422         pWin 
= wxFindWinFromHandle((WXHWND
)hWnd
) ; 
4427 // Get the current mouse position. 
4428 wxPoint 
wxGetMousePosition() 
4432     ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
); 
4433     return wxPoint(vPt
.x
, vPt
.y
);