3 // Author: David Webster
7 // Copyright: (c) David Webster
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
12 // For compilers that support precompilation, includes "wx.h".
14 #include "wx/wxprec.h"
20 #include "wx/window.h"
25 #include "wx/dcclient.h"
29 #include "wx/layout.h"
30 #include "wx/checkbox.h"
31 #include "wx/combobox.h"
32 #include "wx/dialog.h"
34 #include "wx/listbox.h"
35 #include "wx/button.h"
36 #include "wx/bmpbuttn.h"
37 #include "wx/msgdlg.h"
38 #include "wx/scrolwin.h"
39 #include "wx/radiobox.h"
40 #include "wx/radiobut.h"
41 #include "wx/slider.h"
42 #include "wx/statbox.h"
43 #include "wx/statusbr.h"
44 #include "wx/toolbar.h"
45 #include "wx/settings.h"
50 #include "wx/ownerdrw.h"
53 #if wxUSE_DRAG_AND_DROP
57 #include "wx/menuitem.h"
60 #include "wx/os2/private.h"
63 #include "wx/tooltip.h"
67 #include "wx/notebook.h"
78 #include "wx/textctrl.h"
83 // Place compiler, OS specific includes here
87 // Standard macros -- these are for OS/2 PM, but most GUI's have something similar
91 // SHORT1FROMMP -- LOWORD
93 #define GET_X_LPARAM(mp) ((unsigned short)(unsigned long)(mp))
95 // SHORT2FROMMP -- HIWORD
97 #define GET_Y_LPARAM(mp) ((unsigned short)(unsigned long)(mp >> 16))
98 #endif // GET_X_LPARAM
100 #ifndef CW_USEDEFAULT
101 # define CW_USEDEFAULT ((int)0x80000000)
105 #define VK_OEM_1 0xBA
106 #define VK_OEM_PLUS 0xBB
107 #define VK_OEM_COMMA 0xBC
108 #define VK_OEM_MINUS 0xBD
109 #define VK_OEM_PERIOD 0xBE
110 #define VK_OEM_2 0xBF
111 #define VK_OEM_3 0xC0
112 #define VK_OEM_4 0xDB
113 #define VK_OEM_5 0xDC
114 #define VK_OEM_6 0xDD
115 #define VK_OEM_7 0xDE
118 // ---------------------------------------------------------------------------
120 // ---------------------------------------------------------------------------
123 // The last PM message we got (MT-UNSAFE)
127 #if wxUSE_MENUS_NATIVE
128 wxMenu
* wxCurrentPopupMenu
= NULL
;
129 #endif // wxUSE_MENUS_NATIVE
131 // ---------------------------------------------------------------------------
133 // ---------------------------------------------------------------------------
136 // the window proc for all our windows; most gui's have something similar
138 MRESULT EXPENTRY
wxWndProc( HWND hWnd
145 const char *wxGetMessageName(int message
);
148 wxWindowOS2
* FindWindowForMouseEvent( wxWindow
* pWin
152 void wxRemoveHandleAssociation(wxWindowOS2
* pWin
);
153 void wxAssociateWinWithHandle( HWND hWnd
156 wxWindow
* wxFindWinFromHandle(WXHWND hWnd
);
159 // get the current state of SHIFT/CTRL keys
161 static inline bool IsShiftDown() { return (::WinGetKeyState(HWND_DESKTOP
, VK_SHIFT
) & 0x8000) != 0; }
162 static inline bool IsCtrlDown() { return (::WinGetKeyState(HWND_DESKTOP
, VK_CTRL
) & 0x8000) != 0; }
164 static wxWindow
* gpWinBeingCreated
= NULL
;
166 // ---------------------------------------------------------------------------
168 // ---------------------------------------------------------------------------
170 // in wxUniv-OS/2 this class is abstract because it doesn't have DoPopupMenu()
172 #ifdef __WXUNIVERSAL__
173 IMPLEMENT_ABSTRACT_CLASS(wxWindowOS2
, wxWindowBase
)
175 IMPLEMENT_DYNAMIC_CLASS(wxWindow
, wxWindowBase
)
176 #endif // __WXUNIVERSAL__/__WXPM__
178 BEGIN_EVENT_TABLE(wxWindowOS2
, wxWindowBase
)
179 EVT_ERASE_BACKGROUND(wxWindowOS2::OnEraseBackground
)
180 EVT_SYS_COLOUR_CHANGED(wxWindowOS2::OnSysColourChanged
)
181 EVT_IDLE(wxWindowOS2::OnIdle
)
182 EVT_SET_FOCUS(wxWindowOS2::OnSetFocus
)
185 // ===========================================================================
187 // ===========================================================================
189 // ---------------------------------------------------------------------------
190 // wxWindow utility functions
191 // ---------------------------------------------------------------------------
194 // Find an item given the PM Window id
196 wxWindow
* wxWindowOS2::FindItem(
201 wxControl
* pItem
= wxDynamicCast(this, wxControl
);
206 // I it we or one of our "internal" children?
208 if (pItem
->GetId() == lId
209 #ifndef __WXUNIVERSAL__
210 || (pItem
->GetSubcontrols().Index(lId
) != wxNOT_FOUND
)
217 #endif // wxUSE_CONTROLS
219 wxWindowList::compatibility_iterator current
= GetChildren().GetFirst();
223 wxWindow
* pChildWin
= current
->GetData();
224 wxWindow
* pWnd
= pChildWin
->FindItem(lId
);
229 current
= current
->GetNext();
232 } // end of wxWindowOS2::FindItem
235 // Find an item given the PM Window handle
237 wxWindow
* wxWindowOS2::FindItemByHWND(
242 wxWindowList::compatibility_iterator current
= GetChildren().GetFirst();
246 wxWindow
* pParent
= current
->GetData();
249 // Do a recursive search.
251 wxWindow
* pWnd
= pParent
->FindItemByHWND(hWnd
);
258 || pParent
->IsKindOf(CLASSINFO(wxControl
))
259 #endif // wxUSE_CONTROLS
262 wxWindow
* pItem
= current
->GetData();
264 if (pItem
->GetHWND() == hWnd
)
268 if (pItem
->ContainsHWND(hWnd
))
272 current
= current
->GetNext();
275 } // end of wxWindowOS2::FindItemByHWND
278 // Default command handler
280 bool wxWindowOS2::OS2Command(
281 WXUINT
WXUNUSED(uParam
)
282 , WXWORD
WXUNUSED(uId
)
288 // ----------------------------------------------------------------------------
289 // constructors and such
290 // ----------------------------------------------------------------------------
292 void wxWindowOS2::Init()
297 m_bWinCaptured
= FALSE
;
299 m_fnOldWndProc
= NULL
;
301 m_bMouseInWindow
= FALSE
;
302 m_bLastKeydownProcessed
= FALSE
;
303 m_pChildrenDisabled
= NULL
;
310 m_hWndScrollBarHorz
= 0L;
311 m_hWndScrollBarVert
= 0L;
313 memset(&m_vWinSwp
, '\0', sizeof (SWP
));
316 // Pass WM_GETDLGCODE to DefWindowProc()
322 m_bBackgroundTransparent
= FALSE
;
325 // As all windows are created with WS_VISIBLE style...
329 #if wxUSE_MOUSEEVENT_HACK
332 m_nLastMouseEvent
= -1;
333 #endif // wxUSE_MOUSEEVENT_HACK
334 } // wxWindowOS2::Init
339 wxWindowOS2::~wxWindowOS2()
341 m_isBeingDeleted
= TRUE
;
343 for (wxWindow
* pWin
= GetParent(); pWin
; pWin
= pWin
->GetParent())
345 wxTopLevelWindow
* pFrame
= wxDynamicCast(pWin
, wxTopLevelWindow
);
349 if (pFrame
->GetLastFocus() == this)
350 pFrame
->SetLastFocus(NULL
);
358 if(!::WinDestroyWindow(GetHWND()))
359 wxLogLastError(wxT("DestroyWindow"));
361 // remove hWnd <-> wxWindow association
363 wxRemoveHandleAssociation(this);
365 delete m_pChildrenDisabled
;
366 } // end of wxWindowOS2::~wxWindowOS2
368 // real construction (Init() must have been called before!)
369 bool wxWindowOS2::Create(
372 , const wxPoint
& rPos
373 , const wxSize
& rSize
375 , const wxString
& rName
378 HWND hParent
= NULLHANDLE
;
379 ULONG ulCreateFlags
= 0;
380 WXDWORD dwExStyle
= 0;
382 wxCHECK_MSG(pParent
, FALSE
, wxT("can't create wxWindow without parent"));
386 // wxGTK doesn't allow to create controls with static box as the parent so
387 // this will result in a crash when the program is ported to wxGTK - warn
390 // the correct solution is to create the controls as siblings of the
393 wxASSERT_MSG( !wxDynamicCast(pParent
, wxStaticBox
),
394 _T("wxStaticBox can't be used as a window parent!") );
395 #endif // wxUSE_STATBOX
397 // Ensure groupbox backgrounds are painted
398 if (IsKindOf(CLASSINFO(wxPanel
)))
399 lStyle
&= ~wxCLIP_CHILDREN
;
401 if ( !CreateBase( pParent
413 pParent
->AddChild(this);
414 hParent
= GetWinHwnd(pParent
);
416 if ( pParent
->IsKindOf(CLASSINFO(wxGenericScrolledWindow
)) ||
417 pParent
->IsKindOf(CLASSINFO(wxScrolledWindow
))
419 ulCreateFlags
|= WS_CLIPSIBLINGS
;
423 // Most wxSTYLES are really PM Class specific styles and will be
424 // set in those class create procs. PM's basic windows styles are
427 ulCreateFlags
|= OS2GetCreateWindowFlags(&dwExStyle
);
430 #ifdef __WXUNIVERSAL__
431 // no 3d effects, we draw them ourselves
433 #endif // !wxUniversal
434 if (lStyle
& wxPOPUP_WINDOW
)
436 ulCreateFlags
&= ~WS_VISIBLE
;
441 ulCreateFlags
|= WS_VISIBLE
;
445 // Generic OS/2 Windows have no Control Data but other classes
446 // that call OS2Create may have some.
448 return(OS2Create( (PSZ
)wxCanvasClassName
453 ,NULL
// Control Data
457 } // end of wxWindowOS2::Create
459 // ---------------------------------------------------------------------------
461 // ---------------------------------------------------------------------------
463 void wxWindowOS2::SetFocus()
465 HWND hWnd
= GetHwnd();
466 wxCHECK_RET( hWnd
, _T("can't set focus to invalid window") );
469 ::WinSetFocus(HWND_DESKTOP
, hWnd
);
470 } // end of wxWindowOS2::SetFocus
472 void wxWindowOS2::SetFocusFromKbd()
475 // Nothing else to do under OS/2
477 wxWindowBase::SetFocusFromKbd();
478 } // end of wxWindowOS2::SetFocus
480 wxWindow
* wxWindowBase::DoFindFocus()
482 HWND hWnd
= ::WinQueryFocus(HWND_DESKTOP
);
486 return wxFindWinFromHandle((WXHWND
)hWnd
);
489 } // wxWindowBase::DoFindFocus
491 bool wxWindowOS2::Enable(
495 if (!wxWindowBase::Enable(bEnable
))
498 HWND hWnd
= GetHwnd();
501 ::WinEnableWindow(hWnd
, (BOOL
)bEnable
);
504 // The logic below doesn't apply to the top level windows -- otherwise
505 // showing a modal dialog would result in total greying out (and ungreying
506 // out later) of everything which would be really ugly
511 wxWindowList::compatibility_iterator node
= GetChildren().GetFirst();
515 wxWindow
* pChild
= node
->GetData();
520 // Enable the child back unless it had been disabled before us
522 if (!m_pChildrenDisabled
|| !m_pChildrenDisabled
->Find(pChild
))
525 else // we're being disabled
527 if (pChild
->IsEnabled())
530 // Disable it as children shouldn't stay enabled while the
535 else // child already disabled, remember it
538 // Have we created the list of disabled children already?
540 if (!m_pChildrenDisabled
)
541 m_pChildrenDisabled
= new wxWindowList
;
542 m_pChildrenDisabled
->Append(pChild
);
545 node
= node
->GetNext();
547 if (bEnable
&& m_pChildrenDisabled
)
550 // We don't need this list any more, don't keep unused memory
552 delete m_pChildrenDisabled
;
553 m_pChildrenDisabled
= NULL
;
556 } // end of wxWindowOS2::Enable
558 bool wxWindowOS2::Show(
562 if (!wxWindowBase::Show(bShow
))
565 HWND hWnd
= GetHwnd();
567 ::WinShowWindow(hWnd
, bShow
);
571 ::WinSetWindowPos(hWnd
, HWND_TOP
, 0, 0, 0, 0, SWP_ACTIVATE
| SWP_ZORDER
);
574 } // end of wxWindowOS2::Show
576 void wxWindowOS2::Raise()
578 ::WinSetWindowPos(GetHwnd(), HWND_TOP
, 0, 0, 0, 0, SWP_ZORDER
| SWP_ACTIVATE
);
579 } // end of wxWindowOS2::Raise
581 void wxWindowOS2::Lower()
583 ::WinSetWindowPos(GetHwnd(), HWND_BOTTOM
, 0, 0, 0, 0, SWP_ZORDER
| SWP_DEACTIVATE
);
584 } // end of wxWindowOS2::Lower
586 void wxWindowOS2::SetTitle(
587 const wxString
& rTitle
590 ::WinSetWindowText(GetHwnd(), (PSZ
)rTitle
.c_str());
591 } // end of wxWindowOS2::SetTitle
593 wxString
wxWindowOS2::GetTitle() const
595 return wxGetWindowText(GetHWND());
596 } // end of wxWindowOS2::GetTitle
598 void wxWindowOS2::DoCaptureMouse()
600 HWND hWnd
= GetHwnd();
602 if (hWnd
&& !m_bWinCaptured
)
604 ::WinSetCapture(HWND_DESKTOP
, hWnd
);
605 m_bWinCaptured
= TRUE
;
607 } // end of wxWindowOS2::GetTitle
609 void wxWindowOS2::DoReleaseMouse()
613 ::WinSetCapture(HWND_DESKTOP
, NULLHANDLE
);
614 m_bWinCaptured
= FALSE
;
616 } // end of wxWindowOS2::ReleaseMouse
618 /* static */ wxWindow
* wxWindowBase::GetCapture()
620 HWND hwnd
= ::WinQueryCapture(HWND_DESKTOP
);
621 return hwnd
? wxFindWinFromHandle((WXHWND
)hwnd
) : (wxWindow
*)NULL
;
622 } // end of wxWindowBase::GetCapture
624 bool wxWindowOS2::SetFont(
628 if (!wxWindowBase::SetFont(rFont
))
634 HWND hWnd
= GetHwnd();
640 } // end of wxWindowOS2::SetFont
642 bool wxWindowOS2::SetCursor(
643 const wxCursor
& rCursor
644 ) // check if base implementation is OK
646 if ( !wxWindowBase::SetCursor(rCursor
))
652 if ( m_cursor
.Ok() ) {
653 HWND hWnd
= GetHwnd();
657 ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
);
658 ::WinQueryWindowRect(hWnd
, &vRect
);
660 if (::WinPtInRect(vHabmain
, &vRect
, &vPoint
) && !wxIsBusy())
662 ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)m_cursor
.GetHCURSOR());
666 } // end of wxWindowOS2::SetCursor
668 void wxWindowOS2::WarpPointer(
677 ::WinQueryWindowRect(GetHwnd(), &vRect
);
681 ::WinSetPointerPos(HWND_DESKTOP
, (LONG
)nX
, (LONG
)(nY
));
682 } // end of wxWindowOS2::WarpPointer
685 // ---------------------------------------------------------------------------
687 // ---------------------------------------------------------------------------
689 int wxWindowOS2::GetScrollPos(
693 if (nOrient
== wxHORIZONTAL
)
694 return((int)::WinSendMsg(m_hWndScrollBarHorz
, SBM_QUERYPOS
, (MPARAM
)NULL
, (MPARAM
)NULL
));
696 return((int)::WinSendMsg(m_hWndScrollBarVert
, SBM_QUERYPOS
, (MPARAM
)NULL
, (MPARAM
)NULL
));
697 } // end of wxWindowOS2::GetScrollPos
699 int wxWindowOS2::GetScrollRange(
705 if (nOrient
== wxHORIZONTAL
)
706 mr
= ::WinSendMsg(m_hWndScrollBarHorz
, SBM_QUERYRANGE
, (MPARAM
)NULL
, (MPARAM
)NULL
);
708 mr
= ::WinSendMsg(m_hWndScrollBarVert
, SBM_QUERYRANGE
, (MPARAM
)NULL
, (MPARAM
)NULL
);
709 return((int)SHORT2FROMMR(mr
));
710 } // end of wxWindowOS2::GetScrollRange
712 int wxWindowOS2::GetScrollThumb(
716 if (nOrient
== wxHORIZONTAL
)
717 return m_nXThumbSize
;
719 return m_nYThumbSize
;
720 } // end of wxWindowOS2::GetScrollThumb
722 void wxWindowOS2::SetScrollPos(
725 , bool WXUNUSED(bRefresh
)
728 if (nOrient
== wxHORIZONTAL
)
729 ::WinSendMsg(m_hWndScrollBarHorz
, SBM_SETPOS
, (MPARAM
)nPos
, (MPARAM
)NULL
);
731 ::WinSendMsg(m_hWndScrollBarVert
, SBM_SETPOS
, (MPARAM
)nPos
, (MPARAM
)NULL
);
732 } // end of wxWindowOS2::SetScrollPos
734 void wxWindowOS2::SetScrollbar(
739 , bool WXUNUSED(bRefresh
)
742 HWND hWnd
= GetHwnd();
743 int nOldRange
= nRange
- nThumbVisible
;
744 int nRange1
= nOldRange
;
745 int nPageSize
= nThumbVisible
;
748 ULONG ulStyle
= WS_VISIBLE
| WS_SYNCPAINT
;
753 wxWindow
* pParent
= GetParent();
755 if (pParent
&& pParent
->IsKindOf(CLASSINFO(wxFrame
)))
759 pFrame
= wxDynamicCast(pParent
, wxFrame
);
760 hWndParent
= pFrame
->GetFrame();
761 hWndClient
= GetHwndOf(pParent
);
766 hWndParent
= GetHwndOf(pParent
);
768 hWndParent
= GetHwnd();
769 hWndClient
= hWndParent
;
771 ::WinQueryWindowPos(hWndClient
, &vSwp
);
772 ::WinQueryWindowPos(hWnd
, &vSwpOwner
);
774 if (nPageSize
> 1 && nRange
> 0)
776 nRange1
+= (nPageSize
- 1);
779 vInfo
.cb
= sizeof(SBCDATA
);
781 vInfo
.posLast
= (SHORT
)nRange1
;
782 vInfo
.posThumb
= nPos
;
784 if (nOrient
== wxHORIZONTAL
)
787 if (m_hWndScrollBarHorz
== 0L)
790 // Since the scrollbars are usually created before the owner is
791 // sized either via an OnSize event directly or via sizers or
792 // layout constraints, we will initially just use the coords of
793 // the parent window (this is usually a frame client window). But
794 // the bars themselves, are children of the parent frame (i.e
795 // siblings of the frame client. The owner, however is the actual
796 // window being scrolled (or at least the one responsible for
797 // handling the scroll events). The owner will be resized later,
798 // as it is usually a child of a top level window, and when that
799 // is done its scrollbars will be resized and repositioned as well.
801 m_hWndScrollBarHorz
= ::WinCreateWindow( hWndParent
819 // The owner (the scrolled window) is a child of the Frame's
820 // client window, usually. The scrollbars are children of the
821 // frame, itself, and thus are positioned relative to the frame's
822 // origin, not the frame's client window origin.
823 // The starting x position is the same as the starting x position
824 // of the owner, but in terms of the parent frame.
825 // The starting y position is 20 pels below the origin of the
826 // owner in terms of the parent frame.
827 // The horz bar is the same width as the owner and 20 pels high.
829 if (nRange1
>= nThumbVisible
)
831 ::WinSetWindowPos( m_hWndScrollBarHorz
833 ,vSwp
.x
+ vSwpOwner
.x
834 ,(vSwp
.y
+ vSwpOwner
.y
) - 20
837 ,SWP_MOVE
| SWP_SIZE
| SWP_SHOW
| SWP_ACTIVATE
| SWP_ZORDER
839 ::WinSendMsg( m_hWndScrollBarHorz
842 ,MPFROM2SHORT(0, (SHORT
)nRange1
)
844 ::WinSendMsg( m_hWndScrollBarHorz
846 ,MPFROM2SHORT( (SHORT
)nThumbVisible
853 ::WinShowWindow(m_hWndScrollBarHorz
, FALSE
);
859 if (m_hWndScrollBarVert
== 0L)
862 // Since the scrollbars are usually created before the owner is
863 // sized either via an OnSize event directly or via sizers or
864 // layout constraints, we will initially just use the coords of
865 // the parent window (this is usually a frame client window). But
866 // the bars themselves, are children of the parent frame (i.e
867 // siblings of the frame client. The owner, however is the actual
868 // window being scrolled (or at least the one responsible for
869 // handling the scroll events). The owner will be resized later,
870 // as it is usually a child of a top level window, and when that
871 // is done its scrollbars will be resized and repositioned as well.
873 m_hWndScrollBarVert
= ::WinCreateWindow( hWndParent
877 ,vSwp
.x
+ vSwp
.cx
- 20
891 // The owner (the scrolled window) is a child of the Frame's
892 // client window, usually. The scrollbars are children of the
893 // frame, itself and thus are positioned relative to the frame's
894 // origin, not the frame's client window's origin.
895 // Thus, the x position will be frame client's x (usually a few
896 // pels inside the parent frame, plus the width of the owner.
897 // Since we may be using sizers or layout constraints for multiple
898 // child scrolled windows, the y position will be the frame client's
899 // y pos plus the scrolled windows y position, yielding the y
900 // position of the scrollbar relative to the parent frame (the vert
901 // scrollbar is on the right and starts at the bottom of the
903 // It is 20 pels wide and the same height as the owner.
905 if (nRange1
>= nThumbVisible
)
907 ::WinSetWindowPos( m_hWndScrollBarVert
909 ,vSwp
.x
+ vSwpOwner
.x
+ vSwpOwner
.cx
910 ,vSwp
.y
+ vSwpOwner
.y
913 ,SWP_ACTIVATE
| SWP_MOVE
| SWP_SIZE
| SWP_SHOW
915 ::WinSendMsg( m_hWndScrollBarVert
918 ,MPFROM2SHORT(0, (SHORT
)nRange1
)
920 ::WinSendMsg( m_hWndScrollBarVert
922 ,MPFROM2SHORT( (SHORT
)nThumbVisible
929 ::WinShowWindow(m_hWndScrollBarVert
, FALSE
);
931 m_nYThumbSize
= nThumbVisible
;
933 } // end of wxWindowOS2::SetScrollbar
935 void wxWindowOS2::ScrollWindow(
938 , const wxRect
* pRect
943 ::WinQueryWindowRect(GetHwnd(), &vRect
);
944 int height
= vRect
.yTop
;
947 vRect
.xLeft
= pRect
->x
;
948 vRect
.yTop
= height
- pRect
->y
;
949 vRect
.xRight
= pRect
->x
+ pRect
->width
;
950 vRect
.yBottom
= vRect
.yTop
- pRect
->height
;
952 nDy
*= -1; // flip the sign of Dy as OS/2 is opposite Windows.
953 ::WinScrollWindow( GetHwnd()
960 ,SW_SCROLLCHILDREN
| SW_INVALIDATERGN
962 } // end of wxWindowOS2::ScrollWindow
964 // ---------------------------------------------------------------------------
966 // ---------------------------------------------------------------------------
968 void wxWindowOS2::SubclassWin(
972 HWND hwnd
= (HWND
)hWnd
;
974 wxCHECK_RET(::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in SubclassWin") );
975 wxAssociateWinWithHandle( hWnd
978 if (!wxCheckWindowWndProc( hWnd
979 ,(WXFARPROC
)wxWndProc
982 m_fnOldWndProc
= (WXFARPROC
) ::WinSubclassWindow(hwnd
, (PFNWP
)wxWndProc
);
986 m_fnOldWndProc
= (WXFARPROC
)NULL
;
988 } // end of wxWindowOS2::SubclassWin
990 void wxWindowOS2::UnsubclassWin()
993 // Restore old Window proc
995 HWND hwnd
= GetHWND();
999 wxCHECK_RET( ::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in UnsubclassWin") );
1001 PFNWP fnProc
= (PFNWP
)::WinQueryWindowPtr(hwnd
, QWP_PFNWP
);
1003 if ( (m_fnOldWndProc
!= 0) && (fnProc
!= (PFNWP
) m_fnOldWndProc
))
1005 WinSubclassWindow(hwnd
, (PFNWP
)m_fnOldWndProc
);
1009 } // end of wxWindowOS2::UnsubclassWin
1011 bool wxCheckWindowWndProc(
1013 , WXFARPROC fnWndProc
1016 static char zBuffer
[512];
1019 ::WinQueryClassName((HWND
)hWnd
, (LONG
)512, (PCH
)zBuffer
);
1020 ::WinQueryClassInfo(wxGetInstance(), (PSZ
)zBuffer
, &vCls
);
1021 return(fnWndProc
== (WXFARPROC
)vCls
.pfnWindowProc
);
1022 } // end of WinGuiBase_CheckWindowWndProc
1024 void wxWindowOS2::SetWindowStyleFlag(
1028 long lFlagsOld
= GetWindowStyleFlag();
1030 if (lFlags
== lFlagsOld
)
1034 // Update the internal variable
1036 wxWindowBase::SetWindowStyleFlag(lFlags
);
1039 // Now update the Windows style as well if needed - and if the window had
1040 // been already created
1046 WXDWORD dwExstyleOld
;
1047 long lStyle
= OS2GetStyle( lFlags
1050 long lStyleOld
= OS2GetStyle( lFlagsOld
1054 if (lStyle
!= lStyleOld
)
1057 // Some flags (e.g. WS_VISIBLE or WS_DISABLED) should not be changed by
1058 // this function so instead of simply setting the style to the new
1059 // value we clear the bits which were set in styleOld but are set in
1060 // the new one and set the ones which were not set before
1062 long lStyleReal
= ::WinQueryWindowULong(GetHwnd(), QWL_STYLE
);
1064 lStyleReal
&= ~lStyleOld
;
1065 lStyleReal
|= lStyle
;
1067 ::WinSetWindowULong(GetHwnd(), QWL_STYLE
, lStyleReal
);
1069 } // end of wxWindowOS2::SetWindowStyleFlag
1071 WXDWORD
wxWindowOS2::OS2GetStyle(
1073 , WXDWORD
* pdwExstyle
1076 WXDWORD dwStyle
= 0L;
1078 if (lFlags
& wxCLIP_CHILDREN
)
1079 dwStyle
|= WS_CLIPCHILDREN
;
1081 if (lFlags
& wxCLIP_SIBLINGS
)
1082 dwStyle
|= WS_CLIPSIBLINGS
;
1085 } // end of wxWindowMSW::MSWGetStyle
1088 // Make a Windows extended style from the given wxWidgets window style
1090 WXDWORD
wxWindowOS2::MakeExtendedStyle(
1092 , bool bEliminateBorders
1096 // Simply fill out with wxWindow extended styles. We'll conjure
1097 // something up in OS2Create and all window redrawing pieces later
1099 WXDWORD dwStyle
= 0;
1101 if (lStyle
& wxTRANSPARENT_WINDOW
)
1102 dwStyle
|= wxTRANSPARENT_WINDOW
;
1104 if (!bEliminateBorders
)
1106 if (lStyle
& wxSUNKEN_BORDER
)
1107 dwStyle
|= wxSUNKEN_BORDER
;
1108 if (lStyle
& wxDOUBLE_BORDER
)
1109 dwStyle
|= wxDOUBLE_BORDER
;
1110 if (lStyle
& wxRAISED_BORDER
)
1111 dwStyle
|= wxRAISED_BORDER
;
1112 if (lStyle
& wxSTATIC_BORDER
)
1113 dwStyle
|= wxSTATIC_BORDER
;
1116 } // end of wxWindowOS2::MakeExtendedStyle
1119 // Setup background and foreground colours correctly
1121 void wxWindowOS2::SetupColours()
1124 SetBackgroundColour(GetParent()->GetBackgroundColour());
1125 } // end of wxWindowOS2::SetupColours
1127 void wxWindowOS2::OnIdle(
1128 wxIdleEvent
& WXUNUSED(rEvent
)
1132 // Check if we need to send a LEAVE event
1134 if (m_bMouseInWindow
)
1138 ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
);
1139 if (::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, FALSE
) != (HWND
)GetHwnd())
1142 // Generate a LEAVE event
1144 m_bMouseInWindow
= FALSE
;
1147 // Unfortunately the mouse button and keyboard state may have changed
1148 // by the time the OnIdle function is called, so 'state' may be
1158 wxMouseEvent
rEvent(wxEVT_LEAVE_WINDOW
);
1160 InitMouseEvent( rEvent
1165 (void)GetEventHandler()->ProcessEvent(rEvent
);
1168 if (wxUpdateUIEvent::CanUpdate(this))
1169 UpdateWindowUI(wxUPDATE_UI_FROMIDLE
);
1170 } // end of wxWindowOS2::OnIdle
1173 // Set this window to be the child of 'parent'.
1175 bool wxWindowOS2::Reparent(
1179 if (!wxWindowBase::Reparent(pParent
))
1182 HWND hWndChild
= GetHwnd();
1183 HWND hWndParent
= GetParent() ? GetWinHwnd(GetParent()) : (HWND
)0;
1185 ::WinSetParent(hWndChild
, hWndParent
, TRUE
);
1187 } // end of wxWindowOS2::Reparent
1189 void wxWindowOS2::Update()
1191 ::WinUpdateWindow(GetHwnd());
1192 } // end of wxWindowOS2::Update
1194 void wxWindowOS2::Freeze()
1196 ::WinSendMsg(GetHwnd(), WM_VRNDISABLED
, (MPARAM
)0, (MPARAM
)0);
1197 } // end of wxWindowOS2::Freeze
1199 void wxWindowOS2::Thaw()
1201 ::WinSendMsg(GetHwnd(), WM_VRNENABLED
, (MPARAM
)TRUE
, (MPARAM
)0);
1204 // We need to refresh everything or otherwise he invalidated area is not
1208 } // end of wxWindowOS2::Thaw
1210 void wxWindowOS2::Refresh(
1212 , const wxRect
* pRect
1215 HWND hWnd
= GetHwnd();
1224 ::WinQueryWindowRect(GetHwnd(), &vOs2Rect
);
1225 height
= vOs2Rect
.yTop
;
1226 vOs2Rect
.xLeft
= pRect
->x
;
1227 vOs2Rect
.yTop
= height
- pRect
->y
;
1228 vOs2Rect
.xRight
= pRect
->x
+ pRect
->width
;
1229 vOs2Rect
.yBottom
= vOs2Rect
.yTop
- pRect
->height
;
1231 ::WinInvalidateRect(hWnd
, &vOs2Rect
, bEraseBack
);
1234 ::WinInvalidateRect(hWnd
, NULL
, bEraseBack
);
1235 if (m_hWndScrollBarHorz
!= NULLHANDLE
)
1236 ::WinInvalidateRect(m_hWndScrollBarHorz
, NULL
, TRUE
);
1237 if (m_hWndScrollBarVert
!= NULLHANDLE
)
1238 ::WinInvalidateRect(m_hWndScrollBarVert
, NULL
, TRUE
);
1240 } // end of wxWindowOS2::Refresh
1242 // ---------------------------------------------------------------------------
1244 // ---------------------------------------------------------------------------
1246 #if wxUSE_DRAG_AND_DROP
1247 void wxWindowOS2::SetDropTarget(
1248 wxDropTarget
* pDropTarget
1251 m_dropTarget
= pDropTarget
;
1252 } // end of wxWindowOS2::SetDropTarget
1256 // old style file-manager drag&drop support: we retain the old-style
1257 // DragAcceptFiles in parallel with SetDropTarget.
1259 void wxWindowOS2::DragAcceptFiles(
1263 HWND hWnd
= GetHwnd();
1265 if (hWnd
&& bAccept
)
1266 ::DrgAcceptDroppedFiles(hWnd
, NULL
, NULL
, DO_COPY
, 0L);
1267 } // end of wxWindowOS2::DragAcceptFiles
1269 // ----------------------------------------------------------------------------
1271 // ----------------------------------------------------------------------------
1275 void wxWindowOS2::DoSetToolTip(
1279 wxWindowBase::DoSetToolTip(pTooltip
);
1282 m_tooltip
->SetWindow(this);
1283 } // end of wxWindowOS2::DoSetToolTip
1285 #endif // wxUSE_TOOLTIPS
1287 // ---------------------------------------------------------------------------
1288 // moving and resizing
1289 // ---------------------------------------------------------------------------
1292 void wxWindowOS2::DoGetSize(
1300 if (IsKindOf(CLASSINFO(wxFrame
)))
1302 wxFrame
* pFrame
= wxDynamicCast(this, wxFrame
);
1303 hWnd
= pFrame
->GetFrame();
1308 ::WinQueryWindowRect(hWnd
, &vRect
);
1311 *pWidth
= vRect
.xRight
- vRect
.xLeft
;
1313 // OS/2 PM is backwards from windows
1314 *pHeight
= vRect
.yTop
- vRect
.yBottom
;
1315 } // end of wxWindowOS2::DoGetSize
1317 void wxWindowOS2::DoGetPosition(
1322 HWND hWnd
= GetHwnd();
1325 wxWindow
* pParent
= GetParent();
1328 // It would seem that WinQueryWindowRect would be the correlary to
1329 // the WIN32 WinGetRect, but unlike WinGetRect which returns the window
1330 // origin position in screen coordinates, WinQueryWindowRect returns it
1331 // relative to itself, i.e. (0,0). To get the same under PM we must
1332 // us WinQueryWindowPos. This call, unlike the WIN32 call, however,
1333 // returns a position relative to it's parent, so no parent adujstments
1334 // are needed under OS/2. Also, windows should be created using
1335 // wxWindow coordinates, i.e 0,0 is the TOP left so vSwp will already
1338 ::WinQueryWindowPos(hWnd
, &vSwp
);
1344 // We may be faking the client origin. So a window that's really at (0,
1345 // 30) may appear (to wxWin apps) to be at (0, 0).
1349 wxPoint
vPt(pParent
->GetClientAreaOrigin());
1359 } // end of wxWindowOS2::DoGetPosition
1361 void wxWindowOS2::DoScreenToClient(
1366 HWND hWnd
= GetHwnd();
1369 ::WinQueryWindowPos(hWnd
, &vSwp
);
1375 } // end of wxWindowOS2::DoScreenToClient
1377 void wxWindowOS2::DoClientToScreen(
1382 HWND hWnd
= GetHwnd();
1385 ::WinQueryWindowPos(hWnd
, &vSwp
);
1391 } // end of wxWindowOS2::DoClientToScreen
1394 // Get size *available for subwindows* i.e. excluding menu bar etc.
1395 // Must be a frame type window
1397 void wxWindowOS2::DoGetClientSize(
1402 HWND hWnd
= GetHwnd();
1405 ::WinQueryWindowRect(hWnd
, &vRect
);
1406 if (IsKindOf(CLASSINFO(wxDialog
)))
1411 // For a Dialog we have to explicitly request the client portion.
1412 // For a Frame the hWnd IS the client window
1414 hWndTitle
= ::WinWindowFromID(hWnd
, FID_TITLEBAR
);
1415 if (::WinQueryWindowRect(hWndTitle
, &vTitle
))
1417 if (vTitle
.yTop
- vTitle
.yBottom
== 0)
1420 // Dialog has not been created yet, use a default
1424 vRect
.yTop
-= (vTitle
.yTop
- vTitle
.yBottom
);
1427 ULONG uStyle
= ::WinQueryWindowULong(hWnd
, QWL_STYLE
);
1430 // Deal with borders
1432 if (uStyle
& FCF_DLGBORDER
)
1439 else if (uStyle
& FCF_SIZEBORDER
)
1446 else if (uStyle
& FCF_BORDER
)
1453 else // make some kind of adjustment or top sizers ram into the titlebar!
1462 *pWidth
= vRect
.xRight
- vRect
.xLeft
;
1464 *pHeight
= vRect
.yTop
- vRect
.yBottom
;
1465 } // end of wxWindowOS2::DoGetClientSize
1467 void wxWindowOS2::DoMoveWindow(
1475 wxWindow
* pParent
= GetParent();
1477 /* Due to OS/2's inverted coordinate system, changing the height
1478 of a window requires repositioning all it's children, e.g. if
1479 you want a child of height 100 to be at the top left corner of
1480 the parent you need to position the lower left corner of the
1481 child at (0, (height of parent - 100)), so, obviously, if the
1482 height of the parent changes, the child needs to be repositioned. */
1484 GetSize(0, &nHeightDelta
);
1485 nHeightDelta
= nHeight
- nHeightDelta
;
1487 if (pParent
&& !IsKindOf(CLASSINFO(wxDialog
)))
1489 int nOS2Height
= GetOS2ParentHeight(pParent
);
1491 nY
= nOS2Height
- (nY
+ nHeight
);
1497 ::WinQueryWindowRect(HWND_DESKTOP
, &vRect
);
1498 nY
= vRect
.yTop
- (nY
+ nHeight
);
1502 // In the case of a frame whose client is sized, the client cannot be
1503 // large than its parent frame minus its borders! This usually happens
1504 // when using an autosizer to size a frame to precisely hold client
1505 // controls as in the notebook sample.
1507 // In this case, we may need to resize both a frame and its client so we
1508 // need a quick calc of the frame border size, then if the frame
1509 // (less its borders) is smaller than the client, size the frame to
1510 // encompass the client with the appropriate border size.
1512 if (IsKindOf(CLASSINFO(wxFrame
)))
1516 int nWidthFrameDelta
= 0;
1517 int nHeightFrameDelta
= 0;
1518 int nHeightFrame
= 0;
1519 int nWidthFrame
= 0;
1522 pFrame
= wxDynamicCast(this, wxFrame
);
1523 hWndFrame
= pFrame
->GetFrame();
1524 ::WinQueryWindowRect(hWndFrame
, &vRect
);
1525 ::WinMapWindowPoints(hWndFrame
, HWND_DESKTOP
, (PPOINTL
)&vRect
, 2);
1527 ::WinCalcFrameRect(hWndFrame
, &vRect
, TRUE
);
1528 nWidthFrameDelta
= ((vRect
.xLeft
- vFRect
.xLeft
) + (vFRect
.xRight
- vRect
.xRight
));
1529 nHeightFrameDelta
= ((vRect
.yBottom
- vFRect
.yBottom
) + (vFRect
.yTop
- vRect
.yTop
));
1530 nWidthFrame
= vFRect
.xRight
- vFRect
.xLeft
;
1531 nHeightFrame
= vFRect
.yTop
- vFRect
.yBottom
;
1533 if (nWidth
== vFRect
.xRight
- vFRect
.xLeft
&&
1534 nHeight
== vFRect
.yTop
- vFRect
.yBottom
)
1537 // In this case the caller is not aware of OS/2's need to size both
1538 // the frame and it's client and is really only moving the window,
1539 // not resizeing it. So move the frame, and back off the sizes
1540 // for a proper client fit.
1542 ::WinSetWindowPos( hWndFrame
1544 ,(LONG
)nX
- (vRect
.xLeft
- vFRect
.xLeft
)
1545 ,(LONG
)nY
- (vRect
.yBottom
- vFRect
.yBottom
)
1550 nX
+= (vRect
.xLeft
- vFRect
.xLeft
);
1551 nY
+= (vRect
.yBottom
- vFRect
.yBottom
);
1552 nWidth
-= nWidthFrameDelta
;
1553 nHeight
-= nHeightFrameDelta
;
1557 if (nWidth
> nWidthFrame
- nHeightFrameDelta
||
1558 nHeight
> nHeightFrame
- nHeightFrameDelta
)
1560 ::WinSetWindowPos( hWndFrame
1562 ,(LONG
)nX
- (vRect
.xLeft
- vFRect
.xLeft
)
1563 ,(LONG
)nY
- (vRect
.yBottom
- vFRect
.yBottom
)
1564 ,(LONG
)nWidth
+ nWidthFrameDelta
1565 ,(LONG
)nHeight
+ nHeightFrameDelta
1566 ,SWP_MOVE
| SWP_SIZE
1572 ::WinSetWindowPos( GetHwnd()
1578 ,SWP_SIZE
| SWP_MOVE
1580 if (m_vWinSwp
.cx
== 0 && m_vWinSwp
.cy
== 0 && m_vWinSwp
.fl
== 0)
1584 ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp
);
1587 int nYDiff
= m_vWinSwp
.cy
- nHeight
;
1590 // Handle resizing of scrolled windows. The target or window to
1591 // be scrolled is the owner (gets the scroll notificaitons). The
1592 // parent is usually the parent frame of the scrolled panel window.
1593 // In order to show the scrollbars the target window will be shrunk
1594 // by the size of the scroll bar widths (20) and moved in the X and Y
1595 // directon. That value will be computed as part of the diff for
1596 // moving the children. Everytime the window is sized the
1597 // toplevel OnSize is going to resize the panel to fit the client
1598 // or the whole sizer and will need to me resized. This will send
1599 // a WM_SIZE out which will be intercepted by the ScrollHelper
1600 // which will cause the scrollbars to be displayed via the SetScrollbar
1603 if ( IsKindOf(CLASSINFO(wxGenericScrolledWindow
)) ||
1604 IsKindOf(CLASSINFO(wxScrolledWindow
))
1607 int nAdjustWidth
= 0;
1608 int nAdjustHeight
= 0;
1611 if (GetScrollBarHorz() == NULLHANDLE
||
1612 !WinIsWindowShowing(GetScrollBarHorz()))
1615 nAdjustHeight
= 20L;
1616 if (GetScrollBarVert() == NULLHANDLE
||
1617 !WinIsWindowShowing(GetScrollBarVert()))
1621 ::WinQueryWindowPos(GetHWND(), &vSwpScroll
);
1622 ::WinSetWindowPos( GetHWND()
1625 ,vSwpScroll
.y
+ nAdjustHeight
1626 ,vSwpScroll
.cx
- nAdjustWidth
1627 ,vSwpScroll
.cy
- nAdjustHeight
1628 ,SWP_MOVE
| SWP_SIZE
1630 nYDiff
-= nAdjustHeight
;
1632 MoveChildren(nYDiff
);
1633 ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp
);
1636 // FIXME: By my logic, the next line should be needed as it moves child
1637 // windows when resizing the parent (see comment at beginning of
1638 // function). However, this seems to cause lots of problems. At
1639 // least, e.g. the grid sample almost works with this line
1640 // commented out but crashes badly with it.
1641 MoveChildren(nHeightDelta
);
1643 } // end of wxWindowOS2::DoMoveWindow
1646 // Set the size of the window: if the dimensions are positive, just use them,
1647 // but if any of them is equal to -1, it means that we must find the value for
1648 // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in
1649 // which case -1 is a valid value for x and y)
1651 // If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate
1652 // the width/height to best suit our contents, otherwise we reuse the current
1655 void wxWindowOS2::DoSetSize(
1664 // Get the current size and position...
1670 wxSize
vSize(-1, -1);
1672 GetPosition(&nCurrentX
, &nCurrentY
);
1673 GetSize(&nCurrentWidth
, &nCurrentHeight
);
1676 // ... and don't do anything (avoiding flicker) if it's already ok
1679 // Must convert Y coords to test for equality under OS/2
1683 if (nX
== nCurrentX
&& nY2
== nCurrentY
&&
1684 nWidth
== nCurrentWidth
&& nHeight
== nCurrentHeight
)
1689 if (nX
== -1 && !(nSizeFlags
& wxSIZE_ALLOW_MINUS_ONE
))
1691 if (nY
== -1 && !(nSizeFlags
& wxSIZE_ALLOW_MINUS_ONE
))
1694 AdjustForParentClientOrigin(nX
, nY
, nSizeFlags
);
1698 if (nSizeFlags
& wxSIZE_AUTO_WIDTH
)
1700 vSize
= DoGetBestSize();
1706 // Just take the current one
1708 nWidth
= nCurrentWidth
;
1714 if (nSizeFlags
& wxSIZE_AUTO_HEIGHT
)
1718 vSize
= DoGetBestSize();
1724 // just take the current one
1725 nHeight
= nCurrentHeight
;
1734 } // end of wxWindowOS2::DoSetSize
1736 void wxWindowOS2::DoSetClientSize(
1744 wxWindow
* pParent
= (wxWindow
*)GetParent();
1745 HWND hParentWnd
= (HWND
)0;
1748 hParentWnd
= (HWND
)pParent
->GetHWND();
1750 if (IsKindOf(CLASSINFO(wxFrame
)))
1752 wxFrame
* pFrame
= wxDynamicCast(this, wxFrame
);
1753 HWND hFrame
= pFrame
->GetFrame();
1758 ::WinQueryWindowRect(GetHwnd(), &vRect2
);
1759 ::WinQueryWindowRect(hFrame
, &vRect
);
1760 ::WinQueryWindowRect(hParentWnd
, &vRect3
);
1761 nActualWidth
= vRect2
.xRight
- vRect2
.xLeft
- vRect
.xRight
+ nWidth
;
1762 nActualHeight
= vRect2
.yTop
- vRect2
.yBottom
- vRect
.yTop
+ nHeight
;
1764 vPoint
.x
= vRect2
.xLeft
;
1765 vPoint
.y
= vRect2
.yBottom
;
1768 vPoint
.x
-= vRect3
.xLeft
;
1769 vPoint
.y
-= vRect3
.yBottom
;
1777 GetPosition(&nX
, &nY
);
1778 nActualWidth
= nWidth
;
1779 nActualHeight
= nHeight
;
1784 DoMoveWindow( vPoint
.x
1790 wxSizeEvent
vEvent( wxSize( nWidth
1796 vEvent
.SetEventObject(this);
1797 GetEventHandler()->ProcessEvent(vEvent
);
1798 } // end of wxWindowOS2::DoSetClientSize
1800 // ---------------------------------------------------------------------------
1802 // ---------------------------------------------------------------------------
1804 int wxWindowOS2::GetCharHeight() const
1807 FONTMETRICS vFontMetrics
;
1809 hPs
= ::WinGetPS(GetHwnd());
1811 if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
))
1813 ::WinReleasePS(hPs
);
1816 ::WinReleasePS(hPs
);
1817 return(vFontMetrics
.lMaxAscender
+ vFontMetrics
.lMaxDescender
);
1818 } // end of wxWindowOS2::GetCharHeight
1820 int wxWindowOS2::GetCharWidth() const
1823 FONTMETRICS vFontMetrics
;
1825 hPs
= ::WinGetPS(GetHwnd());
1827 if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
))
1829 ::WinReleasePS(hPs
);
1832 ::WinReleasePS(hPs
);
1833 return(vFontMetrics
.lAveCharWidth
);
1834 } // end of wxWindowOS2::GetCharWidth
1836 void wxWindowOS2::GetTextExtent(
1837 const wxString
& rString
1841 , int* pExternalLeading
1842 , const wxFont
* pTheFont
1845 POINTL avPoint
[TXTBOX_COUNT
];
1850 FONTMETRICS vFM
; // metrics structure
1856 hPS
= ::WinGetPS(GetHwnd());
1858 l
= rString
.Length();
1861 pStr
= (PCH
)rString
.c_str();
1864 // In world coordinates.
1866 bRc
= ::GpiQueryTextBox( hPS
1869 ,TXTBOX_COUNT
// return maximum information
1870 ,avPoint
// array of coordinates points
1874 vPtMin
.x
= avPoint
[0].x
;
1875 vPtMax
.x
= avPoint
[0].x
;
1876 vPtMin
.y
= avPoint
[0].y
;
1877 vPtMax
.y
= avPoint
[0].y
;
1878 for (i
= 1; i
< 4; i
++)
1880 if(vPtMin
.x
> avPoint
[i
].x
) vPtMin
.x
= avPoint
[i
].x
;
1881 if(vPtMin
.y
> avPoint
[i
].y
) vPtMin
.y
= avPoint
[i
].y
;
1882 if(vPtMax
.x
< avPoint
[i
].x
) vPtMax
.x
= avPoint
[i
].x
;
1883 if(vPtMax
.y
< avPoint
[i
].y
) vPtMax
.y
= avPoint
[i
].y
;
1885 bRc
= ::GpiQueryFontMetrics( hPS
1886 ,sizeof(FONTMETRICS
)
1913 *pX
= (vPtMax
.x
- vPtMin
.x
+ 1);
1915 *pY
= (vPtMax
.y
- vPtMin
.y
+ 1);
1919 *pDescent
= vFM
.lMaxDescender
;
1923 if (pExternalLeading
)
1926 *pExternalLeading
= vFM
.lExternalLeading
;
1928 *pExternalLeading
= 0;
1930 ::WinReleasePS(hPS
);
1931 } // end of wxWindow::GetTextExtent
1933 bool wxWindowOS2::IsMouseInWindow() const
1936 // Get the mouse position
1939 ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
);
1942 // Find the window which currently has the cursor and go up the window
1943 // chain until we find this window - or exhaust it
1945 HWND hWnd
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt
, TRUE
);
1947 while (hWnd
&& (hWnd
!= GetHwnd()))
1948 hWnd
= ::WinQueryWindow(hWnd
, QW_PARENT
);
1950 return hWnd
!= NULL
;
1951 } // end of wxWindowOS2::IsMouseInWindow
1954 // ---------------------------------------------------------------------------
1956 // ---------------------------------------------------------------------------
1958 #if wxUSE_MENUS_NATIVE
1959 bool wxWindowOS2::DoPopupMenu(
1965 HWND hWndOwner
= GetHwnd();
1966 HWND hWndParent
= GetHwnd();
1967 HWND hMenu
= GetHmenuOf(pMenu
);
1968 bool bIsWaiting
= TRUE
;
1971 // Protect against recursion
1972 if (wxCurrentPopupMenu
)
1975 pMenu
->SetInvokingWindow(this);
1978 if ( nX
== -1 && nY
== -1 )
1980 wxPoint mouse
= wxGetMousePosition();
1981 nX
= mouse
.x
; nY
= mouse
.y
;
1985 DoClientToScreen( &nX
1988 DoGetSize(0,&nHeight
);
1991 wxCurrentPopupMenu
= pMenu
;
1993 ::WinPopupMenu( hWndParent
1999 ,PU_HCONSTRAIN
| PU_VCONSTRAIN
| PU_MOUSEBUTTON1
| PU_KEYBOARD
2006 ::WinGetMsg(vHabmain
,&vMsg
, (HWND
)0, 0, 0);
2007 if (vMsg
.msg
== WM_COMMAND
)
2009 ::WinDispatchMsg(vHabmain
, (PQMSG
)&vMsg
);
2012 wxCurrentPopupMenu
= NULL
;
2013 pMenu
->SetInvokingWindow(NULL
);
2015 } // end of wxWindowOS2::DoPopupMenu
2016 #endif // wxUSE_MENUS_NATIVE
2018 // ===========================================================================
2019 // pre/post message processing
2020 // ===========================================================================
2022 MRESULT
wxWindowOS2::OS2DefWindowProc(
2029 return (MRESULT
)m_fnOldWndProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
);
2031 return ::WinDefWindowProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
);
2032 } // end of wxWindowOS2::OS2DefWindowProc
2034 bool wxWindowOS2::OS2ProcessMessage(
2038 // wxUniversal implements tab traversal itself
2039 #ifndef __WXUNIVERSAL__
2040 QMSG
* pQMsg
= (QMSG
*)pMsg
;
2042 if (m_hWnd
!= 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL
))
2045 // Intercept dialog navigation keys
2047 bool bProcess
= TRUE
;
2048 USHORT uKeyFlags
= SHORT1FROMMP(pQMsg
->mp1
);
2050 if (uKeyFlags
& KC_KEYUP
)
2053 if (uKeyFlags
& KC_ALT
)
2056 if (!(uKeyFlags
& KC_VIRTUALKEY
))
2061 bool bCtrlDown
= IsCtrlDown();
2062 bool bShiftDown
= IsShiftDown();
2065 // WM_QUERYDLGCODE: ask the control if it wants the key for itself,
2066 // don't process it if it's the case (except for Ctrl-Tab/Enter
2067 // combinations which are always processed)
2069 ULONG ulDlgCode
= 0;
2073 ulDlgCode
= (ULONG
)::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0);
2076 bool bForward
= TRUE
;
2077 bool bWindowChange
= FALSE
;
2079 switch (SHORT2FROMMP(pQMsg
->mp2
))
2082 // Going to make certain assumptions about specific types of controls
2083 // here, so we may have to alter some things later if they prove invalid
2087 // Shift tabl will always be a nav-key but tabs may be wanted
2096 // Entry Fields want tabs for themselve usually
2100 case DLGC_ENTRYFIELD
:
2110 // Ctrl-Tab cycles thru notebook pages
2112 bWindowChange
= bCtrlDown
;
2113 bForward
= !bShiftDown
;
2136 // ctrl-enter is not processed
2140 else if (ulDlgCode
& DLGC_BUTTON
)
2143 // buttons want process Enter themselevs
2149 wxButton
* pBtn
= wxDynamicCast( GetDefaultItem()
2153 if (pBtn
&& pBtn
->IsEnabled())
2156 // If we do have a default button, do press it
2158 pBtn
->OS2Command(BN_CLICKED
, 0 /* unused */);
2161 else if (!IsTopLevel())
2164 // if not a top level window, let parent
2169 // else: but if it does not it makes sense to make
2170 // it work like a TAB - and that's what we do.
2171 // Note that Ctrl-Enter always works this way.
2182 wxNavigationKeyEvent vEvent
;
2184 vEvent
.SetDirection(bForward
);
2185 vEvent
.SetWindowChange(bWindowChange
);
2186 vEvent
.SetEventObject(this);
2188 if (GetEventHandler()->ProcessEvent(vEvent
))
2190 wxButton
* pBtn
= wxDynamicCast(FindFocus(), wxButton
);
2195 // The button which has focus should be default
2204 // Let Dialogs process
2206 if (::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0));
2210 pMsg
= pMsg
; // just shut up the compiler
2211 #endif // __WXUNIVERSAL__
2214 } // end of wxWindowOS2::OS2ProcessMessage
2216 bool wxWindowOS2::OS2TranslateMessage(
2220 #if wxUSE_ACCEL && !defined(__WXUNIVERSAL__)
2221 return m_acceleratorTable
.Translate(m_hWnd
, pMsg
);
2225 #endif //wxUSE_ACCEL
2226 } // end of wxWindowOS2::OS2TranslateMessage
2228 bool wxWindowOS2::OS2ShouldPreProcessMessage(
2232 // preprocess all messages by default
2234 } // end of wxWindowOS2::OS2ShouldPreProcessMessage
2236 // ---------------------------------------------------------------------------
2237 // message params unpackers
2238 // ---------------------------------------------------------------------------
2240 void wxWindowOS2::UnpackCommand(
2248 *pId
= LOWORD(wParam
);
2249 *phWnd
= NULL
; // or may be GetHWND() ?
2250 *pCmd
= LOWORD(lParam
);
2251 } // end of wxWindowOS2::UnpackCommand
2253 void wxWindowOS2::UnpackActivate(
2260 *pState
= LOWORD(wParam
);
2261 *phWnd
= (WXHWND
)lParam
;
2262 } // end of wxWindowOS2::UnpackActivate
2264 void wxWindowOS2::UnpackScroll(
2275 ulId
= (ULONG
)LONGFROMMP(wParam
);
2276 hWnd
= ::WinWindowFromID(GetHwnd(), ulId
);
2277 if (hWnd
== m_hWndScrollBarHorz
|| hWnd
== m_hWndScrollBarVert
)
2278 *phWnd
= NULLHANDLE
;
2282 *pPos
= SHORT1FROMMP(lParam
);
2283 *pCode
= SHORT2FROMMP(lParam
);
2284 } // end of wxWindowOS2::UnpackScroll
2286 void wxWindowOS2::UnpackMenuSelect(
2294 *pItem
= (WXWORD
)LOWORD(wParam
);
2295 *pFlags
= HIWORD(wParam
);
2296 *phMenu
= (WXHMENU
)lParam
;
2297 } // end of wxWindowOS2::UnpackMenuSelect
2299 // ---------------------------------------------------------------------------
2300 // Main wxWidgets window proc and the window proc for wxWindow
2301 // ---------------------------------------------------------------------------
2304 // Hook for new window just as it's being created, when the window isn't yet
2305 // associated with the handle
2307 wxWindowOS2
* wxWndHook
= NULL
;
2312 MRESULT EXPENTRY
wxWndProc(
2319 wxWindowOS2
* pWnd
= wxFindWinFromHandle((WXHWND
)hWnd
);
2322 // When we get the first message for the HWND we just created, we associate
2323 // it with wxWindow stored in wxWndHook
2325 if (!pWnd
&& wxWndHook
)
2327 wxAssociateWinWithHandle(hWnd
, wxWndHook
);
2330 pWnd
->SetHWND((WXHWND
)hWnd
);
2333 MRESULT rc
= (MRESULT
)0;
2337 // Stop right here if we don't have a valid handle in our wxWindow object.
2339 if (pWnd
&& !pWnd
->GetHWND())
2341 pWnd
->SetHWND((WXHWND
) hWnd
);
2342 rc
= pWnd
->OS2DefWindowProc(ulMsg
, wParam
, lParam
);
2349 rc
= pWnd
->OS2WindowProc(ulMsg
, wParam
, lParam
);
2350 if ( (pWnd
->GetScrollBarHorz() != NULLHANDLE
||
2351 pWnd
->GetScrollBarVert() != NULLHANDLE
) &&
2354 if (pWnd
->GetScrollBarHorz() != NULLHANDLE
)
2355 ::WinInvalidateRect(pWnd
->GetScrollBarHorz(), NULL
, TRUE
);
2356 if (pWnd
->GetScrollBarVert() != NULLHANDLE
)
2357 ::WinInvalidateRect(pWnd
->GetScrollBarVert(), NULL
, TRUE
);
2361 rc
= ::WinDefWindowProc(hWnd
, ulMsg
, wParam
, lParam
);
2365 } // end of wxWndProc
2368 // We will add (or delete) messages we need to handle at this default
2371 MRESULT
wxWindowOS2::OS2WindowProc(
2378 // Did we process the uMsg?
2380 bool bProcessed
= FALSE
;
2384 // For most messages we should return 0 when we do process the message
2386 mResult
= (MRESULT
)0;
2394 bProcessed
= HandleCreate( (WXLPCREATESTRUCT
)lParam
2400 // Return 0 to bAllow window creation
2402 mResult
= (MRESULT
)(bMayCreate
? 0 : -1);
2413 bProcessed
= HandleMove( LOWORD(lParam
)
2419 bProcessed
= HandleSize( LOWORD(lParam
)
2425 case WM_WINDOWPOSCHANGED
:
2428 // Dialogs under OS/2 do not get WM_SIZE events at all.
2429 // Instead they get this, which can function much like WM_SIZE
2430 // PSWP contains the new sizes and positioning, PSWP+1 the old
2431 // We use this because ADJUSTWINDOWPOS comes BEFORE the new
2432 // position is added and our auto layout does a WinQueryWindowRect
2433 // to get the CURRENT client size. That is the size used to position
2434 // child controls, so we need to already be sized
2435 // in order to get the child controls positoned properly.
2437 if (IsKindOf(CLASSINFO(wxDialog
)) || IsKindOf(CLASSINFO(wxFrame
)))
2439 PSWP pSwp
= (PSWP
)PVOIDFROMMP(wParam
);
2440 PSWP pSwp2
= pSwp
++;
2442 if (!(pSwp
->cx
== pSwp2
->cx
&&
2443 pSwp
->cy
== pSwp2
->cy
))
2444 bProcessed
= HandleSize( pSwp
->cx
2448 if (IsKindOf(CLASSINFO(wxFrame
)))
2450 wxFrame
* pFrame
= wxDynamicCast(this, wxFrame
);
2454 if (pFrame
->GetStatusBar())
2455 pFrame
->PositionStatusBar();
2456 if (pFrame
->GetToolBar())
2457 pFrame
->PositionToolBar();
2468 UnpackActivate( wParam
2474 bProcessed
= HandleActivate( wState
2482 if (SHORT1FROMMP((MPARAM
)lParam
) == TRUE
)
2483 bProcessed
= HandleSetFocus((WXHWND
)(HWND
)wParam
);
2485 bProcessed
= HandleKillFocus((WXHWND
)(HWND
)wParam
);
2489 bProcessed
= HandlePaint();
2494 // Don't let the DefWindowProc() destroy our window - we'll do it
2495 // ourselves in ~wxWindow
2498 mResult
= (MRESULT
)TRUE
;
2502 bProcessed
= HandleShow(wParam
!= 0, (int)lParam
);
2506 // Under OS2 PM Joysticks are treated just like mouse events
2507 // The "Motion" events will be prevelent in joysticks
2510 case WM_BUTTON1DOWN
:
2512 case WM_BUTTON1DBLCLK
:
2513 case WM_BUTTON1MOTIONEND
:
2514 case WM_BUTTON1MOTIONSTART
:
2515 case WM_BUTTON2DOWN
:
2517 case WM_BUTTON2DBLCLK
:
2518 case WM_BUTTON2MOTIONEND
:
2519 case WM_BUTTON2MOTIONSTART
:
2520 case WM_BUTTON3DOWN
:
2522 case WM_BUTTON3DBLCLK
:
2523 case WM_BUTTON3MOTIONEND
:
2524 case WM_BUTTON3MOTIONSTART
:
2526 if (uMsg
== WM_BUTTON1DOWN
&& AcceptsFocus())
2529 short nX
= LOWORD(wParam
);
2530 short nY
= HIWORD(wParam
);
2533 // Redirect the event to a static control if necessary
2535 if (this == GetCapture())
2537 bProcessed
= HandleMouseEvent( uMsg
2540 ,(WXUINT
)SHORT2FROMMP(lParam
)
2545 wxWindow
* pWin
= FindWindowForMouseEvent( this
2549 if (!pWin
->IsOfStandardClass())
2551 if (uMsg
== WM_BUTTON1DOWN
&& pWin
->AcceptsFocus() )
2554 bProcessed
= pWin
->HandleMouseEvent( uMsg
2557 ,(WXUINT
)SHORT2FROMMP(lParam
)
2564 bProcessed
= HandleSysCommand(wParam
, lParam
);
2571 UnpackCommand(wParam
, lParam
, &id
, &hwnd
, &cmd
);
2573 bProcessed
= HandleCommand(id
, cmd
, hwnd
);
2578 // For these messages we must return TRUE if process the message
2581 case WM_MEASUREITEM
:
2583 int nIdCtrl
= (UINT
)wParam
;
2585 if ( uMsg
== WM_DRAWITEM
)
2587 bProcessed
= OS2OnDrawItem(nIdCtrl
,
2588 (WXDRAWITEMSTRUCT
*)lParam
);
2592 return MRFROMLONG(OS2OnMeasureItem( nIdCtrl
2593 ,(WXMEASUREITEMSTRUCT
*)lParam
2598 mResult
= (MRESULT
)TRUE
;
2602 case WM_QUERYDLGCODE
:
2603 if (!IsOfStandardClass())
2607 mResult
= (MRESULT
)m_lDlgCode
;
2612 //else: get the dlg code from the DefWindowProc()
2617 // In OS/2 PM all keyboard events are of the WM_CHAR type. Virtual key and key-up
2618 // and key-down events are obtained from the WM_CHAR params.
2622 USHORT uKeyFlags
= SHORT1FROMMP((MPARAM
)wParam
);
2624 if (uKeyFlags
& KC_KEYUP
)
2626 //TODO: check if the cast to WXWORD isn't causing trouble
2627 bProcessed
= HandleKeyUp(wParam
, lParam
);
2630 else // keydown event
2632 m_bLastKeydownProcessed
= FALSE
;
2634 // If this has been processed by an event handler,
2635 // return 0 now (we've handled it). DON't RETURN
2636 // we still need to process further
2638 m_bLastKeydownProcessed
= HandleKeyDown(wParam
, lParam
);
2639 if (uKeyFlags
& KC_VIRTUALKEY
)
2641 USHORT uVk
= SHORT2FROMMP((MPARAM
)lParam
);
2644 // We consider these message "not interesting" to OnChar
2657 // Avoid duplicate messages to OnChar for these ASCII keys: they
2658 // will be translated by TranslateMessage() and received in WM_CHAR
2663 // But set processed to FALSE, not TRUE to still pass them to
2664 // the control's default window proc - otherwise built-in
2665 // keyboard handling won't work
2670 bProcessed
= HandleChar(wParam
, lParam
);
2674 else // WM_CHAR -- Always an ASCII character
2676 if (m_bLastKeydownProcessed
)
2679 // The key was handled in the EVT_KEY_DOWN and handling
2680 // a key in an EVT_KEY_DOWN handler is meant, by
2681 // design, to prevent EVT_CHARs from happening
2683 m_bLastKeydownProcessed
= FALSE
;
2686 else // do generate a CHAR event
2688 bProcessed
= HandleChar(wParam
, lParam
, TRUE
);
2701 UnpackScroll( wParam
2708 bProcessed
= OS2OnScroll( uMsg
== WM_HSCROLL
? wxHORIZONTAL
2718 switch(SHORT2FROMMP(wParam
))
2722 HWND hWnd
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
));
2723 wxWindowOS2
* pWin
= wxFindWinFromHandle(hWnd
);
2730 if (pWin
->IsKindOf(CLASSINFO(wxBitmapButton
)))
2732 wxBitmapButton
* pBitmapButton
= wxDynamicCast(pWin
, wxBitmapButton
);
2734 pBitmapButton
->OS2OnDraw((WXDRAWITEMSTRUCT
*)lParam
);
2740 case BKN_PAGESELECTEDPENDING
:
2742 PPAGESELECTNOTIFY pPage
= (PPAGESELECTNOTIFY
)lParam
;
2744 if ((pPage
->ulPageIdNew
!= pPage
->ulPageIdCur
) &&
2745 (pPage
->ulPageIdNew
> 0L && pPage
->ulPageIdCur
> 0L))
2747 wxWindowOS2
* pWin
= wxFindWinFromHandle(pPage
->hwndBook
);
2748 wxNotebookEvent
vEvent( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
2749 ,(int)SHORT1FROMMP(wParam
)
2750 ,(int)pPage
->ulPageIdNew
2751 ,(int)pPage
->ulPageIdCur
2758 if (pWin
->IsKindOf(CLASSINFO(wxNotebook
)))
2760 wxNotebook
* pNotebook
= wxDynamicCast(pWin
, wxNotebook
);
2762 vEvent
.SetEventObject(pWin
);
2763 pNotebook
->OnSelChange(vEvent
);
2774 case BN_CLICKED
: // Dups as LN_SELECT and CBN_LBSELECT
2776 HWND hWnd
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
));
2777 wxWindowOS2
* pWin
= wxFindWinFromHandle(hWnd
);
2785 // Simulate a WM_COMMAND here, as wxWidgets expects all control
2786 // button clicks to generate WM_COMMAND msgs, not WM_CONTROL
2788 if (pWin
->IsKindOf(CLASSINFO(wxRadioBox
)))
2790 wxRadioBox
* pRadioBox
= wxDynamicCast(pWin
, wxRadioBox
);
2792 pRadioBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2793 ,(WXUINT
)SHORT1FROMMP(wParam
)
2796 if (pWin
->IsKindOf(CLASSINFO(wxRadioButton
)))
2798 wxRadioButton
* pRadioButton
= wxDynamicCast(pWin
, wxRadioButton
);
2800 pRadioButton
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2801 ,(WXUINT
)SHORT1FROMMP(wParam
)
2804 if (pWin
->IsKindOf(CLASSINFO(wxCheckBox
)))
2806 wxCheckBox
* pCheckBox
= wxDynamicCast(pWin
, wxCheckBox
);
2808 pCheckBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2809 ,(WXUINT
)SHORT1FROMMP(wParam
)
2812 if (pWin
->IsKindOf(CLASSINFO(wxListBox
)))
2814 wxListBox
* pListBox
= wxDynamicCast(pWin
, wxListBox
);
2816 pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2817 ,(WXUINT
)SHORT1FROMMP(wParam
)
2819 if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
)
2822 if (pWin
->IsKindOf(CLASSINFO(wxComboBox
)))
2824 wxComboBox
* pComboBox
= wxDynamicCast(pWin
, wxComboBox
);
2826 pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2827 ,(WXUINT
)SHORT1FROMMP(wParam
)
2834 case LN_ENTER
: /* dups as CBN_EFCHANGE */
2836 HWND hWnd
= HWNDFROMMP(lParam
);
2837 wxWindowOS2
* pWin
= wxFindWinFromHandle(hWnd
);
2845 // Simulate a WM_COMMAND here, as wxWidgets expects all control
2846 // button clicks to generate WM_COMMAND msgs, not WM_CONTROL
2848 if (pWin
->IsKindOf(CLASSINFO(wxListBox
)))
2850 wxListBox
* pListBox
= wxDynamicCast(pWin
, wxListBox
);
2852 pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2853 ,(WXUINT
)SHORT1FROMMP(wParam
)
2855 if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
)
2859 if (pWin
->IsKindOf(CLASSINFO(wxComboBox
)))
2861 wxComboBox
* pComboBox
= wxDynamicCast(pWin
, wxComboBox
);
2863 pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2864 ,(WXUINT
)SHORT1FROMMP(wParam
)
2872 case SPBN_DOWNARROW
:
2878 ::WinSendMsg( HWNDFROMMP(lParam
)
2881 ,MPFROM2SHORT( (USHORT
)10
2882 ,(USHORT
)SPBQ_UPDATEIFVALID
2886 bProcessed
= OS2OnScroll( wxVERTICAL
2887 ,(int)SHORT2FROMMP(wParam
)
2894 case SLN_SLIDERTRACK
:
2896 HWND hWnd
= ::WinWindowFromID(GetHWND(), SHORT1FROMMP(wParam
));
2897 wxWindowOS2
* pChild
= wxFindWinFromHandle(hWnd
);
2904 if (pChild
->IsKindOf(CLASSINFO(wxSlider
)))
2905 bProcessed
= OS2OnScroll( wxVERTICAL
2906 ,(int)SHORT2FROMMP(wParam
)
2907 ,(int)LONGFROMMP(lParam
)
2915 #if defined(__VISAGECPP__) && (__IBMCPP__ >= 400)
2916 case WM_CTLCOLORCHANGE
:
2918 bProcessed
= HandleCtlColor(&hBrush
);
2922 case WM_ERASEBACKGROUND
:
2924 // Returning TRUE to requestw PM to paint the window background
2925 // in SYSCLR_WINDOW. We don't really want that
2927 bProcessed
= HandleEraseBkgnd((WXHDC
)(HPS
)wParam
);
2928 mResult
= (MRESULT
)(FALSE
);
2931 // the return value for this message is ignored
2932 case WM_SYSCOLORCHANGE
:
2933 bProcessed
= HandleSysColorChange();
2936 case WM_REALIZEPALETTE
:
2937 bProcessed
= HandlePaletteChanged();
2940 // move all drag and drops to wxDrg
2942 bProcessed
= HandleEndDrag(wParam
);
2946 bProcessed
= HandleInitDialog((WXHWND
)(HWND
)wParam
);
2950 // we never set focus from here
2951 mResult
= (MRESULT
)FALSE
;
2955 // wxFrame specific message
2956 case WM_MINMAXFRAME
:
2957 bProcessed
= HandleGetMinMaxInfo((PSWP
)wParam
);
2960 case WM_SYSVALUECHANGED
:
2961 // TODO: do something
2962 mResult
= (MRESULT
)TRUE
;
2966 // Comparable to WM_SETPOINTER for windows, only for just controls
2968 case WM_CONTROLPOINTER
:
2969 bProcessed
= HandleSetCursor( SHORT1FROMMP(wParam
) // Control ID
2970 ,(HWND
)lParam
// Cursor Handle
2975 // Returning TRUE stops the DefWindowProc() from further
2976 // processing this message - exactly what we need because we've
2977 // just set the cursor.
2979 mResult
= (MRESULT
)TRUE
;
2983 #if wxUSE_MENUS_NATIVE
2985 if (wxCurrentPopupMenu
)
2987 if (GetHmenuOf(wxCurrentPopupMenu
) == (HWND
)lParam
)
2989 // Break out of msg loop in DoPopupMenu
2990 ::WinPostMsg((HWND
)lParam
,WM_COMMAND
,wParam
,0);
2994 #endif // wxUSE_MENUS_NATIVE
3000 wxLogTrace(wxTraceMessages
, wxT("Forwarding %s to DefWindowProc."),
3001 wxGetMessageName(uMsg
));
3002 #endif // __WXDEBUG__
3003 if (IsKindOf(CLASSINFO(wxFrame
)))
3004 mResult
= ::WinDefWindowProc(m_hWnd
, uMsg
, wParam
, lParam
);
3005 else if (IsKindOf(CLASSINFO(wxDialog
)))
3006 mResult
= ::WinDefDlgProc( m_hWnd
, uMsg
, wParam
, lParam
);
3008 mResult
= OS2DefWindowProc(uMsg
, wParam
, lParam
);
3011 } // end of wxWindowOS2::OS2WindowProc
3013 // ----------------------------------------------------------------------------
3014 // wxWindow <-> HWND map
3015 // ----------------------------------------------------------------------------
3017 wxWinHashTable
*wxWinHandleHash
= NULL
;
3019 wxWindow
* wxFindWinFromHandle(
3023 return (wxWindow
*)wxWinHandleHash
->Get((long)hWnd
);
3024 } // end of wxFindWinFromHandle
3026 void wxAssociateWinWithHandle(
3032 // Adding NULL hWnd is (first) surely a result of an error and
3033 // (secondly) breaks menu command processing
3035 wxCHECK_RET( hWnd
!= (HWND
)NULL
,
3036 wxT("attempt to add a NULL hWnd to window list ignored") );
3039 wxWindow
* pOldWin
= wxFindWinFromHandle((WXHWND
) hWnd
);
3041 if (pOldWin
&& (pOldWin
!= pWin
))
3043 wxString
str(pWin
->GetClassInfo()->GetClassName());
3045 wxLogError( _T("Bug! Found existing HWND %X for new window of class %s")
3052 wxWinHandleHash
->Put( (long)hWnd
3056 } // end of wxAssociateWinWithHandle
3058 void wxRemoveHandleAssociation(
3062 wxWinHandleHash
->Delete((long)pWin
->GetHWND());
3063 } // end of wxRemoveHandleAssociation
3066 // Default destroyer - override if you destroy it in some other way
3067 // (e.g. with MDI child windows)
3069 void wxWindowOS2::OS2DestroyWindow()
3073 bool wxWindowOS2::OS2GetCreateWindowCoords(
3075 , const wxSize
& rSize
3082 bool bNonDefault
= FALSE
;
3083 static const int DEFAULT_Y
= 200;
3084 static const int DEFAULT_H
= 250;
3088 rnX
= rnY
= CW_USEDEFAULT
;
3093 rnY
= rPos
.y
== -1 ? DEFAULT_Y
: rPos
.y
;
3098 rnWidth
= rnHeight
= CW_USEDEFAULT
;
3103 rnHeight
= rSize
.y
== -1 ? DEFAULT_H
: rSize
.y
;
3107 } // end of wxWindowOS2::OS2GetCreateWindowCoords
3109 WXHWND
wxWindowOS2::OS2GetParent() const
3111 return m_parent
? m_parent
->GetHWND() : NULL
;
3114 bool wxWindowOS2::OS2Create(
3116 , const wxChar
* zTitle
3118 , const wxPoint
& rPos
3119 , const wxSize
& rSize
3131 long lControlId
= 0L;
3132 wxWindowCreationHook
vHook(this);
3133 wxString
sClassName((wxChar
*)zClass
);
3135 OS2GetCreateWindowCoords( rPos
3145 lControlId
= GetId();
3146 if (GetWindowStyleFlag() & wxCLIP_SIBLINGS
)
3148 dwStyle
|= WS_CLIPSIBLINGS
;
3152 // For each class "Foo" we have we also have "FooNR" ("no repaint") class
3153 // which is the same but without CS_[HV]REDRAW class styles so using it
3154 // ensures that the window is not fully repainted on each resize
3156 if (!HasFlag(wxFULL_REPAINT_ON_RESIZE
))
3158 sClassName
+= wxT("NR");
3160 m_hWnd
= (WXHWND
)::WinCreateWindow( (HWND
)OS2GetParent()
3161 ,(PSZ
)sClassName
.c_str()
3162 ,(PSZ
)(zTitle
? zTitle
: wxEmptyString
)
3176 vError
= ::WinGetLastError(wxGetInstance());
3177 sError
= wxPMErrorToStr(vError
);
3180 SubclassWin(m_hWnd
);
3181 SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
));
3183 m_backgroundColour
.Set(wxString(wxT("GREY")));
3185 LONG lColor
= (LONG
)m_backgroundColour
.GetPixel();
3187 if (!::WinSetPresParam( m_hWnd
3193 vError
= ::WinGetLastError(vHabmain
);
3194 sError
= wxPMErrorToStr(vError
);
3195 wxLogError(_T("Error creating frame. Error: %s\n"), sError
.c_str());
3204 } // end of WinGuiBase_Window::OS2Create
3206 // ===========================================================================
3207 // OS2 PM message handlers
3208 // ===========================================================================
3210 // ---------------------------------------------------------------------------
3211 // window creation/destruction
3212 // ---------------------------------------------------------------------------
3214 bool wxWindowOS2::HandleCreate(
3215 WXLPCREATESTRUCT
WXUNUSED(vCs
)
3219 wxWindowCreateEvent
vEvent((wxWindow
*)this);
3221 (void)GetEventHandler()->ProcessEvent(vEvent
);
3222 *pbMayCreate
= TRUE
;
3224 } // end of wxWindowOS2::HandleCreate
3226 bool wxWindowOS2::HandleDestroy()
3228 wxWindowDestroyEvent
vEvent((wxWindow
*)this);
3229 vEvent
.SetId(GetId());
3230 (void)GetEventHandler()->ProcessEvent(vEvent
);
3233 // Delete our drop target if we've got one
3235 #if wxUSE_DRAG_AND_DROP
3236 if (m_dropTarget
!= NULL
)
3238 delete m_dropTarget
;
3239 m_dropTarget
= NULL
;
3241 #endif // wxUSE_DRAG_AND_DROP
3244 // WM_DESTROY handled
3247 } // end of wxWindowOS2::HandleDestroy
3249 // ---------------------------------------------------------------------------
3251 // ---------------------------------------------------------------------------
3252 void wxWindowOS2::OnSetFocus(
3253 wxFocusEvent
& rEvent
3257 } // end of wxWindowOS2::OnSetFocus
3259 bool wxWindowOS2::HandleActivate(
3261 , WXHWND
WXUNUSED(hActivate
)
3264 wxActivateEvent
vEvent( wxEVT_ACTIVATE
3268 vEvent
.SetEventObject(this);
3269 return GetEventHandler()->ProcessEvent(vEvent
);
3270 } // end of wxWindowOS2::HandleActivate
3272 bool wxWindowOS2::HandleSetFocus(
3273 WXHWND
WXUNUSED(hWnd
)
3277 // Notify the parent keeping track of focus for the kbd navigation
3278 // purposes that we got it
3280 wxChildFocusEvent
vEventFocus((wxWindow
*)this);
3281 (void)GetEventHandler()->ProcessEvent(vEventFocus
);
3289 m_caret
->OnSetFocus();
3291 #endif // wxUSE_CARET
3294 // If it's a wxTextCtrl don't send the event as it will be done
3295 // after the control gets to process it from EN_FOCUS handler
3296 if ( wxDynamicCastThis(wxTextCtrl
) )
3300 #endif // wxUSE_TEXTCTRL
3302 wxFocusEvent
vEvent(wxEVT_SET_FOCUS
, m_windowId
);
3304 vEvent
.SetEventObject(this);
3305 return GetEventHandler()->ProcessEvent(vEvent
);
3306 } // end of wxWindowOS2::HandleSetFocus
3308 bool wxWindowOS2::HandleKillFocus(
3318 m_caret
->OnKillFocus();
3320 #endif // wxUSE_CARET
3324 // If it's a wxTextCtrl don't send the event as it will be done
3325 // after the control gets to process it.
3327 wxTextCtrl
* pCtrl
= wxDynamicCastThis(wxTextCtrl
);
3336 // Don't send the event when in the process of being deleted. This can
3337 // only cause problems if the event handler tries to access the object.
3339 if ( m_isBeingDeleted
)
3344 wxFocusEvent
vEvent( wxEVT_KILL_FOCUS
3348 vEvent
.SetEventObject(this);
3351 // wxFindWinFromHandle() may return NULL, it is ok
3353 vEvent
.SetWindow(wxFindWinFromHandle(hWnd
));
3354 return GetEventHandler()->ProcessEvent(vEvent
);
3355 } // end of wxWindowOS2::HandleKillFocus
3357 // ---------------------------------------------------------------------------
3359 // ---------------------------------------------------------------------------
3361 bool wxWindowOS2::HandleShow(
3363 , int WXUNUSED(nStatus
)
3366 wxShowEvent
vEvent(GetId(), bShow
);
3368 vEvent
.SetEventObject(this);
3369 return GetEventHandler()->ProcessEvent(vEvent
);
3370 } // end of wxWindowOS2::HandleShow
3372 bool wxWindowOS2::HandleInitDialog(
3373 WXHWND
WXUNUSED(hWndFocus
)
3376 wxInitDialogEvent
vEvent(GetId());
3378 vEvent
.SetEventObject(this);
3379 return GetEventHandler()->ProcessEvent(vEvent
);
3380 } // end of wxWindowOS2::HandleInitDialog
3382 bool wxWindowOS2::HandleEndDrag(WXWPARAM
WXUNUSED(wParam
))
3384 // TODO: We'll handle drag and drop later
3388 bool wxWindowOS2::HandleSetCursor(
3389 USHORT
WXUNUSED(vId
)
3394 // Under OS/2 PM this allows the pointer to be changed
3395 // as it passes over a control
3397 ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)hPointer
);
3399 } // end of wxWindowOS2::HandleSetCursor
3401 // ---------------------------------------------------------------------------
3402 // owner drawn stuff
3403 // ---------------------------------------------------------------------------
3404 bool wxWindowOS2::OS2OnDrawItem(
3406 , WXDRAWITEMSTRUCT
* pItemStruct
3409 #if wxUSE_OWNER_DRAWN
3412 #if wxUSE_MENUS_NATIVE
3414 // Is it a menu item?
3420 POWNERITEM pMeasureStruct
= (POWNERITEM
)pItemStruct
;
3421 wxFrame
* pFrame
= (wxFrame
*)this;
3422 wxMenuItem
* pMenuItem
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
);
3423 HDC hDC
= ::GpiQueryDevice(pMeasureStruct
->hps
);
3424 wxRect
vRect( pMeasureStruct
->rclItem
.xLeft
3425 ,pMeasureStruct
->rclItem
.yBottom
3426 ,pMeasureStruct
->rclItem
.xRight
- pMeasureStruct
->rclItem
.xLeft
3427 ,pMeasureStruct
->rclItem
.yTop
- pMeasureStruct
->rclItem
.yBottom
3432 vDc
.SetHPS(pMeasureStruct
->hps
);
3434 // Load the wxWidgets Pallete and set to RGB mode
3436 if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
3440 ,(LONG
)wxTheColourDatabase
->m_nSize
3441 ,(PLONG
)wxTheColourDatabase
->m_palTable
3444 vError
= ::WinGetLastError(vHabmain
);
3445 sError
= wxPMErrorToStr(vError
);
3446 wxLogError(_T("Unable to set current color table. Error: %s\n"), sError
.c_str());
3449 // Set the color table to RGB mode
3451 if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
3459 vError
= ::WinGetLastError(vHabmain
);
3460 sError
= wxPMErrorToStr(vError
);
3461 wxLogError(_T("Unable to set current color table. Error: %s\n"), sError
.c_str());
3464 wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE
);
3470 if (pMeasureStruct
->fsAttribute
== pMeasureStruct
->fsAttributeOld
)
3473 // Entire Item needs to be redrawn (either it has reappeared from
3474 // behind another window or is being displayed for the first time
3476 eAction
= wxOwnerDrawn::wxODDrawAll
;
3478 if (pMeasureStruct
->fsAttribute
& MIA_HILITED
)
3481 // If it is currently selected we let the system handle it
3483 eStatus
|= wxOwnerDrawn::wxODSelected
;
3485 if (pMeasureStruct
->fsAttribute
& MIA_CHECKED
)
3488 // If it is currently checked we draw our own
3490 eStatus
|= wxOwnerDrawn::wxODChecked
;
3491 pMeasureStruct
->fsAttributeOld
= pMeasureStruct
->fsAttribute
&= ~MIA_CHECKED
;
3493 if (pMeasureStruct
->fsAttribute
& MIA_DISABLED
)
3496 // If it is currently disabled we let the system handle it
3498 eStatus
|= wxOwnerDrawn::wxODDisabled
;
3501 // Don't really care about framed (indicationg focus) or NoDismiss
3506 if (pMeasureStruct
->fsAttribute
& MIA_HILITED
)
3508 eAction
= wxOwnerDrawn::wxODDrawAll
;
3509 eStatus
|= wxOwnerDrawn::wxODSelected
;
3511 // Keep the system from trying to highlight with its bogus colors
3513 pMeasureStruct
->fsAttributeOld
= pMeasureStruct
->fsAttribute
&= ~MIA_HILITED
;
3515 else if (!(pMeasureStruct
->fsAttribute
& MIA_HILITED
))
3517 eAction
= wxOwnerDrawn::wxODDrawAll
;
3520 // Keep the system from trying to highlight with its bogus colors
3522 pMeasureStruct
->fsAttribute
= pMeasureStruct
->fsAttributeOld
&= ~MIA_HILITED
;
3527 // For now we don't care about anything else
3528 // just ignore the entire message!
3534 // Now redraw the item
3536 return(pMenuItem
->OnDrawItem( vDc
3538 ,(wxOwnerDrawn::wxODAction
)eAction
3539 ,(wxOwnerDrawn::wxODStatus
)eStatus
3542 // leave the fsAttribute and fsOldAttribute unchanged. If different,
3543 // the system will do the highlight or fraeming or disabling for us,
3544 // otherwise, we'd have to do it ourselves.
3547 #endif // wxUSE_MENUS_NATIVE
3549 wxWindow
* pItem
= FindItem(vId
);
3551 if (pItem
&& pItem
->IsKindOf(CLASSINFO(wxControl
)))
3553 return ((wxControl
*)pItem
)->OS2OnDraw(pItemStruct
);
3557 pItemStruct
= pItemStruct
;
3560 } // end of wxWindowOS2::OS2OnDrawItem
3562 long wxWindowOS2::OS2OnMeasureItem(
3564 , WXMEASUREITEMSTRUCT
* pItemStruct
3567 #if wxUSE_OWNER_DRAWN
3569 // Is it a menu item?
3571 if (lId
== 65536) // I really don't like this...has to be a better indicator
3573 if (IsKindOf(CLASSINFO(wxFrame
))) // we'll assume if Frame then a menu
3577 POWNERITEM pMeasureStruct
= (POWNERITEM
)pItemStruct
;
3578 wxFrame
* pFrame
= (wxFrame
*)this;
3579 wxMenuItem
* pMenuItem
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
);
3581 wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE
);
3584 if (pMenuItem
->OnMeasureItem( &nWidth
3590 pMeasureStruct
->rclItem
.xRight
= nWidth
;
3591 pMeasureStruct
->rclItem
.xLeft
= 0L;
3592 pMeasureStruct
->rclItem
.yTop
= nHeight
;
3593 pMeasureStruct
->rclItem
.yBottom
= 0L;
3594 mRc
= MRFROM2SHORT(nHeight
, nWidth
);
3595 return LONGFROMMR(mRc
);
3600 wxWindow
* pItem
= FindItem(lId
);
3602 if (pItem
&& pItem
->IsKindOf(CLASSINFO(wxControl
)))
3606 vItem
.idItem
= (LONG
)pItemStruct
;
3607 return ((wxControl
*)pItem
)->OS2OnMeasure((WXMEASUREITEMSTRUCT
*)&vItem
);
3611 pItemStruct
= pItemStruct
;
3612 #endif // wxUSE_OWNER_DRAWN
3616 // ---------------------------------------------------------------------------
3617 // colours and palettes
3618 // ---------------------------------------------------------------------------
3620 bool wxWindowOS2::HandleSysColorChange()
3622 wxSysColourChangedEvent vEvent
;
3624 vEvent
.SetEventObject(this);
3625 return GetEventHandler()->ProcessEvent(vEvent
);
3626 } // end of wxWindowOS2::HandleSysColorChange
3628 bool wxWindowOS2::HandleCtlColor(
3629 WXHBRUSH
* WXUNUSED(phBrush
)
3633 // Not much provided with message. So not sure I can do anything with it
3636 } // end of wxWindowOS2::HandleCtlColor
3639 // Define for each class of dialog and control
3640 WXHBRUSH
wxWindowOS2::OnCtlColor(WXHDC
WXUNUSED(hDC
),
3641 WXHWND
WXUNUSED(hWnd
),
3642 WXUINT
WXUNUSED(nCtlColor
),
3643 WXUINT
WXUNUSED(message
),
3644 WXWPARAM
WXUNUSED(wParam
),
3645 WXLPARAM
WXUNUSED(lParam
))
3650 bool wxWindowOS2::HandlePaletteChanged()
3652 // need to set this to something first
3653 WXHWND hWndPalChange
= NULLHANDLE
;
3655 wxPaletteChangedEvent
vEvent(GetId());
3657 vEvent
.SetEventObject(this);
3658 vEvent
.SetChangedWindow(wxFindWinFromHandle(hWndPalChange
));
3660 return GetEventHandler()->ProcessEvent(vEvent
);
3661 } // end of wxWindowOS2::HandlePaletteChanged
3664 // Responds to colour changes: passes event on to children.
3666 void wxWindowOS2::OnSysColourChanged(
3667 wxSysColourChangedEvent
& rEvent
3670 wxWindowList::compatibility_iterator node
= GetChildren().GetFirst();
3675 // Only propagate to non-top-level windows
3677 wxWindow
* pWin
= (wxWindow
*)node
->GetData();
3679 if (pWin
->GetParent())
3681 wxSysColourChangedEvent vEvent
;
3683 rEvent
.SetEventObject(pWin
);
3684 pWin
->GetEventHandler()->ProcessEvent(vEvent
);
3686 node
= node
->GetNext();
3688 } // end of wxWindowOS2::OnSysColourChanged
3690 // ---------------------------------------------------------------------------
3692 // ---------------------------------------------------------------------------
3694 void wxWindow::OnPaint (
3695 wxPaintEvent
& rEvent
3698 HDC hDC
= (HDC
)wxPaintDC::FindDCInCache((wxWindow
*) rEvent
.GetEventObject());
3702 OS2DefWindowProc( (WXUINT
)WM_PAINT
3707 } // end of wxWindow::OnPaint
3709 bool wxWindowOS2::HandlePaint()
3712 wxPaintEvent
vEvent(m_windowId
);
3716 // Create empty region
3717 // TODO: get HPS somewhere else if possible
3718 hPS
= ::WinGetPS(GetHwnd());
3719 hRgn
= ::GpiCreateRegion(hPS
, 0, NULL
);
3721 if (::WinQueryUpdateRegion(GetHwnd(), hRgn
) == RGN_ERROR
)
3723 wxLogLastError("CreateRectRgn");
3727 // Get all the rectangles from the region, convert the individual
3728 // rectangles to "the other" coordinate system and reassemble a
3729 // region from the rectangles, to be feed into m_updateRegion.
3731 // FIXME: This is a bad hack since OS/2 API specifies that rectangles
3732 // passed into GpiSetRegion must not have Bottom > Top,
3733 // however, at first sight, it _seems_ to work nonetheless.
3736 PRECTL pUpdateRects
= NULL
;
3737 vRgnData
.ulDirection
= RECTDIR_LFRT_TOPBOT
;
3738 if (::GpiQueryRegionRects( hPS
// Pres space
3739 ,hRgn
// Handle of region to query
3740 ,NULL
// Return all RECTs
3741 ,&vRgnData
// Will contain number or RECTs in region
3742 ,NULL
// NULL to return number of RECTs
3745 pUpdateRects
= new RECTL
[vRgnData
.crcReturned
];
3746 vRgnData
.crc
= vRgnData
.crcReturned
;
3747 vRgnData
.ircStart
= 1;
3748 if (::GpiQueryRegionRects( hPS
// Pres space of source
3749 ,hRgn
// Handle of source region
3750 ,NULL
// Return all RECTs
3751 ,&vRgnData
// Operations set to return rects
3752 ,pUpdateRects
// Will contain the actual RECTS
3757 ::WinQueryWindowRect(GetHwnd(), &vRect
);
3758 height
= vRect
.yTop
;
3760 for(size_t i
= 0; i
< vRgnData
.crc
; i
++)
3763 rectHeight
= pUpdateRects
[i
].yTop
- pUpdateRects
[i
].yBottom
;
3764 pUpdateRects
[i
].yTop
= height
- pUpdateRects
[i
].yTop
;
3765 pUpdateRects
[i
].yBottom
= pUpdateRects
[i
].yTop
+ rectHeight
;
3767 ::GpiSetRegion(hPS
, hRgn
, vRgnData
.crc
, pUpdateRects
);
3768 delete [] pUpdateRects
;
3772 m_updateRegion
= wxRegion(hRgn
, hPS
);
3774 vEvent
.SetEventObject(this);
3775 bProcessed
= GetEventHandler()->ProcessEvent(vEvent
);
3778 IsKindOf(CLASSINFO(wxPanel
)) &&
3779 GetChildren().GetCount() == 0
3783 // OS/2 needs to process this right here, not by the default proc
3784 // Window's default proc correctly paints everything, OS/2 does not.
3785 // For decorative panels that typically have no children, we draw
3791 hPS
= ::WinBeginPaint( GetHwnd()
3797 ::GpiCreateLogColorTable( hPS
3801 ,(LONG
)wxTheColourDatabase
->m_nSize
3802 ,(PLONG
)wxTheColourDatabase
->m_palTable
3804 ::GpiCreateLogColorTable( hPS
3811 if (::WinIsWindowVisible(GetHWND()))
3812 ::WinFillRect(hPS
, &vRect
, GetBackgroundColour().GetPixel());
3815 LINEBUNDLE vLineBundle
;
3817 vLineBundle
.lColor
= 0x00000000; // Black
3818 vLineBundle
.usMixMode
= FM_OVERPAINT
;
3819 vLineBundle
.fxWidth
= 1;
3820 vLineBundle
.lGeomWidth
= 1;
3821 vLineBundle
.usType
= LINETYPE_SOLID
;
3822 vLineBundle
.usEnd
= 0;
3823 vLineBundle
.usJoin
= 0;
3826 ,LBB_COLOR
| LBB_MIX_MODE
| LBB_WIDTH
| LBB_GEOM_WIDTH
| LBB_TYPE
3830 ::WinQueryWindowRect(GetHwnd(), &vRect
);
3840 else if (!bProcessed
&&
3841 IsKindOf(CLASSINFO(wxPanel
))
3845 // Panel with children, usually fills a frame client so no borders.
3850 hPS
= ::WinBeginPaint( GetHwnd()
3856 ::GpiCreateLogColorTable( hPS
3860 ,(LONG
)wxTheColourDatabase
->m_nSize
3861 ,(PLONG
)wxTheColourDatabase
->m_palTable
3863 ::GpiCreateLogColorTable( hPS
3871 if (::WinIsWindowVisible(GetHWND()))
3872 ::WinFillRect(hPS
, &vRect
, GetBackgroundColour().GetPixel());
3878 } // end of wxWindowOS2::HandlePaint
3880 bool wxWindowOS2::HandleEraseBkgnd(
3887 ::WinQueryWindowPos(GetHwnd(), &vSwp
);
3888 if (vSwp
.fl
& SWP_MINIMIZE
)
3893 vDC
.m_hPS
= (HPS
)hDC
; // this is really a PS
3894 vDC
.SetWindow((wxWindow
*)this);
3897 wxEraseEvent
vEvent(m_windowId
, &vDC
);
3899 vEvent
.SetEventObject(this);
3901 rc
= GetEventHandler()->ProcessEvent(vEvent
);
3904 vDC
.m_hPS
= NULLHANDLE
;
3906 } // end of wxWindowOS2::HandleEraseBkgnd
3908 void wxWindowOS2::OnEraseBackground(
3909 wxEraseEvent
& rEvent
3913 HPS hPS
= rEvent
.m_dc
->m_hPS
;
3915 LONG lColor
= m_backgroundColour
.GetPixel();
3917 rc
= ::WinQueryWindowRect(GetHwnd(), &vRect
);
3918 rc
= ::WinFillRect(hPS
, &vRect
, lColor
);
3919 } // end of wxWindowOS2::OnEraseBackground
3921 // ---------------------------------------------------------------------------
3922 // moving and resizing
3923 // ---------------------------------------------------------------------------
3925 bool wxWindowOS2::HandleMinimize()
3927 wxIconizeEvent
vEvent(m_windowId
);
3929 vEvent
.SetEventObject(this);
3930 return GetEventHandler()->ProcessEvent(vEvent
);
3931 } // end of wxWindowOS2::HandleMinimize
3933 bool wxWindowOS2::HandleMaximize()
3935 wxMaximizeEvent
vEvent(m_windowId
);
3937 vEvent
.SetEventObject(this);
3938 return GetEventHandler()->ProcessEvent(vEvent
);
3939 } // end of wxWindowOS2::HandleMaximize
3941 bool wxWindowOS2::HandleMove(
3946 wxMoveEvent
vEvent(wxPoint(nX
, nY
), m_windowId
);
3948 vEvent
.SetEventObject(this);
3949 return GetEventHandler()->ProcessEvent(vEvent
);
3950 } // end of wxWindowOS2::HandleMove
3952 bool wxWindowOS2::HandleSize(
3955 , WXUINT
WXUNUSED(nFlag
)
3958 wxSizeEvent
vEvent(wxSize(nWidth
, nHeight
), m_windowId
);
3960 vEvent
.SetEventObject(this);
3961 return GetEventHandler()->ProcessEvent(vEvent
);
3962 } // end of wxWindowOS2::HandleSize
3964 bool wxWindowOS2::HandleGetMinMaxInfo(
3973 ::WinGetMaxPosition(GetHwnd(), pSwp
);
3974 m_maxWidth
= pSwp
->cx
;
3975 m_maxHeight
= pSwp
->cy
;
3979 ::WinGetMinPosition(GetHwnd(), pSwp
, &vPoint
);
3980 m_minWidth
= pSwp
->cx
;
3981 m_minHeight
= pSwp
->cy
;
3988 } // end of wxWindowOS2::HandleGetMinMaxInfo
3990 // ---------------------------------------------------------------------------
3992 // ---------------------------------------------------------------------------
3993 bool wxWindowOS2::HandleCommand(
3999 #if wxUSE_MENUS_NATIVE
4000 if (wxCurrentPopupMenu
)
4002 wxMenu
* pPopupMenu
= wxCurrentPopupMenu
;
4004 wxCurrentPopupMenu
= NULL
;
4005 return pPopupMenu
->OS2Command(wCmd
, wId
);
4007 #endif // wxUSE_MENUS_NATIVE
4009 wxWindow
* pWin
= FindItem(wId
);
4013 pWin
= wxFindWinFromHandle(hControl
);
4017 return pWin
->OS2Command(wCmd
, wId
);
4020 } // end of wxWindowOS2::HandleCommand
4022 bool wxWindowOS2::HandleSysCommand(
4024 , WXLPARAM
WXUNUSED(lParam
)
4028 // 4 bits are reserved
4030 switch (SHORT1FROMMP(wParam
))
4033 return HandleMaximize();
4036 return HandleMinimize();
4039 } // end of wxWindowOS2::HandleSysCommand
4041 // ---------------------------------------------------------------------------
4043 // ---------------------------------------------------------------------------
4044 //TODO!!! check against MSW
4045 void wxWindowOS2::InitMouseEvent(
4046 wxMouseEvent
& rEvent
4053 DoGetSize(0, &nHeight
);
4055 // Convert to wxWidgets standard coordinate system!
4056 rEvent
.m_y
= nHeight
- nY
;
4057 rEvent
.m_shiftDown
= ((uFlags
& KC_SHIFT
) != 0);
4058 rEvent
.m_controlDown
= ((uFlags
& KC_CTRL
) != 0);
4059 rEvent
.m_altDown
= ((uFlags
& KC_ALT
) != 0);
4060 rEvent
.m_leftDown
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON1
) &
4062 rEvent
.m_middleDown
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON3
) &
4064 rEvent
.m_rightDown
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON2
) &
4066 rEvent
.SetTimestamp(s_currentMsg
.time
);
4067 rEvent
.SetEventObject(this);
4068 rEvent
.SetId(GetId());
4070 #if wxUSE_MOUSEEVENT_HACK
4073 m_lastMouseEvent
= rEvent
.GetEventType();
4074 #endif // wxUSE_MOUSEEVENT_HACK
4075 } // end of wxWindowOS2::InitMouseEvent
4077 bool wxWindowOS2::HandleMouseEvent(
4084 bool bProcessed
= FALSE
;
4087 // The mouse events take consecutive IDs from WM_MOUSEFIRST to
4088 // WM_MOUSELAST, so it's enough to subtract WM_MOUSEMOVE == WM_MOUSEFIRST
4089 // from the message id and take the value in the table to get wxWin event
4092 static const wxEventType eventsMouse
[] =
4107 if ((uMsg
>= WM_MOUSEMOVE
) && (uMsg
<= WM_BUTTON3DBLCLK
))
4109 wxMouseEvent
vEvent(eventsMouse
[uMsg
- WM_MOUSEMOVE
]);
4111 InitMouseEvent( vEvent
4117 bProcessed
= GetEventHandler()->ProcessEvent(vEvent
);
4120 HPOINTER hCursor
= (HPOINTER
)GetCursor().GetHCURSOR();
4122 if (hCursor
!= NULLHANDLE
)
4124 ::WinSetPointer(HWND_DESKTOP
, hCursor
);
4130 } // end of wxWindowOS2::HandleMouseEvent
4132 bool wxWindowOS2::HandleMouseMove(
4138 if (!m_bMouseInWindow
)
4141 // Generate an ENTER event
4143 m_bMouseInWindow
= TRUE
;
4145 wxMouseEvent
vEvent(wxEVT_ENTER_WINDOW
);
4147 InitMouseEvent( vEvent
4153 (void)GetEventHandler()->ProcessEvent(vEvent
);
4155 return HandleMouseEvent( WM_MOUSEMOVE
4160 } // end of wxWindowOS2::HandleMouseMove
4162 // ---------------------------------------------------------------------------
4163 // keyboard handling
4164 // ---------------------------------------------------------------------------
4167 // Create the key event of the given type for the given key - used by
4168 // HandleChar and HandleKeyDown/Up
4170 wxKeyEvent
wxWindowOS2::CreateKeyEvent(
4177 wxKeyEvent
vEvent(eType
);
4179 vEvent
.SetId(GetId());
4180 vEvent
.m_shiftDown
= IsShiftDown();
4181 vEvent
.m_controlDown
= IsCtrlDown();
4182 vEvent
.m_altDown
= (HIWORD(lParam
) & KC_ALT
) == KC_ALT
;
4184 vEvent
.SetEventObject((wxWindow
*)this); // const_cast
4185 vEvent
.m_keyCode
= nId
;
4186 vEvent
.m_rawCode
= (wxUint32
)wParam
;
4187 vEvent
.m_rawFlags
= (wxUint32
)lParam
;
4188 vEvent
.SetTimestamp(s_currentMsg
.time
);
4191 // Translate the position to client coords
4196 ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
);
4197 ::WinQueryWindowRect( GetHwnd()
4201 vPoint
.x
-= vRect
.xLeft
;
4202 vPoint
.y
-= vRect
.yBottom
;
4204 vEvent
.m_x
= vPoint
.x
;
4205 vEvent
.m_y
= vPoint
.y
;
4208 } // end of wxWindowOS2::CreateKeyEvent
4211 // isASCII is TRUE only when we're called from WM_CHAR handler and not from
4214 bool wxWindowOS2::HandleChar(
4220 bool bCtrlDown
= FALSE
;
4223 if (m_bLastKeydownProcessed
)
4226 // The key was handled in the EVT_KEY_DOWN. Handling a key in an
4227 // EVT_KEY_DOWN handler is meant, by design, to prevent EVT_CHARs
4228 // from happening, so just bail out at this point.
4230 m_bLastKeydownProcessed
= FALSE
;
4236 // If 1 -> 26, translate to either special keycode or just set
4237 // ctrlDown. IOW, Ctrl-C should result in keycode == 3 and
4238 // ControlDown() == TRUE.
4240 vId
= SHORT1FROMMP(lParam
);
4241 if ((vId
> 0) && (vId
< 27))
4263 else // we're called from WM_KEYDOWN
4265 vId
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
));
4270 wxKeyEvent
vEvent(CreateKeyEvent( wxEVT_CHAR
4277 vEvent
.m_controlDown
= TRUE
;
4279 return (GetEventHandler()->ProcessEvent(vEvent
));
4282 bool wxWindowOS2::HandleKeyDown(
4287 int nId
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
));
4292 // Normal ASCII char
4294 nId
= SHORT1FROMMP(lParam
);
4299 wxKeyEvent
vEvent(CreateKeyEvent( wxEVT_KEY_DOWN
4305 if (GetEventHandler()->ProcessEvent(vEvent
))
4311 } // end of wxWindowOS2::HandleKeyDown
4313 bool wxWindowOS2::HandleKeyUp(
4318 int nId
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
));
4323 // Normal ASCII char
4325 nId
= CHAR1FROMMP(lParam
);
4330 wxKeyEvent
vEvent(CreateKeyEvent( wxEVT_KEY_UP
4336 if (GetEventHandler()->ProcessEvent(vEvent
))
4340 } // end of wxWindowOS2::HandleKeyUp
4342 // ---------------------------------------------------------------------------
4344 // ---------------------------------------------------------------------------
4346 // ---------------------------------------------------------------------------
4348 // ---------------------------------------------------------------------------
4350 bool wxWindowOS2::OS2OnScroll(
4359 wxWindow
* pChild
= wxFindWinFromHandle(hControl
);
4362 return pChild
->OS2OnScroll( nOrientation
4369 wxScrollWinEvent vEvent
;
4371 vEvent
.SetPosition(wPos
);
4372 vEvent
.SetOrientation(nOrientation
);
4373 vEvent
.SetEventObject(this);
4378 vEvent
.SetEventType(wxEVT_SCROLLWIN_LINEUP
);
4382 vEvent
.SetEventType(wxEVT_SCROLLWIN_LINEDOWN
);
4386 vEvent
.SetEventType(wxEVT_SCROLLWIN_PAGEUP
);
4390 vEvent
.SetEventType(wxEVT_SCROLLWIN_PAGEDOWN
);
4393 case SB_SLIDERPOSITION
:
4394 vEvent
.SetEventType(wxEVT_SCROLLWIN_THUMBRELEASE
);
4397 case SB_SLIDERTRACK
:
4398 vEvent
.SetEventType(wxEVT_SCROLLWIN_THUMBTRACK
);
4404 return GetEventHandler()->ProcessEvent(vEvent
);
4405 } // end of wxWindowOS2::OS2OnScroll
4407 void wxWindowOS2::MoveChildren(
4412 // We want to handle top levels ourself, manually
4414 if (!IsTopLevel() && GetAutoLayout())
4422 for (wxWindowList::compatibility_iterator node
= GetChildren().GetFirst();
4424 node
= node
->GetNext())
4426 wxWindow
* pWin
= node
->GetData();
4428 ::WinQueryWindowPos( GetHwndOf(pWin
)
4431 // Actually, only move children that already are placed on the
4432 // frame, not ones which are still at wxDefaultCoord.
4433 if (vSwp
.y
== wxDefaultCoord
)
4435 if (pWin
->IsKindOf(CLASSINFO(wxControl
)))
4440 // Must deal with controls that have margins like ENTRYFIELD. The SWP
4441 // struct of such a control will have and origin offset from its intended
4442 // position by the width of the margins.
4444 pCtrl
= wxDynamicCast(pWin
, wxControl
);
4445 vSwp
.y
-= pCtrl
->GetYComp();
4446 vSwp
.x
-= pCtrl
->GetXComp();
4448 ::WinSetWindowPos( GetHwndOf(pWin
)
4456 ::WinQueryWindowPos(GetHwndOf(pWin
), pWin
->GetSwp());
4457 if (pWin
->IsKindOf(CLASSINFO(wxRadioBox
)))
4459 wxRadioBox
* pRadioBox
;
4461 pRadioBox
= wxDynamicCast(pWin
, wxRadioBox
);
4462 pRadioBox
->AdjustButtons( (int)vSwp
.x
4463 ,(int)vSwp
.y
- nDiff
4466 ,pRadioBox
->GetSizeFlags()
4469 if (pWin
->IsKindOf(CLASSINFO(wxSlider
)))
4473 pSlider
= wxDynamicCast(pWin
, wxSlider
);
4474 pSlider
->AdjustSubControls( (int)vSwp
.x
4475 ,(int)vSwp
.y
- nDiff
4478 ,(int)pSlider
->GetSizeFlags()
4484 } // end of wxWindowOS2::MoveChildren
4487 // Getting the Y position for a window, like a control, is a real
4488 // pain. There are three sitatuions we must deal with in determining
4489 // the OS2 to wxWidgets Y coordinate.
4491 // 1) The controls are created in a dialog.
4492 // This is the easiest since a dialog is created with its original
4493 // size so the standard: Y = ParentHeight - (Y + ControlHeight);
4495 // 2) The controls are direct children of a frame
4496 // In this instance the controls are actually children of the Frame's
4497 // client. During creation the frame's client resizes several times
4498 // during creation of the status bar and toolbars. The CFrame class
4499 // will take care of this using its AlterChildPos proc.
4501 // 3) The controls are children of a panel, which in turn is a child of
4503 // The panel may be one of many, in which case the same treatment
4504 // as 1 applies. It may be the only child, though.
4505 // This is the nastiest case. A panel is created as the only child of
4506 // the frame and as such, when a frame has only one child, the child is
4507 // expanded to fit the entire client area of the frame. Because the
4508 // controls are created BEFORE this occurs their positions are totally
4509 // whacked and any call to WinQueryWindowPos will return invalid
4510 // coordinates. So for this situation we have to compare the size of
4511 // the panel at control creation time with that of the frame client. If
4512 // they are the same we can use the standard Y position equation. If
4513 // not, then we must use the Frame Client's dimensions to position them
4514 // as that will be the eventual size of the panel after the frame resizes
4517 int wxWindowOS2::GetOS2ParentHeight(
4518 wxWindowOS2
* pParent
4524 if (pParent
->IsKindOf(CLASSINFO(wxDialog
)))
4525 return(pParent
->GetClientSize().y
);
4528 // Case 2 -- if we are one of the separately built standard Frame
4529 // children, like a statusbar, menubar, or toolbar we want to
4530 // use the frame, itself, for positioning. Otherwise we are
4531 // child window and want to use the Frame's client.
4533 else if (pParent
->IsKindOf(CLASSINFO(wxFrame
)))
4535 if (IsKindOf(CLASSINFO(wxStatusBar
)) ||
4536 IsKindOf(CLASSINFO(wxMenuBar
)) ||
4537 IsKindOf(CLASSINFO(wxToolBar
))
4540 if (IsKindOf(CLASSINFO(wxToolBar
)))
4542 wxFrame
* pFrame
= wxDynamicCast(GetParent(), wxFrame
);
4544 if (pFrame
->GetToolBar() == this)
4545 return(pParent
->GetSize().y
);
4547 return(pParent
->GetClientSize().y
);
4550 return(pParent
->GetSize().y
);
4553 return(pParent
->GetClientSize().y
);
4556 // Case -- this is for any window that is the sole child of a Frame.
4557 // The grandparent must exist and it must be of type CFrame
4558 // and it's height must be different. Otherwise the standard
4563 return(pParent
->GetClientSize().y
);
4566 } // end of wxWindowOS2::GetOS2ParentHeight
4569 // OS/2 needs a lot extra manipulation to deal with layouts
4570 // for canvas windows, particularly scrolled ones.
4572 wxWindowCreationHook::wxWindowCreationHook(
4573 wxWindow
* pWinBeingCreated
4576 gpWinBeingCreated
= pWinBeingCreated
;
4577 } // end of wxWindowCreationHook::wxWindowCreationHook
4579 wxWindowCreationHook::~wxWindowCreationHook()
4581 gpWinBeingCreated
= NULL
;
4582 } // end of wxWindowCreationHook::~wxWindowCreationHook
4584 // ===========================================================================
4586 // ===========================================================================
4592 ,wxFont
* WXUNUSED(pTheFont
)
4599 hPS
=::WinGetPS(hWnd
);
4601 rc
= ::GpiQueryFontMetrics(hPS
, sizeof(FONTMETRICS
), &vFM
);
4605 *pX
= vFM
.lAveCharWidth
;
4607 *pY
= vFM
.lEmHeight
+ vFM
.lExternalLeading
;
4616 ::WinReleasePS(hPS
);
4617 } // end of wxGetCharSize
4620 // Returns 0 if was a normal ASCII value, not a special key. This indicates that
4621 // the key should be ignored by WM_KEYDOWN and processed by WM_CHAR instead.
4623 int wxCharCodeOS2ToWX(
4631 case VK_BACKTAB
: nId
= WXK_BACK
; break;
4632 case VK_TAB
: nId
= WXK_TAB
; break;
4633 case VK_CLEAR
: nId
= WXK_CLEAR
; break;
4634 case VK_ENTER
: nId
= WXK_RETURN
; break;
4635 case VK_SHIFT
: nId
= WXK_SHIFT
; break;
4636 case VK_CTRL
: nId
= WXK_CONTROL
; break;
4637 case VK_PAUSE
: nId
= WXK_PAUSE
; break;
4638 case VK_SPACE
: nId
= WXK_SPACE
; break;
4639 case VK_PAGEUP
: nId
= WXK_PRIOR
; break;
4640 case VK_PAGEDOWN
: nId
= WXK_NEXT
; break;
4641 case VK_ESC
: nId
= WXK_ESCAPE
; break;
4642 case VK_END
: nId
= WXK_END
; break;
4643 case VK_HOME
: nId
= WXK_HOME
; break;
4644 case VK_LEFT
: nId
= WXK_LEFT
; break;
4645 case VK_UP
: nId
= WXK_UP
; break;
4646 case VK_RIGHT
: nId
= WXK_RIGHT
; break;
4647 case VK_DOWN
: nId
= WXK_DOWN
; break;
4648 case VK_PRINTSCRN
: nId
= WXK_PRINT
; break;
4649 case VK_INSERT
: nId
= WXK_INSERT
; break;
4650 case VK_DELETE
: nId
= WXK_DELETE
; break;
4651 case VK_CAPSLOCK
: nId
= WXK_CAPITAL
; break;
4652 case VK_F1
: nId
= WXK_F1
; break;
4653 case VK_F2
: nId
= WXK_F2
; break;
4654 case VK_F3
: nId
= WXK_F3
; break;
4655 case VK_F4
: nId
= WXK_F4
; break;
4656 case VK_F5
: nId
= WXK_F5
; break;
4657 case VK_F6
: nId
= WXK_F6
; break;
4658 case VK_F7
: nId
= WXK_F7
; break;
4659 case VK_F8
: nId
= WXK_F8
; break;
4660 case VK_F9
: nId
= WXK_F9
; break;
4661 case VK_F10
: nId
= WXK_F10
; break;
4662 case VK_F11
: nId
= WXK_F11
; break;
4663 case VK_F12
: nId
= WXK_F12
; break;
4664 case VK_F13
: nId
= WXK_F13
; break;
4665 case VK_F14
: nId
= WXK_F14
; break;
4666 case VK_F15
: nId
= WXK_F15
; break;
4667 case VK_F16
: nId
= WXK_F16
; break;
4668 case VK_F17
: nId
= WXK_F17
; break;
4669 case VK_F18
: nId
= WXK_F18
; break;
4670 case VK_F19
: nId
= WXK_F19
; break;
4671 case VK_F20
: nId
= WXK_F20
; break;
4672 case VK_F21
: nId
= WXK_F21
; break;
4673 case VK_F22
: nId
= WXK_F22
; break;
4674 case VK_F23
: nId
= WXK_F23
; break;
4675 case VK_F24
: nId
= WXK_F24
; break;
4676 case VK_OEM_1
: nId
= ';'; break;
4677 case VK_OEM_PLUS
: nId
= '+'; break;
4678 case VK_OEM_COMMA
: nId
= ','; break;
4679 case VK_OEM_MINUS
: nId
= '-'; break;
4680 case VK_OEM_PERIOD
: nId
= '.'; break;
4681 case VK_OEM_2
: nId
= '/'; break;
4682 case VK_OEM_3
: nId
= '~'; break;
4683 case VK_OEM_4
: nId
= '['; break;
4684 case VK_OEM_5
: nId
= '\\'; break;
4685 case VK_OEM_6
: nId
= ']'; break;
4686 case VK_OEM_7
: nId
= '\''; break;
4687 case VK_NUMLOCK
: nId
= WXK_NUMLOCK
; break;
4688 case VK_SCRLLOCK
: nId
= WXK_SCROLL
; break;
4695 } // end of wxCharCodeOS2ToWX
4697 int wxCharCodeWXToOS2(
4707 case WXK_CLEAR
: nKeySym
= VK_CLEAR
; break;
4708 case WXK_SHIFT
: nKeySym
= VK_SHIFT
; break;
4709 case WXK_CONTROL
: nKeySym
= VK_CTRL
; break;
4710 case WXK_PAUSE
: nKeySym
= VK_PAUSE
; break;
4711 case WXK_PRIOR
: nKeySym
= VK_PAGEUP
; break;
4712 case WXK_NEXT
: nKeySym
= VK_PAGEDOWN
; break;
4713 case WXK_END
: nKeySym
= VK_END
; break;
4714 case WXK_HOME
: nKeySym
= VK_HOME
; break;
4715 case WXK_LEFT
: nKeySym
= VK_LEFT
; break;
4716 case WXK_UP
: nKeySym
= VK_UP
; break;
4717 case WXK_RIGHT
: nKeySym
= VK_RIGHT
; break;
4718 case WXK_DOWN
: nKeySym
= VK_DOWN
; break;
4719 case WXK_PRINT
: nKeySym
= VK_PRINTSCRN
; break;
4720 case WXK_INSERT
: nKeySym
= VK_INSERT
; break;
4721 case WXK_DELETE
: nKeySym
= VK_DELETE
; break;
4722 case WXK_F1
: nKeySym
= VK_F1
; break;
4723 case WXK_F2
: nKeySym
= VK_F2
; break;
4724 case WXK_F3
: nKeySym
= VK_F3
; break;
4725 case WXK_F4
: nKeySym
= VK_F4
; break;
4726 case WXK_F5
: nKeySym
= VK_F5
; break;
4727 case WXK_F6
: nKeySym
= VK_F6
; break;
4728 case WXK_F7
: nKeySym
= VK_F7
; break;
4729 case WXK_F8
: nKeySym
= VK_F8
; break;
4730 case WXK_F9
: nKeySym
= VK_F9
; break;
4731 case WXK_F10
: nKeySym
= VK_F10
; break;
4732 case WXK_F11
: nKeySym
= VK_F11
; break;
4733 case WXK_F12
: nKeySym
= VK_F12
; break;
4734 case WXK_F13
: nKeySym
= VK_F13
; break;
4735 case WXK_F14
: nKeySym
= VK_F14
; break;
4736 case WXK_F15
: nKeySym
= VK_F15
; break;
4737 case WXK_F16
: nKeySym
= VK_F16
; break;
4738 case WXK_F17
: nKeySym
= VK_F17
; break;
4739 case WXK_F18
: nKeySym
= VK_F18
; break;
4740 case WXK_F19
: nKeySym
= VK_F19
; break;
4741 case WXK_F20
: nKeySym
= VK_F20
; break;
4742 case WXK_F21
: nKeySym
= VK_F21
; break;
4743 case WXK_F22
: nKeySym
= VK_F22
; break;
4744 case WXK_F23
: nKeySym
= VK_F23
; break;
4745 case WXK_F24
: nKeySym
= VK_F24
; break;
4746 case WXK_NUMLOCK
: nKeySym
= VK_NUMLOCK
; break;
4747 case WXK_SCROLL
: nKeySym
= VK_SCRLLOCK
; break;
4750 *bIsVirtual
= FALSE
;
4756 } // end of wxCharCodeWXToOS2
4758 wxWindow
* wxGetActiveWindow()
4760 HWND hWnd
= ::WinQueryActiveWindow(HWND_DESKTOP
);
4764 return wxFindWinFromHandle((WXHWND
)hWnd
);
4767 } // end of wxGetActiveWindow
4770 const char* wxGetMessageName(
4775 case 0x0000: return "WM_NULL";
4776 case 0x0001: return "WM_CREATE";
4777 case 0x0002: return "WM_DESTROY";
4778 case 0x0004: return "WM_ENABLE";
4779 case 0x0005: return "WM_SHOW";
4780 case 0x0006: return "WM_MOVE";
4781 case 0x0007: return "WM_SIZE";
4782 case 0x0008: return "WM_ADJUSTWINDOWPOS";
4783 case 0x0009: return "WM_CALCVALIDRECTS";
4784 case 0x000A: return "WM_SETWINDOWPARAMS";
4785 case 0x000B: return "WM_QUERYWINDOWPARAMS";
4786 case 0x000C: return "WM_HITTEST";
4787 case 0x000D: return "WM_ACTIVATE";
4788 case 0x000F: return "WM_SETFOCUS";
4789 case 0x0010: return "WM_SETSELECTION";
4790 case 0x0011: return "WM_PPAINT";
4791 case 0x0012: return "WM_PSETFOCUS";
4792 case 0x0013: return "WM_PSYSCOLORCHANGE";
4793 case 0x0014: return "WM_PSIZE";
4794 case 0x0015: return "WM_PACTIVATE";
4795 case 0x0016: return "WM_PCONTROL";
4796 case 0x0020: return "WM_COMMAND";
4797 case 0x0021: return "WM_SYSCOMMAND";
4798 case 0x0022: return "WM_HELP";
4799 case 0x0023: return "WM_PAINT";
4800 case 0x0024: return "WM_TIMER";
4801 case 0x0025: return "WM_SEM1";
4802 case 0x0026: return "WM_SEM2";
4803 case 0x0027: return "WM_SEM3";
4804 case 0x0028: return "WM_SEM4";
4805 case 0x0029: return "WM_CLOSE";
4806 case 0x002A: return "WM_QUIT";
4807 case 0x002B: return "WM_SYSCOLORCHANGE";
4808 case 0x002D: return "WM_SYSVALUECHANGE";
4809 case 0x002E: return "WM_APPTERMINATENOTIFY";
4810 case 0x002F: return "WM_PRESPARAMCHANGED";
4811 // Control notification messages
4812 case 0x0030: return "WM_CONTROL";
4813 case 0x0031: return "WM_VSCROLL";
4814 case 0x0032: return "WM_HSCROLL";
4815 case 0x0033: return "WM_INITMENU";
4816 case 0x0034: return "WM_MENUSELECT";
4817 case 0x0035: return "WM_MENUSEND";
4818 case 0x0036: return "WM_DRAWITEM";
4819 case 0x0037: return "WM_MEASUREITEM";
4820 case 0x0038: return "WM_CONTROLPOINTER";
4821 case 0x003A: return "WM_QUERYDLGCODE";
4822 case 0x003B: return "WM_INITDLG";
4823 case 0x003C: return "WM_SUBSTITUTESTRING";
4824 case 0x003D: return "WM_MATCHMNEMONIC";
4825 case 0x003E: return "WM_SAVEAPPLICATION";
4826 case 0x0129: return "WM_CTLCOLORCHANGE";
4827 case 0x0130: return "WM_QUERYCTLTYPE";
4829 case 0x0040: return "WM_FLASHWINDOW";
4830 case 0x0041: return "WM_FORMATFRAME";
4831 case 0x0042: return "WM_UPDATEFRAME";
4832 case 0x0043: return "WM_FOCUSCHANGE";
4833 case 0x0044: return "WM_SETBORDERSIZE";
4834 case 0x0045: return "WM_TRACKFRAME";
4835 case 0x0046: return "WM_MINMAXFRAME";
4836 case 0x0047: return "WM_SETICON";
4837 case 0x0048: return "WM_QUERYICON";
4838 case 0x0049: return "WM_SETACCELTABLE";
4839 case 0x004A: return "WM_QUERYACCELTABLE";
4840 case 0x004B: return "WM_TRANSLATEACCEL";
4841 case 0x004C: return "WM_QUERYTRACKINFO";
4842 case 0x004D: return "WM_QUERYBORDERSIZE";
4843 case 0x004E: return "WM_NEXTMENU";
4844 case 0x004F: return "WM_ERASEBACKGROUND";
4845 case 0x0050: return "WM_QUERYFRAMEINFO";
4846 case 0x0051: return "WM_QUERYFOCUSCHAIN";
4847 case 0x0052: return "WM_OWNERPOSCHANGE";
4848 case 0x0053: return "WM_CACLFRAMERECT";
4849 case 0x0055: return "WM_WINDOWPOSCHANGED";
4850 case 0x0056: return "WM_ADJUSTFRAMEPOS";
4851 case 0x0059: return "WM_QUERYFRAMECTLCOUNT";
4852 case 0x005B: return "WM_QUERYHELPINFO";
4853 case 0x005C: return "WM_SETHELPINFO";
4854 case 0x005D: return "WM_ERROR";
4855 case 0x005E: return "WM_REALIZEPALETTE";
4856 // Clipboard messages
4857 case 0x0060: return "WM_RENDERFMT";
4858 case 0x0061: return "WM_RENDERALLFMTS";
4859 case 0x0062: return "WM_DESTROYCLIPBOARD";
4860 case 0x0063: return "WM_PAINTCLIPBOARD";
4861 case 0x0064: return "WM_SIZECLIPBOARD";
4862 case 0x0065: return "WM_HSCROLLCLIPBOARD";
4863 case 0x0066: return "WM_VSCROLLCLIPBOARD";
4864 case 0x0067: return "WM_DRAWCLIPBOARD";
4866 case 0x0070: return "WM_MOUSEMOVE";
4867 case 0x0071: return "WM_BUTTON1DOWN";
4868 case 0x0072: return "WM_BUTTON1UP";
4869 case 0x0073: return "WM_BUTTON1DBLCLK";
4870 case 0x0074: return "WM_BUTTON2DOWN";
4871 case 0x0075: return "WM_BUTTON2UP";
4872 case 0x0076: return "WM_BUTTON2DBLCLK";
4873 case 0x0077: return "WM_BUTTON3DOWN";
4874 case 0x0078: return "WM_BUTTON3UP";
4875 case 0x0079: return "WM_BUTTON3DBLCLK";
4876 case 0x007D: return "WM_MOUSEMAP";
4877 case 0x007E: return "WM_VRNDISABLED";
4878 case 0x007F: return "WM_VRNENABLED";
4879 case 0x0410: return "WM_CHORD";
4880 case 0x0411: return "WM_BUTTON1MOTIONSTART";
4881 case 0x0412: return "WM_BUTTON1MOTIONEND";
4882 case 0x0413: return "WM_BUTTON1CLICK";
4883 case 0x0414: return "WM_BUTTON2MOTIONSTART";
4884 case 0x0415: return "WM_BUTTON2MOTIONEND";
4885 case 0x0416: return "WM_BUTTON2CLICK";
4886 case 0x0417: return "WM_BUTTON3MOTIONSTART";
4887 case 0x0418: return "WM_BUTTON3MOTIONEND";
4888 case 0x0419: return "WM_BUTTON3CLICK";
4889 case 0x0420: return "WM_BEGINDRAG";
4890 case 0x0421: return "WM_ENDDRAG";
4891 case 0x0422: return "WM_SINGLESELECT";
4892 case 0x0423: return "WM_OPEN";
4893 case 0x0424: return "WM_CONTEXTMENU";
4894 case 0x0425: return "WM_CONTEXTHELP";
4895 case 0x0426: return "WM_TEXTEDIT";
4896 case 0x0427: return "WM_BEGINSELECT";
4897 case 0x0228: return "WM_ENDSELECT";
4898 case 0x0429: return "WM_PICKUP";
4899 case 0x04C0: return "WM_PENFIRST";
4900 case 0x04FF: return "WM_PENLAST";
4901 case 0x0500: return "WM_MMPMFIRST";
4902 case 0x05FF: return "WM_MMPMLAST";
4903 case 0x0600: return "WM_STDDLGFIRST";
4904 case 0x06FF: return "WM_STDDLGLAST";
4905 case 0x0BD0: return "WM_BIDI_FIRST";
4906 case 0x0BFF: return "WM_BIDI_LAST";
4908 case 0x007A: return "WM_CHAR";
4909 case 0x007B: return "WM_VIOCHAR";
4911 case 0x00A0: return "WM_DDE_INITIATE";
4912 case 0x00A1: return "WM_DDE_REQUEST";
4913 case 0x00A2: return "WM_DDE_ACK";
4914 case 0x00A3: return "WM_DDE_DATA";
4915 case 0x00A4: return "WM_DDE_ADVISE";
4916 case 0x00A5: return "WM_DDE_UNADVISE";
4917 case 0x00A6: return "WM_DDE_POKE";
4918 case 0x00A7: return "WM_DDE_EXECUTE";
4919 case 0x00A8: return "WM_DDE_TERMINATE";
4920 case 0x00A9: return "WM_DDE_INITIATEACK";
4921 case 0x00AF: return "WM_DDE_LAST";
4923 case 0x0120: return "BM_CLICK";
4924 case 0x0121: return "BM_QUERYCHECKINDEX";
4925 case 0x0122: return "BM_QUERYHILITE";
4926 case 0x0123: return "BM_SETHILITE";
4927 case 0x0124: return "BM_QUERYCHECK";
4928 case 0x0125: return "BM_SETCHECK";
4929 case 0x0126: return "BM_SETDEFAULT";
4930 case 0x0128: return "BM_AUTOSIZE";
4932 case 0x029A: return "CBID_LIST";
4933 case 0x029B: return "CBID_EDIT";
4934 case 0x0170: return "CBM_SHOWLIST";
4935 case 0x0171: return "CBM_HILITE";
4936 case 0x0172: return "CBM_ISLISTSHOWING";
4938 case 0x0140: return "EM_QUERYCHANGED";
4939 case 0x0141: return "EM_QUERYSEL";
4940 case 0x0142: return "EM_SETSEL";
4941 case 0x0143: return "EM_SETTEXTLIMIT";
4942 case 0x0144: return "EM_CUT";
4943 case 0x0145: return "EM_COPY";
4944 case 0x0146: return "EM_CLEAR";
4945 case 0x0147: return "EM_PASTE";
4946 case 0x0148: return "EM_QUERYFIRSTCHAR";
4947 case 0x0149: return "EM_SETFIRSTCHAR";
4948 case 0x014A: return "EM_QUERYREADONLY";
4949 case 0x014B: return "EM_SETREADONLY";
4950 case 0x014C: return "EM_SETINSERTMODE";
4952 case 0x0160: return "LM_QUERYITEMCOUNT";
4953 case 0x0161: return "LM_INSERTITEM";
4954 case 0x0162: return "LM_SETOPENINDEX";
4955 case 0x0163: return "LM_DELETEITEM";
4956 case 0x0164: return "LM_SELECTITEM";
4957 case 0x0165: return "LM_QUERYSELECTION";
4958 case 0x0166: return "LM_SETITEMTEXT";
4959 case 0x0167: return "LM_QUERYITEMTEXTLENGTH";
4960 case 0x0168: return "LM_QUERYITEMTEXT";
4961 case 0x0169: return "LM_SETITEMHANDLE";
4962 case 0x016A: return "LM_QUERYITEMHANDLE";
4963 case 0x016B: return "LM_SEARCHSTRING";
4964 case 0x016C: return "LM_SETITEMHEIGHT";
4965 case 0x016D: return "LM_QUERYTOPINDEX";
4966 case 0x016E: return "LM_DELETEALL";
4967 case 0x016F: return "LM_INSERTMULITEMS";
4968 case 0x0660: return "LM_SETITEMWIDTH";
4970 case 0x0180: return "MM_INSERTITEM";
4971 case 0x0181: return "MM_DELETEITEM";
4972 case 0x0182: return "MM_QUERYITEM";
4973 case 0x0183: return "MM_SETITEM";
4974 case 0x0184: return "MM_QUERYITEMCOUNT";
4975 case 0x0185: return "MM_STARTMENUMODE";
4976 case 0x0186: return "MM_ENDMENUMODE";
4977 case 0x0188: return "MM_REMOVEITEM";
4978 case 0x0189: return "MM_SELECTITEM";
4979 case 0x018A: return "MM_QUERYSELITEMID";
4980 case 0x018B: return "MM_QUERYITEMTEXT";
4981 case 0x018C: return "MM_QUERYITEMTEXTLENGTH";
4982 case 0x018D: return "MM_SETITEMHANDLE";
4983 case 0x018E: return "MM_SETITEMTEXT";
4984 case 0x018F: return "MM_ITEMPOSITIONFROMID";
4985 case 0x0190: return "MM_ITEMIDFROMPOSITION";
4986 case 0x0191: return "MM_QUERYITEMATTR";
4987 case 0x0192: return "MM_SETITEMATTR";
4988 case 0x0193: return "MM_ISITEMVALID";
4989 case 0x0194: return "MM_QUERYITEMRECT";
4990 case 0x0431: return "MM_QUERYDEFAULTITEMID";
4991 case 0x0432: return "MM_SETDEFAULTITEMID";
4993 case 0x01A0: return "SBM_SETSCROLLBAR";
4994 case 0x01A1: return "SBM_SETPOS";
4995 case 0x01A2: return "SBM_QUERYPOS";
4996 case 0x01A3: return "SBM_QUERYRANGE";
4997 case 0x01A6: return "SBM_SETTHUMBSIZE";
5000 case 0x0F00: return "WM_HELPBASE";
5001 case 0x0FFF: return "WM_HELPTOP";
5002 // Beginning of user defined messages
5003 case 0x1000: return "WM_USER";
5005 // wxWidgets user defined types
5008 // case 0x1000 + 0: return "LVM_GETBKCOLOR";
5009 case 0x1000 + 1: return "LVM_SETBKCOLOR";
5010 case 0x1000 + 2: return "LVM_GETIMAGELIST";
5011 case 0x1000 + 3: return "LVM_SETIMAGELIST";
5012 case 0x1000 + 4: return "LVM_GETITEMCOUNT";
5013 case 0x1000 + 5: return "LVM_GETITEMA";
5014 case 0x1000 + 75: return "LVM_GETITEMW";
5015 case 0x1000 + 6: return "LVM_SETITEMA";
5016 case 0x1000 + 76: return "LVM_SETITEMW";
5017 case 0x1000 + 7: return "LVM_INSERTITEMA";
5018 case 0x1000 + 77: return "LVM_INSERTITEMW";
5019 case 0x1000 + 8: return "LVM_DELETEITEM";
5020 case 0x1000 + 9: return "LVM_DELETEALLITEMS";
5021 case 0x1000 + 10: return "LVM_GETCALLBACKMASK";
5022 case 0x1000 + 11: return "LVM_SETCALLBACKMASK";
5023 case 0x1000 + 12: return "LVM_GETNEXTITEM";
5024 case 0x1000 + 13: return "LVM_FINDITEMA";
5025 case 0x1000 + 83: return "LVM_FINDITEMW";
5026 case 0x1000 + 14: return "LVM_GETITEMRECT";
5027 case 0x1000 + 15: return "LVM_SETITEMPOSITION";
5028 case 0x1000 + 16: return "LVM_GETITEMPOSITION";
5029 case 0x1000 + 17: return "LVM_GETSTRINGWIDTHA";
5030 case 0x1000 + 87: return "LVM_GETSTRINGWIDTHW";
5031 case 0x1000 + 18: return "LVM_HITTEST";
5032 case 0x1000 + 19: return "LVM_ENSUREVISIBLE";
5033 case 0x1000 + 20: return "LVM_SCROLL";
5034 case 0x1000 + 21: return "LVM_REDRAWITEMS";
5035 case 0x1000 + 22: return "LVM_ARRANGE";
5036 case 0x1000 + 23: return "LVM_EDITLABELA";
5037 case 0x1000 + 118: return "LVM_EDITLABELW";
5038 case 0x1000 + 24: return "LVM_GETEDITCONTROL";
5039 case 0x1000 + 25: return "LVM_GETCOLUMNA";
5040 case 0x1000 + 95: return "LVM_GETCOLUMNW";
5041 case 0x1000 + 26: return "LVM_SETCOLUMNA";
5042 case 0x1000 + 96: return "LVM_SETCOLUMNW";
5043 case 0x1000 + 27: return "LVM_INSERTCOLUMNA";
5044 case 0x1000 + 97: return "LVM_INSERTCOLUMNW";
5045 case 0x1000 + 28: return "LVM_DELETECOLUMN";
5046 case 0x1000 + 29: return "LVM_GETCOLUMNWIDTH";
5047 case 0x1000 + 30: return "LVM_SETCOLUMNWIDTH";
5048 case 0x1000 + 31: return "LVM_GETHEADER";
5049 case 0x1000 + 33: return "LVM_CREATEDRAGIMAGE";
5050 case 0x1000 + 34: return "LVM_GETVIEWRECT";
5051 case 0x1000 + 35: return "LVM_GETTEXTCOLOR";
5052 case 0x1000 + 36: return "LVM_SETTEXTCOLOR";
5053 case 0x1000 + 37: return "LVM_GETTEXTBKCOLOR";
5054 case 0x1000 + 38: return "LVM_SETTEXTBKCOLOR";
5055 case 0x1000 + 39: return "LVM_GETTOPINDEX";
5056 case 0x1000 + 40: return "LVM_GETCOUNTPERPAGE";
5057 case 0x1000 + 41: return "LVM_GETORIGIN";
5058 case 0x1000 + 42: return "LVM_UPDATE";
5059 case 0x1000 + 43: return "LVM_SETITEMSTATE";
5060 case 0x1000 + 44: return "LVM_GETITEMSTATE";
5061 case 0x1000 + 45: return "LVM_GETITEMTEXTA";
5062 case 0x1000 + 115: return "LVM_GETITEMTEXTW";
5063 case 0x1000 + 46: return "LVM_SETITEMTEXTA";
5064 case 0x1000 + 116: return "LVM_SETITEMTEXTW";
5065 case 0x1000 + 47: return "LVM_SETITEMCOUNT";
5066 case 0x1000 + 48: return "LVM_SORTITEMS";
5067 case 0x1000 + 49: return "LVM_SETITEMPOSITION32";
5068 case 0x1000 + 50: return "LVM_GETSELECTEDCOUNT";
5069 case 0x1000 + 51: return "LVM_GETITEMSPACING";
5070 case 0x1000 + 52: return "LVM_GETISEARCHSTRINGA";
5071 case 0x1000 + 117: return "LVM_GETISEARCHSTRINGW";
5072 case 0x1000 + 53: return "LVM_SETICONSPACING";
5073 case 0x1000 + 54: return "LVM_SETEXTENDEDLISTVIEWSTYLE";
5074 case 0x1000 + 55: return "LVM_GETEXTENDEDLISTVIEWSTYLE";
5075 case 0x1000 + 56: return "LVM_GETSUBITEMRECT";
5076 case 0x1000 + 57: return "LVM_SUBITEMHITTEST";
5077 case 0x1000 + 58: return "LVM_SETCOLUMNORDERARRAY";
5078 case 0x1000 + 59: return "LVM_GETCOLUMNORDERARRAY";
5079 case 0x1000 + 60: return "LVM_SETHOTITEM";
5080 case 0x1000 + 61: return "LVM_GETHOTITEM";
5081 case 0x1000 + 62: return "LVM_SETHOTCURSOR";
5082 case 0x1000 + 63: return "LVM_GETHOTCURSOR";
5083 case 0x1000 + 64: return "LVM_APPROXIMATEVIEWRECT";
5084 case 0x1000 + 65: return "LVM_SETWORKAREA";
5087 case 0x1100 + 0: return "TVM_INSERTITEMA";
5088 case 0x1100 + 50: return "TVM_INSERTITEMW";
5089 case 0x1100 + 1: return "TVM_DELETEITEM";
5090 case 0x1100 + 2: return "TVM_EXPAND";
5091 case 0x1100 + 4: return "TVM_GETITEMRECT";
5092 case 0x1100 + 5: return "TVM_GETCOUNT";
5093 case 0x1100 + 6: return "TVM_GETINDENT";
5094 case 0x1100 + 7: return "TVM_SETINDENT";
5095 case 0x1100 + 8: return "TVM_GETIMAGELIST";
5096 case 0x1100 + 9: return "TVM_SETIMAGELIST";
5097 case 0x1100 + 10: return "TVM_GETNEXTITEM";
5098 case 0x1100 + 11: return "TVM_SELECTITEM";
5099 case 0x1100 + 12: return "TVM_GETITEMA";
5100 case 0x1100 + 62: return "TVM_GETITEMW";
5101 case 0x1100 + 13: return "TVM_SETITEMA";
5102 case 0x1100 + 63: return "TVM_SETITEMW";
5103 case 0x1100 + 14: return "TVM_EDITLABELA";
5104 case 0x1100 + 65: return "TVM_EDITLABELW";
5105 case 0x1100 + 15: return "TVM_GETEDITCONTROL";
5106 case 0x1100 + 16: return "TVM_GETVISIBLECOUNT";
5107 case 0x1100 + 17: return "TVM_HITTEST";
5108 case 0x1100 + 18: return "TVM_CREATEDRAGIMAGE";
5109 case 0x1100 + 19: return "TVM_SORTCHILDREN";
5110 case 0x1100 + 20: return "TVM_ENSUREVISIBLE";
5111 case 0x1100 + 21: return "TVM_SORTCHILDRENCB";
5112 case 0x1100 + 22: return "TVM_ENDEDITLABELNOW";
5113 case 0x1100 + 23: return "TVM_GETISEARCHSTRINGA";
5114 case 0x1100 + 64: return "TVM_GETISEARCHSTRINGW";
5115 case 0x1100 + 24: return "TVM_SETTOOLTIPS";
5116 case 0x1100 + 25: return "TVM_GETTOOLTIPS";
5119 case 0x1200 + 0: return "HDM_GETITEMCOUNT";
5120 case 0x1200 + 1: return "HDM_INSERTITEMA";
5121 case 0x1200 + 10: return "HDM_INSERTITEMW";
5122 case 0x1200 + 2: return "HDM_DELETEITEM";
5123 case 0x1200 + 3: return "HDM_GETITEMA";
5124 case 0x1200 + 11: return "HDM_GETITEMW";
5125 case 0x1200 + 4: return "HDM_SETITEMA";
5126 case 0x1200 + 12: return "HDM_SETITEMW";
5127 case 0x1200 + 5: return "HDM_LAYOUT";
5128 case 0x1200 + 6: return "HDM_HITTEST";
5129 case 0x1200 + 7: return "HDM_GETITEMRECT";
5130 case 0x1200 + 8: return "HDM_SETIMAGELIST";
5131 case 0x1200 + 9: return "HDM_GETIMAGELIST";
5132 case 0x1200 + 15: return "HDM_ORDERTOINDEX";
5133 case 0x1200 + 16: return "HDM_CREATEDRAGIMAGE";
5134 case 0x1200 + 17: return "HDM_GETORDERARRAY";
5135 case 0x1200 + 18: return "HDM_SETORDERARRAY";
5136 case 0x1200 + 19: return "HDM_SETHOTDIVIDER";
5139 case 0x1300 + 2: return "TCM_GETIMAGELIST";
5140 case 0x1300 + 3: return "TCM_SETIMAGELIST";
5141 case 0x1300 + 4: return "TCM_GETITEMCOUNT";
5142 case 0x1300 + 5: return "TCM_GETITEMA";
5143 case 0x1300 + 60: return "TCM_GETITEMW";
5144 case 0x1300 + 6: return "TCM_SETITEMA";
5145 case 0x1300 + 61: return "TCM_SETITEMW";
5146 case 0x1300 + 7: return "TCM_INSERTITEMA";
5147 case 0x1300 + 62: return "TCM_INSERTITEMW";
5148 case 0x1300 + 8: return "TCM_DELETEITEM";
5149 case 0x1300 + 9: return "TCM_DELETEALLITEMS";
5150 case 0x1300 + 10: return "TCM_GETITEMRECT";
5151 case 0x1300 + 11: return "TCM_GETCURSEL";
5152 case 0x1300 + 12: return "TCM_SETCURSEL";
5153 case 0x1300 + 13: return "TCM_HITTEST";
5154 case 0x1300 + 14: return "TCM_SETITEMEXTRA";
5155 case 0x1300 + 40: return "TCM_ADJUSTRECT";
5156 case 0x1300 + 41: return "TCM_SETITEMSIZE";
5157 case 0x1300 + 42: return "TCM_REMOVEIMAGE";
5158 case 0x1300 + 43: return "TCM_SETPADDING";
5159 case 0x1300 + 44: return "TCM_GETROWCOUNT";
5160 case 0x1300 + 45: return "TCM_GETTOOLTIPS";
5161 case 0x1300 + 46: return "TCM_SETTOOLTIPS";
5162 case 0x1300 + 47: return "TCM_GETCURFOCUS";
5163 case 0x1300 + 48: return "TCM_SETCURFOCUS";
5164 case 0x1300 + 49: return "TCM_SETMINTABWIDTH";
5165 case 0x1300 + 50: return "TCM_DESELECTALL";
5168 case WM_USER
+1000+1: return "TB_ENABLEBUTTON";
5169 case WM_USER
+1000+2: return "TB_CHECKBUTTON";
5170 case WM_USER
+1000+3: return "TB_PRESSBUTTON";
5171 case WM_USER
+1000+4: return "TB_HIDEBUTTON";
5172 case WM_USER
+1000+5: return "TB_INDETERMINATE";
5173 case WM_USER
+1000+9: return "TB_ISBUTTONENABLED";
5174 case WM_USER
+1000+10: return "TB_ISBUTTONCHECKED";
5175 case WM_USER
+1000+11: return "TB_ISBUTTONPRESSED";
5176 case WM_USER
+1000+12: return "TB_ISBUTTONHIDDEN";
5177 case WM_USER
+1000+13: return "TB_ISBUTTONINDETERMINATE";
5178 case WM_USER
+1000+17: return "TB_SETSTATE";
5179 case WM_USER
+1000+18: return "TB_GETSTATE";
5180 case WM_USER
+1000+19: return "TB_ADDBITMAP";
5181 case WM_USER
+1000+20: return "TB_ADDBUTTONS";
5182 case WM_USER
+1000+21: return "TB_INSERTBUTTON";
5183 case WM_USER
+1000+22: return "TB_DELETEBUTTON";
5184 case WM_USER
+1000+23: return "TB_GETBUTTON";
5185 case WM_USER
+1000+24: return "TB_BUTTONCOUNT";
5186 case WM_USER
+1000+25: return "TB_COMMANDTOINDEX";
5187 case WM_USER
+1000+26: return "TB_SAVERESTOREA";
5188 case WM_USER
+1000+76: return "TB_SAVERESTOREW";
5189 case WM_USER
+1000+27: return "TB_CUSTOMIZE";
5190 case WM_USER
+1000+28: return "TB_ADDSTRINGA";
5191 case WM_USER
+1000+77: return "TB_ADDSTRINGW";
5192 case WM_USER
+1000+29: return "TB_GETITEMRECT";
5193 case WM_USER
+1000+30: return "TB_BUTTONSTRUCTSIZE";
5194 case WM_USER
+1000+31: return "TB_SETBUTTONSIZE";
5195 case WM_USER
+1000+32: return "TB_SETBITMAPSIZE";
5196 case WM_USER
+1000+33: return "TB_AUTOSIZE";
5197 case WM_USER
+1000+35: return "TB_GETTOOLTIPS";
5198 case WM_USER
+1000+36: return "TB_SETTOOLTIPS";
5199 case WM_USER
+1000+37: return "TB_SETPARENT";
5200 case WM_USER
+1000+39: return "TB_SETROWS";
5201 case WM_USER
+1000+40: return "TB_GETROWS";
5202 case WM_USER
+1000+42: return "TB_SETCMDID";
5203 case WM_USER
+1000+43: return "TB_CHANGEBITMAP";
5204 case WM_USER
+1000+44: return "TB_GETBITMAP";
5205 case WM_USER
+1000+45: return "TB_GETBUTTONTEXTA";
5206 case WM_USER
+1000+75: return "TB_GETBUTTONTEXTW";
5207 case WM_USER
+1000+46: return "TB_REPLACEBITMAP";
5208 case WM_USER
+1000+47: return "TB_SETINDENT";
5209 case WM_USER
+1000+48: return "TB_SETIMAGELIST";
5210 case WM_USER
+1000+49: return "TB_GETIMAGELIST";
5211 case WM_USER
+1000+50: return "TB_LOADIMAGES";
5212 case WM_USER
+1000+51: return "TB_GETRECT";
5213 case WM_USER
+1000+52: return "TB_SETHOTIMAGELIST";
5214 case WM_USER
+1000+53: return "TB_GETHOTIMAGELIST";
5215 case WM_USER
+1000+54: return "TB_SETDISABLEDIMAGELIST";
5216 case WM_USER
+1000+55: return "TB_GETDISABLEDIMAGELIST";
5217 case WM_USER
+1000+56: return "TB_SETSTYLE";
5218 case WM_USER
+1000+57: return "TB_GETSTYLE";
5219 case WM_USER
+1000+58: return "TB_GETBUTTONSIZE";
5220 case WM_USER
+1000+59: return "TB_SETBUTTONWIDTH";
5221 case WM_USER
+1000+60: return "TB_SETMAXTEXTROWS";
5222 case WM_USER
+1000+61: return "TB_GETTEXTROWS";
5223 case WM_USER
+1000+41: return "TB_GETBITMAPFLAGS";
5226 static char s_szBuf
[128];
5227 sprintf(s_szBuf
, "<unknown message = %d>", nMessage
);
5231 } // end of wxGetMessageName
5233 #endif // __WXDEBUG__
5237 static void TranslateKbdEventToMouse(
5245 // Construct the key mask
5246 ULONG
& fwKeys
= *pFlags
;
5248 fwKeys
= VK_BUTTON2
;
5249 if ((::WinGetKeyState(HWND_DESKTOP
, VK_CTRL
) & 0x100) != 0)
5251 if ((::WinGetKeyState(HWND_DESKTOP
, VK_SHIFT
) & 0x100) != 0)
5255 // Simulate right mouse button click
5259 ::WinQueryMsgPos(vHabmain
, &vPoint
);
5263 pWin
->ScreenToClient(pX
, pY
);
5264 } // end of TranslateKbdEventToMouse
5267 // Find the wxWindow at the current mouse position, returning the mouse
5269 wxWindow
* wxFindWindowAtPointer(
5270 wxPoint
& WXUNUSED(rPt
)
5273 return wxFindWindowAtPoint(wxGetMousePosition());
5276 wxWindow
* wxFindWindowAtPoint(
5285 HWND hWndHit
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt2
, FALSE
);
5286 wxWindow
* pWin
= wxFindWinFromHandle((WXHWND
)hWndHit
) ;
5287 HWND hWnd
= hWndHit
;
5290 // Try to find a window with a wxWindow associated with it
5292 while (!pWin
&& (hWnd
!= 0))
5294 hWnd
= ::WinQueryWindow(hWnd
, QW_PARENT
);
5295 pWin
= wxFindWinFromHandle((WXHWND
)hWnd
) ;
5300 // Get the current mouse position.
5301 wxPoint
wxGetMousePosition()
5305 ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
);
5306 return wxPoint(vPt
.x
, vPt
.y
);
5309 wxWindowOS2
* FindWindowForMouseEvent(
5315 HWND hWnd
= GetHwndOf(pWin
);
5316 HWND hWndUnderMouse
;
5318 BOOL rcEnabled
= FALSE
;
5319 BOOL rcVisible
= FALSE
;
5321 ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
);
5322 hWndUnderMouse
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, TRUE
);
5323 if (hWndUnderMouse
!= HWND_DESKTOP
)
5325 wxWindow
* pWinUnderMouse
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
);
5329 wxWindowList::compatibility_iterator current
= pWinUnderMouse
->GetChildren().GetFirst();
5330 wxWindow
* pGrandChild
= NULL
;
5334 ::WinMapWindowPoints(HWND_DESKTOP
, hWndUnderMouse
, &vPoint
, 1);
5336 // Find a child window mouse might be under
5340 wxWindow
* pChild
= current
->GetData();
5342 vPoint2
.x
= vPoint
.x
;
5343 vPoint2
.y
= vPoint
.y
;
5344 ::WinMapWindowPoints(hWndUnderMouse
, pChild
->GetHWND(), &vPoint2
, 1);
5345 ::WinQueryWindowRect(pChild
->GetHWND(), &vRect
);
5346 if (::WinPtInRect(vHabmain
, &vRect
, &vPoint2
))
5348 if (pChild
->IsTopLevel())
5351 wxWindowList::compatibility_iterator current2
=pChild
->GetChildren().GetFirst();
5355 wxWindow
* pGrandChild
= current2
->GetData();
5357 vPoint3
.x
= vPoint2
.x
;
5358 vPoint3
.y
= vPoint2
.y
;
5359 ::WinMapWindowPoints( pChild
->GetHWND()
5360 ,pGrandChild
->GetHWND()
5364 ::WinQueryWindowRect(pGrandChild
->GetHWND(), &vRect
);
5365 if (::WinPtInRect(vHabmain
, &vRect
, &vPoint3
))
5367 hWndUnderMouse
= GetHwndOf(pGrandChild
);
5368 pWinUnderMouse
= pGrandChild
;
5371 current2
= current2
->GetNext();
5376 hWndUnderMouse
= GetHwndOf(pChild
);
5377 pWinUnderMouse
= pChild
;
5378 rcVisible
= ::WinIsWindowVisible(hWndUnderMouse
);
5379 rcEnabled
= ::WinIsWindowEnabled(hWndUnderMouse
);
5380 if (rcVisible
&& rcEnabled
)
5383 current
= current
->GetNext();
5387 rcVisible
= ::WinIsWindowVisible(hWndUnderMouse
);
5388 rcEnabled
= ::WinIsWindowEnabled(hWndUnderMouse
);
5392 // Check that we have a child window which is susceptible to receive mouse
5393 // events: for this it must be shown and enabled
5395 if ( hWndUnderMouse
&&
5396 hWndUnderMouse
!= hWnd
&&
5397 rcVisible
&& rcEnabled
)
5399 wxWindow
* pWinUnderMouse
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
);
5404 // Translate the mouse coords to the other window coords
5406 pWin
= pWinUnderMouse
;
5410 } // end of FindWindowForMouseEvent