1 ///////////////////////////////////////////////////////////////////////////// 
   4 // Author:      Julian Smart 
   5 // Modified by: VZ on 13.05.99: no more Default(), MSWOnXXX() reorganisation 
   8 // Copyright:   (c) Julian Smart and Markus Holzem 
   9 // Licence:     wxWindows license 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // =========================================================================== 
  14 // =========================================================================== 
  16 // --------------------------------------------------------------------------- 
  18 // --------------------------------------------------------------------------- 
  21     #pragma implementation "window.h" 
  24 // For compilers that support precompilation, includes "wx.h". 
  25 #include "wx/wxprec.h" 
  33     #include "wx/msw/winundef.h" 
  38     #include "wx/dcclient.h" 
  42     #include "wx/layout.h" 
  43     #include "wx/dialog.h" 
  45     #include "wx/listbox.h" 
  46     #include "wx/button.h" 
  47     #include "wx/msgdlg.h" 
  53     #include "wx/ownerdrw.h" 
  56 #if     wxUSE_DRAG_AND_DROP 
  57     #include "wx/dataobj.h" 
  58     #include "wx/msw/ole/droptgt.h" 
  61 #include "wx/menuitem.h" 
  64 #include "wx/msw/private.h" 
  67     #include "wx/tooltip.h" 
  78 #include "wx/textctrl.h" 
  91 #if ( defined(__WIN95__) && !defined(__GNUWIN32__)) || defined(__TWIN32__ ) 
  97         #include <wx/msw/gnuwin32/extra.h> 
 101 // --------------------------------------------------------------------------- 
 103 // --------------------------------------------------------------------------- 
 105 // standard macros missing from some compilers headers 
 107     #define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp)) 
 108     #define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp)) 
 109 #endif // GET_X_LPARAM 
 111 // --------------------------------------------------------------------------- 
 113 // --------------------------------------------------------------------------- 
 115 // the last Windows message we got (MT-UNSAFE) 
 116 extern MSG s_currentMsg
; 
 118 wxMenu 
*wxCurrentPopupMenu 
= NULL
; 
 119 extern wxList WXDLLEXPORT wxPendingDelete
; 
 120 extern wxChar wxCanvasClassName
[]; 
 122 // --------------------------------------------------------------------------- 
 124 // --------------------------------------------------------------------------- 
 126 // the window proc for all our windows 
 127 LRESULT APIENTRY _EXPORT 
wxWndProc(HWND hWnd
, UINT message
, 
 128                                    WPARAM wParam
, LPARAM lParam
); 
 131     const char *wxGetMessageName(int message
); 
 134 void wxRemoveHandleAssociation(wxWindow 
*win
); 
 135 void wxAssociateWinWithHandle(HWND hWnd
, wxWindow 
*win
); 
 136 wxWindow 
*wxFindWinFromHandle(WXHWND hWnd
); 
 138 // --------------------------------------------------------------------------- 
 140 // --------------------------------------------------------------------------- 
 142 #if !USE_SHARED_LIBRARY 
 143     IMPLEMENT_DYNAMIC_CLASS(wxWindow
, wxWindowBase
) 
 146 BEGIN_EVENT_TABLE(wxWindow
, wxWindowBase
) 
 147     EVT_ERASE_BACKGROUND(wxWindow::OnEraseBackground
) 
 148     EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged
) 
 149     EVT_INIT_DIALOG(wxWindow::OnInitDialog
) 
 150     EVT_IDLE(wxWindow::OnIdle
) 
 153 // =========================================================================== 
 155 // =========================================================================== 
 157 // --------------------------------------------------------------------------- 
 158 // wxWindow utility functions 
 159 // --------------------------------------------------------------------------- 
 161 // Find an item given the MS Windows id 
 162 wxWindow 
*wxWindow::FindItem(int id
) const 
 164     wxWindowList::Node 
*current 
= GetChildren().GetFirst(); 
 167         wxWindow 
*childWin 
= current
->GetData(); 
 169         wxWindow 
*wnd 
= childWin
->FindItem(id
); 
 173         if ( childWin
->IsKindOf(CLASSINFO(wxControl
)) ) 
 175             wxControl 
*item 
= (wxControl 
*)childWin
; 
 176             if ( item
->GetId() == id 
) 
 180                 // In case it's a 'virtual' control (e.g. radiobox) 
 181                 if ( item
->GetSubcontrols().Member((wxObject 
*)id
) ) 
 186         current 
= current
->GetNext(); 
 192 // Find an item given the MS Windows handle 
 193 wxWindow 
*wxWindow::FindItemByHWND(WXHWND hWnd
, bool controlOnly
) const 
 195     wxWindowList::Node 
*current 
= GetChildren().GetFirst(); 
 198         wxWindow 
*parent 
= current
->GetData(); 
 200         // Do a recursive search. 
 201         wxWindow 
*wnd 
= parent
->FindItemByHWND(hWnd
); 
 205         if ( !controlOnly 
|| parent
->IsKindOf(CLASSINFO(wxControl
)) ) 
 207             wxWindow 
*item 
= current
->GetData(); 
 208             if ( item
->GetHWND() == hWnd 
) 
 212                 if ( item
->ContainsHWND(hWnd
) ) 
 217         current 
= current
->GetNext(); 
 222 // Default command handler 
 223 bool wxWindow::MSWCommand(WXUINT 
WXUNUSED(param
), WXWORD 
WXUNUSED(id
)) 
 228 // ---------------------------------------------------------------------------- 
 229 // constructors and such 
 230 // ---------------------------------------------------------------------------- 
 232 void wxWindow::Init() 
 238     m_doubleClickAllowed 
= 0; 
 239     m_winCaptured 
= FALSE
; 
 241     m_isBeingDeleted 
= FALSE
; 
 244     m_mouseInWindow 
= FALSE
; 
 251     // pass WM_GETDLGCODE to DefWindowProc() 
 256     m_backgroundTransparent 
= FALSE
; 
 258     // as all windows are created with WS_VISIBLE style... 
 261 #if wxUSE_MOUSEEVENT_HACK 
 264     m_lastMouseEvent 
= -1; 
 265 #endif // wxUSE_MOUSEEVENT_HACK 
 269 wxWindow::~wxWindow() 
 271     m_isBeingDeleted 
= TRUE
; 
 273     MSWDetachWindowMenu(); 
 276         m_parent
->RemoveChild(this); 
 282         if ( !::DestroyWindow(GetHwnd()) ) 
 283             wxLogLastError("DestroyWindow"); 
 286     // Restore old Window proc, if required and remove hWnd <-> wxWindow 
 291 // real construction (Init() must have been called before!) 
 292 bool wxWindow::Create(wxWindow 
*parent
, wxWindowID id
, 
 296                       const wxString
& name
) 
 298     wxCHECK_MSG( parent
, FALSE
, _T("can't create wxWindow without parent") ); 
 300     CreateBase(parent
, id
, pos
, size
, style
, name
); 
 302     parent
->AddChild(this); 
 305     if ( style 
& wxBORDER 
) 
 306         msflags 
|= WS_BORDER
; 
 307     if ( style 
& wxTHICK_FRAME 
) 
 308         msflags 
|= WS_THICKFRAME
; 
 310     msflags 
|= WS_CHILD 
| WS_VISIBLE
; 
 311     if ( style 
& wxCLIP_CHILDREN 
) 
 312         msflags 
|= WS_CLIPCHILDREN
; 
 315     WXDWORD exStyle 
= Determine3DEffects(WS_EX_CLIENTEDGE
, &want3D
); 
 317     // Even with extended styles, need to combine with WS_BORDER 
 318     // for them to look right. 
 319     if ( want3D 
|| (m_windowStyle 
& wxSIMPLE_BORDER
) || (m_windowStyle 
& wxRAISED_BORDER 
) || 
 320         (m_windowStyle 
& wxSUNKEN_BORDER
) || (m_windowStyle 
& wxDOUBLE_BORDER
)) 
 322         msflags 
|= WS_BORDER
; 
 325     // calculate the value to return from WM_GETDLGCODE handler 
 326     if ( GetWindowStyleFlag() & wxWANTS_CHARS 
) 
 328         // want everything: i.e. all keys and WM_CHAR message 
 329         m_lDlgCode 
= DLGC_WANTARROWS 
| DLGC_WANTCHARS 
| 
 330                      DLGC_WANTTAB 
| DLGC_WANTMESSAGE
; 
 334     MSWCreate(m_windowId
, parent
, wxCanvasClassName
, this, NULL
, 
 336               WidthDefault(size
.x
), HeightDefault(size
.y
), 
 337               msflags
, NULL
, exStyle
); 
 342 // --------------------------------------------------------------------------- 
 344 // --------------------------------------------------------------------------- 
 346 void wxWindow::SetFocus() 
 348     HWND hWnd 
= GetHwnd(); 
 353 // Get the window with the focus 
 354 wxWindow 
*wxWindowBase::FindFocus() 
 356     HWND hWnd 
= ::GetFocus(); 
 359         return wxFindWinFromHandle((WXHWND
) hWnd
); 
 365 bool wxWindow::Enable(bool enable
) 
 367     if ( !wxWindowBase::Enable(enable
) ) 
 370     HWND hWnd 
= GetHwnd(); 
 372         ::EnableWindow(hWnd
, (BOOL
)enable
); 
 377 bool wxWindow::Show(bool show
) 
 379     if ( !wxWindowBase::Show(show
) ) 
 382     HWND hWnd 
= GetHwnd(); 
 383     int cshow 
= show 
? SW_SHOW 
: SW_HIDE
; 
 384     ::ShowWindow(hWnd
, cshow
); 
 388         BringWindowToTop(hWnd
); 
 394 // Raise the window to the top of the Z order 
 395 void wxWindow::Raise() 
 397     ::BringWindowToTop(GetHwnd()); 
 400 // Lower the window to the bottom of the Z order 
 401 void wxWindow::Lower() 
 403     ::SetWindowPos(GetHwnd(), HWND_BOTTOM
, 0, 0, 0, 0, 
 404                    SWP_NOMOVE 
| SWP_NOSIZE 
| SWP_NOACTIVATE
); 
 407 void wxWindow::SetTitle( const wxString
& title
) 
 409     SetWindowText(GetHwnd(), title
.c_str()); 
 412 wxString 
wxWindow::GetTitle() const 
 414     return wxGetWindowText(GetHWND()); 
 417 void wxWindow::CaptureMouse() 
 419     HWND hWnd 
= GetHwnd(); 
 420     if ( hWnd 
&& !m_winCaptured 
) 
 423         m_winCaptured 
= TRUE
; 
 427 void wxWindow::ReleaseMouse() 
 432         m_winCaptured 
= FALSE
; 
 436 bool wxWindow::SetFont(const wxFont
& font
) 
 438     if ( !wxWindowBase::SetFont(font
) ) 
 444     HWND hWnd 
= GetHwnd(); 
 447         WXHANDLE hFont 
= m_font
.GetResourceHandle(); 
 449         wxASSERT_MSG( hFont
, _T("should have valid font") ); 
 451         ::SendMessage(hWnd
, WM_SETFONT
, (WPARAM
)hFont
, TRUE
); 
 456 bool wxWindow::SetCursor(const wxCursor
& cursor
) 
 458     if ( !wxWindowBase::SetCursor(cursor
) ) 
 464     wxASSERT_MSG( m_cursor
.Ok(), 
 465                   _T("cursor must be valid after call to the base version")); 
 467     HWND hWnd 
= GetHwnd(); 
 469     // Change the cursor NOW if we're within the correct window 
 471     ::GetCursorPos(&point
); 
 474     ::GetWindowRect(hWnd
, &rect
); 
 476     if ( ::PtInRect(&rect
, point
) && !wxIsBusy() ) 
 477         ::SetCursor((HCURSOR
)m_cursor
.GetHCURSOR()); 
 482 void wxWindow::WarpPointer (int x_pos
, int y_pos
) 
 484     // Move the pointer to (x_pos,y_pos) coordinates. They are expressed in 
 485     // pixel coordinates, relatives to the canvas -- So, we first need to 
 486     // substract origin of the window, then convert to screen position 
 488     int x 
= x_pos
; int y 
= y_pos
; 
 490     GetWindowRect (GetHwnd(), &rect
); 
 498 #if WXWIN_COMPATIBILITY 
 499 void wxWindow::MSWDeviceToLogical (float *x
, float *y
) const 
 502 #endif // WXWIN_COMPATIBILITY 
 504 // --------------------------------------------------------------------------- 
 506 // --------------------------------------------------------------------------- 
 508 #if WXWIN_COMPATIBILITY 
 509 void wxWindow::SetScrollRange(int orient
, int range
, bool refresh
) 
 511 #if defined(__WIN95__) 
 515     // Try to adjust the range to cope with page size > 1 
 516     // - a Windows API quirk 
 517     int pageSize 
= GetScrollPage(orient
); 
 518     if ( pageSize 
> 1 && range 
> 0) 
 520         range1 
+= (pageSize 
- 1); 
 526     if ( orient 
== wxHORIZONTAL 
) { 
 532     info
.cbSize 
= sizeof(SCROLLINFO
); 
 533     info
.nPage 
= pageSize
; // Have to set this, or scrollbar goes awry 
 537     info
.fMask 
= SIF_RANGE 
| SIF_PAGE
; 
 539     HWND hWnd 
= GetHwnd(); 
 541         ::SetScrollInfo(hWnd
, dir
, &info
, refresh
); 
 544     if ( orient 
== wxHORIZONTAL 
) 
 549     HWND hWnd 
= GetHwnd(); 
 551         ::SetScrollRange(hWnd
, wOrient
, 0, range
, refresh
); 
 555 void wxWindow::SetScrollPage(int orient
, int page
, bool refresh
) 
 557 #if defined(__WIN95__) 
 561     if ( orient 
== wxHORIZONTAL 
) { 
 569     info
.cbSize 
= sizeof(SCROLLINFO
); 
 572     info
.fMask 
= SIF_PAGE
; 
 574     HWND hWnd 
= GetHwnd(); 
 576         ::SetScrollInfo(hWnd
, dir
, &info
, refresh
); 
 578     if ( orient 
== wxHORIZONTAL 
) 
 585 int wxWindow::OldGetScrollRange(int orient
) const 
 588     if ( orient 
== wxHORIZONTAL 
) 
 593 #if __WATCOMC__ && defined(__WINDOWS_386__) 
 594     short minPos
, maxPos
; 
 598     HWND hWnd 
= GetHwnd(); 
 601         ::GetScrollRange(hWnd
, wOrient
, &minPos
, &maxPos
); 
 602 #if defined(__WIN95__) 
 603         // Try to adjust the range to cope with page size > 1 
 604         // - a Windows API quirk 
 605         int pageSize 
= GetScrollPage(orient
); 
 608             maxPos 
-= (pageSize 
- 1); 
 617 int wxWindow::GetScrollPage(int orient
) const 
 619     if ( orient 
== wxHORIZONTAL 
) 
 625 #endif // WXWIN_COMPATIBILITY 
 627 int wxWindow::GetScrollPos(int orient
) const 
 630     if ( orient 
== wxHORIZONTAL 
) 
 634     HWND hWnd 
= GetHwnd(); 
 637         return ::GetScrollPos(hWnd
, wOrient
); 
 643 // This now returns the whole range, not just the number 
 644 // of positions that we can scroll. 
 645 int wxWindow::GetScrollRange(int orient
) const 
 648     if ( orient 
== wxHORIZONTAL 
) 
 653 #if __WATCOMC__ && defined(__WINDOWS_386__) 
 654     short minPos
, maxPos
; 
 658     HWND hWnd 
= GetHwnd(); 
 661         ::GetScrollRange(hWnd
, wOrient
, &minPos
, &maxPos
); 
 662 #if defined(__WIN95__) 
 663         // Try to adjust the range to cope with page size > 1 
 664         // - a Windows API quirk 
 665         int pageSize 
= GetScrollThumb(orient
); 
 668             maxPos 
-= (pageSize 
- 1); 
 670         // October 10th: new range concept. 
 680 int wxWindow::GetScrollThumb(int orient
) const 
 682     if ( orient 
== wxHORIZONTAL 
) 
 688 void wxWindow::SetScrollPos(int orient
, int pos
, bool refresh
) 
 690 #if defined(__WIN95__) 
 694     if ( orient 
== wxHORIZONTAL 
) { 
 700     info
.cbSize 
= sizeof(SCROLLINFO
); 
 704     info
.fMask 
= SIF_POS
; 
 706     HWND hWnd 
= GetHwnd(); 
 708         ::SetScrollInfo(hWnd
, dir
, &info
, refresh
); 
 711     if ( orient 
== wxHORIZONTAL 
) 
 716     HWND hWnd 
= GetHwnd(); 
 718         ::SetScrollPos(hWnd
, wOrient
, pos
, refresh
); 
 722 // New function that will replace some of the above. 
 723 void wxWindow::SetScrollbar(int orient
, int pos
, int thumbVisible
, 
 724                             int range
, bool refresh
) 
 726 #if defined(__WIN95__) 
 727     int oldRange 
= range 
- thumbVisible
; 
 729     int range1 
= oldRange
; 
 731     // Try to adjust the range to cope with page size > 1 
 732     // - a Windows API quirk 
 733     int pageSize 
= thumbVisible
; 
 734     if ( pageSize 
> 1 && range 
> 0) 
 736         range1 
+= (pageSize 
- 1); 
 742     if ( orient 
== wxHORIZONTAL 
) { 
 748     info
.cbSize 
= sizeof(SCROLLINFO
); 
 749     info
.nPage 
= pageSize
; // Have to set this, or scrollbar goes awry 
 753     info
.fMask 
= SIF_RANGE 
| SIF_PAGE 
| SIF_POS
; 
 755     HWND hWnd 
= GetHwnd(); 
 757         ::SetScrollInfo(hWnd
, dir
, &info
, refresh
); 
 760     if ( orient 
== wxHORIZONTAL 
) 
 765     HWND hWnd 
= GetHwnd(); 
 768         ::SetScrollRange(hWnd
, wOrient
, 0, range
, FALSE
); 
 769         ::SetScrollPos(hWnd
, wOrient
, pos
, refresh
); 
 772     if ( orient 
== wxHORIZONTAL 
) { 
 773         m_xThumbSize 
= thumbVisible
; 
 775         m_yThumbSize 
= thumbVisible
; 
 779 void wxWindow::ScrollWindow(int dx
, int dy
, const wxRect 
*rect
) 
 784         rect2
.left 
= rect
->x
; 
 786         rect2
.right 
= rect
->x 
+ rect
->width
; 
 787         rect2
.bottom 
= rect
->y 
+ rect
->height
; 
 791         ::ScrollWindow(GetHwnd(), dx
, dy
, &rect2
, NULL
); 
 793         ::ScrollWindow(GetHwnd(), dx
, dy
, NULL
, NULL
); 
 796 // --------------------------------------------------------------------------- 
 798 // --------------------------------------------------------------------------- 
 800 void wxWindow::SubclassWin(WXHWND hWnd
) 
 802     wxASSERT_MSG( !m_oldWndProc
, _T("subclassing window twice?") ); 
 804     wxAssociateWinWithHandle((HWND
)hWnd
, this); 
 806     m_oldWndProc 
= (WXFARPROC
) GetWindowLong((HWND
) hWnd
, GWL_WNDPROC
); 
 807     SetWindowLong((HWND
) hWnd
, GWL_WNDPROC
, (LONG
) wxWndProc
); 
 810 void wxWindow::UnsubclassWin() 
 812     wxRemoveHandleAssociation(this); 
 814     // Restore old Window proc 
 817         FARPROC farProc 
= (FARPROC
) GetWindowLong(GetHwnd(), GWL_WNDPROC
); 
 818         if ( (m_oldWndProc 
!= 0) && (farProc 
!= (FARPROC
) m_oldWndProc
) ) 
 820             SetWindowLong(GetHwnd(), GWL_WNDPROC
, (LONG
) m_oldWndProc
); 
 828 // Make a Windows extended style from the given wxWindows window style 
 829 WXDWORD 
wxWindow::MakeExtendedStyle(long style
, bool eliminateBorders
) 
 832     if ( style 
& wxTRANSPARENT_WINDOW 
) 
 833         exStyle 
|= WS_EX_TRANSPARENT
; 
 835     if ( !eliminateBorders 
) 
 837         if ( style 
& wxSUNKEN_BORDER 
) 
 838             exStyle 
|= WS_EX_CLIENTEDGE
; 
 839         if ( style 
& wxDOUBLE_BORDER 
) 
 840             exStyle 
|= WS_EX_DLGMODALFRAME
; 
 841 #if defined(__WIN95__) 
 842         if ( style 
& wxRAISED_BORDER 
) 
 843             exStyle 
|= WS_EX_WINDOWEDGE
; 
 844         if ( style 
& wxSTATIC_BORDER 
) 
 845             exStyle 
|= WS_EX_STATICEDGE
; 
 851 // Determines whether native 3D effects or CTL3D should be used, 
 852 // applying a default border style if required, and returning an extended 
 853 // style to pass to CreateWindowEx. 
 854 WXDWORD 
wxWindow::Determine3DEffects(WXDWORD defaultBorderStyle
, bool *want3D
) 
 856     // If matches certain criteria, then assume no 3D effects 
 857     // unless specifically requested (dealt with in MakeExtendedStyle) 
 858     if ( !GetParent() || !IsKindOf(CLASSINFO(wxControl
)) || (m_windowStyle 
& wxNO_BORDER
) ) 
 861         return MakeExtendedStyle(m_windowStyle
, FALSE
); 
 864     // Determine whether we should be using 3D effects or not. 
 865     bool nativeBorder 
= FALSE
; // by default, we don't want a Win95 effect 
 867     // 1) App can specify global 3D effects 
 868     *want3D 
= wxTheApp
->GetAuto3D(); 
 870     // 2) If the parent is being drawn with user colours, or simple border specified, 
 871     // switch effects off. TODO: replace wxUSER_COLOURS with wxNO_3D 
 872     if ( GetParent() && (GetParent()->GetWindowStyleFlag() & wxUSER_COLOURS
) || (m_windowStyle 
& wxSIMPLE_BORDER
) ) 
 875     // 3) Control can override this global setting by defining 
 876     // a border style, e.g. wxSUNKEN_BORDER 
 877     if ( m_windowStyle 
& wxSUNKEN_BORDER  
) 
 880     // 4) If it's a special border, CTL3D can't cope so we want a native border 
 881     if ( (m_windowStyle 
& wxDOUBLE_BORDER
) || (m_windowStyle 
& wxRAISED_BORDER
) || 
 882         (m_windowStyle 
& wxSTATIC_BORDER
) ) 
 888     // 5) If this isn't a Win95 app, and we are using CTL3D, remove border 
 889     // effects from extended style 
 892         nativeBorder 
= FALSE
; 
 895     DWORD exStyle 
= MakeExtendedStyle(m_windowStyle
, !nativeBorder
); 
 897     // If we want 3D, but haven't specified a border here, 
 898     // apply the default border style specified. 
 899     // TODO what about non-Win95 WIN32? Does it have borders? 
 900 #if defined(__WIN95__) && !wxUSE_CTL3D 
 901     if ( defaultBorderStyle 
&& (*want3D
) && ! ((m_windowStyle 
& wxDOUBLE_BORDER
) || (m_windowStyle 
& wxRAISED_BORDER 
) || 
 902         (m_windowStyle 
& wxSTATIC_BORDER
) || (m_windowStyle 
& wxSIMPLE_BORDER
) )) 
 903         exStyle 
|= defaultBorderStyle
; // WS_EX_CLIENTEDGE; 
 909 #if WXWIN_COMPATIBILITY 
 910 // If nothing defined for this, try the parent. 
 911 // E.g. we may be a button loaded from a resource, with no callback function 
 913 void wxWindow::OnCommand(wxWindow
& win
, wxCommandEvent
& event
) 
 915     if ( GetEventHandler()->ProcessEvent(event
)  ) 
 918         m_parent
->GetEventHandler()->OnCommand(win
, event
); 
 920 #endif // WXWIN_COMPATIBILITY_2 
 922 #if WXWIN_COMPATIBILITY 
 923 wxObject
* wxWindow::GetChild(int number
) const 
 925     // Return a pointer to the Nth object in the Panel 
 926     wxNode 
*node 
= GetChildren().First(); 
 932         wxObject 
*obj 
= (wxObject 
*)node
->Data(); 
 938 #endif // WXWIN_COMPATIBILITY 
 940 // Setup background and foreground colours correctly 
 941 void wxWindow::SetupColours() 
 944         SetBackgroundColour(GetParent()->GetBackgroundColour()); 
 947 void wxWindow::OnIdle(wxIdleEvent
& event
) 
 949     // Check if we need to send a LEAVE event 
 950     if ( m_mouseInWindow 
) 
 954         if ( ::WindowFromPoint(pt
) != GetHwnd() ) 
 956             // Generate a LEAVE event 
 957             m_mouseInWindow 
= FALSE
; 
 959             // Unfortunately the mouse button and keyboard state may have changed 
 960             // by the time the OnIdle function is called, so 'state' may be 
 963             if ( ::GetKeyState(VK_SHIFT
) != 0 ) 
 965             if ( ::GetKeyState(VK_CONTROL
) != 0 ) 
 968             wxMouseEvent 
event(wxEVT_LEAVE_WINDOW
); 
 969             InitMouseEvent(event
, pt
.x
, pt
.y
, state
); 
 971             (void)GetEventHandler()->ProcessEvent(event
); 
 978 // Set this window to be the child of 'parent'. 
 979 bool wxWindow::Reparent(wxWindow 
*parent
) 
 981     if ( !wxWindowBase::Reparent(parent
) ) 
 984     HWND hWndChild 
= GetHwnd(); 
 985     HWND hWndParent 
= GetParent() ? GetWinHwnd(GetParent()) : (HWND
)0; 
 987     ::SetParent(hWndChild
, hWndParent
); 
 992 void wxWindow::Clear() 
 995     wxBrush 
brush(GetBackgroundColour(), wxSOLID
); 
 996     dc
.SetBackground(brush
); 
1000 void wxWindow::Refresh(bool eraseBack
, const wxRect 
*rect
) 
1002     HWND hWnd 
= GetHwnd(); 
1008             mswRect
.left 
= rect
->x
; 
1009             mswRect
.top 
= rect
->y
; 
1010             mswRect
.right 
= rect
->x 
+ rect
->width
; 
1011             mswRect
.bottom 
= rect
->y 
+ rect
->height
; 
1013             ::InvalidateRect(hWnd
, &mswRect
, eraseBack
); 
1016             ::InvalidateRect(hWnd
, NULL
, eraseBack
); 
1020 // --------------------------------------------------------------------------- 
1022 // --------------------------------------------------------------------------- 
1024 #if wxUSE_DRAG_AND_DROP 
1026 void wxWindow::SetDropTarget(wxDropTarget 
*pDropTarget
) 
1028     if ( m_dropTarget 
!= 0 ) { 
1029         m_dropTarget
->Revoke(m_hWnd
); 
1030         delete m_dropTarget
; 
1033     m_dropTarget 
= pDropTarget
; 
1034     if ( m_dropTarget 
!= 0 ) 
1035         m_dropTarget
->Register(m_hWnd
); 
1038 #endif // wxUSE_DRAG_AND_DROP 
1040 // old style file-manager drag&drop support: we retain the old-style 
1041 // DragAcceptFiles in parallel with SetDropTarget. 
1042 void wxWindow::DragAcceptFiles(bool accept
) 
1044     HWND hWnd 
= GetHwnd(); 
1046         ::DragAcceptFiles(hWnd
, (BOOL
)accept
); 
1049 // ---------------------------------------------------------------------------- 
1051 // ---------------------------------------------------------------------------- 
1055 void wxWindow::DoSetToolTip(wxToolTip 
*tooltip
) 
1057     wxWindowBase::DoSetToolTip(tooltip
); 
1060         m_tooltip
->SetWindow(this); 
1063 #endif // wxUSE_TOOLTIPS 
1065 // --------------------------------------------------------------------------- 
1066 // moving and resizing 
1067 // --------------------------------------------------------------------------- 
1070 void wxWindow::DoGetSize(int *x
, int *y
) const 
1072     HWND hWnd 
= GetHwnd(); 
1074     GetWindowRect(hWnd
, &rect
); 
1077         *x 
= rect
.right 
- rect
.left
; 
1079         *y 
= rect
.bottom 
- rect
.top
; 
1082 void wxWindow::DoGetPosition(int *x
, int *y
) const 
1084     HWND hWnd 
= GetHwnd(); 
1087     GetWindowRect(hWnd
, &rect
); 
1090     point
.x 
= rect
.left
; 
1093     // we do the adjustments with respect to the parent only for the "real" 
1094     // children, not for the dialogs/frames 
1095     if ( !IsTopLevel() ) 
1097         HWND hParentWnd 
= 0; 
1098         wxWindow 
*parent 
= GetParent(); 
1100             hParentWnd 
= GetWinHwnd(parent
); 
1102         // Since we now have the absolute screen coords, if there's a parent we 
1103         // must subtract its top left corner 
1106             ::ScreenToClient(hParentWnd
, &point
); 
1109         // We may be faking the client origin. So a window that's really at (0, 
1110         // 30) may appear (to wxWin apps) to be at (0, 0). 
1113             wxPoint 
pt(parent
->GetClientAreaOrigin()); 
1125 void wxWindow::DoScreenToClient(int *x
, int *y
) const 
1133     HWND hWnd 
= GetHwnd(); 
1134     ::ScreenToClient(hWnd
, &pt
); 
1142 void wxWindow::DoClientToScreen(int *x
, int *y
) const 
1150     HWND hWnd 
= GetHwnd(); 
1151     ::ClientToScreen(hWnd
, &pt
); 
1159 // Get size *available for subwindows* i.e. excluding menu bar etc. 
1160 void wxWindow::DoGetClientSize(int *x
, int *y
) const 
1162     HWND hWnd 
= GetHwnd(); 
1164     ::GetClientRect(hWnd
, &rect
); 
1171 void wxWindow::DoSetSize(int x
, int y
, int width
, int height
, int sizeFlags
) 
1173     int currentX
, currentY
; 
1174     GetPosition(¤tX
, ¤tY
); 
1175     int currentW
,currentH
; 
1176     GetSize(¤tW
, ¤tH
); 
1178     if ( x 
== currentX 
&& y 
== currentY 
&& width 
== currentW 
&& height 
== currentH 
) 
1181     int actualWidth 
= width
; 
1182     int actualHeight 
= height
; 
1185     if ( x 
== -1 || (sizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
) ) 
1187     if ( y 
== -1 || (sizeFlags 
& wxSIZE_ALLOW_MINUS_ONE
) ) 
1190     AdjustForParentClientOrigin(actualX
, actualY
, sizeFlags
); 
1193         actualWidth 
= currentW
; 
1195         actualHeight 
= currentH
; 
1197     HWND hWnd 
= GetHwnd(); 
1199         MoveWindow(hWnd
, actualX
, actualY
, actualWidth
, actualHeight
, (BOOL
)TRUE
); 
1202 void wxWindow::DoSetClientSize(int width
, int height
) 
1204     wxWindow 
*parent 
= GetParent(); 
1205     HWND hWnd 
= GetHwnd(); 
1206     HWND hParentWnd 
= (HWND
) 0; 
1208         hParentWnd 
= (HWND
) parent
->GetHWND(); 
1211     ::GetClientRect(hWnd
, &rect
); 
1214     GetWindowRect(hWnd
, &rect2
); 
1216     // Find the difference between the entire window (title bar and all) 
1217     // and the client area; add this to the new client size to move the 
1219     int actual_width 
= rect2
.right 
- rect2
.left 
- rect
.right 
+ width
; 
1220     int actual_height 
= rect2
.bottom 
- rect2
.top 
- rect
.bottom 
+ height
; 
1222     // If there's a parent, must subtract the parent's top left corner 
1223     // since MoveWindow moves relative to the parent 
1226     point
.x 
= rect2
.left
; 
1227     point
.y 
= rect2
.top
; 
1230         ::ScreenToClient(hParentWnd
, &point
); 
1233     MoveWindow(hWnd
, point
.x
, point
.y
, actual_width
, actual_height
, (BOOL
)TRUE
); 
1235     wxSizeEvent 
event(wxSize(width
, height
), m_windowId
); 
1236     event
.SetEventObject(this); 
1237     GetEventHandler()->ProcessEvent(event
); 
1240 // For implementation purposes - sometimes decorations make the client area 
1242 wxPoint 
wxWindow::GetClientAreaOrigin() const 
1244     return wxPoint(0, 0); 
1247 // Makes an adjustment to the window position (for example, a frame that has 
1248 // a toolbar that it manages itself). 
1249 void wxWindow::AdjustForParentClientOrigin(int& x
, int& y
, int sizeFlags
) 
1251     // don't do it for the dialogs/frames - they float independently of their 
1253     if ( !IsTopLevel() ) 
1255         wxWindow 
*parent 
= GetParent(); 
1256         if ( !(sizeFlags 
& wxSIZE_NO_ADJUSTMENTS
) && parent 
) 
1258             wxPoint 
pt(parent
->GetClientAreaOrigin()); 
1259             x 
+= pt
.x
; y 
+= pt
.y
; 
1264 // --------------------------------------------------------------------------- 
1266 // --------------------------------------------------------------------------- 
1268 int wxWindow::GetCharHeight() const 
1270     TEXTMETRIC lpTextMetric
; 
1271     HWND hWnd 
= GetHwnd(); 
1272     HDC dc 
= ::GetDC(hWnd
); 
1274     GetTextMetrics(dc
, &lpTextMetric
); 
1275     ::ReleaseDC(hWnd
, dc
); 
1277     return lpTextMetric
.tmHeight
; 
1280 int wxWindow::GetCharWidth() const 
1282     TEXTMETRIC lpTextMetric
; 
1283     HWND hWnd 
= GetHwnd(); 
1284     HDC dc 
= ::GetDC(hWnd
); 
1286     GetTextMetrics(dc
, &lpTextMetric
); 
1287     ::ReleaseDC(hWnd
, dc
); 
1289     return lpTextMetric
.tmAveCharWidth
; 
1292 void wxWindow::GetTextExtent(const wxString
& string
, 
1294                              int *descent
, int *externalLeading
, 
1295                              const wxFont 
*theFont
) const 
1297     const wxFont 
*fontToUse 
= theFont
; 
1299         fontToUse 
= &m_font
; 
1301     HWND hWnd 
= GetHwnd(); 
1302     HDC dc 
= ::GetDC(hWnd
); 
1306     if ( fontToUse 
&& fontToUse
->Ok() ) 
1308         fnt 
= (HFONT
)((wxFont 
*)fontToUse
)->GetResourceHandle(); // const_cast 
1310             hfontOld 
= (HFONT
)SelectObject(dc
,fnt
); 
1315     GetTextExtentPoint(dc
, (const wxChar 
*)string
, (int)string
.Length(), &sizeRect
); 
1316     GetTextMetrics(dc
, &tm
); 
1318     if ( fontToUse 
&& fnt 
&& hfontOld 
) 
1319         SelectObject(dc
, hfontOld
); 
1321     ReleaseDC(hWnd
, dc
); 
1323     if ( x 
) *x 
= sizeRect
.cx
; 
1324     if ( y 
) *y 
= sizeRect
.cy
; 
1325     if ( descent 
) *descent 
= tm
.tmDescent
; 
1326     if ( externalLeading 
) *externalLeading 
= tm
.tmExternalLeading
; 
1329 #if wxUSE_CARET && WXWIN_COMPATIBILITY 
1330 // --------------------------------------------------------------------------- 
1331 // Caret manipulation 
1332 // --------------------------------------------------------------------------- 
1334 void wxWindow::CreateCaret(int w
, int h
) 
1336     SetCaret(new wxCaret(this, w
, h
)); 
1339 void wxWindow::CreateCaret(const wxBitmap 
*WXUNUSED(bitmap
)) 
1341     wxFAIL_MSG("not implemented"); 
1344 void wxWindow::ShowCaret(bool show
) 
1346     wxCHECK_RET( m_caret
, "no caret to show" ); 
1348     m_caret
->Show(show
); 
1351 void wxWindow::DestroyCaret() 
1356 void wxWindow::SetCaretPos(int x
, int y
) 
1358     wxCHECK_RET( m_caret
, "no caret to move" ); 
1360     m_caret
->Move(x
, y
); 
1363 void wxWindow::GetCaretPos(int *x
, int *y
) const 
1365     wxCHECK_RET( m_caret
, "no caret to get position of" ); 
1367     m_caret
->GetPosition(x
, y
); 
1369 #endif // wxUSE_CARET 
1371 // =========================================================================== 
1372 // pre/post message processing 
1373 // =========================================================================== 
1375 long wxWindow::MSWDefWindowProc(WXUINT nMsg
, WXWPARAM wParam
, WXLPARAM lParam
) 
1378         return ::CallWindowProc(CASTWNDPROC m_oldWndProc
, GetHwnd(), (UINT
) nMsg
, (WPARAM
) wParam
, (LPARAM
) lParam
); 
1380         return ::DefWindowProc(GetHwnd(), nMsg
, wParam
, lParam
); 
1383 bool wxWindow::MSWProcessMessage(WXMSG
* pMsg
) 
1385     if ( m_hWnd 
!= 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL
) ) 
1387         // intercept dialog navigation keys 
1388         MSG 
*msg 
= (MSG 
*)pMsg
; 
1389         bool bProcess 
= TRUE
; 
1390         if ( msg
->message 
!= WM_KEYDOWN 
) 
1393         if ( bProcess 
&& (HIWORD(msg
->lParam
) & KF_ALTDOWN
) == KF_ALTDOWN 
) 
1398             bool bCtrlDown 
= (::GetKeyState(VK_CONTROL
) & 0x100) != 0; 
1399             bool bShiftDown 
= (::GetKeyState(VK_SHIFT
) & 0x100) != 0; 
1401             // WM_GETDLGCODE: ask the control if it wants the key for itself, 
1402             // don't process it if it's the case (except for Ctrl-Tab/Enter 
1403             // combinations which are always processed) 
1407                 lDlgCode 
= ::SendMessage(msg
->hwnd
, WM_GETDLGCODE
, 0, 0); 
1410             bool bForward 
= TRUE
, 
1411                  bWindowChange 
= FALSE
; 
1413             switch ( msg
->wParam 
) 
1416                     // assume that nobody wants Shift-TAB for himself - if we 
1417                     // don't do it there is no easy way for a control to grab 
1418                     // TABs but still let Shift-TAB work as navugation key 
1419                     if ( (lDlgCode 
& DLGC_WANTTAB
) && !bShiftDown 
) { 
1423                         // Ctrl-Tab cycles thru notebook pages 
1424                         bWindowChange 
= bCtrlDown
; 
1425                         bForward 
= !bShiftDown
; 
1431                     if ( (lDlgCode 
& DLGC_WANTARROWS
) || bCtrlDown 
) 
1439                     if ( (lDlgCode 
& DLGC_WANTARROWS
) || bCtrlDown 
) 
1445                         if ( (lDlgCode 
& DLGC_WANTMESSAGE
) && !bCtrlDown 
) 
1447                             // control wants to process Enter itself, don't 
1448                             // call IsDialogMessage() which would interpret 
1452                         else if ( lDlgCode 
& DLGC_BUTTON 
) 
1454                             // buttons want process Enter themselevs 
1457                         // else: but if it does not it makes sense to make it 
1458                         //       work like a TAB - and that's what we do. 
1459                         //       Note that Ctrl-Enter always works this way. 
1469                 wxNavigationKeyEvent event
; 
1470                 event
.SetDirection(bForward
); 
1471                 event
.SetWindowChange(bWindowChange
); 
1472                 event
.SetEventObject(this); 
1474                 if ( GetEventHandler()->ProcessEvent(event
) ) 
1476                     wxButton 
*btn 
= wxDynamicCast(FindFocus(), wxButton
); 
1479                         // the button which has focus should be default 
1488         if ( ::IsDialogMessage(GetHwnd(), msg
) ) 
1495         // relay mouse move events to the tooltip control 
1496         MSG 
*msg 
= (MSG 
*)pMsg
; 
1497         if ( msg
->message 
== WM_MOUSEMOVE 
) 
1498             m_tooltip
->RelayEvent(pMsg
); 
1500 #endif // wxUSE_TOOLTIPS 
1505 bool wxWindow::MSWTranslateMessage(WXMSG
* pMsg
) 
1507     return m_acceleratorTable
.Ok() && 
1508            ::TranslateAccelerator(GetHwnd(), 
1509                                   GetTableHaccel(m_acceleratorTable
), 
1513 // --------------------------------------------------------------------------- 
1514 // message params unpackers (different for Win16 and Win32) 
1515 // --------------------------------------------------------------------------- 
1519 void wxWindow::UnpackCommand(WXWPARAM wParam
, WXLPARAM lParam
, 
1520                              WORD 
*id
, WXHWND 
*hwnd
, WORD 
*cmd
) 
1522     *id 
= LOWORD(wParam
); 
1523     *hwnd 
= (WXHWND
)lParam
; 
1524     *cmd 
= HIWORD(wParam
); 
1527 void wxWindow::UnpackActivate(WXWPARAM wParam
, WXLPARAM lParam
, 
1528                               WXWORD 
*state
, WXWORD 
*minimized
, WXHWND 
*hwnd
) 
1530     *state 
= LOWORD(wParam
); 
1531     *minimized 
= HIWORD(wParam
); 
1532     *hwnd 
= (WXHWND
)lParam
; 
1535 void wxWindow::UnpackScroll(WXWPARAM wParam
, WXLPARAM lParam
, 
1536                             WXWORD 
*code
, WXWORD 
*pos
, WXHWND 
*hwnd
) 
1538     *code 
= LOWORD(wParam
); 
1539     *pos 
= HIWORD(wParam
); 
1540     *hwnd 
= (WXHWND
)lParam
; 
1543 void wxWindow::UnpackCtlColor(WXWPARAM wParam
, WXLPARAM lParam
, 
1544                               WXWORD 
*nCtlColor
, WXHDC 
*hdc
, WXHWND 
*hwnd
) 
1546     *nCtlColor 
= CTLCOLOR_BTN
; 
1547     *hwnd 
= (WXHWND
)lParam
; 
1548     *hdc 
= (WXHDC
)wParam
; 
1551 void wxWindow::UnpackMenuSelect(WXWPARAM wParam
, WXLPARAM lParam
, 
1552                                 WXWORD 
*item
, WXWORD 
*flags
, WXHMENU 
*hmenu
) 
1554     *item 
= (WXWORD
)wParam
; 
1555     *flags 
= HIWORD(wParam
); 
1556     *hmenu 
= (WXHMENU
)lParam
; 
1561 void wxWindow::UnpackCommand(WXWPARAM wParam
, WXLPARAM lParam
, 
1562                              WXWORD 
*id
, WXHWND 
*hwnd
, WXWORD 
*cmd
) 
1564     *id 
= (WXWORD
)wParam
; 
1565     *hwnd 
= (WXHWND
)LOWORD(lParam
); 
1566     *cmd 
= HIWORD(lParam
); 
1569 void wxWindow::UnpackActivate(WXWPARAM wParam
, WXLPARAM lParam
, 
1570                               WXWORD 
*state
, WXWORD 
*minimized
, WXHWND 
*hwnd
) 
1572     *state 
= (WXWORD
)wParam
; 
1573     *minimized 
= LOWORD(lParam
); 
1574     *hwnd 
= (WXHWND
)HIWORD(lParam
); 
1577 void wxWindow::UnpackScroll(WXWPARAM wParam
, WXLPARAM lParam
, 
1578                             WXWORD 
*code
, WXWORD 
*pos
, WXHWND 
*hwnd
) 
1580     *code 
= (WXWORD
)wParam
; 
1581     *pos 
= LOWORD(lParam
); 
1582     *hwnd 
= (WXHWND
)HIWORD(lParam
); 
1585 void wxWindow::UnpackCtlColor(WXWPARAM wParam
, WXLPARAM lParam
, 
1586                               WXWORD 
*nCtlColor
, WXHDC 
*hdc
, WXHWND 
*hwnd
) 
1588     *hwnd 
= (WXHWND
)LOWORD(lParam
); 
1589     *nCtlColor 
= (int)HIWORD(lParam
); 
1590     *hdc 
= (WXHDC
)wParam
; 
1593 void wxWindow::UnpackMenuSelect(WXWPARAM wParam
, WXLPARAM lParam
, 
1594                                 WXWORD 
*item
, WXWORD 
*flags
, WXHMENU 
*hmenu
) 
1596     *item 
= (WXWORD
)wParam
; 
1597     *flags 
= LOWORD(lParam
); 
1598     *hmenu 
= (WXHMENU
)HIWORD(lParam
); 
1603 // --------------------------------------------------------------------------- 
1604 // Main wxWindows window proc and the window proc for wxWindow 
1605 // --------------------------------------------------------------------------- 
1607 // Hook for new window just as it's being created, when the window isn't yet 
1608 // associated with the handle 
1609 wxWindow 
*wxWndHook 
= NULL
; 
1612 LRESULT APIENTRY _EXPORT 
wxWndProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
) 
1614     // trace all messages - useful for the debugging 
1616     wxLogTrace(wxTraceMessages
, _T("Processing %s(wParam=%8lx, lParam=%8lx)"), 
1617                wxGetMessageName(message
), wParam
, lParam
); 
1618 #endif // __WXDEBUG__ 
1620     wxWindow 
*wnd 
= wxFindWinFromHandle((WXHWND
) hWnd
); 
1622     // when we get the first message for the HWND we just created, we associate 
1623     // it with wxWindow stored in wxWndHook 
1624     if ( !wnd 
&& wxWndHook 
) 
1626         wxAssociateWinWithHandle(hWnd
, wxWndHook
); 
1629         wnd
->SetHWND((WXHWND
)hWnd
); 
1634     // Stop right here if we don't have a valid handle in our wxWindow object. 
1635     if ( wnd 
&& !wnd
->GetHWND() ) 
1637         // FIXME: why do we do this? 
1638         wnd
->SetHWND((WXHWND
) hWnd
); 
1639         rc 
= wnd
->MSWDefWindowProc(message
, wParam
, lParam 
); 
1645             rc 
= wnd
->MSWWindowProc(message
, wParam
, lParam
); 
1647             rc 
= DefWindowProc( hWnd
, message
, wParam
, lParam 
); 
1653 long wxWindow::MSWWindowProc(WXUINT message
, WXWPARAM wParam
, WXLPARAM lParam
) 
1655     // did we process the message? 
1656     bool processed 
= FALSE
; 
1667     // for most messages we should return 0 when we do process the message 
1675                 processed 
= HandleCreate((WXLPCREATESTRUCT
)lParam
, &mayCreate
); 
1678                     // return 0 to allow window creation 
1679                     rc
.result 
= mayCreate 
? 0 : -1; 
1685             processed 
= HandleDestroy(); 
1689             processed 
= HandleMove(LOWORD(lParam
), HIWORD(lParam
)); 
1693             processed 
= HandleSize(LOWORD(lParam
), HIWORD(lParam
), wParam
); 
1698                 WXWORD state
, minimized
; 
1700                 UnpackActivate(wParam
, lParam
, &state
, &minimized
, &hwnd
); 
1702                 processed 
= HandleActivate(state
, minimized 
!= 0, (WXHWND
)hwnd
); 
1707             processed 
= HandleSetFocus((WXHWND
)(HWND
)wParam
); 
1711             processed 
= HandleKillFocus((WXHWND
)(HWND
)wParam
); 
1715             processed 
= HandlePaint(); 
1719             // don't let the DefWindowProc() destroy our window - we'll do it 
1720             // ourselves in ~wxWindow 
1726             processed 
= HandleShow(wParam 
!= 0, (int)lParam
); 
1730         case WM_LBUTTONDOWN
: 
1732         case WM_LBUTTONDBLCLK
: 
1733         case WM_RBUTTONDOWN
: 
1735         case WM_RBUTTONDBLCLK
: 
1736         case WM_MBUTTONDOWN
: 
1738         case WM_MBUTTONDBLCLK
: 
1740                 int x 
= LOWORD(lParam
); 
1741                 int y 
= HIWORD(lParam
); 
1743                 processed 
= HandleMouseEvent(message
, x
, y
, wParam
); 
1751         case MM_JOY1BUTTONDOWN
: 
1752         case MM_JOY2BUTTONDOWN
: 
1753         case MM_JOY1BUTTONUP
: 
1754         case MM_JOY2BUTTONUP
: 
1756                 int x 
= LOWORD(lParam
); 
1757                 int y 
= HIWORD(lParam
); 
1759                 processed 
= HandleJoystickEvent(message
, x
, y
, wParam
); 
1764             processed 
= HandleSysCommand(wParam
, lParam
); 
1771                 UnpackCommand(wParam
, lParam
, &id
, &hwnd
, &cmd
); 
1773                 processed 
= HandleCommand(id
, cmd
, hwnd
); 
1779             processed 
= HandleNotify((int)wParam
, lParam
, &rc
.result
); 
1783             // for these messages we must return TRUE if process the message 
1785         case WM_MEASUREITEM
: 
1787                 int idCtrl 
= (UINT
)wParam
; 
1788                 if ( message 
== WM_DRAWITEM 
) 
1790                     processed 
= MSWOnDrawItem(idCtrl
, 
1791                                               (WXDRAWITEMSTRUCT 
*)lParam
); 
1795                     processed 
= MSWOnMeasureItem(idCtrl
, 
1796                                                  (WXMEASUREITEMSTRUCT 
*)lParam
); 
1807                 rc
.result 
= m_lDlgCode
; 
1810             //else: get the dlg code from the DefWindowProc() 
1814             // If this has been processed by an event handler, 
1815             // return 0 now (we've handled it). 
1816             if ( HandleKeyDown((WORD
) wParam
, lParam
) ) 
1823             // we consider these message "not interesting" to OnChar 
1824             if ( wParam 
== VK_SHIFT 
|| wParam 
== VK_CONTROL 
) 
1833                 // avoid duplicate messages to OnChar for these ASCII keys: they 
1834                 // will be translated by TranslateMessage() and received in WM_CHAR 
1840                     // but set processed to FALSE, not TRUE to still pass them to 
1841                     // the control's default window proc - otherwise built-in 
1842                     // keyboard handling won't work 
1848                 // special case of VK_APPS: treat it the same as right mouse 
1849                 // click because both usually pop up a context menu 
1852                         // construct the key mask 
1853                         WPARAM fwKeys 
= MK_RBUTTON
; 
1854                         if ( (::GetKeyState(VK_CONTROL
) & 0x100) != 0 ) 
1855                             fwKeys 
|= MK_CONTROL
; 
1856                         if ( (::GetKeyState(VK_SHIFT
) & 0x100) != 0 ) 
1859                         // simulate right mouse button click 
1860                         DWORD dwPos 
= ::GetMessagePos(); 
1861                         int x 
= GET_X_LPARAM(dwPos
), 
1862                             y 
= GET_Y_LPARAM(dwPos
); 
1864                         ScreenToClient(&x
, &y
); 
1865                         processed 
= HandleMouseEvent(WM_RBUTTONDOWN
, x
, y
, fwKeys
); 
1875                     processed 
= HandleChar((WORD
)wParam
, lParam
); 
1880             processed 
= HandleKeyUp((WORD
) wParam
, lParam
); 
1883         case WM_CHAR
: // Always an ASCII character 
1884             processed 
= HandleChar((WORD
)wParam
, lParam
, TRUE
); 
1892                 UnpackScroll(wParam
, lParam
, &code
, &pos
, &hwnd
); 
1894                 processed 
= MSWOnScroll(message 
== WM_HSCROLL 
? wxHORIZONTAL
 
1900         // CTLCOLOR messages are sent by children to query the parent for their 
1903         case WM_CTLCOLORMSGBOX
: 
1904         case WM_CTLCOLOREDIT
: 
1905         case WM_CTLCOLORLISTBOX
: 
1906         case WM_CTLCOLORBTN
: 
1907         case WM_CTLCOLORDLG
: 
1908         case WM_CTLCOLORSCROLLBAR
: 
1909         case WM_CTLCOLORSTATIC
: 
1917                 UnpackCtlColor(wParam
, lParam
, &nCtlColor
, &hdc
, &hwnd
); 
1919                 processed 
= HandleCtlColor(&rc
.hBrush
, 
1929             // the return value for this message is ignored 
1930         case WM_SYSCOLORCHANGE
: 
1931             processed 
= HandleSysColorChange(); 
1934         case WM_PALETTECHANGED
: 
1935             processed 
= HandlePaletteChanged((WXHWND
) (HWND
) wParam
); 
1938         case WM_QUERYNEWPALETTE
: 
1939             processed 
= HandleQueryNewPalette(); 
1943             processed 
= HandleEraseBkgnd((WXHDC
)(HDC
)wParam
); 
1946                 // we processed the message, i.e. erased the background 
1952             processed 
= HandleDropFiles(wParam
); 
1956             processed 
= HandleInitDialog((WXHWND
)(HWND
)wParam
); 
1960                 // we never set focus from here 
1965         case WM_QUERYENDSESSION
: 
1966             processed 
= HandleQueryEndSession(lParam
, &rc
.allow
); 
1970             processed 
= HandleEndSession(wParam 
!= 0, lParam
); 
1973         case WM_GETMINMAXINFO
: 
1974             processed 
= HandleGetMinMaxInfo((MINMAXINFO
*)lParam
); 
1978             processed 
= HandleSetCursor((WXHWND
)(HWND
)wParam
, 
1979                                         LOWORD(lParam
),     // hit test 
1980                                         HIWORD(lParam
));    // mouse msg 
1984                 // returning TRUE stops the DefWindowProc() from further 
1985                 // processing this message - exactly what we need because we've 
1986                 // just set the cursor. 
1995         wxLogTrace(wxTraceMessages
, _T("Forwarding %s to DefWindowProc."), 
1996                    wxGetMessageName(message
)); 
1997 #endif // __WXDEBUG__ 
1998         rc
.result 
= MSWDefWindowProc(message
, wParam
, lParam
); 
2004 // Dialog window proc 
2005 LONG APIENTRY _EXPORT
 
2006 wxDlgProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
) 
2008     if ( message 
== WM_INITDIALOG 
) 
2010         // for this message, returning TRUE tells system to set focus to the 
2011         // first control in the dialog box 
2016         // for all the other ones, FALSE means that we didn't process the 
2022 wxList 
*wxWinHandleList 
= NULL
; 
2023 wxWindow 
*wxFindWinFromHandle(WXHWND hWnd
) 
2025     wxNode 
*node 
= wxWinHandleList
->Find((long)hWnd
); 
2028     return (wxWindow 
*)node
->Data(); 
2031 void wxAssociateWinWithHandle(HWND hWnd
, wxWindow 
*win
) 
2033     // adding NULL hWnd is (first) surely a result of an error and 
2034     // (secondly) breaks menu command processing 
2035     wxCHECK_RET( hWnd 
!= (HWND
)NULL
, 
2036                  _T("attempt to add a NULL hWnd to window list ignored") ); 
2038     if ( !wxWinHandleList
->Find((long)hWnd
) ) 
2039         wxWinHandleList
->Append((long)hWnd
, win
); 
2042 void wxRemoveHandleAssociation(wxWindow 
*win
) 
2044     wxWinHandleList
->DeleteObject(win
); 
2047 // Default destroyer - override if you destroy it in some other way 
2048 // (e.g. with MDI child windows) 
2049 void wxWindow::MSWDestroyWindow() 
2053 void wxWindow::MSWDetachWindowMenu() 
2057         HMENU hMenu 
= (HMENU
)m_hMenu
; 
2059         int N 
= ::GetMenuItemCount(hMenu
); 
2061         for (i 
= 0; i 
< N
; i
++) 
2064             int chars 
= GetMenuString(hMenu
, i
, buf
, 100, MF_BYPOSITION
); 
2067                 wxLogLastError(_T("GetMenuString")); 
2072             if ( wxStrcmp(buf
, _T("&Window")) == 0 ) 
2074                 RemoveMenu(hMenu
, i
, MF_BYPOSITION
); 
2082 bool wxWindow::MSWCreate(int id
, 
2084                          const wxChar 
*wclass
, 
2086                          const wxChar 
*title
, 
2092                          const wxChar 
*dialog_template
, 
2093                          WXDWORD extendedStyle
) 
2095     int x1 
= CW_USEDEFAULT
; 
2097     int width1 
= CW_USEDEFAULT
; 
2100     // Find parent's size, if it exists, to set up a possible default 
2101     // panel size the size of the parent window 
2105         ::GetClientRect((HWND
) parent
->GetHWND(), &parent_rect
); 
2107         width1 
= parent_rect
.right 
- parent_rect
.left
; 
2108         height1 
= parent_rect
.bottom 
- parent_rect
.top
; 
2111     if ( x 
> -1 ) x1 
= x
; 
2112     if ( y 
> -1 ) y1 
= y
; 
2113     if ( width 
> -1 ) width1 
= width
; 
2114     if ( height 
> -1 ) height1 
= height
; 
2117     HWND hParent 
= (HWND
)NULL
; 
2119     HWND hParent 
= NULL
; 
2122         hParent 
= (HWND
) parent
->GetHWND(); 
2126     if ( dialog_template 
) 
2128         m_hWnd 
= (WXHWND
)::CreateDialog(wxGetInstance(), 
2131                                         (DLGPROC
)wxDlgProc
); 
2135             wxLogError(_("Can't find dummy dialog template!\n" 
2136                          "Check resource include path for finding wx.rc.")); 
2141         // ::SetWindowLong(GWL_EXSTYLE) doesn't work for the dialogs, so try 
2142         // to take care of (at least some) extended style flags ourselves 
2143         if ( extendedStyle 
& WS_EX_TOPMOST 
) 
2145             if ( !::SetWindowPos(GetHwnd(), HWND_TOPMOST
, 0, 0, 0, 0, 
2146                                  SWP_NOSIZE 
| SWP_NOMOVE
) ) 
2148                 wxLogLastError(_T("SetWindowPos")); 
2152         // move the dialog to its initial position without forcing repainting 
2153         if ( !::MoveWindow(GetHwnd(), x1
, y1
, width1
, height1
, FALSE
) ) 
2155             wxLogLastError(_T("MoveWindow")); 
2161         if ( style 
& WS_CHILD 
) 
2164         m_hWnd 
= (WXHWND
)CreateWindowEx(extendedStyle
, 
2166                                         title 
? title 
: _T(""), 
2170                                         hParent
, (HMENU
)controlId
, 
2176             wxLogError(_("Can't create window of class %s!\n" 
2177                          "Possible Windows 3.x compatibility problem?"), 
2185     wxWinHandleList
->Append((long)m_hWnd
, this); 
2190 // =========================================================================== 
2191 // MSW message handlers 
2192 // =========================================================================== 
2194 // --------------------------------------------------------------------------- 
2196 // --------------------------------------------------------------------------- 
2199 // FIXME: VZ: I'm not sure at all that the order of processing is correct 
2200 bool wxWindow::HandleNotify(int idCtrl
, WXLPARAM lParam
, WXLPARAM 
*result
) 
2202     LPNMHDR hdr 
= (LPNMHDR
)lParam
; 
2203     HWND hWnd 
= hdr
->hwndFrom
; 
2204     wxWindow 
*win 
= wxFindWinFromHandle((WXHWND
)hWnd
); 
2206     // is this one of our windows? 
2209         return win
->MSWOnNotify(idCtrl
, lParam
, result
); 
2212     // try all our children 
2213     wxWindowList::Node 
*node 
= GetChildren().GetFirst(); 
2216         wxWindow 
*child 
= node
->GetData(); 
2217         if ( child
->MSWOnNotify(idCtrl
, lParam
, result
) ) 
2224         node 
= node
->GetNext(); 
2227     // finally try this window too (catches toolbar case) 
2228     return MSWOnNotify(idCtrl
, lParam
, result
); 
2231 bool wxWindow::MSWOnNotify(int WXUNUSED(idCtrl
), 
2233                            WXLPARAM
* WXUNUSED(result
)) 
2236     NMHDR
* hdr 
= (NMHDR 
*)lParam
; 
2237     if ( hdr
->code 
== TTN_NEEDTEXT 
&& m_tooltip 
) 
2239         TOOLTIPTEXT 
*ttt 
= (TOOLTIPTEXT 
*)lParam
; 
2240         ttt
->lpszText 
= (wxChar 
*)m_tooltip
->GetTip().c_str(); 
2245 #endif // wxUSE_TOOLTIPS 
2251 // --------------------------------------------------------------------------- 
2252 // end session messages 
2253 // --------------------------------------------------------------------------- 
2255 bool wxWindow::HandleQueryEndSession(long logOff
, bool *mayEnd
) 
2257     wxCloseEvent 
event(wxEVT_QUERY_END_SESSION
, -1); 
2258     event
.SetEventObject(wxTheApp
); 
2259     event
.SetCanVeto(TRUE
); 
2260     event
.SetLoggingOff(logOff 
== ENDSESSION_LOGOFF
); 
2262     bool rc 
= wxTheApp
->ProcessEvent(event
); 
2266         // we may end only if the app didn't veto session closing (double 
2268         *mayEnd 
= !event
.GetVeto(); 
2274 bool wxWindow::HandleEndSession(bool endSession
, long logOff
) 
2276     // do nothing if the session isn't ending 
2280     wxCloseEvent 
event(wxEVT_END_SESSION
, -1); 
2281     event
.SetEventObject(wxTheApp
); 
2282     event
.SetCanVeto(FALSE
); 
2283     event
.SetLoggingOff( (logOff 
== ENDSESSION_LOGOFF
) ); 
2284     if ( (this == wxTheApp
->GetTopWindow()) && // Only send once 
2285         wxTheApp
->ProcessEvent(event
)) 
2291 // --------------------------------------------------------------------------- 
2292 // window creation/destruction 
2293 // --------------------------------------------------------------------------- 
2295 bool wxWindow::HandleCreate(WXLPCREATESTRUCT cs
, bool *mayCreate
) 
2297     // TODO: should generate this event from WM_NCCREATE 
2298     wxWindowCreateEvent 
event(this); 
2299     (void)GetEventHandler()->ProcessEvent(event
); 
2306 bool wxWindow::HandleDestroy() 
2308     wxWindowDestroyEvent 
event(this); 
2309     (void)GetEventHandler()->ProcessEvent(event
); 
2311     // delete our drop target if we've got one 
2312 #if wxUSE_DRAG_AND_DROP 
2313     if ( m_dropTarget 
!= NULL 
) 
2315         m_dropTarget
->Revoke(m_hWnd
); 
2317         delete m_dropTarget
; 
2318         m_dropTarget 
= NULL
; 
2320 #endif // wxUSE_DRAG_AND_DROP 
2322     // WM_DESTROY handled 
2326 // --------------------------------------------------------------------------- 
2328 // --------------------------------------------------------------------------- 
2330 bool wxWindow::HandleActivate(int state
, 
2331                               bool WXUNUSED(minimized
), 
2332                               WXHWND 
WXUNUSED(activate
)) 
2334     wxActivateEvent 
event(wxEVT_ACTIVATE
, 
2335                           (state 
== WA_ACTIVE
) || (state 
== WA_CLICKACTIVE
), 
2337     event
.SetEventObject(this); 
2339     return GetEventHandler()->ProcessEvent(event
); 
2342 bool wxWindow::HandleSetFocus(WXHWND 
WXUNUSED(hwnd
)) 
2348         m_caret
->OnSetFocus(); 
2350 #endif // wxUSE_CARET 
2352     // panel wants to track the window which was the last to have focus in it 
2353     wxPanel 
*panel 
= wxDynamicCast(GetParent(), wxPanel
); 
2356         panel
->SetLastFocus(this); 
2359     wxFocusEvent 
event(wxEVT_SET_FOCUS
, m_windowId
); 
2360     event
.SetEventObject(this); 
2362     return GetEventHandler()->ProcessEvent(event
); 
2365 bool wxWindow::HandleKillFocus(WXHWND 
WXUNUSED(hwnd
)) 
2371         m_caret
->OnKillFocus(); 
2373 #endif // wxUSE_CARET 
2375     wxFocusEvent 
event(wxEVT_KILL_FOCUS
, m_windowId
); 
2376     event
.SetEventObject(this); 
2378     return GetEventHandler()->ProcessEvent(event
); 
2381 // --------------------------------------------------------------------------- 
2383 // --------------------------------------------------------------------------- 
2385 bool wxWindow::HandleShow(bool show
, int status
) 
2387     wxShowEvent 
event(GetId(), show
); 
2388     event
.m_eventObject 
= this; 
2390     return GetEventHandler()->ProcessEvent(event
); 
2393 bool wxWindow::HandleInitDialog(WXHWND 
WXUNUSED(hWndFocus
)) 
2395     wxInitDialogEvent 
event(GetId()); 
2396     event
.m_eventObject 
= this; 
2398     return GetEventHandler()->ProcessEvent(event
); 
2401 bool wxWindow::HandleDropFiles(WXWPARAM wParam
) 
2403     HDROP hFilesInfo 
= (HDROP
) wParam
; 
2405     DragQueryPoint(hFilesInfo
, (LPPOINT
) &dropPoint
); 
2407     // Get the total number of files dropped 
2408     WORD gwFilesDropped 
= (WORD
)DragQueryFile ((HDROP
)hFilesInfo
, 
2413     wxString 
*files 
= new wxString
[gwFilesDropped
]; 
2415     for (wIndex
=0; wIndex 
< (int)gwFilesDropped
; wIndex
++) 
2417         DragQueryFile (hFilesInfo
, wIndex
, (LPTSTR
) wxBuffer
, 1000); 
2418         files
[wIndex
] = wxBuffer
; 
2420     DragFinish (hFilesInfo
); 
2422     wxDropFilesEvent 
event(wxEVT_DROP_FILES
, gwFilesDropped
, files
); 
2423     event
.m_eventObject 
= this; 
2424     event
.m_pos
.x 
= dropPoint
.x
; event
.m_pos
.x 
= dropPoint
.y
; 
2426     bool rc 
= GetEventHandler()->ProcessEvent(event
); 
2433 bool wxWindow::HandleSetCursor(WXHWND hWnd
, 
2435                                int WXUNUSED(mouseMsg
)) 
2437     // don't set cursor for other windows, only for this one: this prevents 
2438     // children of this window from getting the same cursor as the parent has 
2439     // (don't forget that this message is propagated by default up the window 
2440     // parent-child hierarchy) 
2441     if ( GetHWND() == hWnd 
) 
2443         // don't set cursor when the mouse is not in the client part 
2444         if ( nHitTest 
== HTCLIENT 
|| nHitTest 
== HTERROR 
) 
2446             HCURSOR hcursor 
= 0; 
2449                 // from msw\utils.cpp 
2450                 extern HCURSOR gs_wxBusyCursor
; 
2452                 hcursor 
= gs_wxBusyCursor
; 
2456                 wxCursor 
*cursor 
= NULL
; 
2458                 if ( m_cursor
.Ok() ) 
2464                     // from msw\data.cpp 
2465                     extern wxCursor 
*g_globalCursor
; 
2467                     if ( g_globalCursor 
&& g_globalCursor
->Ok() ) 
2468                         cursor 
= g_globalCursor
; 
2472                     hcursor 
= (HCURSOR
)cursor
->GetHCURSOR(); 
2477                 ::SetCursor(hcursor
); 
2487 // --------------------------------------------------------------------------- 
2488 // owner drawn stuff 
2489 // --------------------------------------------------------------------------- 
2491 bool wxWindow::MSWOnDrawItem(int id
, WXDRAWITEMSTRUCT 
*itemStruct
) 
2493 #if wxUSE_OWNER_DRAWN 
2494     // is it a menu item? 
2497         DRAWITEMSTRUCT 
*pDrawStruct 
= (DRAWITEMSTRUCT 
*)itemStruct
; 
2498         wxMenuItem 
*pMenuItem 
= (wxMenuItem 
*)(pDrawStruct
->itemData
); 
2500         wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE 
); 
2502         // prepare to call OnDrawItem() 
2504         dc
.SetHDC((WXHDC
)pDrawStruct
->hDC
, FALSE
); 
2505         wxRect 
rect(pDrawStruct
->rcItem
.left
, pDrawStruct
->rcItem
.top
, 
2506                     pDrawStruct
->rcItem
.right 
- pDrawStruct
->rcItem
.left
, 
2507                     pDrawStruct
->rcItem
.bottom 
- pDrawStruct
->rcItem
.top
); 
2509         return pMenuItem
->OnDrawItem
 
2512                             (wxOwnerDrawn::wxODAction
)pDrawStruct
->itemAction
, 
2513                             (wxOwnerDrawn::wxODStatus
)pDrawStruct
->itemState
 
2517     wxWindow 
*item 
= FindItem(id
); 
2518     if ( item 
&& item
->IsKindOf(CLASSINFO(wxControl
)) ) 
2520         return ((wxControl 
*)item
)->MSWOnDraw(itemStruct
); 
2528 bool wxWindow::MSWOnMeasureItem(int id
, WXMEASUREITEMSTRUCT 
*itemStruct
) 
2530 #if wxUSE_OWNER_DRAWN 
2531     // is it a menu item? 
2534         MEASUREITEMSTRUCT 
*pMeasureStruct 
= (MEASUREITEMSTRUCT 
*)itemStruct
; 
2535         wxMenuItem 
*pMenuItem 
= (wxMenuItem 
*)(pMeasureStruct
->itemData
); 
2537         wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE 
); 
2539         return pMenuItem
->OnMeasureItem(&pMeasureStruct
->itemWidth
, 
2540                                         &pMeasureStruct
->itemHeight
); 
2543     wxWindow 
*item 
= FindItem(id
); 
2544     if ( item 
&& item
->IsKindOf(CLASSINFO(wxControl
)) ) 
2546         return ((wxControl 
*)item
)->MSWOnMeasure(itemStruct
); 
2548 #endif  // owner-drawn menus 
2552 // --------------------------------------------------------------------------- 
2553 // colours and palettes 
2554 // --------------------------------------------------------------------------- 
2556 bool wxWindow::HandleSysColorChange() 
2558     wxSysColourChangedEvent event
; 
2559     event
.SetEventObject(this); 
2561     return GetEventHandler()->ProcessEvent(event
); 
2564 bool wxWindow::HandleCtlColor(WXHBRUSH 
*brush
, 
2572     WXHBRUSH hBrush 
= 0; 
2574     if ( nCtlColor 
== CTLCOLOR_DLG 
) 
2576         hBrush 
= OnCtlColor(pDC
, pWnd
, nCtlColor
, message
, wParam
, lParam
); 
2580         wxControl 
*item 
= (wxControl 
*)FindItemByHWND(pWnd
, TRUE
); 
2582             hBrush 
= item
->OnCtlColor(pDC
, pWnd
, nCtlColor
, message
, wParam
, lParam
); 
2591 // Define for each class of dialog and control 
2592 WXHBRUSH 
wxWindow::OnCtlColor(WXHDC hDC
, 
2602 bool wxWindow::HandlePaletteChanged(WXHWND hWndPalChange
) 
2604     wxPaletteChangedEvent 
event(GetId()); 
2605     event
.SetEventObject(this); 
2606     event
.SetChangedWindow(wxFindWinFromHandle(hWndPalChange
)); 
2608     return GetEventHandler()->ProcessEvent(event
); 
2611 bool wxWindow::HandleQueryNewPalette() 
2613     wxQueryNewPaletteEvent 
event(GetId()); 
2614     event
.SetEventObject(this); 
2616     return GetEventHandler()->ProcessEvent(event
) && event
.GetPaletteRealized(); 
2619 // Responds to colour changes: passes event on to children. 
2620 void wxWindow::OnSysColourChanged(wxSysColourChangedEvent
& event
) 
2622     wxNode 
*node 
= GetChildren().First(); 
2625         // Only propagate to non-top-level windows 
2626         wxWindow 
*win 
= (wxWindow 
*)node
->Data(); 
2627         if ( win
->GetParent() ) 
2629             wxSysColourChangedEvent event2
; 
2630             event
.m_eventObject 
= win
; 
2631             win
->GetEventHandler()->ProcessEvent(event2
); 
2634         node 
= node
->Next(); 
2638 // --------------------------------------------------------------------------- 
2640 // --------------------------------------------------------------------------- 
2642 bool wxWindow::HandlePaint() 
2645     HRGN hRegion 
= ::CreateRectRgn(0, 0, 0, 0); // Dummy call to get a handle 
2647         wxLogLastError("CreateRectRgn"); 
2648     if ( ::GetUpdateRgn(GetHwnd(), hRegion
, FALSE
) == ERROR 
) 
2649         wxLogLastError("GetUpdateRgn"); 
2651     m_updateRegion 
= wxRegion((WXHRGN
) hRegion
); 
2654     ::GetUpdateRect(GetHwnd(), & updateRect
, FALSE
); 
2656     m_updateRegion 
= wxRegion(updateRect
.left
, updateRect
.top
, 
2657                               updateRect
.right 
- updateRect
.left
, 
2658                               updateRect
.bottom 
- updateRect
.top
); 
2661     wxPaintEvent 
event(m_windowId
); 
2662     event
.SetEventObject(this); 
2664     return GetEventHandler()->ProcessEvent(event
); 
2667 bool wxWindow::HandleEraseBkgnd(WXHDC hdc
) 
2669     // Prevents flicker when dragging 
2670     if ( ::IsIconic(GetHwnd()) ) 
2679     wxEraseEvent 
event(m_windowId
, &dc
); 
2680     event
.SetEventObject(this); 
2681     bool rc 
= GetEventHandler()->ProcessEvent(event
); 
2684     dc
.SelectOldObjects(hdc
); 
2685     dc
.SetHDC((WXHDC
) NULL
); 
2690 void wxWindow::OnEraseBackground(wxEraseEvent
& event
) 
2693     ::GetClientRect(GetHwnd(), &rect
); 
2695     COLORREF ref 
= PALETTERGB(m_backgroundColour
.Red(), 
2696                               m_backgroundColour
.Green(), 
2697                               m_backgroundColour
.Blue()); 
2698     HBRUSH hBrush 
= ::CreateSolidBrush(ref
); 
2700         wxLogLastError("CreateSolidBrush"); 
2702     HDC hdc 
= (HDC
)event
.GetDC()->GetHDC(); 
2704     int mode 
= ::SetMapMode(hdc
, MM_TEXT
); 
2706     ::FillRect(hdc
, &rect
, hBrush
); 
2707     ::DeleteObject(hBrush
); 
2708     ::SetMapMode(hdc
, mode
); 
2711 // --------------------------------------------------------------------------- 
2712 // moving and resizing 
2713 // --------------------------------------------------------------------------- 
2715 bool wxWindow::HandleMinimize() 
2717     wxIconizeEvent 
event(m_windowId
); 
2718     event
.SetEventObject(this); 
2720     return GetEventHandler()->ProcessEvent(event
); 
2723 bool wxWindow::HandleMaximize() 
2725     wxMaximizeEvent 
event(m_windowId
); 
2726     event
.SetEventObject(this); 
2728     return GetEventHandler()->ProcessEvent(event
); 
2731 bool wxWindow::HandleMove(int x
, int y
) 
2733     wxMoveEvent 
event(wxPoint(x
, y
), m_windowId
); 
2734     event
.SetEventObject(this); 
2736     return GetEventHandler()->ProcessEvent(event
); 
2739 bool wxWindow::HandleSize(int w
, int h
, WXUINT 
WXUNUSED(flag
)) 
2741     wxSizeEvent 
event(wxSize(w
, h
), m_windowId
); 
2742     event
.SetEventObject(this); 
2744     return GetEventHandler()->ProcessEvent(event
); 
2747 bool wxWindow::HandleGetMinMaxInfo(void *mmInfo
) 
2749     MINMAXINFO 
*info 
= (MINMAXINFO 
*)mmInfo
; 
2753     if ( m_minWidth 
!= -1 ) 
2755         info
->ptMinTrackSize
.x 
= m_minWidth
; 
2759     if ( m_minHeight 
!= -1 ) 
2761         info
->ptMinTrackSize
.y 
= m_minHeight
; 
2765     if ( m_maxWidth 
!= -1 ) 
2767         info
->ptMaxTrackSize
.x 
= m_maxWidth
; 
2771     if ( m_maxHeight 
!= -1 ) 
2773         info
->ptMaxTrackSize
.y 
= m_maxHeight
; 
2780 // --------------------------------------------------------------------------- 
2782 // --------------------------------------------------------------------------- 
2784 bool wxWindow::HandleCommand(WXWORD id
, WXWORD cmd
, WXHWND control
) 
2786     if ( wxCurrentPopupMenu 
) 
2788         wxMenu 
*popupMenu 
= wxCurrentPopupMenu
; 
2789         wxCurrentPopupMenu 
= NULL
; 
2791         return popupMenu
->MSWCommand(cmd
, id
); 
2794     wxWindow 
*win 
= FindItem(id
); 
2797         win 
= wxFindWinFromHandle(control
); 
2801         return win
->MSWCommand(cmd
, id
); 
2806 bool wxWindow::HandleSysCommand(WXWPARAM wParam
, WXLPARAM lParam
) 
2808     // 4 bits are reserved 
2809     switch ( wParam 
& 0xFFFFFFF0 ) 
2812             return HandleMaximize(); 
2815             return HandleMinimize(); 
2821 // --------------------------------------------------------------------------- 
2823 // --------------------------------------------------------------------------- 
2825 void wxWindow::InitMouseEvent(wxMouseEvent
& event
, int x
, int y
, WXUINT flags
) 
2829     event
.m_shiftDown 
= ((flags 
& MK_SHIFT
) != 0); 
2830     event
.m_controlDown 
= ((flags 
& MK_CONTROL
) != 0); 
2831     event
.m_leftDown 
= ((flags 
& MK_LBUTTON
) != 0); 
2832     event
.m_middleDown 
= ((flags 
& MK_MBUTTON
) != 0); 
2833     event
.m_rightDown 
= ((flags 
& MK_RBUTTON
) != 0); 
2834     event
.SetTimestamp(s_currentMsg
.time
); 
2835     event
.m_eventObject 
= this; 
2837 #if wxUSE_MOUSEEVENT_HACK 
2840     m_lastMouseEvent 
= event
.GetEventType(); 
2841 #endif // wxUSE_MOUSEEVENT_HACK 
2845 bool wxWindow::HandleMouseEvent(WXUINT msg
, int x
, int y
, WXUINT flags
) 
2847     // the mouse events take consecutive IDs from WM_MOUSEFIRST to 
2848     // WM_MOUSELAST, so it's enough to substract WM_MOUSEMOVE == WM_MOUSEFIRST 
2849     // from the message id and take the value in the table to get wxWin event 
2851     static const wxEventType eventsMouse
[] = 
2865     wxMouseEvent 
event(eventsMouse
[msg 
- WM_MOUSEMOVE
]); 
2866     InitMouseEvent(event
, x
, y
, flags
); 
2868     return GetEventHandler()->ProcessEvent(event
); 
2871 bool wxWindow::HandleMouseMove(int x
, int y
, WXUINT flags
) 
2873     if ( !m_mouseInWindow 
) 
2875         // Generate an ENTER event 
2876         m_mouseInWindow 
= TRUE
; 
2878         wxMouseEvent 
event(wxEVT_ENTER_WINDOW
); 
2879         InitMouseEvent(event
, x
, y
, flags
); 
2881         (void)GetEventHandler()->ProcessEvent(event
); 
2884 #if wxUSE_MOUSEEVENT_HACK 
2885     // Window gets a click down message followed by a mouse move message even 
2886     // if position isn't changed!  We want to discard the trailing move event 
2887     // if x and y are the same. 
2888     if ( (m_lastMouseEvent 
== wxEVT_RIGHT_DOWN 
|| 
2889           m_lastMouseEvent 
== wxEVT_LEFT_DOWN 
|| 
2890           m_lastMouseEvent 
== wxEVT_MIDDLE_DOWN
) && 
2891          (m_lastMouseX 
== event
.m_x 
&& m_lastMouseY 
== event
.m_y
) ) 
2893         m_lastMouseEvent 
= wxEVT_MOTION
; 
2897 #endif // wxUSE_MOUSEEVENT_HACK 
2899     return HandleMouseEvent(WM_MOUSEMOVE
, x
, y
, flags
); 
2902 // --------------------------------------------------------------------------- 
2903 // keyboard handling 
2904 // --------------------------------------------------------------------------- 
2906 // isASCII is TRUE only when we're called from WM_CHAR handler and not from 
2908 bool wxWindow::HandleChar(WXWORD wParam
, WXLPARAM lParam
, bool isASCII
) 
2911     bool tempControlDown 
= FALSE
; 
2914         // If 1 -> 26, translate to CTRL plus a letter. 
2916         if ( (id 
> 0) && (id 
< 27) ) 
2937                     tempControlDown 
= TRUE
; 
2943     else if ( (id 
= wxCharCodeMSWToWX(wParam
)) == 0 ) { 
2944         // it's ASCII and will be processed here only when called from 
2945         // WM_CHAR (i.e. when isASCII = TRUE) 
2951         wxKeyEvent 
event(wxEVT_CHAR
); 
2952         event
.m_shiftDown 
= (::GetKeyState(VK_SHIFT
)&0x100?TRUE
:FALSE
); 
2953         event
.m_controlDown 
= (::GetKeyState(VK_CONTROL
)&0x100?TRUE
:FALSE
); 
2954         if ( (HIWORD(lParam
) & KF_ALTDOWN
) == KF_ALTDOWN 
) 
2955             event
.m_altDown 
= TRUE
; 
2957         event
.m_eventObject 
= this; 
2958         event
.m_keyCode 
= id
; 
2959         event
.SetTimestamp(s_currentMsg
.time
); 
2964         GetWindowRect(GetHwnd(),&rect
); 
2968         event
.m_x 
= pt
.x
; event
.m_y 
= pt
.y
; 
2970         if ( GetEventHandler()->ProcessEvent(event
) ) 
2979 bool wxWindow::HandleKeyDown(WXWORD wParam
, WXLPARAM lParam
) 
2983     if ( (id 
= wxCharCodeMSWToWX(wParam
)) == 0 ) { 
2989         wxKeyEvent 
event(wxEVT_KEY_DOWN
); 
2990         event
.m_shiftDown 
= (::GetKeyState(VK_SHIFT
)&0x100?TRUE
:FALSE
); 
2991         event
.m_controlDown 
= (::GetKeyState(VK_CONTROL
)&0x100?TRUE
:FALSE
); 
2992         if ( (HIWORD(lParam
) & KF_ALTDOWN
) == KF_ALTDOWN 
) 
2993             event
.m_altDown 
= TRUE
; 
2995         event
.m_eventObject 
= this; 
2996         event
.m_keyCode 
= id
; 
2997         event
.SetTimestamp(s_currentMsg
.time
); 
3002         GetWindowRect(GetHwnd(),&rect
); 
3006         event
.m_x 
= pt
.x
; event
.m_y 
= pt
.y
; 
3008         if ( GetEventHandler()->ProcessEvent(event
) ) 
3020 bool wxWindow::HandleKeyUp(WXWORD wParam
, WXLPARAM lParam
) 
3024     if ( (id 
= wxCharCodeMSWToWX(wParam
)) == 0 ) { 
3030         wxKeyEvent 
event(wxEVT_KEY_UP
); 
3031         event
.m_shiftDown 
= (::GetKeyState(VK_SHIFT
)&0x100?TRUE
:FALSE
); 
3032         event
.m_controlDown 
= (::GetKeyState(VK_CONTROL
)&0x100?TRUE
:FALSE
); 
3033         if ( (HIWORD(lParam
) & KF_ALTDOWN
) == KF_ALTDOWN 
) 
3034             event
.m_altDown 
= TRUE
; 
3036         event
.m_eventObject 
= this; 
3037         event
.m_keyCode 
= id
; 
3038         event
.SetTimestamp(s_currentMsg
.time
); 
3043         GetWindowRect(GetHwnd(),&rect
); 
3047         event
.m_x 
= pt
.x
; event
.m_y 
= pt
.y
; 
3049         if ( GetEventHandler()->ProcessEvent(event
) ) 
3058 // --------------------------------------------------------------------------- 
3060 // --------------------------------------------------------------------------- 
3062 bool wxWindow::HandleJoystickEvent(WXUINT msg
, int x
, int y
, WXUINT flags
) 
3065     if ( flags 
& JOY_BUTTON1CHG 
) 
3066         change 
= wxJOY_BUTTON1
; 
3067     if ( flags 
& JOY_BUTTON2CHG 
) 
3068         change 
= wxJOY_BUTTON2
; 
3069     if ( flags 
& JOY_BUTTON3CHG 
) 
3070         change 
= wxJOY_BUTTON3
; 
3071     if ( flags 
& JOY_BUTTON4CHG 
) 
3072         change 
= wxJOY_BUTTON4
; 
3075     if ( flags 
& JOY_BUTTON1 
) 
3076         buttons 
|= wxJOY_BUTTON1
; 
3077     if ( flags 
& JOY_BUTTON2 
) 
3078         buttons 
|= wxJOY_BUTTON2
; 
3079     if ( flags 
& JOY_BUTTON3 
) 
3080         buttons 
|= wxJOY_BUTTON3
; 
3081     if ( flags 
& JOY_BUTTON4 
) 
3082         buttons 
|= wxJOY_BUTTON4
; 
3084     // the event ids aren't consecutive so we can't use table based lookup 
3086     wxEventType eventType
; 
3091             eventType 
= wxEVT_JOY_MOVE
; 
3096             eventType 
= wxEVT_JOY_MOVE
; 
3101             eventType 
= wxEVT_JOY_ZMOVE
; 
3106             eventType 
= wxEVT_JOY_ZMOVE
; 
3109         case MM_JOY1BUTTONDOWN
: 
3111             eventType 
= wxEVT_JOY_BUTTON_DOWN
; 
3114         case MM_JOY2BUTTONDOWN
: 
3116             eventType 
= wxEVT_JOY_BUTTON_DOWN
; 
3119         case MM_JOY1BUTTONUP
: 
3121             eventType 
= wxEVT_JOY_BUTTON_UP
; 
3124         case MM_JOY2BUTTONUP
: 
3126             eventType 
= wxEVT_JOY_BUTTON_UP
; 
3130             wxFAIL_MSG(_T("no such joystick event")); 
3135     wxJoystickEvent 
event(eventType
, buttons
, joystick
, change
); 
3136     event
.SetPosition(wxPoint(x
, y
)); 
3137     event
.SetEventObject(this); 
3139     return GetEventHandler()->ProcessEvent(event
); 
3142 // --------------------------------------------------------------------------- 
3144 // --------------------------------------------------------------------------- 
3146 bool wxWindow::MSWOnScroll(int orientation
, WXWORD wParam
, 
3147                            WXWORD pos
, WXHWND control
) 
3151         wxWindow 
*child 
= wxFindWinFromHandle(control
); 
3153             return child
->MSWOnScroll(orientation
, wParam
, pos
, control
); 
3156     wxScrollWinEvent event
; 
3157     event
.SetPosition(pos
); 
3158     event
.SetOrientation(orientation
); 
3159     event
.m_eventObject 
= this; 
3164         event
.m_eventType 
= wxEVT_SCROLLWIN_TOP
; 
3168         event
.m_eventType 
= wxEVT_SCROLLWIN_BOTTOM
; 
3172         event
.m_eventType 
= wxEVT_SCROLLWIN_LINEUP
; 
3176         event
.m_eventType 
= wxEVT_SCROLLWIN_LINEDOWN
; 
3180         event
.m_eventType 
= wxEVT_SCROLLWIN_PAGEUP
; 
3184         event
.m_eventType 
= wxEVT_SCROLLWIN_PAGEDOWN
; 
3188     case SB_THUMBPOSITION
: 
3189         event
.m_eventType 
= wxEVT_SCROLLWIN_THUMBTRACK
; 
3196     return GetEventHandler()->ProcessEvent(event
); 
3199 // =========================================================================== 
3201 // =========================================================================== 
3203 void wxGetCharSize(WXHWND wnd
, int *x
, int *y
,wxFont 
*the_font
) 
3206     HDC dc 
= ::GetDC((HWND
) wnd
); 
3211         //    the_font->UseResource(); 
3212         //    the_font->RealizeResource(); 
3213         fnt 
= (HFONT
)the_font
->GetResourceHandle(); 
3215             was 
= (HFONT
) SelectObject(dc
,fnt
); 
3217     GetTextMetrics(dc
, &tm
); 
3218     if ( the_font 
&& fnt 
&& was 
) 
3220         SelectObject(dc
,was
); 
3222     ReleaseDC((HWND
)wnd
, dc
); 
3223     *x 
= tm
.tmAveCharWidth
; 
3224     *y 
= tm
.tmHeight 
+ tm
.tmExternalLeading
; 
3227     //    the_font->ReleaseResource(); 
3230 // Returns 0 if was a normal ASCII value, not a special key. This indicates that 
3231 // the key should be ignored by WM_KEYDOWN and processed by WM_CHAR instead. 
3232 int wxCharCodeMSWToWX(int keySym
) 
3237     case VK_CANCEL
:     id 
= WXK_CANCEL
; break; 
3238     case VK_BACK
:       id 
= WXK_BACK
; break; 
3239     case VK_TAB
:        id 
= WXK_TAB
; break; 
3240     case VK_CLEAR
:      id 
= WXK_CLEAR
; break; 
3241     case VK_RETURN
:     id 
= WXK_RETURN
; break; 
3242     case VK_SHIFT
:      id 
= WXK_SHIFT
; break; 
3243     case VK_CONTROL
:    id 
= WXK_CONTROL
; break; 
3244     case VK_MENU 
:      id 
= WXK_MENU
; break; 
3245     case VK_PAUSE
:      id 
= WXK_PAUSE
; break; 
3246     case VK_SPACE
:      id 
= WXK_SPACE
; break; 
3247     case VK_ESCAPE
:     id 
= WXK_ESCAPE
; break; 
3248     case VK_PRIOR
:      id 
= WXK_PRIOR
; break; 
3249     case VK_NEXT 
:      id 
= WXK_NEXT
; break; 
3250     case VK_END
:        id 
= WXK_END
; break; 
3251     case VK_HOME 
:      id 
= WXK_HOME
; break; 
3252     case VK_LEFT 
:      id 
= WXK_LEFT
; break; 
3253     case VK_UP
:         id 
= WXK_UP
; break; 
3254     case VK_RIGHT
:      id 
= WXK_RIGHT
; break; 
3255     case VK_DOWN 
:      id 
= WXK_DOWN
; break; 
3256     case VK_SELECT
:     id 
= WXK_SELECT
; break; 
3257     case VK_PRINT
:      id 
= WXK_PRINT
; break; 
3258     case VK_EXECUTE
:    id 
= WXK_EXECUTE
; break; 
3259     case VK_INSERT
:     id 
= WXK_INSERT
; break; 
3260     case VK_DELETE
:     id 
= WXK_DELETE
; break; 
3261     case VK_HELP 
:      id 
= WXK_HELP
; break; 
3262     case VK_NUMPAD0
:    id 
= WXK_NUMPAD0
; break; 
3263     case VK_NUMPAD1
:    id 
= WXK_NUMPAD1
; break; 
3264     case VK_NUMPAD2
:    id 
= WXK_NUMPAD2
; break; 
3265     case VK_NUMPAD3
:    id 
= WXK_NUMPAD3
; break; 
3266     case VK_NUMPAD4
:    id 
= WXK_NUMPAD4
; break; 
3267     case VK_NUMPAD5
:    id 
= WXK_NUMPAD5
; break; 
3268     case VK_NUMPAD6
:    id 
= WXK_NUMPAD6
; break; 
3269     case VK_NUMPAD7
:    id 
= WXK_NUMPAD7
; break; 
3270     case VK_NUMPAD8
:    id 
= WXK_NUMPAD8
; break; 
3271     case VK_NUMPAD9
:    id 
= WXK_NUMPAD9
; break; 
3272     case VK_MULTIPLY
:   id 
= WXK_MULTIPLY
; break; 
3273     case VK_ADD
:        id 
= WXK_ADD
; break; 
3274     case VK_SUBTRACT
:   id 
= WXK_SUBTRACT
; break; 
3275     case VK_DECIMAL
:    id 
= WXK_DECIMAL
; break; 
3276     case VK_DIVIDE
:     id 
= WXK_DIVIDE
; break; 
3277     case VK_F1
:         id 
= WXK_F1
; break; 
3278     case VK_F2
:         id 
= WXK_F2
; break; 
3279     case VK_F3
:         id 
= WXK_F3
; break; 
3280     case VK_F4
:         id 
= WXK_F4
; break; 
3281     case VK_F5
:         id 
= WXK_F5
; break; 
3282     case VK_F6
:         id 
= WXK_F6
; break; 
3283     case VK_F7
:         id 
= WXK_F7
; break; 
3284     case VK_F8
:         id 
= WXK_F8
; break; 
3285     case VK_F9
:         id 
= WXK_F9
; break; 
3286     case VK_F10
:        id 
= WXK_F10
; break; 
3287     case VK_F11
:        id 
= WXK_F11
; break; 
3288     case VK_F12
:        id 
= WXK_F12
; break; 
3289     case VK_F13
:        id 
= WXK_F13
; break; 
3290     case VK_F14
:        id 
= WXK_F14
; break; 
3291     case VK_F15
:        id 
= WXK_F15
; break; 
3292     case VK_F16
:        id 
= WXK_F16
; break; 
3293     case VK_F17
:        id 
= WXK_F17
; break; 
3294     case VK_F18
:        id 
= WXK_F18
; break; 
3295     case VK_F19
:        id 
= WXK_F19
; break; 
3296     case VK_F20
:        id 
= WXK_F20
; break; 
3297     case VK_F21
:        id 
= WXK_F21
; break; 
3298     case VK_F22
:        id 
= WXK_F22
; break; 
3299     case VK_F23
:        id 
= WXK_F23
; break; 
3300     case VK_F24
:        id 
= WXK_F24
; break; 
3301     case VK_NUMLOCK
:    id 
= WXK_NUMLOCK
; break; 
3302     case VK_SCROLL
:     id 
= WXK_SCROLL
; break; 
3311 int wxCharCodeWXToMSW(int id
, bool *isVirtual
) 
3317     case WXK_CANCEL
:    keySym 
= VK_CANCEL
; break; 
3318     case WXK_CLEAR
:     keySym 
= VK_CLEAR
; break; 
3319     case WXK_SHIFT
:     keySym 
= VK_SHIFT
; break; 
3320     case WXK_CONTROL
:   keySym 
= VK_CONTROL
; break; 
3321     case WXK_MENU 
:     keySym 
= VK_MENU
; break; 
3322     case WXK_PAUSE
:     keySym 
= VK_PAUSE
; break; 
3323     case WXK_PRIOR
:     keySym 
= VK_PRIOR
; break; 
3324     case WXK_NEXT 
:     keySym 
= VK_NEXT
; break; 
3325     case WXK_END
:       keySym 
= VK_END
; break; 
3326     case WXK_HOME 
:     keySym 
= VK_HOME
; break; 
3327     case WXK_LEFT 
:     keySym 
= VK_LEFT
; break; 
3328     case WXK_UP
:        keySym 
= VK_UP
; break; 
3329     case WXK_RIGHT
:     keySym 
= VK_RIGHT
; break; 
3330     case WXK_DOWN 
:     keySym 
= VK_DOWN
; break; 
3331     case WXK_SELECT
:    keySym 
= VK_SELECT
; break; 
3332     case WXK_PRINT
:     keySym 
= VK_PRINT
; break; 
3333     case WXK_EXECUTE
:   keySym 
= VK_EXECUTE
; break; 
3334     case WXK_INSERT
:    keySym 
= VK_INSERT
; break; 
3335     case WXK_DELETE
:    keySym 
= VK_DELETE
; break; 
3336     case WXK_HELP 
:     keySym 
= VK_HELP
; break; 
3337     case WXK_NUMPAD0
:   keySym 
= VK_NUMPAD0
; break; 
3338     case WXK_NUMPAD1
:   keySym 
= VK_NUMPAD1
; break; 
3339     case WXK_NUMPAD2
:   keySym 
= VK_NUMPAD2
; break; 
3340     case WXK_NUMPAD3
:   keySym 
= VK_NUMPAD3
; break; 
3341     case WXK_NUMPAD4
:   keySym 
= VK_NUMPAD4
; break; 
3342     case WXK_NUMPAD5
:   keySym 
= VK_NUMPAD5
; break; 
3343     case WXK_NUMPAD6
:   keySym 
= VK_NUMPAD6
; break; 
3344     case WXK_NUMPAD7
:   keySym 
= VK_NUMPAD7
; break; 
3345     case WXK_NUMPAD8
:   keySym 
= VK_NUMPAD8
; break; 
3346     case WXK_NUMPAD9
:   keySym 
= VK_NUMPAD9
; break; 
3347     case WXK_MULTIPLY
:  keySym 
= VK_MULTIPLY
; break; 
3348     case WXK_ADD
:       keySym 
= VK_ADD
; break; 
3349     case WXK_SUBTRACT
:  keySym 
= VK_SUBTRACT
; break; 
3350     case WXK_DECIMAL
:   keySym 
= VK_DECIMAL
; break; 
3351     case WXK_DIVIDE
:    keySym 
= VK_DIVIDE
; break; 
3352     case WXK_F1
:        keySym 
= VK_F1
; break; 
3353     case WXK_F2
:        keySym 
= VK_F2
; break; 
3354     case WXK_F3
:        keySym 
= VK_F3
; break; 
3355     case WXK_F4
:        keySym 
= VK_F4
; break; 
3356     case WXK_F5
:        keySym 
= VK_F5
; break; 
3357     case WXK_F6
:        keySym 
= VK_F6
; break; 
3358     case WXK_F7
:        keySym 
= VK_F7
; break; 
3359     case WXK_F8
:        keySym 
= VK_F8
; break; 
3360     case WXK_F9
:        keySym 
= VK_F9
; break; 
3361     case WXK_F10
:       keySym 
= VK_F10
; break; 
3362     case WXK_F11
:       keySym 
= VK_F11
; break; 
3363     case WXK_F12
:       keySym 
= VK_F12
; break; 
3364     case WXK_F13
:       keySym 
= VK_F13
; break; 
3365     case WXK_F14
:       keySym 
= VK_F14
; break; 
3366     case WXK_F15
:       keySym 
= VK_F15
; break; 
3367     case WXK_F16
:       keySym 
= VK_F16
; break; 
3368     case WXK_F17
:       keySym 
= VK_F17
; break; 
3369     case WXK_F18
:       keySym 
= VK_F18
; break; 
3370     case WXK_F19
:       keySym 
= VK_F19
; break; 
3371     case WXK_F20
:       keySym 
= VK_F20
; break; 
3372     case WXK_F21
:       keySym 
= VK_F21
; break; 
3373     case WXK_F22
:       keySym 
= VK_F22
; break; 
3374     case WXK_F23
:       keySym 
= VK_F23
; break; 
3375     case WXK_F24
:       keySym 
= VK_F24
; break; 
3376     case WXK_NUMLOCK
:   keySym 
= VK_NUMLOCK
; break; 
3377     case WXK_SCROLL
:    keySym 
= VK_SCROLL
; break; 
3388 wxWindow 
*wxGetActiveWindow() 
3390     HWND hWnd 
= GetActiveWindow(); 
3393         return wxFindWinFromHandle((WXHWND
) hWnd
); 
3398 // Windows keyboard hook. Allows interception of e.g. F1, ESCAPE 
3399 // in active frames and dialogs, regardless of where the focus is. 
3400 static HHOOK wxTheKeyboardHook 
= 0; 
3401 static FARPROC wxTheKeyboardHookProc 
= 0; 
3402 int APIENTRY _EXPORT
 
3403 wxKeyboardHook(int nCode
, WORD wParam
, DWORD lParam
); 
3405 void wxSetKeyboardHook(bool doIt
) 
3409         wxTheKeyboardHookProc 
= MakeProcInstance((FARPROC
) wxKeyboardHook
, wxGetInstance()); 
3410         wxTheKeyboardHook 
= SetWindowsHookEx(WH_KEYBOARD
, (HOOKPROC
) wxTheKeyboardHookProc
, wxGetInstance(), 
3411 #if defined(__WIN32__) && !defined(__TWIN32__) 
3412             GetCurrentThreadId()); 
3413         //      (DWORD)GetCurrentProcess()); // This is another possibility. Which is right? 
3420         UnhookWindowsHookEx(wxTheKeyboardHook
); 
3421         FreeProcInstance(wxTheKeyboardHookProc
); 
3425 int APIENTRY _EXPORT
 
3426 wxKeyboardHook(int nCode
, WORD wParam
, DWORD lParam
) 
3428     DWORD hiWord 
= HIWORD(lParam
); 
3429     if ( nCode 
!= HC_NOREMOVE 
&& ((hiWord 
& KF_UP
) == 0) ) 
3432         if ( (id 
= wxCharCodeMSWToWX(wParam
)) != 0 ) 
3434             wxKeyEvent 
event(wxEVT_CHAR_HOOK
); 
3435             if ( (HIWORD(lParam
) & KF_ALTDOWN
) == KF_ALTDOWN 
) 
3436                 event
.m_altDown 
= TRUE
; 
3438             event
.m_eventObject 
= NULL
; 
3439             event
.m_keyCode 
= id
; 
3440             /* begin Albert's fix for control and shift key 26.5 */ 
3441             event
.m_shiftDown 
= (::GetKeyState(VK_SHIFT
)&0x100?TRUE
:FALSE
); 
3442             event
.m_controlDown 
= (::GetKeyState(VK_CONTROL
)&0x100?TRUE
:FALSE
); 
3443             /* end Albert's fix for control and shift key 26.5 */ 
3444             event
.SetTimestamp(s_currentMsg
.time
); 
3446             wxWindow 
*win 
= wxGetActiveWindow(); 
3449                 if ( win
->GetEventHandler()->ProcessEvent(event
) ) 
3454                 if ( wxTheApp 
&& wxTheApp
->ProcessEvent(event
) ) 
3459     return (int)CallNextHookEx(wxTheKeyboardHook
, nCode
, wParam
, lParam
); 
3463 const char *wxGetMessageName(int message
) 
3467         case 0x0000: return "WM_NULL"; 
3468         case 0x0001: return "WM_CREATE"; 
3469         case 0x0002: return "WM_DESTROY"; 
3470         case 0x0003: return "WM_MOVE"; 
3471         case 0x0005: return "WM_SIZE"; 
3472         case 0x0006: return "WM_ACTIVATE"; 
3473         case 0x0007: return "WM_SETFOCUS"; 
3474         case 0x0008: return "WM_KILLFOCUS"; 
3475         case 0x000A: return "WM_ENABLE"; 
3476         case 0x000B: return "WM_SETREDRAW"; 
3477         case 0x000C: return "WM_SETTEXT"; 
3478         case 0x000D: return "WM_GETTEXT"; 
3479         case 0x000E: return "WM_GETTEXTLENGTH"; 
3480         case 0x000F: return "WM_PAINT"; 
3481         case 0x0010: return "WM_CLOSE"; 
3482         case 0x0011: return "WM_QUERYENDSESSION"; 
3483         case 0x0012: return "WM_QUIT"; 
3484         case 0x0013: return "WM_QUERYOPEN"; 
3485         case 0x0014: return "WM_ERASEBKGND"; 
3486         case 0x0015: return "WM_SYSCOLORCHANGE"; 
3487         case 0x0016: return "WM_ENDSESSION"; 
3488         case 0x0017: return "WM_SYSTEMERROR"; 
3489         case 0x0018: return "WM_SHOWWINDOW"; 
3490         case 0x0019: return "WM_CTLCOLOR"; 
3491         case 0x001A: return "WM_WININICHANGE"; 
3492         case 0x001B: return "WM_DEVMODECHANGE"; 
3493         case 0x001C: return "WM_ACTIVATEAPP"; 
3494         case 0x001D: return "WM_FONTCHANGE"; 
3495         case 0x001E: return "WM_TIMECHANGE"; 
3496         case 0x001F: return "WM_CANCELMODE"; 
3497         case 0x0020: return "WM_SETCURSOR"; 
3498         case 0x0021: return "WM_MOUSEACTIVATE"; 
3499         case 0x0022: return "WM_CHILDACTIVATE"; 
3500         case 0x0023: return "WM_QUEUESYNC"; 
3501         case 0x0024: return "WM_GETMINMAXINFO"; 
3502         case 0x0026: return "WM_PAINTICON"; 
3503         case 0x0027: return "WM_ICONERASEBKGND"; 
3504         case 0x0028: return "WM_NEXTDLGCTL"; 
3505         case 0x002A: return "WM_SPOOLERSTATUS"; 
3506         case 0x002B: return "WM_DRAWITEM"; 
3507         case 0x002C: return "WM_MEASUREITEM"; 
3508         case 0x002D: return "WM_DELETEITEM"; 
3509         case 0x002E: return "WM_VKEYTOITEM"; 
3510         case 0x002F: return "WM_CHARTOITEM"; 
3511         case 0x0030: return "WM_SETFONT"; 
3512         case 0x0031: return "WM_GETFONT"; 
3513         case 0x0037: return "WM_QUERYDRAGICON"; 
3514         case 0x0039: return "WM_COMPAREITEM"; 
3515         case 0x0041: return "WM_COMPACTING"; 
3516         case 0x0044: return "WM_COMMNOTIFY"; 
3517         case 0x0046: return "WM_WINDOWPOSCHANGING"; 
3518         case 0x0047: return "WM_WINDOWPOSCHANGED"; 
3519         case 0x0048: return "WM_POWER"; 
3522         case 0x004A: return "WM_COPYDATA"; 
3523         case 0x004B: return "WM_CANCELJOURNAL"; 
3524         case 0x004E: return "WM_NOTIFY"; 
3525         case 0x0050: return "WM_INPUTLANGCHANGEREQUEST"; 
3526         case 0x0051: return "WM_INPUTLANGCHANGE"; 
3527         case 0x0052: return "WM_TCARD"; 
3528         case 0x0053: return "WM_HELP"; 
3529         case 0x0054: return "WM_USERCHANGED"; 
3530         case 0x0055: return "WM_NOTIFYFORMAT"; 
3531         case 0x007B: return "WM_CONTEXTMENU"; 
3532         case 0x007C: return "WM_STYLECHANGING"; 
3533         case 0x007D: return "WM_STYLECHANGED"; 
3534         case 0x007E: return "WM_DISPLAYCHANGE"; 
3535         case 0x007F: return "WM_GETICON"; 
3536         case 0x0080: return "WM_SETICON"; 
3539         case 0x0081: return "WM_NCCREATE"; 
3540         case 0x0082: return "WM_NCDESTROY"; 
3541         case 0x0083: return "WM_NCCALCSIZE"; 
3542         case 0x0084: return "WM_NCHITTEST"; 
3543         case 0x0085: return "WM_NCPAINT"; 
3544         case 0x0086: return "WM_NCACTIVATE"; 
3545         case 0x0087: return "WM_GETDLGCODE"; 
3546         case 0x00A0: return "WM_NCMOUSEMOVE"; 
3547         case 0x00A1: return "WM_NCLBUTTONDOWN"; 
3548         case 0x00A2: return "WM_NCLBUTTONUP"; 
3549         case 0x00A3: return "WM_NCLBUTTONDBLCLK"; 
3550         case 0x00A4: return "WM_NCRBUTTONDOWN"; 
3551         case 0x00A5: return "WM_NCRBUTTONUP"; 
3552         case 0x00A6: return "WM_NCRBUTTONDBLCLK"; 
3553         case 0x00A7: return "WM_NCMBUTTONDOWN"; 
3554         case 0x00A8: return "WM_NCMBUTTONUP"; 
3555         case 0x00A9: return "WM_NCMBUTTONDBLCLK"; 
3556         case 0x0100: return "WM_KEYDOWN"; 
3557         case 0x0101: return "WM_KEYUP"; 
3558         case 0x0102: return "WM_CHAR"; 
3559         case 0x0103: return "WM_DEADCHAR"; 
3560         case 0x0104: return "WM_SYSKEYDOWN"; 
3561         case 0x0105: return "WM_SYSKEYUP"; 
3562         case 0x0106: return "WM_SYSCHAR"; 
3563         case 0x0107: return "WM_SYSDEADCHAR"; 
3564         case 0x0108: return "WM_KEYLAST"; 
3567         case 0x010D: return "WM_IME_STARTCOMPOSITION"; 
3568         case 0x010E: return "WM_IME_ENDCOMPOSITION"; 
3569         case 0x010F: return "WM_IME_COMPOSITION"; 
3572         case 0x0110: return "WM_INITDIALOG"; 
3573         case 0x0111: return "WM_COMMAND"; 
3574         case 0x0112: return "WM_SYSCOMMAND"; 
3575         case 0x0113: return "WM_TIMER"; 
3576         case 0x0114: return "WM_HSCROLL"; 
3577         case 0x0115: return "WM_VSCROLL"; 
3578         case 0x0116: return "WM_INITMENU"; 
3579         case 0x0117: return "WM_INITMENUPOPUP"; 
3580         case 0x011F: return "WM_MENUSELECT"; 
3581         case 0x0120: return "WM_MENUCHAR"; 
3582         case 0x0121: return "WM_ENTERIDLE"; 
3583         case 0x0200: return "WM_MOUSEMOVE"; 
3584         case 0x0201: return "WM_LBUTTONDOWN"; 
3585         case 0x0202: return "WM_LBUTTONUP"; 
3586         case 0x0203: return "WM_LBUTTONDBLCLK"; 
3587         case 0x0204: return "WM_RBUTTONDOWN"; 
3588         case 0x0205: return "WM_RBUTTONUP"; 
3589         case 0x0206: return "WM_RBUTTONDBLCLK"; 
3590         case 0x0207: return "WM_MBUTTONDOWN"; 
3591         case 0x0208: return "WM_MBUTTONUP"; 
3592         case 0x0209: return "WM_MBUTTONDBLCLK"; 
3593         case 0x0210: return "WM_PARENTNOTIFY"; 
3594         case 0x0211: return "WM_ENTERMENULOOP"; 
3595         case 0x0212: return "WM_EXITMENULOOP"; 
3598         case 0x0213: return "WM_NEXTMENU"; 
3599         case 0x0214: return "WM_SIZING"; 
3600         case 0x0215: return "WM_CAPTURECHANGED"; 
3601         case 0x0216: return "WM_MOVING"; 
3602         case 0x0218: return "WM_POWERBROADCAST"; 
3603         case 0x0219: return "WM_DEVICECHANGE"; 
3606         case 0x0220: return "WM_MDICREATE"; 
3607         case 0x0221: return "WM_MDIDESTROY"; 
3608         case 0x0222: return "WM_MDIACTIVATE"; 
3609         case 0x0223: return "WM_MDIRESTORE"; 
3610         case 0x0224: return "WM_MDINEXT"; 
3611         case 0x0225: return "WM_MDIMAXIMIZE"; 
3612         case 0x0226: return "WM_MDITILE"; 
3613         case 0x0227: return "WM_MDICASCADE"; 
3614         case 0x0228: return "WM_MDIICONARRANGE"; 
3615         case 0x0229: return "WM_MDIGETACTIVE"; 
3616         case 0x0230: return "WM_MDISETMENU"; 
3617         case 0x0233: return "WM_DROPFILES"; 
3620         case 0x0281: return "WM_IME_SETCONTEXT"; 
3621         case 0x0282: return "WM_IME_NOTIFY"; 
3622         case 0x0283: return "WM_IME_CONTROL"; 
3623         case 0x0284: return "WM_IME_COMPOSITIONFULL"; 
3624         case 0x0285: return "WM_IME_SELECT"; 
3625         case 0x0286: return "WM_IME_CHAR"; 
3626         case 0x0290: return "WM_IME_KEYDOWN"; 
3627         case 0x0291: return "WM_IME_KEYUP"; 
3630         case 0x0300: return "WM_CUT"; 
3631         case 0x0301: return "WM_COPY"; 
3632         case 0x0302: return "WM_PASTE"; 
3633         case 0x0303: return "WM_CLEAR"; 
3634         case 0x0304: return "WM_UNDO"; 
3635         case 0x0305: return "WM_RENDERFORMAT"; 
3636         case 0x0306: return "WM_RENDERALLFORMATS"; 
3637         case 0x0307: return "WM_DESTROYCLIPBOARD"; 
3638         case 0x0308: return "WM_DRAWCLIPBOARD"; 
3639         case 0x0309: return "WM_PAINTCLIPBOARD"; 
3640         case 0x030A: return "WM_VSCROLLCLIPBOARD"; 
3641         case 0x030B: return "WM_SIZECLIPBOARD"; 
3642         case 0x030C: return "WM_ASKCBFORMATNAME"; 
3643         case 0x030D: return "WM_CHANGECBCHAIN"; 
3644         case 0x030E: return "WM_HSCROLLCLIPBOARD"; 
3645         case 0x030F: return "WM_QUERYNEWPALETTE"; 
3646         case 0x0310: return "WM_PALETTEISCHANGING"; 
3647         case 0x0311: return "WM_PALETTECHANGED"; 
3650         // common controls messages - although they're not strictly speaking 
3651         // standard, it's nice to decode them nevertheless 
3654         case 0x1000 + 0: return "LVM_GETBKCOLOR"; 
3655         case 0x1000 + 1: return "LVM_SETBKCOLOR"; 
3656         case 0x1000 + 2: return "LVM_GETIMAGELIST"; 
3657         case 0x1000 + 3: return "LVM_SETIMAGELIST"; 
3658         case 0x1000 + 4: return "LVM_GETITEMCOUNT"; 
3659         case 0x1000 + 5: return "LVM_GETITEMA"; 
3660         case 0x1000 + 75: return "LVM_GETITEMW"; 
3661         case 0x1000 + 6: return "LVM_SETITEMA"; 
3662         case 0x1000 + 76: return "LVM_SETITEMW"; 
3663         case 0x1000 + 7: return "LVM_INSERTITEMA"; 
3664         case 0x1000 + 77: return "LVM_INSERTITEMW"; 
3665         case 0x1000 + 8: return "LVM_DELETEITEM"; 
3666         case 0x1000 + 9: return "LVM_DELETEALLITEMS"; 
3667         case 0x1000 + 10: return "LVM_GETCALLBACKMASK"; 
3668         case 0x1000 + 11: return "LVM_SETCALLBACKMASK"; 
3669         case 0x1000 + 12: return "LVM_GETNEXTITEM"; 
3670         case 0x1000 + 13: return "LVM_FINDITEMA"; 
3671         case 0x1000 + 83: return "LVM_FINDITEMW"; 
3672         case 0x1000 + 14: return "LVM_GETITEMRECT"; 
3673         case 0x1000 + 15: return "LVM_SETITEMPOSITION"; 
3674         case 0x1000 + 16: return "LVM_GETITEMPOSITION"; 
3675         case 0x1000 + 17: return "LVM_GETSTRINGWIDTHA"; 
3676         case 0x1000 + 87: return "LVM_GETSTRINGWIDTHW"; 
3677         case 0x1000 + 18: return "LVM_HITTEST"; 
3678         case 0x1000 + 19: return "LVM_ENSUREVISIBLE"; 
3679         case 0x1000 + 20: return "LVM_SCROLL"; 
3680         case 0x1000 + 21: return "LVM_REDRAWITEMS"; 
3681         case 0x1000 + 22: return "LVM_ARRANGE"; 
3682         case 0x1000 + 23: return "LVM_EDITLABELA"; 
3683         case 0x1000 + 118: return "LVM_EDITLABELW"; 
3684         case 0x1000 + 24: return "LVM_GETEDITCONTROL"; 
3685         case 0x1000 + 25: return "LVM_GETCOLUMNA"; 
3686         case 0x1000 + 95: return "LVM_GETCOLUMNW"; 
3687         case 0x1000 + 26: return "LVM_SETCOLUMNA"; 
3688         case 0x1000 + 96: return "LVM_SETCOLUMNW"; 
3689         case 0x1000 + 27: return "LVM_INSERTCOLUMNA"; 
3690         case 0x1000 + 97: return "LVM_INSERTCOLUMNW"; 
3691         case 0x1000 + 28: return "LVM_DELETECOLUMN"; 
3692         case 0x1000 + 29: return "LVM_GETCOLUMNWIDTH"; 
3693         case 0x1000 + 30: return "LVM_SETCOLUMNWIDTH"; 
3694         case 0x1000 + 31: return "LVM_GETHEADER"; 
3695         case 0x1000 + 33: return "LVM_CREATEDRAGIMAGE"; 
3696         case 0x1000 + 34: return "LVM_GETVIEWRECT"; 
3697         case 0x1000 + 35: return "LVM_GETTEXTCOLOR"; 
3698         case 0x1000 + 36: return "LVM_SETTEXTCOLOR"; 
3699         case 0x1000 + 37: return "LVM_GETTEXTBKCOLOR"; 
3700         case 0x1000 + 38: return "LVM_SETTEXTBKCOLOR"; 
3701         case 0x1000 + 39: return "LVM_GETTOPINDEX"; 
3702         case 0x1000 + 40: return "LVM_GETCOUNTPERPAGE"; 
3703         case 0x1000 + 41: return "LVM_GETORIGIN"; 
3704         case 0x1000 + 42: return "LVM_UPDATE"; 
3705         case 0x1000 + 43: return "LVM_SETITEMSTATE"; 
3706         case 0x1000 + 44: return "LVM_GETITEMSTATE"; 
3707         case 0x1000 + 45: return "LVM_GETITEMTEXTA"; 
3708         case 0x1000 + 115: return "LVM_GETITEMTEXTW"; 
3709         case 0x1000 + 46: return "LVM_SETITEMTEXTA"; 
3710         case 0x1000 + 116: return "LVM_SETITEMTEXTW"; 
3711         case 0x1000 + 47: return "LVM_SETITEMCOUNT"; 
3712         case 0x1000 + 48: return "LVM_SORTITEMS"; 
3713         case 0x1000 + 49: return "LVM_SETITEMPOSITION32"; 
3714         case 0x1000 + 50: return "LVM_GETSELECTEDCOUNT"; 
3715         case 0x1000 + 51: return "LVM_GETITEMSPACING"; 
3716         case 0x1000 + 52: return "LVM_GETISEARCHSTRINGA"; 
3717         case 0x1000 + 117: return "LVM_GETISEARCHSTRINGW"; 
3718         case 0x1000 + 53: return "LVM_SETICONSPACING"; 
3719         case 0x1000 + 54: return "LVM_SETEXTENDEDLISTVIEWSTYLE"; 
3720         case 0x1000 + 55: return "LVM_GETEXTENDEDLISTVIEWSTYLE"; 
3721         case 0x1000 + 56: return "LVM_GETSUBITEMRECT"; 
3722         case 0x1000 + 57: return "LVM_SUBITEMHITTEST"; 
3723         case 0x1000 + 58: return "LVM_SETCOLUMNORDERARRAY"; 
3724         case 0x1000 + 59: return "LVM_GETCOLUMNORDERARRAY"; 
3725         case 0x1000 + 60: return "LVM_SETHOTITEM"; 
3726         case 0x1000 + 61: return "LVM_GETHOTITEM"; 
3727         case 0x1000 + 62: return "LVM_SETHOTCURSOR"; 
3728         case 0x1000 + 63: return "LVM_GETHOTCURSOR"; 
3729         case 0x1000 + 64: return "LVM_APPROXIMATEVIEWRECT"; 
3730         case 0x1000 + 65: return "LVM_SETWORKAREA"; 
3733         case 0x1100 + 0: return "TVM_INSERTITEMA"; 
3734         case 0x1100 + 50: return "TVM_INSERTITEMW"; 
3735         case 0x1100 + 1: return "TVM_DELETEITEM"; 
3736         case 0x1100 + 2: return "TVM_EXPAND"; 
3737         case 0x1100 + 4: return "TVM_GETITEMRECT"; 
3738         case 0x1100 + 5: return "TVM_GETCOUNT"; 
3739         case 0x1100 + 6: return "TVM_GETINDENT"; 
3740         case 0x1100 + 7: return "TVM_SETINDENT"; 
3741         case 0x1100 + 8: return "TVM_GETIMAGELIST"; 
3742         case 0x1100 + 9: return "TVM_SETIMAGELIST"; 
3743         case 0x1100 + 10: return "TVM_GETNEXTITEM"; 
3744         case 0x1100 + 11: return "TVM_SELECTITEM"; 
3745         case 0x1100 + 12: return "TVM_GETITEMA"; 
3746         case 0x1100 + 62: return "TVM_GETITEMW"; 
3747         case 0x1100 + 13: return "TVM_SETITEMA"; 
3748         case 0x1100 + 63: return "TVM_SETITEMW"; 
3749         case 0x1100 + 14: return "TVM_EDITLABELA"; 
3750         case 0x1100 + 65: return "TVM_EDITLABELW"; 
3751         case 0x1100 + 15: return "TVM_GETEDITCONTROL"; 
3752         case 0x1100 + 16: return "TVM_GETVISIBLECOUNT"; 
3753         case 0x1100 + 17: return "TVM_HITTEST"; 
3754         case 0x1100 + 18: return "TVM_CREATEDRAGIMAGE"; 
3755         case 0x1100 + 19: return "TVM_SORTCHILDREN"; 
3756         case 0x1100 + 20: return "TVM_ENSUREVISIBLE"; 
3757         case 0x1100 + 21: return "TVM_SORTCHILDRENCB"; 
3758         case 0x1100 + 22: return "TVM_ENDEDITLABELNOW"; 
3759         case 0x1100 + 23: return "TVM_GETISEARCHSTRINGA"; 
3760         case 0x1100 + 64: return "TVM_GETISEARCHSTRINGW"; 
3761         case 0x1100 + 24: return "TVM_SETTOOLTIPS"; 
3762         case 0x1100 + 25: return "TVM_GETTOOLTIPS"; 
3765         case 0x1200 + 0: return "HDM_GETITEMCOUNT"; 
3766         case 0x1200 + 1: return "HDM_INSERTITEMA"; 
3767         case 0x1200 + 10: return "HDM_INSERTITEMW"; 
3768         case 0x1200 + 2: return "HDM_DELETEITEM"; 
3769         case 0x1200 + 3: return "HDM_GETITEMA"; 
3770         case 0x1200 + 11: return "HDM_GETITEMW"; 
3771         case 0x1200 + 4: return "HDM_SETITEMA"; 
3772         case 0x1200 + 12: return "HDM_SETITEMW"; 
3773         case 0x1200 + 5: return "HDM_LAYOUT"; 
3774         case 0x1200 + 6: return "HDM_HITTEST"; 
3775         case 0x1200 + 7: return "HDM_GETITEMRECT"; 
3776         case 0x1200 + 8: return "HDM_SETIMAGELIST"; 
3777         case 0x1200 + 9: return "HDM_GETIMAGELIST"; 
3778         case 0x1200 + 15: return "HDM_ORDERTOINDEX"; 
3779         case 0x1200 + 16: return "HDM_CREATEDRAGIMAGE"; 
3780         case 0x1200 + 17: return "HDM_GETORDERARRAY"; 
3781         case 0x1200 + 18: return "HDM_SETORDERARRAY"; 
3782         case 0x1200 + 19: return "HDM_SETHOTDIVIDER"; 
3785         case 0x1300 + 2: return "TCM_GETIMAGELIST"; 
3786         case 0x1300 + 3: return "TCM_SETIMAGELIST"; 
3787         case 0x1300 + 4: return "TCM_GETITEMCOUNT"; 
3788         case 0x1300 + 5: return "TCM_GETITEMA"; 
3789         case 0x1300 + 60: return "TCM_GETITEMW"; 
3790         case 0x1300 + 6: return "TCM_SETITEMA"; 
3791         case 0x1300 + 61: return "TCM_SETITEMW"; 
3792         case 0x1300 + 7: return "TCM_INSERTITEMA"; 
3793         case 0x1300 + 62: return "TCM_INSERTITEMW"; 
3794         case 0x1300 + 8: return "TCM_DELETEITEM"; 
3795         case 0x1300 + 9: return "TCM_DELETEALLITEMS"; 
3796         case 0x1300 + 10: return "TCM_GETITEMRECT"; 
3797         case 0x1300 + 11: return "TCM_GETCURSEL"; 
3798         case 0x1300 + 12: return "TCM_SETCURSEL"; 
3799         case 0x1300 + 13: return "TCM_HITTEST"; 
3800         case 0x1300 + 14: return "TCM_SETITEMEXTRA"; 
3801         case 0x1300 + 40: return "TCM_ADJUSTRECT"; 
3802         case 0x1300 + 41: return "TCM_SETITEMSIZE"; 
3803         case 0x1300 + 42: return "TCM_REMOVEIMAGE"; 
3804         case 0x1300 + 43: return "TCM_SETPADDING"; 
3805         case 0x1300 + 44: return "TCM_GETROWCOUNT"; 
3806         case 0x1300 + 45: return "TCM_GETTOOLTIPS"; 
3807         case 0x1300 + 46: return "TCM_SETTOOLTIPS"; 
3808         case 0x1300 + 47: return "TCM_GETCURFOCUS"; 
3809         case 0x1300 + 48: return "TCM_SETCURFOCUS"; 
3810         case 0x1300 + 49: return "TCM_SETMINTABWIDTH"; 
3811         case 0x1300 + 50: return "TCM_DESELECTALL"; 
3814         case WM_USER
+1: return "TB_ENABLEBUTTON"; 
3815         case WM_USER
+2: return "TB_CHECKBUTTON"; 
3816         case WM_USER
+3: return "TB_PRESSBUTTON"; 
3817         case WM_USER
+4: return "TB_HIDEBUTTON"; 
3818         case WM_USER
+5: return "TB_INDETERMINATE"; 
3819         case WM_USER
+9: return "TB_ISBUTTONENABLED"; 
3820         case WM_USER
+10: return "TB_ISBUTTONCHECKED"; 
3821         case WM_USER
+11: return "TB_ISBUTTONPRESSED"; 
3822         case WM_USER
+12: return "TB_ISBUTTONHIDDEN"; 
3823         case WM_USER
+13: return "TB_ISBUTTONINDETERMINATE"; 
3824         case WM_USER
+17: return "TB_SETSTATE"; 
3825         case WM_USER
+18: return "TB_GETSTATE"; 
3826         case WM_USER
+19: return "TB_ADDBITMAP"; 
3827         case WM_USER
+20: return "TB_ADDBUTTONS"; 
3828         case WM_USER
+21: return "TB_INSERTBUTTON"; 
3829         case WM_USER
+22: return "TB_DELETEBUTTON"; 
3830         case WM_USER
+23: return "TB_GETBUTTON"; 
3831         case WM_USER
+24: return "TB_BUTTONCOUNT"; 
3832         case WM_USER
+25: return "TB_COMMANDTOINDEX"; 
3833         case WM_USER
+26: return "TB_SAVERESTOREA"; 
3834         case WM_USER
+76: return "TB_SAVERESTOREW"; 
3835         case WM_USER
+27: return "TB_CUSTOMIZE"; 
3836         case WM_USER
+28: return "TB_ADDSTRINGA"; 
3837         case WM_USER
+77: return "TB_ADDSTRINGW"; 
3838         case WM_USER
+29: return "TB_GETITEMRECT"; 
3839         case WM_USER
+30: return "TB_BUTTONSTRUCTSIZE"; 
3840         case WM_USER
+31: return "TB_SETBUTTONSIZE"; 
3841         case WM_USER
+32: return "TB_SETBITMAPSIZE"; 
3842         case WM_USER
+33: return "TB_AUTOSIZE"; 
3843         case WM_USER
+35: return "TB_GETTOOLTIPS"; 
3844         case WM_USER
+36: return "TB_SETTOOLTIPS"; 
3845         case WM_USER
+37: return "TB_SETPARENT"; 
3846         case WM_USER
+39: return "TB_SETROWS"; 
3847         case WM_USER
+40: return "TB_GETROWS"; 
3848         case WM_USER
+42: return "TB_SETCMDID"; 
3849         case WM_USER
+43: return "TB_CHANGEBITMAP"; 
3850         case WM_USER
+44: return "TB_GETBITMAP"; 
3851         case WM_USER
+45: return "TB_GETBUTTONTEXTA"; 
3852         case WM_USER
+75: return "TB_GETBUTTONTEXTW"; 
3853         case WM_USER
+46: return "TB_REPLACEBITMAP"; 
3854         case WM_USER
+47: return "TB_SETINDENT"; 
3855         case WM_USER
+48: return "TB_SETIMAGELIST"; 
3856         case WM_USER
+49: return "TB_GETIMAGELIST"; 
3857         case WM_USER
+50: return "TB_LOADIMAGES"; 
3858         case WM_USER
+51: return "TB_GETRECT"; 
3859         case WM_USER
+52: return "TB_SETHOTIMAGELIST"; 
3860         case WM_USER
+53: return "TB_GETHOTIMAGELIST"; 
3861         case WM_USER
+54: return "TB_SETDISABLEDIMAGELIST"; 
3862         case WM_USER
+55: return "TB_GETDISABLEDIMAGELIST"; 
3863         case WM_USER
+56: return "TB_SETSTYLE"; 
3864         case WM_USER
+57: return "TB_GETSTYLE"; 
3865         case WM_USER
+58: return "TB_GETBUTTONSIZE"; 
3866         case WM_USER
+59: return "TB_SETBUTTONWIDTH"; 
3867         case WM_USER
+60: return "TB_SETMAXTEXTROWS"; 
3868         case WM_USER
+61: return "TB_GETTEXTROWS"; 
3869         case WM_USER
+41: return "TB_GETBITMAPFLAGS"; 
3874             static char s_szBuf
[128]; 
3875             sprintf(s_szBuf
, "<unknown message = %d>", message
); 
3879 #endif //__WXDEBUG__