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( int nOrient
,
738 bool WXUNUSED(bRefresh
) )
740 HWND hWnd
= GetHwnd();
741 int nOldRange
= nRange
- nThumbVisible
;
742 int nRange1
= nOldRange
;
743 int nPageSize
= nThumbVisible
;
746 ULONG ulStyle
= WS_VISIBLE
| WS_SYNCPAINT
;
751 wxWindow
* pParent
= GetParent();
753 if (pParent
&& pParent
->IsKindOf(CLASSINFO(wxFrame
)))
757 pFrame
= wxDynamicCast(pParent
, wxFrame
);
758 hWndParent
= pFrame
->GetFrame();
759 hWndClient
= GetHwndOf(pParent
);
764 hWndParent
= GetHwndOf(pParent
);
766 hWndParent
= GetHwnd();
767 hWndClient
= hWndParent
;
769 ::WinQueryWindowPos(hWndClient
, &vSwp
);
770 ::WinQueryWindowPos(hWnd
, &vSwpOwner
);
772 if (nPageSize
> 1 && nRange
> 0)
774 nRange1
+= (nPageSize
- 1);
777 vInfo
.cb
= sizeof(SBCDATA
);
779 vInfo
.posLast
= (SHORT
)nRange1
;
780 vInfo
.posThumb
= (SHORT
)nPos
;
782 if (nOrient
== wxHORIZONTAL
)
785 if (m_hWndScrollBarHorz
== 0L)
788 // Since the scrollbars are usually created before the owner is
789 // sized either via an OnSize event directly or via sizers or
790 // layout constraints, we will initially just use the coords of
791 // the parent window (this is usually a frame client window). But
792 // the bars themselves, are children of the parent frame (i.e
793 // siblings of the frame client. The owner, however is the actual
794 // window being scrolled (or at least the one responsible for
795 // handling the scroll events). The owner will be resized later,
796 // as it is usually a child of a top level window, and when that
797 // is done its scrollbars will be resized and repositioned as well.
799 m_hWndScrollBarHorz
= ::WinCreateWindow( hWndParent
817 // The owner (the scrolled window) is a child of the Frame's
818 // client window, usually. The scrollbars are children of the
819 // frame, itself, and thus are positioned relative to the frame's
820 // origin, not the frame's client window origin.
821 // The starting x position is the same as the starting x position
822 // of the owner, but in terms of the parent frame.
823 // The starting y position is 20 pels below the origin of the
824 // owner in terms of the parent frame.
825 // The horz bar is the same width as the owner and 20 pels high.
827 if (nRange1
>= nThumbVisible
)
829 ::WinSetWindowPos( m_hWndScrollBarHorz
831 ,vSwp
.x
+ vSwpOwner
.x
832 ,(vSwp
.y
+ vSwpOwner
.y
) - 20
835 ,SWP_MOVE
| SWP_SIZE
| SWP_SHOW
| SWP_ACTIVATE
| SWP_ZORDER
837 ::WinSendMsg( m_hWndScrollBarHorz
840 ,MPFROM2SHORT(0, (SHORT
)nRange1
)
842 ::WinSendMsg( m_hWndScrollBarHorz
844 ,MPFROM2SHORT( (SHORT
)nThumbVisible
851 ::WinShowWindow(m_hWndScrollBarHorz
, FALSE
);
857 if (m_hWndScrollBarVert
== 0L)
860 // Since the scrollbars are usually created before the owner is
861 // sized either via an OnSize event directly or via sizers or
862 // layout constraints, we will initially just use the coords of
863 // the parent window (this is usually a frame client window). But
864 // the bars themselves, are children of the parent frame (i.e
865 // siblings of the frame client. The owner, however is the actual
866 // window being scrolled (or at least the one responsible for
867 // handling the scroll events). The owner will be resized later,
868 // as it is usually a child of a top level window, and when that
869 // is done its scrollbars will be resized and repositioned as well.
871 m_hWndScrollBarVert
= ::WinCreateWindow( hWndParent
875 ,vSwp
.x
+ vSwp
.cx
- 20
889 // The owner (the scrolled window) is a child of the Frame's
890 // client window, usually. The scrollbars are children of the
891 // frame, itself and thus are positioned relative to the frame's
892 // origin, not the frame's client window's origin.
893 // Thus, the x position will be frame client's x (usually a few
894 // pels inside the parent frame, plus the width of the owner.
895 // Since we may be using sizers or layout constraints for multiple
896 // child scrolled windows, the y position will be the frame client's
897 // y pos plus the scrolled windows y position, yielding the y
898 // position of the scrollbar relative to the parent frame (the vert
899 // scrollbar is on the right and starts at the bottom of the
901 // It is 20 pels wide and the same height as the owner.
903 if (nRange1
>= nThumbVisible
)
905 ::WinSetWindowPos( m_hWndScrollBarVert
907 ,vSwp
.x
+ vSwpOwner
.x
+ vSwpOwner
.cx
908 ,vSwp
.y
+ vSwpOwner
.y
911 ,SWP_ACTIVATE
| SWP_MOVE
| SWP_SIZE
| SWP_SHOW
913 ::WinSendMsg( m_hWndScrollBarVert
916 ,MPFROM2SHORT(0, (SHORT
)nRange1
)
918 ::WinSendMsg( m_hWndScrollBarVert
920 ,MPFROM2SHORT( (SHORT
)nThumbVisible
927 ::WinShowWindow(m_hWndScrollBarVert
, FALSE
);
929 m_nYThumbSize
= nThumbVisible
;
931 } // end of wxWindowOS2::SetScrollbar
933 void wxWindowOS2::ScrollWindow(
936 , const wxRect
* pRect
941 ::WinQueryWindowRect(GetHwnd(), &vRect
);
942 int height
= vRect
.yTop
;
945 vRect
.xLeft
= pRect
->x
;
946 vRect
.yTop
= height
- pRect
->y
;
947 vRect
.xRight
= pRect
->x
+ pRect
->width
;
948 vRect
.yBottom
= vRect
.yTop
- pRect
->height
;
950 nDy
*= -1; // flip the sign of Dy as OS/2 is opposite Windows.
951 ::WinScrollWindow( GetHwnd()
958 ,SW_SCROLLCHILDREN
| SW_INVALIDATERGN
960 } // end of wxWindowOS2::ScrollWindow
962 // ---------------------------------------------------------------------------
964 // ---------------------------------------------------------------------------
966 void wxWindowOS2::SubclassWin(
970 HWND hwnd
= (HWND
)hWnd
;
972 wxCHECK_RET(::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in SubclassWin") );
973 wxAssociateWinWithHandle( hWnd
976 if (!wxCheckWindowWndProc( hWnd
977 ,(WXFARPROC
)wxWndProc
980 m_fnOldWndProc
= (WXFARPROC
) ::WinSubclassWindow(hwnd
, (PFNWP
)wxWndProc
);
984 m_fnOldWndProc
= (WXFARPROC
)NULL
;
986 } // end of wxWindowOS2::SubclassWin
988 void wxWindowOS2::UnsubclassWin()
991 // Restore old Window proc
993 HWND hwnd
= GetHWND();
997 wxCHECK_RET( ::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in UnsubclassWin") );
999 PFNWP fnProc
= (PFNWP
)::WinQueryWindowPtr(hwnd
, QWP_PFNWP
);
1001 if ( (m_fnOldWndProc
!= 0) && (fnProc
!= (PFNWP
) m_fnOldWndProc
))
1003 WinSubclassWindow(hwnd
, (PFNWP
)m_fnOldWndProc
);
1007 } // end of wxWindowOS2::UnsubclassWin
1009 bool wxCheckWindowWndProc(
1011 , WXFARPROC fnWndProc
1014 static char zBuffer
[512];
1017 ::WinQueryClassName((HWND
)hWnd
, (LONG
)512, (PCH
)zBuffer
);
1018 ::WinQueryClassInfo(wxGetInstance(), (PSZ
)zBuffer
, &vCls
);
1019 return(fnWndProc
== (WXFARPROC
)vCls
.pfnWindowProc
);
1020 } // end of WinGuiBase_CheckWindowWndProc
1022 void wxWindowOS2::SetWindowStyleFlag(
1026 long lFlagsOld
= GetWindowStyleFlag();
1028 if (lFlags
== lFlagsOld
)
1032 // Update the internal variable
1034 wxWindowBase::SetWindowStyleFlag(lFlags
);
1037 // Now update the Windows style as well if needed - and if the window had
1038 // been already created
1044 WXDWORD dwExstyleOld
;
1045 long lStyle
= OS2GetStyle( lFlags
1048 long lStyleOld
= OS2GetStyle( lFlagsOld
1052 if (lStyle
!= lStyleOld
)
1055 // Some flags (e.g. WS_VISIBLE or WS_DISABLED) should not be changed by
1056 // this function so instead of simply setting the style to the new
1057 // value we clear the bits which were set in styleOld but are set in
1058 // the new one and set the ones which were not set before
1060 long lStyleReal
= ::WinQueryWindowULong(GetHwnd(), QWL_STYLE
);
1062 lStyleReal
&= ~lStyleOld
;
1063 lStyleReal
|= lStyle
;
1065 ::WinSetWindowULong(GetHwnd(), QWL_STYLE
, lStyleReal
);
1067 } // end of wxWindowOS2::SetWindowStyleFlag
1069 WXDWORD
wxWindowOS2::OS2GetStyle( long lFlags
,
1070 WXDWORD
* WXUNUSED(pdwExstyle
) ) const
1072 WXDWORD dwStyle
= 0L;
1074 if (lFlags
& wxCLIP_CHILDREN
)
1075 dwStyle
|= WS_CLIPCHILDREN
;
1077 if (lFlags
& wxCLIP_SIBLINGS
)
1078 dwStyle
|= WS_CLIPSIBLINGS
;
1081 } // end of wxWindowOS2::OS2GetStyle
1084 // Make a Windows extended style from the given wxWidgets window style
1086 WXDWORD
wxWindowOS2::MakeExtendedStyle(
1088 , bool bEliminateBorders
1092 // Simply fill out with wxWindow extended styles. We'll conjure
1093 // something up in OS2Create and all window redrawing pieces later
1095 WXDWORD dwStyle
= 0;
1097 if (lStyle
& wxTRANSPARENT_WINDOW
)
1098 dwStyle
|= wxTRANSPARENT_WINDOW
;
1100 if (!bEliminateBorders
)
1102 if (lStyle
& wxSUNKEN_BORDER
)
1103 dwStyle
|= wxSUNKEN_BORDER
;
1104 if (lStyle
& wxDOUBLE_BORDER
)
1105 dwStyle
|= wxDOUBLE_BORDER
;
1106 if (lStyle
& wxRAISED_BORDER
)
1107 dwStyle
|= wxRAISED_BORDER
;
1108 if (lStyle
& wxSTATIC_BORDER
)
1109 dwStyle
|= wxSTATIC_BORDER
;
1112 } // end of wxWindowOS2::MakeExtendedStyle
1115 // Setup background and foreground colours correctly
1117 void wxWindowOS2::SetupColours()
1120 SetBackgroundColour(GetParent()->GetBackgroundColour());
1121 } // end of wxWindowOS2::SetupColours
1123 void wxWindowOS2::OnIdle(
1124 wxIdleEvent
& WXUNUSED(rEvent
)
1128 // Check if we need to send a LEAVE event
1130 if (m_bMouseInWindow
)
1134 ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
);
1135 if (::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, FALSE
) != (HWND
)GetHwnd())
1138 // Generate a LEAVE event
1140 m_bMouseInWindow
= FALSE
;
1143 // Unfortunately the mouse button and keyboard state may have changed
1144 // by the time the OnIdle function is called, so 'state' may be
1154 wxMouseEvent
rEvent(wxEVT_LEAVE_WINDOW
);
1156 InitMouseEvent( rEvent
1161 (void)GetEventHandler()->ProcessEvent(rEvent
);
1164 if (wxUpdateUIEvent::CanUpdate(this))
1165 UpdateWindowUI(wxUPDATE_UI_FROMIDLE
);
1166 } // end of wxWindowOS2::OnIdle
1169 // Set this window to be the child of 'parent'.
1171 bool wxWindowOS2::Reparent(
1175 if (!wxWindowBase::Reparent(pParent
))
1178 HWND hWndChild
= GetHwnd();
1179 HWND hWndParent
= GetParent() ? GetWinHwnd(GetParent()) : (HWND
)0;
1181 ::WinSetParent(hWndChild
, hWndParent
, TRUE
);
1183 } // end of wxWindowOS2::Reparent
1185 void wxWindowOS2::Update()
1187 ::WinUpdateWindow(GetHwnd());
1188 } // end of wxWindowOS2::Update
1190 void wxWindowOS2::Freeze()
1192 ::WinSendMsg(GetHwnd(), WM_VRNDISABLED
, (MPARAM
)0, (MPARAM
)0);
1193 } // end of wxWindowOS2::Freeze
1195 void wxWindowOS2::Thaw()
1197 ::WinSendMsg(GetHwnd(), WM_VRNENABLED
, (MPARAM
)TRUE
, (MPARAM
)0);
1200 // We need to refresh everything or otherwise he invalidated area is not
1204 } // end of wxWindowOS2::Thaw
1206 void wxWindowOS2::Refresh(
1208 , const wxRect
* pRect
1211 HWND hWnd
= GetHwnd();
1220 ::WinQueryWindowRect(GetHwnd(), &vOs2Rect
);
1221 height
= vOs2Rect
.yTop
;
1222 vOs2Rect
.xLeft
= pRect
->x
;
1223 vOs2Rect
.yTop
= height
- pRect
->y
;
1224 vOs2Rect
.xRight
= pRect
->x
+ pRect
->width
;
1225 vOs2Rect
.yBottom
= vOs2Rect
.yTop
- pRect
->height
;
1227 ::WinInvalidateRect(hWnd
, &vOs2Rect
, bEraseBack
);
1230 ::WinInvalidateRect(hWnd
, NULL
, bEraseBack
);
1231 if (m_hWndScrollBarHorz
!= NULLHANDLE
)
1232 ::WinInvalidateRect(m_hWndScrollBarHorz
, NULL
, TRUE
);
1233 if (m_hWndScrollBarVert
!= NULLHANDLE
)
1234 ::WinInvalidateRect(m_hWndScrollBarVert
, NULL
, TRUE
);
1236 } // end of wxWindowOS2::Refresh
1238 // ---------------------------------------------------------------------------
1240 // ---------------------------------------------------------------------------
1242 #if wxUSE_DRAG_AND_DROP
1243 void wxWindowOS2::SetDropTarget(
1244 wxDropTarget
* pDropTarget
1247 m_dropTarget
= pDropTarget
;
1248 } // end of wxWindowOS2::SetDropTarget
1252 // old style file-manager drag&drop support: we retain the old-style
1253 // DragAcceptFiles in parallel with SetDropTarget.
1255 void wxWindowOS2::DragAcceptFiles(
1259 HWND hWnd
= GetHwnd();
1261 if (hWnd
&& bAccept
)
1262 ::DrgAcceptDroppedFiles(hWnd
, NULL
, NULL
, DO_COPY
, 0L);
1263 } // end of wxWindowOS2::DragAcceptFiles
1265 // ----------------------------------------------------------------------------
1267 // ----------------------------------------------------------------------------
1271 void wxWindowOS2::DoSetToolTip(
1275 wxWindowBase::DoSetToolTip(pTooltip
);
1278 m_tooltip
->SetWindow(this);
1279 } // end of wxWindowOS2::DoSetToolTip
1281 #endif // wxUSE_TOOLTIPS
1283 // ---------------------------------------------------------------------------
1284 // moving and resizing
1285 // ---------------------------------------------------------------------------
1288 void wxWindowOS2::DoGetSize(
1296 if (IsKindOf(CLASSINFO(wxFrame
)))
1298 wxFrame
* pFrame
= wxDynamicCast(this, wxFrame
);
1299 hWnd
= pFrame
->GetFrame();
1304 ::WinQueryWindowRect(hWnd
, &vRect
);
1307 *pWidth
= vRect
.xRight
- vRect
.xLeft
;
1309 // OS/2 PM is backwards from windows
1310 *pHeight
= vRect
.yTop
- vRect
.yBottom
;
1311 } // end of wxWindowOS2::DoGetSize
1313 void wxWindowOS2::DoGetPosition(
1318 HWND hWnd
= GetHwnd();
1321 wxWindow
* pParent
= GetParent();
1324 // It would seem that WinQueryWindowRect would be the correlary to
1325 // the WIN32 WinGetRect, but unlike WinGetRect which returns the window
1326 // origin position in screen coordinates, WinQueryWindowRect returns it
1327 // relative to itself, i.e. (0,0). To get the same under PM we must
1328 // us WinQueryWindowPos. This call, unlike the WIN32 call, however,
1329 // returns a position relative to it's parent, so no parent adujstments
1330 // are needed under OS/2. Also, windows should be created using
1331 // wxWindow coordinates, i.e 0,0 is the TOP left so vSwp will already
1334 ::WinQueryWindowPos(hWnd
, &vSwp
);
1340 // We may be faking the client origin. So a window that's really at (0,
1341 // 30) may appear (to wxWin apps) to be at (0, 0).
1345 wxPoint
vPt(pParent
->GetClientAreaOrigin());
1355 } // end of wxWindowOS2::DoGetPosition
1357 void wxWindowOS2::DoScreenToClient(
1362 HWND hWnd
= GetHwnd();
1365 ::WinQueryWindowPos(hWnd
, &vSwp
);
1371 } // end of wxWindowOS2::DoScreenToClient
1373 void wxWindowOS2::DoClientToScreen(
1378 HWND hWnd
= GetHwnd();
1381 ::WinQueryWindowPos(hWnd
, &vSwp
);
1387 } // end of wxWindowOS2::DoClientToScreen
1390 // Get size *available for subwindows* i.e. excluding menu bar etc.
1391 // Must be a frame type window
1393 void wxWindowOS2::DoGetClientSize(
1398 HWND hWnd
= GetHwnd();
1401 ::WinQueryWindowRect(hWnd
, &vRect
);
1402 if (IsKindOf(CLASSINFO(wxDialog
)))
1407 // For a Dialog we have to explicitly request the client portion.
1408 // For a Frame the hWnd IS the client window
1410 hWndTitle
= ::WinWindowFromID(hWnd
, FID_TITLEBAR
);
1411 if (::WinQueryWindowRect(hWndTitle
, &vTitle
))
1413 if (vTitle
.yTop
- vTitle
.yBottom
== 0)
1416 // Dialog has not been created yet, use a default
1420 vRect
.yTop
-= (vTitle
.yTop
- vTitle
.yBottom
);
1423 ULONG uStyle
= ::WinQueryWindowULong(hWnd
, QWL_STYLE
);
1426 // Deal with borders
1428 if (uStyle
& FCF_DLGBORDER
)
1435 else if (uStyle
& FCF_SIZEBORDER
)
1442 else if (uStyle
& FCF_BORDER
)
1449 else // make some kind of adjustment or top sizers ram into the titlebar!
1458 *pWidth
= vRect
.xRight
- vRect
.xLeft
;
1460 *pHeight
= vRect
.yTop
- vRect
.yBottom
;
1461 } // end of wxWindowOS2::DoGetClientSize
1463 void wxWindowOS2::DoMoveWindow(
1471 wxWindow
* pParent
= GetParent();
1473 /* Due to OS/2's inverted coordinate system, changing the height
1474 of a window requires repositioning all it's children, e.g. if
1475 you want a child of height 100 to be at the top left corner of
1476 the parent you need to position the lower left corner of the
1477 child at (0, (height of parent - 100)), so, obviously, if the
1478 height of the parent changes, the child needs to be repositioned. */
1480 GetSize(0, &nHeightDelta
);
1481 nHeightDelta
= nHeight
- nHeightDelta
;
1483 if (pParent
&& !IsKindOf(CLASSINFO(wxDialog
)))
1485 int nOS2Height
= GetOS2ParentHeight(pParent
);
1487 nY
= nOS2Height
- (nY
+ nHeight
);
1493 ::WinQueryWindowRect(HWND_DESKTOP
, &vRect
);
1494 nY
= vRect
.yTop
- (nY
+ nHeight
);
1498 // In the case of a frame whose client is sized, the client cannot be
1499 // large than its parent frame minus its borders! This usually happens
1500 // when using an autosizer to size a frame to precisely hold client
1501 // controls as in the notebook sample.
1503 // In this case, we may need to resize both a frame and its client so we
1504 // need a quick calc of the frame border size, then if the frame
1505 // (less its borders) is smaller than the client, size the frame to
1506 // encompass the client with the appropriate border size.
1508 if (IsKindOf(CLASSINFO(wxFrame
)))
1512 int nWidthFrameDelta
= 0;
1513 int nHeightFrameDelta
= 0;
1514 int nHeightFrame
= 0;
1515 int nWidthFrame
= 0;
1518 pFrame
= wxDynamicCast(this, wxFrame
);
1519 hWndFrame
= pFrame
->GetFrame();
1520 ::WinQueryWindowRect(hWndFrame
, &vRect
);
1521 ::WinMapWindowPoints(hWndFrame
, HWND_DESKTOP
, (PPOINTL
)&vRect
, 2);
1523 ::WinCalcFrameRect(hWndFrame
, &vRect
, TRUE
);
1524 nWidthFrameDelta
= ((vRect
.xLeft
- vFRect
.xLeft
) + (vFRect
.xRight
- vRect
.xRight
));
1525 nHeightFrameDelta
= ((vRect
.yBottom
- vFRect
.yBottom
) + (vFRect
.yTop
- vRect
.yTop
));
1526 nWidthFrame
= vFRect
.xRight
- vFRect
.xLeft
;
1527 nHeightFrame
= vFRect
.yTop
- vFRect
.yBottom
;
1529 if (nWidth
== vFRect
.xRight
- vFRect
.xLeft
&&
1530 nHeight
== vFRect
.yTop
- vFRect
.yBottom
)
1533 // In this case the caller is not aware of OS/2's need to size both
1534 // the frame and it's client and is really only moving the window,
1535 // not resizeing it. So move the frame, and back off the sizes
1536 // for a proper client fit.
1538 ::WinSetWindowPos( hWndFrame
1540 ,(LONG
)nX
- (vRect
.xLeft
- vFRect
.xLeft
)
1541 ,(LONG
)nY
- (vRect
.yBottom
- vFRect
.yBottom
)
1546 nX
+= (vRect
.xLeft
- vFRect
.xLeft
);
1547 nY
+= (vRect
.yBottom
- vFRect
.yBottom
);
1548 nWidth
-= nWidthFrameDelta
;
1549 nHeight
-= nHeightFrameDelta
;
1553 if (nWidth
> nWidthFrame
- nHeightFrameDelta
||
1554 nHeight
> nHeightFrame
- nHeightFrameDelta
)
1556 ::WinSetWindowPos( hWndFrame
1558 ,(LONG
)nX
- (vRect
.xLeft
- vFRect
.xLeft
)
1559 ,(LONG
)nY
- (vRect
.yBottom
- vFRect
.yBottom
)
1560 ,(LONG
)nWidth
+ nWidthFrameDelta
1561 ,(LONG
)nHeight
+ nHeightFrameDelta
1562 ,SWP_MOVE
| SWP_SIZE
1568 ::WinSetWindowPos( GetHwnd()
1574 ,SWP_SIZE
| SWP_MOVE
1576 if (m_vWinSwp
.cx
== 0 && m_vWinSwp
.cy
== 0 && m_vWinSwp
.fl
== 0)
1580 ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp
);
1583 int nYDiff
= m_vWinSwp
.cy
- nHeight
;
1586 // Handle resizing of scrolled windows. The target or window to
1587 // be scrolled is the owner (gets the scroll notificaitons). The
1588 // parent is usually the parent frame of the scrolled panel window.
1589 // In order to show the scrollbars the target window will be shrunk
1590 // by the size of the scroll bar widths (20) and moved in the X and Y
1591 // directon. That value will be computed as part of the diff for
1592 // moving the children. Everytime the window is sized the
1593 // toplevel OnSize is going to resize the panel to fit the client
1594 // or the whole sizer and will need to me resized. This will send
1595 // a WM_SIZE out which will be intercepted by the ScrollHelper
1596 // which will cause the scrollbars to be displayed via the SetScrollbar
1599 if ( IsKindOf(CLASSINFO(wxGenericScrolledWindow
)) ||
1600 IsKindOf(CLASSINFO(wxScrolledWindow
))
1603 int nAdjustWidth
= 0;
1604 int nAdjustHeight
= 0;
1607 if (GetScrollBarHorz() == NULLHANDLE
||
1608 !WinIsWindowShowing(GetScrollBarHorz()))
1611 nAdjustHeight
= 20L;
1612 if (GetScrollBarVert() == NULLHANDLE
||
1613 !WinIsWindowShowing(GetScrollBarVert()))
1617 ::WinQueryWindowPos(GetHWND(), &vSwpScroll
);
1618 ::WinSetWindowPos( GetHWND()
1621 ,vSwpScroll
.y
+ nAdjustHeight
1622 ,vSwpScroll
.cx
- nAdjustWidth
1623 ,vSwpScroll
.cy
- nAdjustHeight
1624 ,SWP_MOVE
| SWP_SIZE
1626 nYDiff
-= nAdjustHeight
;
1628 MoveChildren(nYDiff
);
1629 ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp
);
1632 // FIXME: By my logic, the next line should be needed as it moves child
1633 // windows when resizing the parent (see comment at beginning of
1634 // function). However, this seems to cause lots of problems. At
1635 // least, e.g. the grid sample almost works with this line
1636 // commented out but crashes badly with it.
1637 MoveChildren(nHeightDelta
);
1639 } // end of wxWindowOS2::DoMoveWindow
1642 // Set the size of the window: if the dimensions are positive, just use them,
1643 // but if any of them is equal to -1, it means that we must find the value for
1644 // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in
1645 // which case -1 is a valid value for x and y)
1647 // If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate
1648 // the width/height to best suit our contents, otherwise we reuse the current
1651 void wxWindowOS2::DoSetSize(
1660 // Get the current size and position...
1666 wxSize
vSize(-1, -1);
1668 GetPosition(&nCurrentX
, &nCurrentY
);
1669 GetSize(&nCurrentWidth
, &nCurrentHeight
);
1672 // ... and don't do anything (avoiding flicker) if it's already ok
1675 // Must convert Y coords to test for equality under OS/2
1679 if (nX
== nCurrentX
&& nY2
== nCurrentY
&&
1680 nWidth
== nCurrentWidth
&& nHeight
== nCurrentHeight
)
1685 if (nX
== -1 && !(nSizeFlags
& wxSIZE_ALLOW_MINUS_ONE
))
1687 if (nY
== -1 && !(nSizeFlags
& wxSIZE_ALLOW_MINUS_ONE
))
1690 AdjustForParentClientOrigin(nX
, nY
, nSizeFlags
);
1694 if (nSizeFlags
& wxSIZE_AUTO_WIDTH
)
1696 vSize
= DoGetBestSize();
1702 // Just take the current one
1704 nWidth
= nCurrentWidth
;
1710 if (nSizeFlags
& wxSIZE_AUTO_HEIGHT
)
1714 vSize
= DoGetBestSize();
1720 // just take the current one
1721 nHeight
= nCurrentHeight
;
1730 } // end of wxWindowOS2::DoSetSize
1732 void wxWindowOS2::DoSetClientSize( int nWidth
,
1738 wxWindow
* pParent
= (wxWindow
*)GetParent();
1739 HWND hParentWnd
= (HWND
)0;
1742 hParentWnd
= (HWND
)pParent
->GetHWND();
1744 if (IsKindOf(CLASSINFO(wxFrame
)))
1746 wxFrame
* pFrame
= wxDynamicCast(this, wxFrame
);
1747 HWND hFrame
= pFrame
->GetFrame();
1752 ::WinQueryWindowRect(GetHwnd(), &vRect2
);
1753 ::WinQueryWindowRect(hFrame
, &vRect
);
1754 ::WinQueryWindowRect(hParentWnd
, &vRect3
);
1755 nActualWidth
= vRect2
.xRight
- vRect2
.xLeft
- vRect
.xRight
+ nWidth
;
1756 nActualHeight
= vRect2
.yTop
- vRect2
.yBottom
- vRect
.yTop
+ nHeight
;
1758 vPoint
.x
= vRect2
.xLeft
;
1759 vPoint
.y
= vRect2
.yBottom
;
1762 vPoint
.x
-= vRect3
.xLeft
;
1763 vPoint
.y
-= vRect3
.yBottom
;
1771 GetPosition(&nX
, &nY
);
1772 nActualWidth
= nWidth
;
1773 nActualHeight
= nHeight
;
1778 DoMoveWindow( vPoint
.x
, vPoint
.y
, nActualWidth
, nActualHeight
);
1780 wxSize
size( nWidth
, nHeight
);
1781 wxSizeEvent
vEvent( size
, m_windowId
);
1782 vEvent
.SetEventObject(this);
1783 GetEventHandler()->ProcessEvent(vEvent
);
1784 } // end of wxWindowOS2::DoSetClientSize
1786 // ---------------------------------------------------------------------------
1788 // ---------------------------------------------------------------------------
1790 int wxWindowOS2::GetCharHeight() const
1793 FONTMETRICS vFontMetrics
;
1795 hPs
= ::WinGetPS(GetHwnd());
1797 if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
))
1799 ::WinReleasePS(hPs
);
1802 ::WinReleasePS(hPs
);
1803 return(vFontMetrics
.lMaxAscender
+ vFontMetrics
.lMaxDescender
);
1804 } // end of wxWindowOS2::GetCharHeight
1806 int wxWindowOS2::GetCharWidth() const
1809 FONTMETRICS vFontMetrics
;
1811 hPs
= ::WinGetPS(GetHwnd());
1813 if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
))
1815 ::WinReleasePS(hPs
);
1818 ::WinReleasePS(hPs
);
1819 return(vFontMetrics
.lAveCharWidth
);
1820 } // end of wxWindowOS2::GetCharWidth
1822 void wxWindowOS2::GetTextExtent( const wxString
& rString
,
1826 int* pExternalLeading
,
1827 const wxFont
* WXUNUSED(pTheFont
) ) const
1829 POINTL avPoint
[TXTBOX_COUNT
];
1834 FONTMETRICS vFM
; // metrics structure
1839 hPS
= ::WinGetPS(GetHwnd());
1841 l
= rString
.Length();
1844 pStr
= (PCH
)rString
.c_str();
1847 // In world coordinates.
1849 bRc
= ::GpiQueryTextBox( hPS
1852 ,TXTBOX_COUNT
// return maximum information
1853 ,avPoint
// array of coordinates points
1857 vPtMin
.x
= avPoint
[0].x
;
1858 vPtMax
.x
= avPoint
[0].x
;
1859 vPtMin
.y
= avPoint
[0].y
;
1860 vPtMax
.y
= avPoint
[0].y
;
1861 for (i
= 1; i
< 4; i
++)
1863 if(vPtMin
.x
> avPoint
[i
].x
) vPtMin
.x
= avPoint
[i
].x
;
1864 if(vPtMin
.y
> avPoint
[i
].y
) vPtMin
.y
= avPoint
[i
].y
;
1865 if(vPtMax
.x
< avPoint
[i
].x
) vPtMax
.x
= avPoint
[i
].x
;
1866 if(vPtMax
.y
< avPoint
[i
].y
) vPtMax
.y
= avPoint
[i
].y
;
1868 bRc
= ::GpiQueryFontMetrics( hPS
1869 ,sizeof(FONTMETRICS
)
1896 *pX
= (vPtMax
.x
- vPtMin
.x
+ 1);
1898 *pY
= (vPtMax
.y
- vPtMin
.y
+ 1);
1902 *pDescent
= vFM
.lMaxDescender
;
1906 if (pExternalLeading
)
1909 *pExternalLeading
= vFM
.lExternalLeading
;
1911 *pExternalLeading
= 0;
1913 ::WinReleasePS(hPS
);
1914 } // end of wxWindow::GetTextExtent
1916 bool wxWindowOS2::IsMouseInWindow() const
1919 // Get the mouse position
1922 ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
);
1925 // Find the window which currently has the cursor and go up the window
1926 // chain until we find this window - or exhaust it
1928 HWND hWnd
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt
, TRUE
);
1930 while (hWnd
&& (hWnd
!= GetHwnd()))
1931 hWnd
= ::WinQueryWindow(hWnd
, QW_PARENT
);
1933 return hWnd
!= NULL
;
1934 } // end of wxWindowOS2::IsMouseInWindow
1937 // ---------------------------------------------------------------------------
1939 // ---------------------------------------------------------------------------
1941 #if wxUSE_MENUS_NATIVE
1942 bool wxWindowOS2::DoPopupMenu(
1948 HWND hWndOwner
= GetHwnd();
1949 HWND hWndParent
= GetHwnd();
1950 HWND hMenu
= GetHmenuOf(pMenu
);
1951 bool bIsWaiting
= TRUE
;
1954 // Protect against recursion
1955 if (wxCurrentPopupMenu
)
1958 pMenu
->SetInvokingWindow(this);
1961 if ( nX
== -1 && nY
== -1 )
1963 wxPoint mouse
= wxGetMousePosition();
1964 nX
= mouse
.x
; nY
= mouse
.y
;
1968 DoClientToScreen( &nX
1971 DoGetSize(0,&nHeight
);
1974 wxCurrentPopupMenu
= pMenu
;
1976 ::WinPopupMenu( hWndParent
1982 ,PU_HCONSTRAIN
| PU_VCONSTRAIN
| PU_MOUSEBUTTON1
| PU_KEYBOARD
1989 ::WinGetMsg(vHabmain
,&vMsg
, (HWND
)0, 0, 0);
1990 if (vMsg
.msg
== WM_COMMAND
)
1992 ::WinDispatchMsg(vHabmain
, (PQMSG
)&vMsg
);
1995 wxCurrentPopupMenu
= NULL
;
1996 pMenu
->SetInvokingWindow(NULL
);
1998 } // end of wxWindowOS2::DoPopupMenu
1999 #endif // wxUSE_MENUS_NATIVE
2001 // ===========================================================================
2002 // pre/post message processing
2003 // ===========================================================================
2005 MRESULT
wxWindowOS2::OS2DefWindowProc(
2012 return (MRESULT
)m_fnOldWndProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
);
2014 return ::WinDefWindowProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
);
2015 } // end of wxWindowOS2::OS2DefWindowProc
2017 bool wxWindowOS2::OS2ProcessMessage(
2021 // wxUniversal implements tab traversal itself
2022 #ifndef __WXUNIVERSAL__
2023 QMSG
* pQMsg
= (QMSG
*)pMsg
;
2025 if (m_hWnd
!= 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL
))
2028 // Intercept dialog navigation keys
2030 bool bProcess
= TRUE
;
2031 USHORT uKeyFlags
= SHORT1FROMMP(pQMsg
->mp1
);
2033 if (uKeyFlags
& KC_KEYUP
)
2036 if (uKeyFlags
& KC_ALT
)
2039 if (!(uKeyFlags
& KC_VIRTUALKEY
))
2044 bool bCtrlDown
= IsCtrlDown();
2045 bool bShiftDown
= IsShiftDown();
2048 // WM_QUERYDLGCODE: ask the control if it wants the key for itself,
2049 // don't process it if it's the case (except for Ctrl-Tab/Enter
2050 // combinations which are always processed)
2052 ULONG ulDlgCode
= 0;
2056 ulDlgCode
= (ULONG
)::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0);
2059 bool bForward
= TRUE
;
2060 bool bWindowChange
= FALSE
;
2062 switch (SHORT2FROMMP(pQMsg
->mp2
))
2065 // Going to make certain assumptions about specific types of controls
2066 // here, so we may have to alter some things later if they prove invalid
2070 // Shift tabl will always be a nav-key but tabs may be wanted
2079 // Entry Fields want tabs for themselve usually
2083 case DLGC_ENTRYFIELD
:
2093 // Ctrl-Tab cycles thru notebook pages
2095 bWindowChange
= bCtrlDown
;
2096 bForward
= !bShiftDown
;
2119 // ctrl-enter is not processed
2123 else if (ulDlgCode
& DLGC_BUTTON
)
2126 // buttons want process Enter themselevs
2132 wxButton
* pBtn
= wxDynamicCast( GetDefaultItem()
2136 if (pBtn
&& pBtn
->IsEnabled())
2139 // If we do have a default button, do press it
2141 pBtn
->OS2Command(BN_CLICKED
, 0 /* unused */);
2144 else if (!IsTopLevel())
2147 // if not a top level window, let parent
2152 // else: but if it does not it makes sense to make
2153 // it work like a TAB - and that's what we do.
2154 // Note that Ctrl-Enter always works this way.
2165 wxNavigationKeyEvent vEvent
;
2167 vEvent
.SetDirection(bForward
);
2168 vEvent
.SetWindowChange(bWindowChange
);
2169 vEvent
.SetEventObject(this);
2171 if (GetEventHandler()->ProcessEvent(vEvent
))
2173 wxButton
* pBtn
= wxDynamicCast(FindFocus(), wxButton
);
2178 // The button which has focus should be default
2187 // Let Dialogs process
2189 if (::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0));
2193 pMsg
= pMsg
; // just shut up the compiler
2194 #endif // __WXUNIVERSAL__
2197 } // end of wxWindowOS2::OS2ProcessMessage
2199 bool wxWindowOS2::OS2TranslateMessage(
2203 #if wxUSE_ACCEL && !defined(__WXUNIVERSAL__)
2204 return m_acceleratorTable
.Translate(m_hWnd
, pMsg
);
2208 #endif //wxUSE_ACCEL
2209 } // end of wxWindowOS2::OS2TranslateMessage
2211 bool wxWindowOS2::OS2ShouldPreProcessMessage( WXMSG
* WXUNUSED(pMsg
) )
2213 // preprocess all messages by default
2215 } // end of wxWindowOS2::OS2ShouldPreProcessMessage
2217 // ---------------------------------------------------------------------------
2218 // message params unpackers
2219 // ---------------------------------------------------------------------------
2221 void wxWindowOS2::UnpackCommand(
2229 *pId
= LOWORD(wParam
);
2230 *phWnd
= NULL
; // or may be GetHWND() ?
2231 *pCmd
= LOWORD(lParam
);
2232 } // end of wxWindowOS2::UnpackCommand
2234 void wxWindowOS2::UnpackActivate(
2241 *pState
= LOWORD(wParam
);
2242 *phWnd
= (WXHWND
)lParam
;
2243 } // end of wxWindowOS2::UnpackActivate
2245 void wxWindowOS2::UnpackScroll(
2256 ulId
= (ULONG
)LONGFROMMP(wParam
);
2257 hWnd
= ::WinWindowFromID(GetHwnd(), ulId
);
2258 if (hWnd
== m_hWndScrollBarHorz
|| hWnd
== m_hWndScrollBarVert
)
2259 *phWnd
= NULLHANDLE
;
2263 *pPos
= SHORT1FROMMP(lParam
);
2264 *pCode
= SHORT2FROMMP(lParam
);
2265 } // end of wxWindowOS2::UnpackScroll
2267 void wxWindowOS2::UnpackMenuSelect(
2275 *pItem
= (WXWORD
)LOWORD(wParam
);
2276 *pFlags
= HIWORD(wParam
);
2277 *phMenu
= (WXHMENU
)lParam
;
2278 } // end of wxWindowOS2::UnpackMenuSelect
2280 // ---------------------------------------------------------------------------
2281 // Main wxWidgets window proc and the window proc for wxWindow
2282 // ---------------------------------------------------------------------------
2285 // Hook for new window just as it's being created, when the window isn't yet
2286 // associated with the handle
2288 wxWindowOS2
* wxWndHook
= NULL
;
2293 MRESULT EXPENTRY
wxWndProc(
2300 wxWindowOS2
* pWnd
= wxFindWinFromHandle((WXHWND
)hWnd
);
2303 // When we get the first message for the HWND we just created, we associate
2304 // it with wxWindow stored in wxWndHook
2306 if (!pWnd
&& wxWndHook
)
2308 wxAssociateWinWithHandle(hWnd
, wxWndHook
);
2311 pWnd
->SetHWND((WXHWND
)hWnd
);
2314 MRESULT rc
= (MRESULT
)0;
2318 // Stop right here if we don't have a valid handle in our wxWindow object.
2320 if (pWnd
&& !pWnd
->GetHWND())
2322 pWnd
->SetHWND((WXHWND
) hWnd
);
2323 rc
= pWnd
->OS2DefWindowProc(ulMsg
, wParam
, lParam
);
2330 rc
= pWnd
->OS2WindowProc(ulMsg
, wParam
, lParam
);
2331 if ( (pWnd
->GetScrollBarHorz() != NULLHANDLE
||
2332 pWnd
->GetScrollBarVert() != NULLHANDLE
) &&
2335 if (pWnd
->GetScrollBarHorz() != NULLHANDLE
)
2336 ::WinInvalidateRect(pWnd
->GetScrollBarHorz(), NULL
, TRUE
);
2337 if (pWnd
->GetScrollBarVert() != NULLHANDLE
)
2338 ::WinInvalidateRect(pWnd
->GetScrollBarVert(), NULL
, TRUE
);
2342 rc
= ::WinDefWindowProc(hWnd
, ulMsg
, wParam
, lParam
);
2346 } // end of wxWndProc
2349 // We will add (or delete) messages we need to handle at this default
2352 MRESULT
wxWindowOS2::OS2WindowProc(
2359 // Did we process the uMsg?
2361 bool bProcessed
= FALSE
;
2365 // For most messages we should return 0 when we do process the message
2367 mResult
= (MRESULT
)0;
2375 bProcessed
= HandleCreate( (WXLPCREATESTRUCT
)lParam
2381 // Return 0 to bAllow window creation
2383 mResult
= (MRESULT
)(bMayCreate
? 0 : -1);
2394 bProcessed
= HandleMove( LOWORD(lParam
)
2400 bProcessed
= HandleSize( LOWORD(lParam
)
2406 case WM_WINDOWPOSCHANGED
:
2409 // Dialogs under OS/2 do not get WM_SIZE events at all.
2410 // Instead they get this, which can function much like WM_SIZE
2411 // PSWP contains the new sizes and positioning, PSWP+1 the old
2412 // We use this because ADJUSTWINDOWPOS comes BEFORE the new
2413 // position is added and our auto layout does a WinQueryWindowRect
2414 // to get the CURRENT client size. That is the size used to position
2415 // child controls, so we need to already be sized
2416 // in order to get the child controls positoned properly.
2418 if (IsKindOf(CLASSINFO(wxDialog
)) || IsKindOf(CLASSINFO(wxFrame
)))
2420 PSWP pSwp
= (PSWP
)PVOIDFROMMP(wParam
);
2421 PSWP pSwp2
= pSwp
++;
2423 if (!(pSwp
->cx
== pSwp2
->cx
&&
2424 pSwp
->cy
== pSwp2
->cy
))
2425 bProcessed
= HandleSize( pSwp
->cx
2429 if (IsKindOf(CLASSINFO(wxFrame
)))
2431 wxFrame
* pFrame
= wxDynamicCast(this, wxFrame
);
2435 if (pFrame
->GetStatusBar())
2436 pFrame
->PositionStatusBar();
2437 if (pFrame
->GetToolBar())
2438 pFrame
->PositionToolBar();
2449 UnpackActivate( wParam
2455 bProcessed
= HandleActivate( wState
2463 if (SHORT1FROMMP((MPARAM
)lParam
) == TRUE
)
2464 bProcessed
= HandleSetFocus((WXHWND
)(HWND
)wParam
);
2466 bProcessed
= HandleKillFocus((WXHWND
)(HWND
)wParam
);
2470 bProcessed
= HandlePaint();
2475 // Don't let the DefWindowProc() destroy our window - we'll do it
2476 // ourselves in ~wxWindow
2479 mResult
= (MRESULT
)TRUE
;
2483 bProcessed
= HandleShow(wParam
!= 0, (int)lParam
);
2487 // Under OS2 PM Joysticks are treated just like mouse events
2488 // The "Motion" events will be prevelent in joysticks
2491 case WM_BUTTON1DOWN
:
2493 case WM_BUTTON1DBLCLK
:
2494 case WM_BUTTON1MOTIONEND
:
2495 case WM_BUTTON1MOTIONSTART
:
2496 case WM_BUTTON2DOWN
:
2498 case WM_BUTTON2DBLCLK
:
2499 case WM_BUTTON2MOTIONEND
:
2500 case WM_BUTTON2MOTIONSTART
:
2501 case WM_BUTTON3DOWN
:
2503 case WM_BUTTON3DBLCLK
:
2504 case WM_BUTTON3MOTIONEND
:
2505 case WM_BUTTON3MOTIONSTART
:
2507 if (uMsg
== WM_BUTTON1DOWN
&& AcceptsFocus())
2510 short nX
= LOWORD(wParam
);
2511 short nY
= HIWORD(wParam
);
2514 // Redirect the event to a static control if necessary
2516 if (this == GetCapture())
2518 bProcessed
= HandleMouseEvent( uMsg
2521 ,(WXUINT
)SHORT2FROMMP(lParam
)
2526 wxWindow
* pWin
= FindWindowForMouseEvent( this
2530 if (!pWin
->IsOfStandardClass())
2532 if (uMsg
== WM_BUTTON1DOWN
&& pWin
->AcceptsFocus() )
2535 bProcessed
= pWin
->HandleMouseEvent( uMsg
2538 ,(WXUINT
)SHORT2FROMMP(lParam
)
2545 bProcessed
= HandleSysCommand(wParam
, lParam
);
2552 UnpackCommand(wParam
, lParam
, &id
, &hwnd
, &cmd
);
2554 bProcessed
= HandleCommand(id
, cmd
, hwnd
);
2559 // For these messages we must return TRUE if process the message
2562 case WM_MEASUREITEM
:
2564 int nIdCtrl
= (UINT
)wParam
;
2566 if ( uMsg
== WM_DRAWITEM
)
2568 bProcessed
= OS2OnDrawItem(nIdCtrl
,
2569 (WXDRAWITEMSTRUCT
*)lParam
);
2573 return MRFROMLONG(OS2OnMeasureItem( nIdCtrl
2574 ,(WXMEASUREITEMSTRUCT
*)lParam
2579 mResult
= (MRESULT
)TRUE
;
2583 case WM_QUERYDLGCODE
:
2584 if (!IsOfStandardClass())
2588 mResult
= (MRESULT
)m_lDlgCode
;
2593 //else: get the dlg code from the DefWindowProc()
2598 // In OS/2 PM all keyboard events are of the WM_CHAR type. Virtual key and key-up
2599 // and key-down events are obtained from the WM_CHAR params.
2603 USHORT uKeyFlags
= SHORT1FROMMP((MPARAM
)wParam
);
2605 if (uKeyFlags
& KC_KEYUP
)
2607 //TODO: check if the cast to WXWORD isn't causing trouble
2608 bProcessed
= HandleKeyUp(wParam
, lParam
);
2611 else // keydown event
2613 m_bLastKeydownProcessed
= FALSE
;
2615 // If this has been processed by an event handler,
2616 // return 0 now (we've handled it). DON't RETURN
2617 // we still need to process further
2619 m_bLastKeydownProcessed
= HandleKeyDown(wParam
, lParam
);
2620 if (uKeyFlags
& KC_VIRTUALKEY
)
2622 USHORT uVk
= SHORT2FROMMP((MPARAM
)lParam
);
2625 // We consider these message "not interesting" to OnChar
2638 // Avoid duplicate messages to OnChar for these ASCII keys: they
2639 // will be translated by TranslateMessage() and received in WM_CHAR
2644 // But set processed to FALSE, not TRUE to still pass them to
2645 // the control's default window proc - otherwise built-in
2646 // keyboard handling won't work
2651 bProcessed
= HandleChar(wParam
, lParam
);
2655 else // WM_CHAR -- Always an ASCII character
2657 if (m_bLastKeydownProcessed
)
2660 // The key was handled in the EVT_KEY_DOWN and handling
2661 // a key in an EVT_KEY_DOWN handler is meant, by
2662 // design, to prevent EVT_CHARs from happening
2664 m_bLastKeydownProcessed
= FALSE
;
2667 else // do generate a CHAR event
2669 bProcessed
= HandleChar(wParam
, lParam
, TRUE
);
2682 UnpackScroll( wParam
2689 bProcessed
= OS2OnScroll( uMsg
== WM_HSCROLL
? wxHORIZONTAL
2699 switch(SHORT2FROMMP(wParam
))
2703 HWND hWnd
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
));
2704 wxWindowOS2
* pWin
= wxFindWinFromHandle(hWnd
);
2711 if (pWin
->IsKindOf(CLASSINFO(wxBitmapButton
)))
2713 wxBitmapButton
* pBitmapButton
= wxDynamicCast(pWin
, wxBitmapButton
);
2715 pBitmapButton
->OS2OnDraw((WXDRAWITEMSTRUCT
*)lParam
);
2721 case BKN_PAGESELECTEDPENDING
:
2723 PPAGESELECTNOTIFY pPage
= (PPAGESELECTNOTIFY
)lParam
;
2725 if ((pPage
->ulPageIdNew
!= pPage
->ulPageIdCur
) &&
2726 (pPage
->ulPageIdNew
> 0L && pPage
->ulPageIdCur
> 0L))
2728 wxWindowOS2
* pWin
= wxFindWinFromHandle(pPage
->hwndBook
);
2729 wxNotebookEvent
vEvent( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
2730 ,(int)SHORT1FROMMP(wParam
)
2731 ,(int)pPage
->ulPageIdNew
2732 ,(int)pPage
->ulPageIdCur
2739 if (pWin
->IsKindOf(CLASSINFO(wxNotebook
)))
2741 wxNotebook
* pNotebook
= wxDynamicCast(pWin
, wxNotebook
);
2743 vEvent
.SetEventObject(pWin
);
2744 pNotebook
->OnSelChange(vEvent
);
2755 case BN_CLICKED
: // Dups as LN_SELECT and CBN_LBSELECT
2757 HWND hWnd
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
));
2758 wxWindowOS2
* pWin
= wxFindWinFromHandle(hWnd
);
2766 // Simulate a WM_COMMAND here, as wxWidgets expects all control
2767 // button clicks to generate WM_COMMAND msgs, not WM_CONTROL
2769 if (pWin
->IsKindOf(CLASSINFO(wxRadioBox
)))
2771 wxRadioBox
* pRadioBox
= wxDynamicCast(pWin
, wxRadioBox
);
2773 pRadioBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2774 ,(WXWORD
)SHORT1FROMMP(wParam
)
2777 if (pWin
->IsKindOf(CLASSINFO(wxRadioButton
)))
2779 wxRadioButton
* pRadioButton
= wxDynamicCast(pWin
, wxRadioButton
);
2781 pRadioButton
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2782 ,(WXWORD
)SHORT1FROMMP(wParam
)
2785 if (pWin
->IsKindOf(CLASSINFO(wxCheckBox
)))
2787 wxCheckBox
* pCheckBox
= wxDynamicCast(pWin
, wxCheckBox
);
2789 pCheckBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2790 ,(WXWORD
)SHORT1FROMMP(wParam
)
2793 if (pWin
->IsKindOf(CLASSINFO(wxListBox
)))
2795 wxListBox
* pListBox
= wxDynamicCast(pWin
, wxListBox
);
2797 pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2798 ,(WXWORD
)SHORT1FROMMP(wParam
)
2800 if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
)
2803 if (pWin
->IsKindOf(CLASSINFO(wxComboBox
)))
2805 wxComboBox
* pComboBox
= wxDynamicCast(pWin
, wxComboBox
);
2807 pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2808 ,(WXWORD
)SHORT1FROMMP(wParam
)
2815 case LN_ENTER
: /* dups as CBN_EFCHANGE */
2817 HWND hWnd
= HWNDFROMMP(lParam
);
2818 wxWindowOS2
* pWin
= wxFindWinFromHandle(hWnd
);
2826 // Simulate a WM_COMMAND here, as wxWidgets expects all control
2827 // button clicks to generate WM_COMMAND msgs, not WM_CONTROL
2829 if (pWin
->IsKindOf(CLASSINFO(wxListBox
)))
2831 wxListBox
* pListBox
= wxDynamicCast(pWin
, wxListBox
);
2833 pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2834 ,(WXWORD
)SHORT1FROMMP(wParam
)
2836 if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
)
2840 if (pWin
->IsKindOf(CLASSINFO(wxComboBox
)))
2842 wxComboBox
* pComboBox
= wxDynamicCast(pWin
, wxComboBox
);
2844 pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2845 ,(WXWORD
)SHORT1FROMMP(wParam
)
2853 case SPBN_DOWNARROW
:
2859 ::WinSendMsg( HWNDFROMMP(lParam
)
2862 ,MPFROM2SHORT( (USHORT
)10
2863 ,(USHORT
)SPBQ_UPDATEIFVALID
2867 bProcessed
= OS2OnScroll( wxVERTICAL
2868 ,(WXWORD
)SHORT2FROMMP(wParam
)
2875 case SLN_SLIDERTRACK
:
2877 HWND hWnd
= ::WinWindowFromID(GetHWND(), SHORT1FROMMP(wParam
));
2878 wxWindowOS2
* pChild
= wxFindWinFromHandle(hWnd
);
2885 if (pChild
->IsKindOf(CLASSINFO(wxSlider
)))
2886 bProcessed
= OS2OnScroll( wxVERTICAL
2887 ,(WXWORD
)SHORT2FROMMP(wParam
)
2888 ,(WXWORD
)LONGFROMMP(lParam
)
2896 #if defined(__VISAGECPP__) && (__IBMCPP__ >= 400)
2897 case WM_CTLCOLORCHANGE
:
2899 bProcessed
= HandleCtlColor(&hBrush
);
2903 case WM_ERASEBACKGROUND
:
2905 // Returning TRUE to requestw PM to paint the window background
2906 // in SYSCLR_WINDOW. We don't really want that
2908 bProcessed
= HandleEraseBkgnd((WXHDC
)(HPS
)wParam
);
2909 mResult
= (MRESULT
)(FALSE
);
2912 // the return value for this message is ignored
2913 case WM_SYSCOLORCHANGE
:
2914 bProcessed
= HandleSysColorChange();
2917 case WM_REALIZEPALETTE
:
2918 bProcessed
= HandlePaletteChanged();
2921 // move all drag and drops to wxDrg
2923 bProcessed
= HandleEndDrag(wParam
);
2927 bProcessed
= HandleInitDialog((WXHWND
)(HWND
)wParam
);
2931 // we never set focus from here
2932 mResult
= (MRESULT
)FALSE
;
2936 // wxFrame specific message
2937 case WM_MINMAXFRAME
:
2938 bProcessed
= HandleGetMinMaxInfo((PSWP
)wParam
);
2941 case WM_SYSVALUECHANGED
:
2942 // TODO: do something
2943 mResult
= (MRESULT
)TRUE
;
2947 // Comparable to WM_SETPOINTER for windows, only for just controls
2949 case WM_CONTROLPOINTER
:
2950 bProcessed
= HandleSetCursor( SHORT1FROMMP(wParam
) // Control ID
2951 ,(HWND
)lParam
// Cursor Handle
2956 // Returning TRUE stops the DefWindowProc() from further
2957 // processing this message - exactly what we need because we've
2958 // just set the cursor.
2960 mResult
= (MRESULT
)TRUE
;
2964 #if wxUSE_MENUS_NATIVE
2966 if (wxCurrentPopupMenu
)
2968 if (GetHmenuOf(wxCurrentPopupMenu
) == (HWND
)lParam
)
2970 // Break out of msg loop in DoPopupMenu
2971 ::WinPostMsg((HWND
)lParam
,WM_COMMAND
,wParam
,0);
2975 #endif // wxUSE_MENUS_NATIVE
2981 wxLogTrace(wxTraceMessages
, wxT("Forwarding %s to DefWindowProc."),
2982 wxGetMessageName(uMsg
));
2983 #endif // __WXDEBUG__
2984 if (IsKindOf(CLASSINFO(wxFrame
)))
2985 mResult
= ::WinDefWindowProc(m_hWnd
, uMsg
, wParam
, lParam
);
2986 else if (IsKindOf(CLASSINFO(wxDialog
)))
2987 mResult
= ::WinDefDlgProc( m_hWnd
, uMsg
, wParam
, lParam
);
2989 mResult
= OS2DefWindowProc(uMsg
, wParam
, lParam
);
2992 } // end of wxWindowOS2::OS2WindowProc
2994 // ----------------------------------------------------------------------------
2995 // wxWindow <-> HWND map
2996 // ----------------------------------------------------------------------------
2998 wxWinHashTable
*wxWinHandleHash
= NULL
;
3000 wxWindow
* wxFindWinFromHandle(
3004 return (wxWindow
*)wxWinHandleHash
->Get((long)hWnd
);
3005 } // end of wxFindWinFromHandle
3007 void wxAssociateWinWithHandle(
3013 // Adding NULL hWnd is (first) surely a result of an error and
3014 // (secondly) breaks menu command processing
3016 wxCHECK_RET( hWnd
!= (HWND
)NULL
,
3017 wxT("attempt to add a NULL hWnd to window list ignored") );
3020 wxWindow
* pOldWin
= wxFindWinFromHandle((WXHWND
) hWnd
);
3022 if (pOldWin
&& (pOldWin
!= pWin
))
3024 wxString
str(pWin
->GetClassInfo()->GetClassName());
3026 wxLogError( _T("Bug! Found existing HWND %X for new window of class %s")
3033 wxWinHandleHash
->Put( (long)hWnd
3037 } // end of wxAssociateWinWithHandle
3039 void wxRemoveHandleAssociation(
3043 wxWinHandleHash
->Delete((long)pWin
->GetHWND());
3044 } // end of wxRemoveHandleAssociation
3047 // Default destroyer - override if you destroy it in some other way
3048 // (e.g. with MDI child windows)
3050 void wxWindowOS2::OS2DestroyWindow()
3054 bool wxWindowOS2::OS2GetCreateWindowCoords(
3056 , const wxSize
& rSize
3063 bool bNonDefault
= FALSE
;
3064 static const int DEFAULT_Y
= 200;
3065 static const int DEFAULT_H
= 250;
3069 rnX
= rnY
= CW_USEDEFAULT
;
3074 rnY
= rPos
.y
== -1 ? DEFAULT_Y
: rPos
.y
;
3079 rnWidth
= rnHeight
= CW_USEDEFAULT
;
3084 rnHeight
= rSize
.y
== -1 ? DEFAULT_H
: rSize
.y
;
3088 } // end of wxWindowOS2::OS2GetCreateWindowCoords
3090 WXHWND
wxWindowOS2::OS2GetParent() const
3092 return m_parent
? m_parent
->GetHWND() : NULL
;
3095 bool wxWindowOS2::OS2Create( PSZ zClass
,
3096 const wxChar
* zTitle
,
3098 const wxPoint
& rPos
,
3099 const wxSize
& rSize
,
3101 WXDWORD
WXUNUSED(dwExStyle
),
3110 long lControlId
= 0L;
3111 wxWindowCreationHook
vHook(this);
3112 wxString
sClassName((wxChar
*)zClass
);
3114 OS2GetCreateWindowCoords( rPos
3124 lControlId
= GetId();
3125 if (GetWindowStyleFlag() & wxCLIP_SIBLINGS
)
3127 dwStyle
|= WS_CLIPSIBLINGS
;
3131 // For each class "Foo" we have we also have "FooNR" ("no repaint") class
3132 // which is the same but without CS_[HV]REDRAW class styles so using it
3133 // ensures that the window is not fully repainted on each resize
3135 if (!HasFlag(wxFULL_REPAINT_ON_RESIZE
))
3137 sClassName
+= wxT("NR");
3139 m_hWnd
= (WXHWND
)::WinCreateWindow( (HWND
)OS2GetParent()
3140 ,(PSZ
)sClassName
.c_str()
3141 ,(PSZ
)(zTitle
? zTitle
: wxEmptyString
)
3155 vError
= ::WinGetLastError(wxGetInstance());
3156 sError
= wxPMErrorToStr(vError
);
3159 SubclassWin(m_hWnd
);
3160 SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
));
3162 m_backgroundColour
.Set(wxString(wxT("GREY")));
3164 LONG lColor
= (LONG
)m_backgroundColour
.GetPixel();
3166 if (!::WinSetPresParam( m_hWnd
3172 vError
= ::WinGetLastError(vHabmain
);
3173 sError
= wxPMErrorToStr(vError
);
3174 wxLogError(_T("Error creating frame. Error: %s\n"), sError
.c_str());
3183 } // end of WinGuiBase_Window::OS2Create
3185 // ===========================================================================
3186 // OS2 PM message handlers
3187 // ===========================================================================
3189 // ---------------------------------------------------------------------------
3190 // window creation/destruction
3191 // ---------------------------------------------------------------------------
3193 bool wxWindowOS2::HandleCreate(
3194 WXLPCREATESTRUCT
WXUNUSED(vCs
)
3198 wxWindowCreateEvent
vEvent((wxWindow
*)this);
3200 (void)GetEventHandler()->ProcessEvent(vEvent
);
3201 *pbMayCreate
= TRUE
;
3203 } // end of wxWindowOS2::HandleCreate
3205 bool wxWindowOS2::HandleDestroy()
3207 wxWindowDestroyEvent
vEvent((wxWindow
*)this);
3208 vEvent
.SetId(GetId());
3209 (void)GetEventHandler()->ProcessEvent(vEvent
);
3212 // Delete our drop target if we've got one
3214 #if wxUSE_DRAG_AND_DROP
3215 if (m_dropTarget
!= NULL
)
3217 delete m_dropTarget
;
3218 m_dropTarget
= NULL
;
3220 #endif // wxUSE_DRAG_AND_DROP
3223 // WM_DESTROY handled
3226 } // end of wxWindowOS2::HandleDestroy
3228 // ---------------------------------------------------------------------------
3230 // ---------------------------------------------------------------------------
3231 void wxWindowOS2::OnSetFocus(
3232 wxFocusEvent
& rEvent
3236 } // end of wxWindowOS2::OnSetFocus
3238 bool wxWindowOS2::HandleActivate(
3240 , WXHWND
WXUNUSED(hActivate
)
3243 wxActivateEvent
vEvent( wxEVT_ACTIVATE
3247 vEvent
.SetEventObject(this);
3248 return GetEventHandler()->ProcessEvent(vEvent
);
3249 } // end of wxWindowOS2::HandleActivate
3251 bool wxWindowOS2::HandleSetFocus(
3252 WXHWND
WXUNUSED(hWnd
)
3256 // Notify the parent keeping track of focus for the kbd navigation
3257 // purposes that we got it
3259 wxChildFocusEvent
vEventFocus((wxWindow
*)this);
3260 (void)GetEventHandler()->ProcessEvent(vEventFocus
);
3268 m_caret
->OnSetFocus();
3270 #endif // wxUSE_CARET
3273 // If it's a wxTextCtrl don't send the event as it will be done
3274 // after the control gets to process it from EN_FOCUS handler
3275 if ( wxDynamicCastThis(wxTextCtrl
) )
3279 #endif // wxUSE_TEXTCTRL
3281 wxFocusEvent
vEvent(wxEVT_SET_FOCUS
, m_windowId
);
3283 vEvent
.SetEventObject(this);
3284 return GetEventHandler()->ProcessEvent(vEvent
);
3285 } // end of wxWindowOS2::HandleSetFocus
3287 bool wxWindowOS2::HandleKillFocus(
3297 m_caret
->OnKillFocus();
3299 #endif // wxUSE_CARET
3303 // If it's a wxTextCtrl don't send the event as it will be done
3304 // after the control gets to process it.
3306 wxTextCtrl
* pCtrl
= wxDynamicCastThis(wxTextCtrl
);
3315 // Don't send the event when in the process of being deleted. This can
3316 // only cause problems if the event handler tries to access the object.
3318 if ( m_isBeingDeleted
)
3323 wxFocusEvent
vEvent( wxEVT_KILL_FOCUS
3327 vEvent
.SetEventObject(this);
3330 // wxFindWinFromHandle() may return NULL, it is ok
3332 vEvent
.SetWindow(wxFindWinFromHandle(hWnd
));
3333 return GetEventHandler()->ProcessEvent(vEvent
);
3334 } // end of wxWindowOS2::HandleKillFocus
3336 // ---------------------------------------------------------------------------
3338 // ---------------------------------------------------------------------------
3340 bool wxWindowOS2::HandleShow(
3342 , int WXUNUSED(nStatus
)
3345 wxShowEvent
vEvent(GetId(), bShow
);
3347 vEvent
.SetEventObject(this);
3348 return GetEventHandler()->ProcessEvent(vEvent
);
3349 } // end of wxWindowOS2::HandleShow
3351 bool wxWindowOS2::HandleInitDialog(
3352 WXHWND
WXUNUSED(hWndFocus
)
3355 wxInitDialogEvent
vEvent(GetId());
3357 vEvent
.SetEventObject(this);
3358 return GetEventHandler()->ProcessEvent(vEvent
);
3359 } // end of wxWindowOS2::HandleInitDialog
3361 bool wxWindowOS2::HandleEndDrag(WXWPARAM
WXUNUSED(wParam
))
3363 // TODO: We'll handle drag and drop later
3367 bool wxWindowOS2::HandleSetCursor(
3368 USHORT
WXUNUSED(vId
)
3373 // Under OS/2 PM this allows the pointer to be changed
3374 // as it passes over a control
3376 ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)hPointer
);
3378 } // end of wxWindowOS2::HandleSetCursor
3380 // ---------------------------------------------------------------------------
3381 // owner drawn stuff
3382 // ---------------------------------------------------------------------------
3383 bool wxWindowOS2::OS2OnDrawItem(
3385 , WXDRAWITEMSTRUCT
* pItemStruct
3388 #if wxUSE_OWNER_DRAWN
3391 #if wxUSE_MENUS_NATIVE
3393 // Is it a menu item?
3399 POWNERITEM pMeasureStruct
= (POWNERITEM
)pItemStruct
;
3400 wxFrame
* pFrame
= (wxFrame
*)this;
3401 wxMenuItem
* pMenuItem
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
);
3402 HDC hDC
= ::GpiQueryDevice(pMeasureStruct
->hps
);
3403 wxRect
vRect( pMeasureStruct
->rclItem
.xLeft
3404 ,pMeasureStruct
->rclItem
.yBottom
3405 ,pMeasureStruct
->rclItem
.xRight
- pMeasureStruct
->rclItem
.xLeft
3406 ,pMeasureStruct
->rclItem
.yTop
- pMeasureStruct
->rclItem
.yBottom
3411 vDc
.SetHPS(pMeasureStruct
->hps
);
3413 // Load the wxWidgets Pallete and set to RGB mode
3415 if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
3419 ,(LONG
)wxTheColourDatabase
->m_nSize
3420 ,(PLONG
)wxTheColourDatabase
->m_palTable
3423 vError
= ::WinGetLastError(vHabmain
);
3424 sError
= wxPMErrorToStr(vError
);
3425 wxLogError(_T("Unable to set current color table. Error: %s\n"), sError
.c_str());
3428 // Set the color table to RGB mode
3430 if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
3438 vError
= ::WinGetLastError(vHabmain
);
3439 sError
= wxPMErrorToStr(vError
);
3440 wxLogError(_T("Unable to set current color table. Error: %s\n"), sError
.c_str());
3443 wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE
);
3449 if (pMeasureStruct
->fsAttribute
== pMeasureStruct
->fsAttributeOld
)
3452 // Entire Item needs to be redrawn (either it has reappeared from
3453 // behind another window or is being displayed for the first time
3455 eAction
= wxOwnerDrawn::wxODDrawAll
;
3457 if (pMeasureStruct
->fsAttribute
& MIA_HILITED
)
3460 // If it is currently selected we let the system handle it
3462 eStatus
|= wxOwnerDrawn::wxODSelected
;
3464 if (pMeasureStruct
->fsAttribute
& MIA_CHECKED
)
3467 // If it is currently checked we draw our own
3469 eStatus
|= wxOwnerDrawn::wxODChecked
;
3470 pMeasureStruct
->fsAttributeOld
= pMeasureStruct
->fsAttribute
&= ~MIA_CHECKED
;
3472 if (pMeasureStruct
->fsAttribute
& MIA_DISABLED
)
3475 // If it is currently disabled we let the system handle it
3477 eStatus
|= wxOwnerDrawn::wxODDisabled
;
3480 // Don't really care about framed (indicationg focus) or NoDismiss
3485 if (pMeasureStruct
->fsAttribute
& MIA_HILITED
)
3487 eAction
= wxOwnerDrawn::wxODDrawAll
;
3488 eStatus
|= wxOwnerDrawn::wxODSelected
;
3490 // Keep the system from trying to highlight with its bogus colors
3492 pMeasureStruct
->fsAttributeOld
= pMeasureStruct
->fsAttribute
&= ~MIA_HILITED
;
3494 else if (!(pMeasureStruct
->fsAttribute
& MIA_HILITED
))
3496 eAction
= wxOwnerDrawn::wxODDrawAll
;
3499 // Keep the system from trying to highlight with its bogus colors
3501 pMeasureStruct
->fsAttribute
= pMeasureStruct
->fsAttributeOld
&= ~MIA_HILITED
;
3506 // For now we don't care about anything else
3507 // just ignore the entire message!
3513 // Now redraw the item
3515 return(pMenuItem
->OnDrawItem( vDc
3517 ,(wxOwnerDrawn::wxODAction
)eAction
3518 ,(wxOwnerDrawn::wxODStatus
)eStatus
3521 // leave the fsAttribute and fsOldAttribute unchanged. If different,
3522 // the system will do the highlight or fraeming or disabling for us,
3523 // otherwise, we'd have to do it ourselves.
3526 #endif // wxUSE_MENUS_NATIVE
3528 wxWindow
* pItem
= FindItem(vId
);
3530 if (pItem
&& pItem
->IsKindOf(CLASSINFO(wxControl
)))
3532 return ((wxControl
*)pItem
)->OS2OnDraw(pItemStruct
);
3536 pItemStruct
= pItemStruct
;
3539 } // end of wxWindowOS2::OS2OnDrawItem
3541 long wxWindowOS2::OS2OnMeasureItem(
3543 , WXMEASUREITEMSTRUCT
* pItemStruct
3546 #if wxUSE_OWNER_DRAWN
3548 // Is it a menu item?
3550 if (lId
== 65536) // I really don't like this...has to be a better indicator
3552 if (IsKindOf(CLASSINFO(wxFrame
))) // we'll assume if Frame then a menu
3556 POWNERITEM pMeasureStruct
= (POWNERITEM
)pItemStruct
;
3557 wxFrame
* pFrame
= (wxFrame
*)this;
3558 wxMenuItem
* pMenuItem
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
);
3560 wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE
);
3563 if (pMenuItem
->OnMeasureItem( &nWidth
3569 pMeasureStruct
->rclItem
.xRight
= nWidth
;
3570 pMeasureStruct
->rclItem
.xLeft
= 0L;
3571 pMeasureStruct
->rclItem
.yTop
= nHeight
;
3572 pMeasureStruct
->rclItem
.yBottom
= 0L;
3573 mRc
= MRFROM2SHORT(nHeight
, nWidth
);
3574 return LONGFROMMR(mRc
);
3579 wxWindow
* pItem
= FindItem(lId
);
3581 if (pItem
&& pItem
->IsKindOf(CLASSINFO(wxControl
)))
3585 vItem
.idItem
= (LONG
)pItemStruct
;
3586 return ((wxControl
*)pItem
)->OS2OnMeasure((WXMEASUREITEMSTRUCT
*)&vItem
);
3590 pItemStruct
= pItemStruct
;
3591 #endif // wxUSE_OWNER_DRAWN
3595 // ---------------------------------------------------------------------------
3596 // colours and palettes
3597 // ---------------------------------------------------------------------------
3599 bool wxWindowOS2::HandleSysColorChange()
3601 wxSysColourChangedEvent vEvent
;
3603 vEvent
.SetEventObject(this);
3604 return GetEventHandler()->ProcessEvent(vEvent
);
3605 } // end of wxWindowOS2::HandleSysColorChange
3607 bool wxWindowOS2::HandleCtlColor(
3608 WXHBRUSH
* WXUNUSED(phBrush
)
3612 // Not much provided with message. So not sure I can do anything with it
3615 } // end of wxWindowOS2::HandleCtlColor
3618 // Define for each class of dialog and control
3619 WXHBRUSH
wxWindowOS2::OnCtlColor(WXHDC
WXUNUSED(hDC
),
3620 WXHWND
WXUNUSED(hWnd
),
3621 WXUINT
WXUNUSED(nCtlColor
),
3622 WXUINT
WXUNUSED(message
),
3623 WXWPARAM
WXUNUSED(wParam
),
3624 WXLPARAM
WXUNUSED(lParam
))
3629 bool wxWindowOS2::HandlePaletteChanged()
3631 // need to set this to something first
3632 WXHWND hWndPalChange
= NULLHANDLE
;
3634 wxPaletteChangedEvent
vEvent(GetId());
3636 vEvent
.SetEventObject(this);
3637 vEvent
.SetChangedWindow(wxFindWinFromHandle(hWndPalChange
));
3639 return GetEventHandler()->ProcessEvent(vEvent
);
3640 } // end of wxWindowOS2::HandlePaletteChanged
3643 // Responds to colour changes: passes event on to children.
3645 void wxWindowOS2::OnSysColourChanged(
3646 wxSysColourChangedEvent
& rEvent
3649 wxWindowList::compatibility_iterator node
= GetChildren().GetFirst();
3654 // Only propagate to non-top-level windows
3656 wxWindow
* pWin
= (wxWindow
*)node
->GetData();
3658 if (pWin
->GetParent())
3660 wxSysColourChangedEvent vEvent
;
3662 rEvent
.SetEventObject(pWin
);
3663 pWin
->GetEventHandler()->ProcessEvent(vEvent
);
3665 node
= node
->GetNext();
3667 } // end of wxWindowOS2::OnSysColourChanged
3669 // ---------------------------------------------------------------------------
3671 // ---------------------------------------------------------------------------
3673 void wxWindow::OnPaint (
3674 wxPaintEvent
& rEvent
3677 HDC hDC
= (HDC
)wxPaintDC::FindDCInCache((wxWindow
*) rEvent
.GetEventObject());
3681 OS2DefWindowProc( (WXUINT
)WM_PAINT
3686 } // end of wxWindow::OnPaint
3688 bool wxWindowOS2::HandlePaint()
3691 wxPaintEvent
vEvent(m_windowId
);
3695 // Create empty region
3696 // TODO: get HPS somewhere else if possible
3697 hPS
= ::WinGetPS(GetHwnd());
3698 hRgn
= ::GpiCreateRegion(hPS
, 0, NULL
);
3700 if (::WinQueryUpdateRegion(GetHwnd(), hRgn
) == RGN_ERROR
)
3702 wxLogLastError(wxT("CreateRectRgn"));
3706 // Get all the rectangles from the region, convert the individual
3707 // rectangles to "the other" coordinate system and reassemble a
3708 // region from the rectangles, to be feed into m_updateRegion.
3710 // FIXME: This is a bad hack since OS/2 API specifies that rectangles
3711 // passed into GpiSetRegion must not have Bottom > Top,
3712 // however, at first sight, it _seems_ to work nonetheless.
3715 PRECTL pUpdateRects
= NULL
;
3716 vRgnData
.ulDirection
= RECTDIR_LFRT_TOPBOT
;
3717 if (::GpiQueryRegionRects( hPS
// Pres space
3718 ,hRgn
// Handle of region to query
3719 ,NULL
// Return all RECTs
3720 ,&vRgnData
// Will contain number or RECTs in region
3721 ,NULL
// NULL to return number of RECTs
3724 pUpdateRects
= new RECTL
[vRgnData
.crcReturned
];
3725 vRgnData
.crc
= vRgnData
.crcReturned
;
3726 vRgnData
.ircStart
= 1;
3727 if (::GpiQueryRegionRects( hPS
// Pres space of source
3728 ,hRgn
// Handle of source region
3729 ,NULL
// Return all RECTs
3730 ,&vRgnData
// Operations set to return rects
3731 ,pUpdateRects
// Will contain the actual RECTS
3736 ::WinQueryWindowRect(GetHwnd(), &vRect
);
3737 height
= vRect
.yTop
;
3739 for(size_t i
= 0; i
< vRgnData
.crc
; i
++)
3742 rectHeight
= pUpdateRects
[i
].yTop
- pUpdateRects
[i
].yBottom
;
3743 pUpdateRects
[i
].yTop
= height
- pUpdateRects
[i
].yTop
;
3744 pUpdateRects
[i
].yBottom
= pUpdateRects
[i
].yTop
+ rectHeight
;
3746 ::GpiSetRegion(hPS
, hRgn
, vRgnData
.crc
, pUpdateRects
);
3747 delete [] pUpdateRects
;
3751 m_updateRegion
= wxRegion(hRgn
, hPS
);
3753 vEvent
.SetEventObject(this);
3754 bProcessed
= GetEventHandler()->ProcessEvent(vEvent
);
3757 IsKindOf(CLASSINFO(wxPanel
)) &&
3758 GetChildren().GetCount() == 0
3762 // OS/2 needs to process this right here, not by the default proc
3763 // Window's default proc correctly paints everything, OS/2 does not.
3764 // For decorative panels that typically have no children, we draw
3770 hPS
= ::WinBeginPaint( GetHwnd()
3776 ::GpiCreateLogColorTable( hPS
3780 ,(LONG
)wxTheColourDatabase
->m_nSize
3781 ,(PLONG
)wxTheColourDatabase
->m_palTable
3783 ::GpiCreateLogColorTable( hPS
3790 if (::WinIsWindowVisible(GetHWND()))
3791 ::WinFillRect(hPS
, &vRect
, GetBackgroundColour().GetPixel());
3794 LINEBUNDLE vLineBundle
;
3796 vLineBundle
.lColor
= 0x00000000; // Black
3797 vLineBundle
.usMixMode
= FM_OVERPAINT
;
3798 vLineBundle
.fxWidth
= 1;
3799 vLineBundle
.lGeomWidth
= 1;
3800 vLineBundle
.usType
= LINETYPE_SOLID
;
3801 vLineBundle
.usEnd
= 0;
3802 vLineBundle
.usJoin
= 0;
3805 ,LBB_COLOR
| LBB_MIX_MODE
| LBB_WIDTH
| LBB_GEOM_WIDTH
| LBB_TYPE
3809 ::WinQueryWindowRect(GetHwnd(), &vRect
);
3819 else if (!bProcessed
&&
3820 IsKindOf(CLASSINFO(wxPanel
))
3824 // Panel with children, usually fills a frame client so no borders.
3829 hPS
= ::WinBeginPaint( GetHwnd()
3835 ::GpiCreateLogColorTable( hPS
3839 ,(LONG
)wxTheColourDatabase
->m_nSize
3840 ,(PLONG
)wxTheColourDatabase
->m_palTable
3842 ::GpiCreateLogColorTable( hPS
3850 if (::WinIsWindowVisible(GetHWND()))
3851 ::WinFillRect(hPS
, &vRect
, GetBackgroundColour().GetPixel());
3857 } // end of wxWindowOS2::HandlePaint
3859 bool wxWindowOS2::HandleEraseBkgnd(
3866 ::WinQueryWindowPos(GetHwnd(), &vSwp
);
3867 if (vSwp
.fl
& SWP_MINIMIZE
)
3872 vDC
.m_hPS
= (HPS
)hDC
; // this is really a PS
3873 vDC
.SetWindow((wxWindow
*)this);
3876 wxEraseEvent
vEvent(m_windowId
, &vDC
);
3878 vEvent
.SetEventObject(this);
3880 rc
= GetEventHandler()->ProcessEvent(vEvent
);
3883 vDC
.m_hPS
= NULLHANDLE
;
3885 } // end of wxWindowOS2::HandleEraseBkgnd
3887 void wxWindowOS2::OnEraseBackground(
3888 wxEraseEvent
& rEvent
3892 HPS hPS
= rEvent
.m_dc
->m_hPS
;
3894 LONG lColor
= m_backgroundColour
.GetPixel();
3896 rc
= ::WinQueryWindowRect(GetHwnd(), &vRect
);
3897 rc
= ::WinFillRect(hPS
, &vRect
, lColor
);
3898 } // end of wxWindowOS2::OnEraseBackground
3900 // ---------------------------------------------------------------------------
3901 // moving and resizing
3902 // ---------------------------------------------------------------------------
3904 bool wxWindowOS2::HandleMinimize()
3906 wxIconizeEvent
vEvent(m_windowId
);
3908 vEvent
.SetEventObject(this);
3909 return GetEventHandler()->ProcessEvent(vEvent
);
3910 } // end of wxWindowOS2::HandleMinimize
3912 bool wxWindowOS2::HandleMaximize()
3914 wxMaximizeEvent
vEvent(m_windowId
);
3916 vEvent
.SetEventObject(this);
3917 return GetEventHandler()->ProcessEvent(vEvent
);
3918 } // end of wxWindowOS2::HandleMaximize
3920 bool wxWindowOS2::HandleMove( int nX
, int nY
)
3923 wxMoveEvent
vEvent(pt
, m_windowId
);
3925 vEvent
.SetEventObject(this);
3926 return GetEventHandler()->ProcessEvent(vEvent
);
3927 } // end of wxWindowOS2::HandleMove
3929 bool wxWindowOS2::HandleSize( int nWidth
,
3931 WXUINT
WXUNUSED(nFlag
) )
3933 wxSize
sz(nWidth
, nHeight
);
3934 wxSizeEvent
vEvent(sz
, m_windowId
);
3936 vEvent
.SetEventObject(this);
3937 return GetEventHandler()->ProcessEvent(vEvent
);
3938 } // end of wxWindowOS2::HandleSize
3940 bool wxWindowOS2::HandleGetMinMaxInfo( PSWP pSwp
)
3948 // FIXME: incomplete headers ???
3949 ::WinGetMaxPosition(GetHwnd(), pSwp
);
3950 m_maxWidth
= pSwp
->cx
;
3951 m_maxHeight
= pSwp
->cy
;
3957 // FIXME: incomplete headers ???
3958 ::WinGetMinPosition(GetHwnd(), pSwp
, &vPoint
);
3959 m_minWidth
= pSwp
->cx
;
3960 m_minHeight
= pSwp
->cy
;
3962 wxUnusedVar(vPoint
);
3970 } // end of wxWindowOS2::HandleGetMinMaxInfo
3972 // ---------------------------------------------------------------------------
3974 // ---------------------------------------------------------------------------
3975 bool wxWindowOS2::HandleCommand(
3981 #if wxUSE_MENUS_NATIVE
3982 if (wxCurrentPopupMenu
)
3984 wxMenu
* pPopupMenu
= wxCurrentPopupMenu
;
3986 wxCurrentPopupMenu
= NULL
;
3987 return pPopupMenu
->OS2Command(wCmd
, wId
);
3989 #endif // wxUSE_MENUS_NATIVE
3991 wxWindow
* pWin
= FindItem(wId
);
3995 pWin
= wxFindWinFromHandle(hControl
);
3999 return pWin
->OS2Command(wCmd
, wId
);
4002 } // end of wxWindowOS2::HandleCommand
4004 bool wxWindowOS2::HandleSysCommand(
4006 , WXLPARAM
WXUNUSED(lParam
)
4010 // 4 bits are reserved
4012 switch (SHORT1FROMMP(wParam
))
4015 return HandleMaximize();
4018 return HandleMinimize();
4021 } // end of wxWindowOS2::HandleSysCommand
4023 // ---------------------------------------------------------------------------
4025 // ---------------------------------------------------------------------------
4026 //TODO!!! check against MSW
4027 void wxWindowOS2::InitMouseEvent(
4028 wxMouseEvent
& rEvent
4035 DoGetSize(0, &nHeight
);
4037 // Convert to wxWidgets standard coordinate system!
4038 rEvent
.m_y
= nHeight
- nY
;
4039 rEvent
.m_shiftDown
= ((uFlags
& KC_SHIFT
) != 0);
4040 rEvent
.m_controlDown
= ((uFlags
& KC_CTRL
) != 0);
4041 rEvent
.m_altDown
= ((uFlags
& KC_ALT
) != 0);
4042 rEvent
.m_leftDown
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON1
) &
4044 rEvent
.m_middleDown
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON3
) &
4046 rEvent
.m_rightDown
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON2
) &
4048 rEvent
.SetTimestamp(s_currentMsg
.time
);
4049 rEvent
.SetEventObject(this);
4050 rEvent
.SetId(GetId());
4052 #if wxUSE_MOUSEEVENT_HACK
4055 m_lastMouseEvent
= rEvent
.GetEventType();
4056 #endif // wxUSE_MOUSEEVENT_HACK
4057 } // end of wxWindowOS2::InitMouseEvent
4059 bool wxWindowOS2::HandleMouseEvent(
4066 bool bProcessed
= FALSE
;
4069 // The mouse events take consecutive IDs from WM_MOUSEFIRST to
4070 // WM_MOUSELAST, so it's enough to subtract WM_MOUSEMOVE == WM_MOUSEFIRST
4071 // from the message id and take the value in the table to get wxWin event
4074 static const wxEventType eventsMouse
[] =
4089 if ((uMsg
>= WM_MOUSEMOVE
) && (uMsg
<= WM_BUTTON3DBLCLK
))
4091 wxMouseEvent
vEvent(eventsMouse
[uMsg
- WM_MOUSEMOVE
]);
4093 InitMouseEvent( vEvent
4099 bProcessed
= GetEventHandler()->ProcessEvent(vEvent
);
4102 HPOINTER hCursor
= (HPOINTER
)GetCursor().GetHCURSOR();
4104 if (hCursor
!= NULLHANDLE
)
4106 ::WinSetPointer(HWND_DESKTOP
, hCursor
);
4112 } // end of wxWindowOS2::HandleMouseEvent
4114 bool wxWindowOS2::HandleMouseMove(
4120 if (!m_bMouseInWindow
)
4123 // Generate an ENTER event
4125 m_bMouseInWindow
= TRUE
;
4127 wxMouseEvent
vEvent(wxEVT_ENTER_WINDOW
);
4129 InitMouseEvent( vEvent
4135 (void)GetEventHandler()->ProcessEvent(vEvent
);
4137 return HandleMouseEvent( WM_MOUSEMOVE
4142 } // end of wxWindowOS2::HandleMouseMove
4144 // ---------------------------------------------------------------------------
4145 // keyboard handling
4146 // ---------------------------------------------------------------------------
4149 // Create the key event of the given type for the given key - used by
4150 // HandleChar and HandleKeyDown/Up
4152 wxKeyEvent
wxWindowOS2::CreateKeyEvent(
4159 wxKeyEvent
vEvent(eType
);
4161 vEvent
.SetId(GetId());
4162 vEvent
.m_shiftDown
= IsShiftDown();
4163 vEvent
.m_controlDown
= IsCtrlDown();
4164 vEvent
.m_altDown
= (HIWORD(lParam
) & KC_ALT
) == KC_ALT
;
4166 vEvent
.SetEventObject((wxWindow
*)this); // const_cast
4167 vEvent
.m_keyCode
= nId
;
4168 vEvent
.m_rawCode
= (wxUint32
)wParam
;
4169 vEvent
.m_rawFlags
= (wxUint32
)lParam
;
4170 vEvent
.SetTimestamp(s_currentMsg
.time
);
4173 // Translate the position to client coords
4178 ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
);
4179 ::WinQueryWindowRect( GetHwnd()
4183 vPoint
.x
-= vRect
.xLeft
;
4184 vPoint
.y
-= vRect
.yBottom
;
4186 vEvent
.m_x
= vPoint
.x
;
4187 vEvent
.m_y
= vPoint
.y
;
4190 } // end of wxWindowOS2::CreateKeyEvent
4193 // isASCII is true only when we're called from WM_CHAR handler and not from
4196 bool wxWindowOS2::HandleChar( WXWPARAM
WXUNUSED(wParam
),
4200 bool bCtrlDown
= FALSE
;
4203 if (m_bLastKeydownProcessed
)
4206 // The key was handled in the EVT_KEY_DOWN. Handling a key in an
4207 // EVT_KEY_DOWN handler is meant, by design, to prevent EVT_CHARs
4208 // from happening, so just bail out at this point.
4210 m_bLastKeydownProcessed
= false;
4216 // If 1 -> 26, translate to either special keycode or just set
4217 // ctrlDown. IOW, Ctrl-C should result in keycode == 3 and
4218 // ControlDown() == true.
4220 vId
= SHORT1FROMMP(lParam
);
4221 if ((vId
> 0) && (vId
< 27))
4243 else // we're called from WM_KEYDOWN
4245 vId
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
));
4250 wxKeyEvent
vEvent(CreateKeyEvent( wxEVT_CHAR
, vId
, lParam
));
4254 vEvent
.m_controlDown
= true;
4257 return (GetEventHandler()->ProcessEvent(vEvent
));
4260 bool wxWindowOS2::HandleKeyDown(
4265 int nId
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
));
4270 // Normal ASCII char
4272 nId
= SHORT1FROMMP(lParam
);
4277 wxKeyEvent
vEvent(CreateKeyEvent( wxEVT_KEY_DOWN
4283 if (GetEventHandler()->ProcessEvent(vEvent
))
4289 } // end of wxWindowOS2::HandleKeyDown
4291 bool wxWindowOS2::HandleKeyUp(
4296 int nId
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
));
4301 // Normal ASCII char
4303 nId
= CHAR1FROMMP(lParam
);
4308 wxKeyEvent
vEvent(CreateKeyEvent( wxEVT_KEY_UP
4314 if (GetEventHandler()->ProcessEvent(vEvent
))
4318 } // end of wxWindowOS2::HandleKeyUp
4320 // ---------------------------------------------------------------------------
4322 // ---------------------------------------------------------------------------
4324 // ---------------------------------------------------------------------------
4326 // ---------------------------------------------------------------------------
4328 bool wxWindowOS2::OS2OnScroll(
4337 wxWindow
* pChild
= wxFindWinFromHandle(hControl
);
4340 return pChild
->OS2OnScroll( nOrientation
4347 wxScrollWinEvent vEvent
;
4349 vEvent
.SetPosition(wPos
);
4350 vEvent
.SetOrientation(nOrientation
);
4351 vEvent
.SetEventObject(this);
4356 vEvent
.SetEventType(wxEVT_SCROLLWIN_LINEUP
);
4360 vEvent
.SetEventType(wxEVT_SCROLLWIN_LINEDOWN
);
4364 vEvent
.SetEventType(wxEVT_SCROLLWIN_PAGEUP
);
4368 vEvent
.SetEventType(wxEVT_SCROLLWIN_PAGEDOWN
);
4371 case SB_SLIDERPOSITION
:
4372 vEvent
.SetEventType(wxEVT_SCROLLWIN_THUMBRELEASE
);
4375 case SB_SLIDERTRACK
:
4376 vEvent
.SetEventType(wxEVT_SCROLLWIN_THUMBTRACK
);
4382 return GetEventHandler()->ProcessEvent(vEvent
);
4383 } // end of wxWindowOS2::OS2OnScroll
4385 void wxWindowOS2::MoveChildren(
4390 // We want to handle top levels ourself, manually
4392 if (!IsTopLevel() && GetAutoLayout())
4400 for (wxWindowList::compatibility_iterator node
= GetChildren().GetFirst();
4402 node
= node
->GetNext())
4404 wxWindow
* pWin
= node
->GetData();
4406 ::WinQueryWindowPos( GetHwndOf(pWin
)
4409 // Actually, only move children that already are placed on the
4410 // frame, not ones which are still at wxDefaultCoord.
4411 if (vSwp
.y
== wxDefaultCoord
)
4413 if (pWin
->IsKindOf(CLASSINFO(wxControl
)))
4418 // Must deal with controls that have margins like ENTRYFIELD. The SWP
4419 // struct of such a control will have and origin offset from its intended
4420 // position by the width of the margins.
4422 pCtrl
= wxDynamicCast(pWin
, wxControl
);
4423 vSwp
.y
-= pCtrl
->GetYComp();
4424 vSwp
.x
-= pCtrl
->GetXComp();
4426 ::WinSetWindowPos( GetHwndOf(pWin
)
4434 ::WinQueryWindowPos(GetHwndOf(pWin
), pWin
->GetSwp());
4435 if (pWin
->IsKindOf(CLASSINFO(wxRadioBox
)))
4437 wxRadioBox
* pRadioBox
;
4439 pRadioBox
= wxDynamicCast(pWin
, wxRadioBox
);
4440 pRadioBox
->AdjustButtons( (int)vSwp
.x
4441 ,(int)vSwp
.y
- nDiff
4444 ,pRadioBox
->GetSizeFlags()
4447 if (pWin
->IsKindOf(CLASSINFO(wxSlider
)))
4451 pSlider
= wxDynamicCast(pWin
, wxSlider
);
4452 pSlider
->AdjustSubControls( (int)vSwp
.x
4453 ,(int)vSwp
.y
- nDiff
4456 ,(int)pSlider
->GetSizeFlags()
4462 } // end of wxWindowOS2::MoveChildren
4465 // Getting the Y position for a window, like a control, is a real
4466 // pain. There are three sitatuions we must deal with in determining
4467 // the OS2 to wxWidgets Y coordinate.
4469 // 1) The controls are created in a dialog.
4470 // This is the easiest since a dialog is created with its original
4471 // size so the standard: Y = ParentHeight - (Y + ControlHeight);
4473 // 2) The controls are direct children of a frame
4474 // In this instance the controls are actually children of the Frame's
4475 // client. During creation the frame's client resizes several times
4476 // during creation of the status bar and toolbars. The CFrame class
4477 // will take care of this using its AlterChildPos proc.
4479 // 3) The controls are children of a panel, which in turn is a child of
4481 // The panel may be one of many, in which case the same treatment
4482 // as 1 applies. It may be the only child, though.
4483 // This is the nastiest case. A panel is created as the only child of
4484 // the frame and as such, when a frame has only one child, the child is
4485 // expanded to fit the entire client area of the frame. Because the
4486 // controls are created BEFORE this occurs their positions are totally
4487 // whacked and any call to WinQueryWindowPos will return invalid
4488 // coordinates. So for this situation we have to compare the size of
4489 // the panel at control creation time with that of the frame client. If
4490 // they are the same we can use the standard Y position equation. If
4491 // not, then we must use the Frame Client's dimensions to position them
4492 // as that will be the eventual size of the panel after the frame resizes
4495 int wxWindowOS2::GetOS2ParentHeight( wxWindowOS2
* pParent
)
4500 if (pParent
->IsKindOf(CLASSINFO(wxDialog
)))
4501 return(pParent
->GetClientSize().y
);
4504 // Case 2 -- if we are one of the separately built standard Frame
4505 // children, like a statusbar, menubar, or toolbar we want to
4506 // use the frame, itself, for positioning. Otherwise we are
4507 // child window and want to use the Frame's client.
4509 else if (pParent
->IsKindOf(CLASSINFO(wxFrame
)))
4511 if (IsKindOf(CLASSINFO(wxStatusBar
)) ||
4512 IsKindOf(CLASSINFO(wxMenuBar
)) ||
4513 IsKindOf(CLASSINFO(wxToolBar
))
4516 if (IsKindOf(CLASSINFO(wxToolBar
)))
4518 wxFrame
* pFrame
= wxDynamicCast(GetParent(), wxFrame
);
4520 if (pFrame
->GetToolBar() == this)
4521 return(pParent
->GetSize().y
);
4523 return(pParent
->GetClientSize().y
);
4526 return(pParent
->GetSize().y
);
4529 return(pParent
->GetClientSize().y
);
4532 // Case -- this is for any window that is the sole child of a Frame.
4533 // The grandparent must exist and it must be of type CFrame
4534 // and it's height must be different. Otherwise the standard
4540 return(pParent
->GetClientSize().y
);
4543 } // end of wxWindowOS2::GetOS2ParentHeight
4546 // OS/2 needs a lot extra manipulation to deal with layouts
4547 // for canvas windows, particularly scrolled ones.
4549 wxWindowCreationHook::wxWindowCreationHook(
4550 wxWindow
* pWinBeingCreated
4553 gpWinBeingCreated
= pWinBeingCreated
;
4554 } // end of wxWindowCreationHook::wxWindowCreationHook
4556 wxWindowCreationHook::~wxWindowCreationHook()
4558 gpWinBeingCreated
= NULL
;
4559 } // end of wxWindowCreationHook::~wxWindowCreationHook
4561 // ===========================================================================
4563 // ===========================================================================
4569 ,wxFont
* WXUNUSED(pTheFont
)
4576 hPS
=::WinGetPS(hWnd
);
4578 rc
= ::GpiQueryFontMetrics(hPS
, sizeof(FONTMETRICS
), &vFM
);
4582 *pX
= vFM
.lAveCharWidth
;
4584 *pY
= vFM
.lEmHeight
+ vFM
.lExternalLeading
;
4593 ::WinReleasePS(hPS
);
4594 } // end of wxGetCharSize
4597 // Returns 0 if was a normal ASCII value, not a special key. This indicates that
4598 // the key should be ignored by WM_KEYDOWN and processed by WM_CHAR instead.
4600 int wxCharCodeOS2ToWX(
4608 case VK_BACKTAB
: nId
= WXK_BACK
; break;
4609 case VK_TAB
: nId
= WXK_TAB
; break;
4610 case VK_CLEAR
: nId
= WXK_CLEAR
; break;
4611 case VK_ENTER
: nId
= WXK_RETURN
; break;
4612 case VK_SHIFT
: nId
= WXK_SHIFT
; break;
4613 case VK_CTRL
: nId
= WXK_CONTROL
; break;
4614 case VK_PAUSE
: nId
= WXK_PAUSE
; break;
4615 case VK_SPACE
: nId
= WXK_SPACE
; break;
4616 case VK_PAGEUP
: nId
= WXK_PRIOR
; break;
4617 case VK_PAGEDOWN
: nId
= WXK_NEXT
; break;
4618 case VK_ESC
: nId
= WXK_ESCAPE
; break;
4619 case VK_END
: nId
= WXK_END
; break;
4620 case VK_HOME
: nId
= WXK_HOME
; break;
4621 case VK_LEFT
: nId
= WXK_LEFT
; break;
4622 case VK_UP
: nId
= WXK_UP
; break;
4623 case VK_RIGHT
: nId
= WXK_RIGHT
; break;
4624 case VK_DOWN
: nId
= WXK_DOWN
; break;
4625 case VK_PRINTSCRN
: nId
= WXK_PRINT
; break;
4626 case VK_INSERT
: nId
= WXK_INSERT
; break;
4627 case VK_DELETE
: nId
= WXK_DELETE
; break;
4628 case VK_CAPSLOCK
: nId
= WXK_CAPITAL
; break;
4629 case VK_F1
: nId
= WXK_F1
; break;
4630 case VK_F2
: nId
= WXK_F2
; break;
4631 case VK_F3
: nId
= WXK_F3
; break;
4632 case VK_F4
: nId
= WXK_F4
; break;
4633 case VK_F5
: nId
= WXK_F5
; break;
4634 case VK_F6
: nId
= WXK_F6
; break;
4635 case VK_F7
: nId
= WXK_F7
; break;
4636 case VK_F8
: nId
= WXK_F8
; break;
4637 case VK_F9
: nId
= WXK_F9
; break;
4638 case VK_F10
: nId
= WXK_F10
; break;
4639 case VK_F11
: nId
= WXK_F11
; break;
4640 case VK_F12
: nId
= WXK_F12
; break;
4641 case VK_F13
: nId
= WXK_F13
; break;
4642 case VK_F14
: nId
= WXK_F14
; break;
4643 case VK_F15
: nId
= WXK_F15
; break;
4644 case VK_F16
: nId
= WXK_F16
; break;
4645 case VK_F17
: nId
= WXK_F17
; break;
4646 case VK_F18
: nId
= WXK_F18
; break;
4647 case VK_F19
: nId
= WXK_F19
; break;
4648 case VK_F20
: nId
= WXK_F20
; break;
4649 case VK_F21
: nId
= WXK_F21
; break;
4650 case VK_F22
: nId
= WXK_F22
; break;
4651 case VK_F23
: nId
= WXK_F23
; break;
4652 case VK_F24
: nId
= WXK_F24
; break;
4653 case VK_OEM_1
: nId
= ';'; break;
4654 case VK_OEM_PLUS
: nId
= '+'; break;
4655 case VK_OEM_COMMA
: nId
= ','; break;
4656 case VK_OEM_MINUS
: nId
= '-'; break;
4657 case VK_OEM_PERIOD
: nId
= '.'; break;
4658 case VK_OEM_2
: nId
= '/'; break;
4659 case VK_OEM_3
: nId
= '~'; break;
4660 case VK_OEM_4
: nId
= '['; break;
4661 case VK_OEM_5
: nId
= '\\'; break;
4662 case VK_OEM_6
: nId
= ']'; break;
4663 case VK_OEM_7
: nId
= '\''; break;
4664 case VK_NUMLOCK
: nId
= WXK_NUMLOCK
; break;
4665 case VK_SCRLLOCK
: nId
= WXK_SCROLL
; break;
4672 } // end of wxCharCodeOS2ToWX
4674 int wxCharCodeWXToOS2(
4684 case WXK_CLEAR
: nKeySym
= VK_CLEAR
; break;
4685 case WXK_SHIFT
: nKeySym
= VK_SHIFT
; break;
4686 case WXK_CONTROL
: nKeySym
= VK_CTRL
; break;
4687 case WXK_PAUSE
: nKeySym
= VK_PAUSE
; break;
4688 case WXK_PRIOR
: nKeySym
= VK_PAGEUP
; break;
4689 case WXK_NEXT
: nKeySym
= VK_PAGEDOWN
; break;
4690 case WXK_END
: nKeySym
= VK_END
; break;
4691 case WXK_HOME
: nKeySym
= VK_HOME
; break;
4692 case WXK_LEFT
: nKeySym
= VK_LEFT
; break;
4693 case WXK_UP
: nKeySym
= VK_UP
; break;
4694 case WXK_RIGHT
: nKeySym
= VK_RIGHT
; break;
4695 case WXK_DOWN
: nKeySym
= VK_DOWN
; break;
4696 case WXK_PRINT
: nKeySym
= VK_PRINTSCRN
; break;
4697 case WXK_INSERT
: nKeySym
= VK_INSERT
; break;
4698 case WXK_DELETE
: nKeySym
= VK_DELETE
; break;
4699 case WXK_F1
: nKeySym
= VK_F1
; break;
4700 case WXK_F2
: nKeySym
= VK_F2
; break;
4701 case WXK_F3
: nKeySym
= VK_F3
; break;
4702 case WXK_F4
: nKeySym
= VK_F4
; break;
4703 case WXK_F5
: nKeySym
= VK_F5
; break;
4704 case WXK_F6
: nKeySym
= VK_F6
; break;
4705 case WXK_F7
: nKeySym
= VK_F7
; break;
4706 case WXK_F8
: nKeySym
= VK_F8
; break;
4707 case WXK_F9
: nKeySym
= VK_F9
; break;
4708 case WXK_F10
: nKeySym
= VK_F10
; break;
4709 case WXK_F11
: nKeySym
= VK_F11
; break;
4710 case WXK_F12
: nKeySym
= VK_F12
; break;
4711 case WXK_F13
: nKeySym
= VK_F13
; break;
4712 case WXK_F14
: nKeySym
= VK_F14
; break;
4713 case WXK_F15
: nKeySym
= VK_F15
; break;
4714 case WXK_F16
: nKeySym
= VK_F16
; break;
4715 case WXK_F17
: nKeySym
= VK_F17
; break;
4716 case WXK_F18
: nKeySym
= VK_F18
; break;
4717 case WXK_F19
: nKeySym
= VK_F19
; break;
4718 case WXK_F20
: nKeySym
= VK_F20
; break;
4719 case WXK_F21
: nKeySym
= VK_F21
; break;
4720 case WXK_F22
: nKeySym
= VK_F22
; break;
4721 case WXK_F23
: nKeySym
= VK_F23
; break;
4722 case WXK_F24
: nKeySym
= VK_F24
; break;
4723 case WXK_NUMLOCK
: nKeySym
= VK_NUMLOCK
; break;
4724 case WXK_SCROLL
: nKeySym
= VK_SCRLLOCK
; break;
4727 *bIsVirtual
= FALSE
;
4733 } // end of wxCharCodeWXToOS2
4735 wxWindow
* wxGetActiveWindow()
4737 HWND hWnd
= ::WinQueryActiveWindow(HWND_DESKTOP
);
4741 return wxFindWinFromHandle((WXHWND
)hWnd
);
4744 } // end of wxGetActiveWindow
4747 const char* wxGetMessageName( int nMessage
)
4751 case 0x0000: return "WM_NULL";
4752 case 0x0001: return "WM_CREATE";
4753 case 0x0002: return "WM_DESTROY";
4754 case 0x0004: return "WM_ENABLE";
4755 case 0x0005: return "WM_SHOW";
4756 case 0x0006: return "WM_MOVE";
4757 case 0x0007: return "WM_SIZE";
4758 case 0x0008: return "WM_ADJUSTWINDOWPOS";
4759 case 0x0009: return "WM_CALCVALIDRECTS";
4760 case 0x000A: return "WM_SETWINDOWPARAMS";
4761 case 0x000B: return "WM_QUERYWINDOWPARAMS";
4762 case 0x000C: return "WM_HITTEST";
4763 case 0x000D: return "WM_ACTIVATE";
4764 case 0x000F: return "WM_SETFOCUS";
4765 case 0x0010: return "WM_SETSELECTION";
4766 case 0x0011: return "WM_PPAINT";
4767 case 0x0012: return "WM_PSETFOCUS";
4768 case 0x0013: return "WM_PSYSCOLORCHANGE";
4769 case 0x0014: return "WM_PSIZE";
4770 case 0x0015: return "WM_PACTIVATE";
4771 case 0x0016: return "WM_PCONTROL";
4772 case 0x0020: return "WM_COMMAND";
4773 case 0x0021: return "WM_SYSCOMMAND";
4774 case 0x0022: return "WM_HELP";
4775 case 0x0023: return "WM_PAINT";
4776 case 0x0024: return "WM_TIMER";
4777 case 0x0025: return "WM_SEM1";
4778 case 0x0026: return "WM_SEM2";
4779 case 0x0027: return "WM_SEM3";
4780 case 0x0028: return "WM_SEM4";
4781 case 0x0029: return "WM_CLOSE";
4782 case 0x002A: return "WM_QUIT";
4783 case 0x002B: return "WM_SYSCOLORCHANGE";
4784 case 0x002D: return "WM_SYSVALUECHANGE";
4785 case 0x002E: return "WM_APPTERMINATENOTIFY";
4786 case 0x002F: return "WM_PRESPARAMCHANGED";
4787 // Control notification messages
4788 case 0x0030: return "WM_CONTROL";
4789 case 0x0031: return "WM_VSCROLL";
4790 case 0x0032: return "WM_HSCROLL";
4791 case 0x0033: return "WM_INITMENU";
4792 case 0x0034: return "WM_MENUSELECT";
4793 case 0x0035: return "WM_MENUSEND";
4794 case 0x0036: return "WM_DRAWITEM";
4795 case 0x0037: return "WM_MEASUREITEM";
4796 case 0x0038: return "WM_CONTROLPOINTER";
4797 case 0x003A: return "WM_QUERYDLGCODE";
4798 case 0x003B: return "WM_INITDLG";
4799 case 0x003C: return "WM_SUBSTITUTESTRING";
4800 case 0x003D: return "WM_MATCHMNEMONIC";
4801 case 0x003E: return "WM_SAVEAPPLICATION";
4802 case 0x0129: return "WM_CTLCOLORCHANGE";
4803 case 0x0130: return "WM_QUERYCTLTYPE";
4805 case 0x0040: return "WM_FLASHWINDOW";
4806 case 0x0041: return "WM_FORMATFRAME";
4807 case 0x0042: return "WM_UPDATEFRAME";
4808 case 0x0043: return "WM_FOCUSCHANGE";
4809 case 0x0044: return "WM_SETBORDERSIZE";
4810 case 0x0045: return "WM_TRACKFRAME";
4811 case 0x0046: return "WM_MINMAXFRAME";
4812 case 0x0047: return "WM_SETICON";
4813 case 0x0048: return "WM_QUERYICON";
4814 case 0x0049: return "WM_SETACCELTABLE";
4815 case 0x004A: return "WM_QUERYACCELTABLE";
4816 case 0x004B: return "WM_TRANSLATEACCEL";
4817 case 0x004C: return "WM_QUERYTRACKINFO";
4818 case 0x004D: return "WM_QUERYBORDERSIZE";
4819 case 0x004E: return "WM_NEXTMENU";
4820 case 0x004F: return "WM_ERASEBACKGROUND";
4821 case 0x0050: return "WM_QUERYFRAMEINFO";
4822 case 0x0051: return "WM_QUERYFOCUSCHAIN";
4823 case 0x0052: return "WM_OWNERPOSCHANGE";
4824 case 0x0053: return "WM_CACLFRAMERECT";
4825 case 0x0055: return "WM_WINDOWPOSCHANGED";
4826 case 0x0056: return "WM_ADJUSTFRAMEPOS";
4827 case 0x0059: return "WM_QUERYFRAMECTLCOUNT";
4828 case 0x005B: return "WM_QUERYHELPINFO";
4829 case 0x005C: return "WM_SETHELPINFO";
4830 case 0x005D: return "WM_ERROR";
4831 case 0x005E: return "WM_REALIZEPALETTE";
4832 // Clipboard messages
4833 case 0x0060: return "WM_RENDERFMT";
4834 case 0x0061: return "WM_RENDERALLFMTS";
4835 case 0x0062: return "WM_DESTROYCLIPBOARD";
4836 case 0x0063: return "WM_PAINTCLIPBOARD";
4837 case 0x0064: return "WM_SIZECLIPBOARD";
4838 case 0x0065: return "WM_HSCROLLCLIPBOARD";
4839 case 0x0066: return "WM_VSCROLLCLIPBOARD";
4840 case 0x0067: return "WM_DRAWCLIPBOARD";
4842 case 0x0070: return "WM_MOUSEMOVE";
4843 case 0x0071: return "WM_BUTTON1DOWN";
4844 case 0x0072: return "WM_BUTTON1UP";
4845 case 0x0073: return "WM_BUTTON1DBLCLK";
4846 case 0x0074: return "WM_BUTTON2DOWN";
4847 case 0x0075: return "WM_BUTTON2UP";
4848 case 0x0076: return "WM_BUTTON2DBLCLK";
4849 case 0x0077: return "WM_BUTTON3DOWN";
4850 case 0x0078: return "WM_BUTTON3UP";
4851 case 0x0079: return "WM_BUTTON3DBLCLK";
4852 case 0x007D: return "WM_MOUSEMAP";
4853 case 0x007E: return "WM_VRNDISABLED";
4854 case 0x007F: return "WM_VRNENABLED";
4855 case 0x0410: return "WM_CHORD";
4856 case 0x0411: return "WM_BUTTON1MOTIONSTART";
4857 case 0x0412: return "WM_BUTTON1MOTIONEND";
4858 case 0x0413: return "WM_BUTTON1CLICK";
4859 case 0x0414: return "WM_BUTTON2MOTIONSTART";
4860 case 0x0415: return "WM_BUTTON2MOTIONEND";
4861 case 0x0416: return "WM_BUTTON2CLICK";
4862 case 0x0417: return "WM_BUTTON3MOTIONSTART";
4863 case 0x0418: return "WM_BUTTON3MOTIONEND";
4864 case 0x0419: return "WM_BUTTON3CLICK";
4865 case 0x0420: return "WM_BEGINDRAG";
4866 case 0x0421: return "WM_ENDDRAG";
4867 case 0x0422: return "WM_SINGLESELECT";
4868 case 0x0423: return "WM_OPEN";
4869 case 0x0424: return "WM_CONTEXTMENU";
4870 case 0x0425: return "WM_CONTEXTHELP";
4871 case 0x0426: return "WM_TEXTEDIT";
4872 case 0x0427: return "WM_BEGINSELECT";
4873 case 0x0228: return "WM_ENDSELECT";
4874 case 0x0429: return "WM_PICKUP";
4875 case 0x04C0: return "WM_PENFIRST";
4876 case 0x04FF: return "WM_PENLAST";
4877 case 0x0500: return "WM_MMPMFIRST";
4878 case 0x05FF: return "WM_MMPMLAST";
4879 case 0x0600: return "WM_STDDLGFIRST";
4880 case 0x06FF: return "WM_STDDLGLAST";
4881 case 0x0BD0: return "WM_BIDI_FIRST";
4882 case 0x0BFF: return "WM_BIDI_LAST";
4884 case 0x007A: return "WM_CHAR";
4885 case 0x007B: return "WM_VIOCHAR";
4887 case 0x00A0: return "WM_DDE_INITIATE";
4888 case 0x00A1: return "WM_DDE_REQUEST";
4889 case 0x00A2: return "WM_DDE_ACK";
4890 case 0x00A3: return "WM_DDE_DATA";
4891 case 0x00A4: return "WM_DDE_ADVISE";
4892 case 0x00A5: return "WM_DDE_UNADVISE";
4893 case 0x00A6: return "WM_DDE_POKE";
4894 case 0x00A7: return "WM_DDE_EXECUTE";
4895 case 0x00A8: return "WM_DDE_TERMINATE";
4896 case 0x00A9: return "WM_DDE_INITIATEACK";
4897 case 0x00AF: return "WM_DDE_LAST";
4899 case 0x0120: return "BM_CLICK";
4900 case 0x0121: return "BM_QUERYCHECKINDEX";
4901 case 0x0122: return "BM_QUERYHILITE";
4902 case 0x0123: return "BM_SETHILITE";
4903 case 0x0124: return "BM_QUERYCHECK";
4904 case 0x0125: return "BM_SETCHECK";
4905 case 0x0126: return "BM_SETDEFAULT";
4906 case 0x0128: return "BM_AUTOSIZE";
4908 case 0x029A: return "CBID_LIST";
4909 case 0x029B: return "CBID_EDIT";
4910 case 0x0170: return "CBM_SHOWLIST";
4911 case 0x0171: return "CBM_HILITE";
4912 case 0x0172: return "CBM_ISLISTSHOWING";
4914 case 0x0140: return "EM_QUERYCHANGED";
4915 case 0x0141: return "EM_QUERYSEL";
4916 case 0x0142: return "EM_SETSEL";
4917 case 0x0143: return "EM_SETTEXTLIMIT";
4918 case 0x0144: return "EM_CUT";
4919 case 0x0145: return "EM_COPY";
4920 case 0x0146: return "EM_CLEAR";
4921 case 0x0147: return "EM_PASTE";
4922 case 0x0148: return "EM_QUERYFIRSTCHAR";
4923 case 0x0149: return "EM_SETFIRSTCHAR";
4924 case 0x014A: return "EM_QUERYREADONLY";
4925 case 0x014B: return "EM_SETREADONLY";
4926 case 0x014C: return "EM_SETINSERTMODE";
4928 case 0x0160: return "LM_QUERYITEMCOUNT";
4929 case 0x0161: return "LM_INSERTITEM";
4930 case 0x0162: return "LM_SETOPENINDEX";
4931 case 0x0163: return "LM_DELETEITEM";
4932 case 0x0164: return "LM_SELECTITEM";
4933 case 0x0165: return "LM_QUERYSELECTION";
4934 case 0x0166: return "LM_SETITEMTEXT";
4935 case 0x0167: return "LM_QUERYITEMTEXTLENGTH";
4936 case 0x0168: return "LM_QUERYITEMTEXT";
4937 case 0x0169: return "LM_SETITEMHANDLE";
4938 case 0x016A: return "LM_QUERYITEMHANDLE";
4939 case 0x016B: return "LM_SEARCHSTRING";
4940 case 0x016C: return "LM_SETITEMHEIGHT";
4941 case 0x016D: return "LM_QUERYTOPINDEX";
4942 case 0x016E: return "LM_DELETEALL";
4943 case 0x016F: return "LM_INSERTMULITEMS";
4944 case 0x0660: return "LM_SETITEMWIDTH";
4946 case 0x0180: return "MM_INSERTITEM";
4947 case 0x0181: return "MM_DELETEITEM";
4948 case 0x0182: return "MM_QUERYITEM";
4949 case 0x0183: return "MM_SETITEM";
4950 case 0x0184: return "MM_QUERYITEMCOUNT";
4951 case 0x0185: return "MM_STARTMENUMODE";
4952 case 0x0186: return "MM_ENDMENUMODE";
4953 case 0x0188: return "MM_REMOVEITEM";
4954 case 0x0189: return "MM_SELECTITEM";
4955 case 0x018A: return "MM_QUERYSELITEMID";
4956 case 0x018B: return "MM_QUERYITEMTEXT";
4957 case 0x018C: return "MM_QUERYITEMTEXTLENGTH";
4958 case 0x018D: return "MM_SETITEMHANDLE";
4959 case 0x018E: return "MM_SETITEMTEXT";
4960 case 0x018F: return "MM_ITEMPOSITIONFROMID";
4961 case 0x0190: return "MM_ITEMIDFROMPOSITION";
4962 case 0x0191: return "MM_QUERYITEMATTR";
4963 case 0x0192: return "MM_SETITEMATTR";
4964 case 0x0193: return "MM_ISITEMVALID";
4965 case 0x0194: return "MM_QUERYITEMRECT";
4966 case 0x0431: return "MM_QUERYDEFAULTITEMID";
4967 case 0x0432: return "MM_SETDEFAULTITEMID";
4969 case 0x01A0: return "SBM_SETSCROLLBAR";
4970 case 0x01A1: return "SBM_SETPOS";
4971 case 0x01A2: return "SBM_QUERYPOS";
4972 case 0x01A3: return "SBM_QUERYRANGE";
4973 case 0x01A6: return "SBM_SETTHUMBSIZE";
4976 case 0x0F00: return "WM_HELPBASE";
4977 case 0x0FFF: return "WM_HELPTOP";
4978 // Beginning of user defined messages
4979 case 0x1000: return "WM_USER";
4981 // wxWidgets user defined types
4984 // case 0x1000 + 0: return "LVM_GETBKCOLOR";
4985 case 0x1000 + 1: return "LVM_SETBKCOLOR";
4986 case 0x1000 + 2: return "LVM_GETIMAGELIST";
4987 case 0x1000 + 3: return "LVM_SETIMAGELIST";
4988 case 0x1000 + 4: return "LVM_GETITEMCOUNT";
4989 case 0x1000 + 5: return "LVM_GETITEMA";
4990 case 0x1000 + 75: return "LVM_GETITEMW";
4991 case 0x1000 + 6: return "LVM_SETITEMA";
4992 case 0x1000 + 76: return "LVM_SETITEMW";
4993 case 0x1000 + 7: return "LVM_INSERTITEMA";
4994 case 0x1000 + 77: return "LVM_INSERTITEMW";
4995 case 0x1000 + 8: return "LVM_DELETEITEM";
4996 case 0x1000 + 9: return "LVM_DELETEALLITEMS";
4997 case 0x1000 + 10: return "LVM_GETCALLBACKMASK";
4998 case 0x1000 + 11: return "LVM_SETCALLBACKMASK";
4999 case 0x1000 + 12: return "LVM_GETNEXTITEM";
5000 case 0x1000 + 13: return "LVM_FINDITEMA";
5001 case 0x1000 + 83: return "LVM_FINDITEMW";
5002 case 0x1000 + 14: return "LVM_GETITEMRECT";
5003 case 0x1000 + 15: return "LVM_SETITEMPOSITION";
5004 case 0x1000 + 16: return "LVM_GETITEMPOSITION";
5005 case 0x1000 + 17: return "LVM_GETSTRINGWIDTHA";
5006 case 0x1000 + 87: return "LVM_GETSTRINGWIDTHW";
5007 case 0x1000 + 18: return "LVM_HITTEST";
5008 case 0x1000 + 19: return "LVM_ENSUREVISIBLE";
5009 case 0x1000 + 20: return "LVM_SCROLL";
5010 case 0x1000 + 21: return "LVM_REDRAWITEMS";
5011 case 0x1000 + 22: return "LVM_ARRANGE";
5012 case 0x1000 + 23: return "LVM_EDITLABELA";
5013 case 0x1000 + 118: return "LVM_EDITLABELW";
5014 case 0x1000 + 24: return "LVM_GETEDITCONTROL";
5015 case 0x1000 + 25: return "LVM_GETCOLUMNA";
5016 case 0x1000 + 95: return "LVM_GETCOLUMNW";
5017 case 0x1000 + 26: return "LVM_SETCOLUMNA";
5018 case 0x1000 + 96: return "LVM_SETCOLUMNW";
5019 case 0x1000 + 27: return "LVM_INSERTCOLUMNA";
5020 case 0x1000 + 97: return "LVM_INSERTCOLUMNW";
5021 case 0x1000 + 28: return "LVM_DELETECOLUMN";
5022 case 0x1000 + 29: return "LVM_GETCOLUMNWIDTH";
5023 case 0x1000 + 30: return "LVM_SETCOLUMNWIDTH";
5024 case 0x1000 + 31: return "LVM_GETHEADER";
5025 case 0x1000 + 33: return "LVM_CREATEDRAGIMAGE";
5026 case 0x1000 + 34: return "LVM_GETVIEWRECT";
5027 case 0x1000 + 35: return "LVM_GETTEXTCOLOR";
5028 case 0x1000 + 36: return "LVM_SETTEXTCOLOR";
5029 case 0x1000 + 37: return "LVM_GETTEXTBKCOLOR";
5030 case 0x1000 + 38: return "LVM_SETTEXTBKCOLOR";
5031 case 0x1000 + 39: return "LVM_GETTOPINDEX";
5032 case 0x1000 + 40: return "LVM_GETCOUNTPERPAGE";
5033 case 0x1000 + 41: return "LVM_GETORIGIN";
5034 case 0x1000 + 42: return "LVM_UPDATE";
5035 case 0x1000 + 43: return "LVM_SETITEMSTATE";
5036 case 0x1000 + 44: return "LVM_GETITEMSTATE";
5037 case 0x1000 + 45: return "LVM_GETITEMTEXTA";
5038 case 0x1000 + 115: return "LVM_GETITEMTEXTW";
5039 case 0x1000 + 46: return "LVM_SETITEMTEXTA";
5040 case 0x1000 + 116: return "LVM_SETITEMTEXTW";
5041 case 0x1000 + 47: return "LVM_SETITEMCOUNT";
5042 case 0x1000 + 48: return "LVM_SORTITEMS";
5043 case 0x1000 + 49: return "LVM_SETITEMPOSITION32";
5044 case 0x1000 + 50: return "LVM_GETSELECTEDCOUNT";
5045 case 0x1000 + 51: return "LVM_GETITEMSPACING";
5046 case 0x1000 + 52: return "LVM_GETISEARCHSTRINGA";
5047 case 0x1000 + 117: return "LVM_GETISEARCHSTRINGW";
5048 case 0x1000 + 53: return "LVM_SETICONSPACING";
5049 case 0x1000 + 54: return "LVM_SETEXTENDEDLISTVIEWSTYLE";
5050 case 0x1000 + 55: return "LVM_GETEXTENDEDLISTVIEWSTYLE";
5051 case 0x1000 + 56: return "LVM_GETSUBITEMRECT";
5052 case 0x1000 + 57: return "LVM_SUBITEMHITTEST";
5053 case 0x1000 + 58: return "LVM_SETCOLUMNORDERARRAY";
5054 case 0x1000 + 59: return "LVM_GETCOLUMNORDERARRAY";
5055 case 0x1000 + 60: return "LVM_SETHOTITEM";
5056 case 0x1000 + 61: return "LVM_GETHOTITEM";
5057 case 0x1000 + 62: return "LVM_SETHOTCURSOR";
5058 case 0x1000 + 63: return "LVM_GETHOTCURSOR";
5059 case 0x1000 + 64: return "LVM_APPROXIMATEVIEWRECT";
5060 case 0x1000 + 65: return "LVM_SETWORKAREA";
5063 case 0x1100 + 0: return "TVM_INSERTITEMA";
5064 case 0x1100 + 50: return "TVM_INSERTITEMW";
5065 case 0x1100 + 1: return "TVM_DELETEITEM";
5066 case 0x1100 + 2: return "TVM_EXPAND";
5067 case 0x1100 + 4: return "TVM_GETITEMRECT";
5068 case 0x1100 + 5: return "TVM_GETCOUNT";
5069 case 0x1100 + 6: return "TVM_GETINDENT";
5070 case 0x1100 + 7: return "TVM_SETINDENT";
5071 case 0x1100 + 8: return "TVM_GETIMAGELIST";
5072 case 0x1100 + 9: return "TVM_SETIMAGELIST";
5073 case 0x1100 + 10: return "TVM_GETNEXTITEM";
5074 case 0x1100 + 11: return "TVM_SELECTITEM";
5075 case 0x1100 + 12: return "TVM_GETITEMA";
5076 case 0x1100 + 62: return "TVM_GETITEMW";
5077 case 0x1100 + 13: return "TVM_SETITEMA";
5078 case 0x1100 + 63: return "TVM_SETITEMW";
5079 case 0x1100 + 14: return "TVM_EDITLABELA";
5080 case 0x1100 + 65: return "TVM_EDITLABELW";
5081 case 0x1100 + 15: return "TVM_GETEDITCONTROL";
5082 case 0x1100 + 16: return "TVM_GETVISIBLECOUNT";
5083 case 0x1100 + 17: return "TVM_HITTEST";
5084 case 0x1100 + 18: return "TVM_CREATEDRAGIMAGE";
5085 case 0x1100 + 19: return "TVM_SORTCHILDREN";
5086 case 0x1100 + 20: return "TVM_ENSUREVISIBLE";
5087 case 0x1100 + 21: return "TVM_SORTCHILDRENCB";
5088 case 0x1100 + 22: return "TVM_ENDEDITLABELNOW";
5089 case 0x1100 + 23: return "TVM_GETISEARCHSTRINGA";
5090 case 0x1100 + 64: return "TVM_GETISEARCHSTRINGW";
5091 case 0x1100 + 24: return "TVM_SETTOOLTIPS";
5092 case 0x1100 + 25: return "TVM_GETTOOLTIPS";
5095 case 0x1200 + 0: return "HDM_GETITEMCOUNT";
5096 case 0x1200 + 1: return "HDM_INSERTITEMA";
5097 case 0x1200 + 10: return "HDM_INSERTITEMW";
5098 case 0x1200 + 2: return "HDM_DELETEITEM";
5099 case 0x1200 + 3: return "HDM_GETITEMA";
5100 case 0x1200 + 11: return "HDM_GETITEMW";
5101 case 0x1200 + 4: return "HDM_SETITEMA";
5102 case 0x1200 + 12: return "HDM_SETITEMW";
5103 case 0x1200 + 5: return "HDM_LAYOUT";
5104 case 0x1200 + 6: return "HDM_HITTEST";
5105 case 0x1200 + 7: return "HDM_GETITEMRECT";
5106 case 0x1200 + 8: return "HDM_SETIMAGELIST";
5107 case 0x1200 + 9: return "HDM_GETIMAGELIST";
5108 case 0x1200 + 15: return "HDM_ORDERTOINDEX";
5109 case 0x1200 + 16: return "HDM_CREATEDRAGIMAGE";
5110 case 0x1200 + 17: return "HDM_GETORDERARRAY";
5111 case 0x1200 + 18: return "HDM_SETORDERARRAY";
5112 case 0x1200 + 19: return "HDM_SETHOTDIVIDER";
5115 case 0x1300 + 2: return "TCM_GETIMAGELIST";
5116 case 0x1300 + 3: return "TCM_SETIMAGELIST";
5117 case 0x1300 + 4: return "TCM_GETITEMCOUNT";
5118 case 0x1300 + 5: return "TCM_GETITEMA";
5119 case 0x1300 + 60: return "TCM_GETITEMW";
5120 case 0x1300 + 6: return "TCM_SETITEMA";
5121 case 0x1300 + 61: return "TCM_SETITEMW";
5122 case 0x1300 + 7: return "TCM_INSERTITEMA";
5123 case 0x1300 + 62: return "TCM_INSERTITEMW";
5124 case 0x1300 + 8: return "TCM_DELETEITEM";
5125 case 0x1300 + 9: return "TCM_DELETEALLITEMS";
5126 case 0x1300 + 10: return "TCM_GETITEMRECT";
5127 case 0x1300 + 11: return "TCM_GETCURSEL";
5128 case 0x1300 + 12: return "TCM_SETCURSEL";
5129 case 0x1300 + 13: return "TCM_HITTEST";
5130 case 0x1300 + 14: return "TCM_SETITEMEXTRA";
5131 case 0x1300 + 40: return "TCM_ADJUSTRECT";
5132 case 0x1300 + 41: return "TCM_SETITEMSIZE";
5133 case 0x1300 + 42: return "TCM_REMOVEIMAGE";
5134 case 0x1300 + 43: return "TCM_SETPADDING";
5135 case 0x1300 + 44: return "TCM_GETROWCOUNT";
5136 case 0x1300 + 45: return "TCM_GETTOOLTIPS";
5137 case 0x1300 + 46: return "TCM_SETTOOLTIPS";
5138 case 0x1300 + 47: return "TCM_GETCURFOCUS";
5139 case 0x1300 + 48: return "TCM_SETCURFOCUS";
5140 case 0x1300 + 49: return "TCM_SETMINTABWIDTH";
5141 case 0x1300 + 50: return "TCM_DESELECTALL";
5144 case WM_USER
+1000+1: return "TB_ENABLEBUTTON";
5145 case WM_USER
+1000+2: return "TB_CHECKBUTTON";
5146 case WM_USER
+1000+3: return "TB_PRESSBUTTON";
5147 case WM_USER
+1000+4: return "TB_HIDEBUTTON";
5148 case WM_USER
+1000+5: return "TB_INDETERMINATE";
5149 case WM_USER
+1000+9: return "TB_ISBUTTONENABLED";
5150 case WM_USER
+1000+10: return "TB_ISBUTTONCHECKED";
5151 case WM_USER
+1000+11: return "TB_ISBUTTONPRESSED";
5152 case WM_USER
+1000+12: return "TB_ISBUTTONHIDDEN";
5153 case WM_USER
+1000+13: return "TB_ISBUTTONINDETERMINATE";
5154 case WM_USER
+1000+17: return "TB_SETSTATE";
5155 case WM_USER
+1000+18: return "TB_GETSTATE";
5156 case WM_USER
+1000+19: return "TB_ADDBITMAP";
5157 case WM_USER
+1000+20: return "TB_ADDBUTTONS";
5158 case WM_USER
+1000+21: return "TB_INSERTBUTTON";
5159 case WM_USER
+1000+22: return "TB_DELETEBUTTON";
5160 case WM_USER
+1000+23: return "TB_GETBUTTON";
5161 case WM_USER
+1000+24: return "TB_BUTTONCOUNT";
5162 case WM_USER
+1000+25: return "TB_COMMANDTOINDEX";
5163 case WM_USER
+1000+26: return "TB_SAVERESTOREA";
5164 case WM_USER
+1000+76: return "TB_SAVERESTOREW";
5165 case WM_USER
+1000+27: return "TB_CUSTOMIZE";
5166 case WM_USER
+1000+28: return "TB_ADDSTRINGA";
5167 case WM_USER
+1000+77: return "TB_ADDSTRINGW";
5168 case WM_USER
+1000+29: return "TB_GETITEMRECT";
5169 case WM_USER
+1000+30: return "TB_BUTTONSTRUCTSIZE";
5170 case WM_USER
+1000+31: return "TB_SETBUTTONSIZE";
5171 case WM_USER
+1000+32: return "TB_SETBITMAPSIZE";
5172 case WM_USER
+1000+33: return "TB_AUTOSIZE";
5173 case WM_USER
+1000+35: return "TB_GETTOOLTIPS";
5174 case WM_USER
+1000+36: return "TB_SETTOOLTIPS";
5175 case WM_USER
+1000+37: return "TB_SETPARENT";
5176 case WM_USER
+1000+39: return "TB_SETROWS";
5177 case WM_USER
+1000+40: return "TB_GETROWS";
5178 case WM_USER
+1000+42: return "TB_SETCMDID";
5179 case WM_USER
+1000+43: return "TB_CHANGEBITMAP";
5180 case WM_USER
+1000+44: return "TB_GETBITMAP";
5181 case WM_USER
+1000+45: return "TB_GETBUTTONTEXTA";
5182 case WM_USER
+1000+75: return "TB_GETBUTTONTEXTW";
5183 case WM_USER
+1000+46: return "TB_REPLACEBITMAP";
5184 case WM_USER
+1000+47: return "TB_SETINDENT";
5185 case WM_USER
+1000+48: return "TB_SETIMAGELIST";
5186 case WM_USER
+1000+49: return "TB_GETIMAGELIST";
5187 case WM_USER
+1000+50: return "TB_LOADIMAGES";
5188 case WM_USER
+1000+51: return "TB_GETRECT";
5189 case WM_USER
+1000+52: return "TB_SETHOTIMAGELIST";
5190 case WM_USER
+1000+53: return "TB_GETHOTIMAGELIST";
5191 case WM_USER
+1000+54: return "TB_SETDISABLEDIMAGELIST";
5192 case WM_USER
+1000+55: return "TB_GETDISABLEDIMAGELIST";
5193 case WM_USER
+1000+56: return "TB_SETSTYLE";
5194 case WM_USER
+1000+57: return "TB_GETSTYLE";
5195 case WM_USER
+1000+58: return "TB_GETBUTTONSIZE";
5196 case WM_USER
+1000+59: return "TB_SETBUTTONWIDTH";
5197 case WM_USER
+1000+60: return "TB_SETMAXTEXTROWS";
5198 case WM_USER
+1000+61: return "TB_GETTEXTROWS";
5199 case WM_USER
+1000+41: return "TB_GETBITMAPFLAGS";
5202 static char s_szBuf
[128];
5203 sprintf(s_szBuf
, "<unknown message = %d>", nMessage
);
5206 } // end of wxGetMessageName
5208 #endif // __WXDEBUG__
5212 static void TranslateKbdEventToMouse(
5220 // Construct the key mask
5221 ULONG
& fwKeys
= *pFlags
;
5223 fwKeys
= VK_BUTTON2
;
5224 if ((::WinGetKeyState(HWND_DESKTOP
, VK_CTRL
) & 0x100) != 0)
5226 if ((::WinGetKeyState(HWND_DESKTOP
, VK_SHIFT
) & 0x100) != 0)
5230 // Simulate right mouse button click
5234 ::WinQueryMsgPos(vHabmain
, &vPoint
);
5238 pWin
->ScreenToClient(pX
, pY
);
5239 } // end of TranslateKbdEventToMouse
5242 // Find the wxWindow at the current mouse position, returning the mouse
5244 wxWindow
* wxFindWindowAtPointer(
5245 wxPoint
& WXUNUSED(rPt
)
5248 return wxFindWindowAtPoint(wxGetMousePosition());
5251 wxWindow
* wxFindWindowAtPoint(
5260 HWND hWndHit
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt2
, FALSE
);
5261 wxWindow
* pWin
= wxFindWinFromHandle((WXHWND
)hWndHit
) ;
5262 HWND hWnd
= hWndHit
;
5265 // Try to find a window with a wxWindow associated with it
5267 while (!pWin
&& (hWnd
!= 0))
5269 hWnd
= ::WinQueryWindow(hWnd
, QW_PARENT
);
5270 pWin
= wxFindWinFromHandle((WXHWND
)hWnd
) ;
5275 // Get the current mouse position.
5276 wxPoint
wxGetMousePosition()
5280 ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
);
5281 return wxPoint(vPt
.x
, vPt
.y
);
5284 wxWindowOS2
* FindWindowForMouseEvent( wxWindow
* pWin
,
5285 short* WXUNUSED(pnX
),
5286 short* WXUNUSED(pnY
) )
5288 HWND hWnd
= GetHwndOf(pWin
);
5289 HWND hWndUnderMouse
;
5291 BOOL rcEnabled
= FALSE
;
5292 BOOL rcVisible
= FALSE
;
5294 ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
);
5295 hWndUnderMouse
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, TRUE
);
5296 if (hWndUnderMouse
!= HWND_DESKTOP
)
5298 wxWindow
* pWinUnderMouse
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
);
5302 wxWindowList::compatibility_iterator current
= pWinUnderMouse
->GetChildren().GetFirst();
5303 wxWindow
* pGrandChild
= NULL
;
5307 ::WinMapWindowPoints(HWND_DESKTOP
, hWndUnderMouse
, &vPoint
, 1);
5309 // Find a child window mouse might be under
5313 wxWindow
* pChild
= current
->GetData();
5315 vPoint2
.x
= vPoint
.x
;
5316 vPoint2
.y
= vPoint
.y
;
5317 ::WinMapWindowPoints(hWndUnderMouse
, pChild
->GetHWND(), &vPoint2
, 1);
5318 ::WinQueryWindowRect(pChild
->GetHWND(), &vRect
);
5319 if (::WinPtInRect(vHabmain
, &vRect
, &vPoint2
))
5321 if (pChild
->IsTopLevel())
5324 wxWindowList::compatibility_iterator current2
=pChild
->GetChildren().GetFirst();
5328 wxWindow
* pGrandChild
= current2
->GetData();
5330 vPoint3
.x
= vPoint2
.x
;
5331 vPoint3
.y
= vPoint2
.y
;
5332 ::WinMapWindowPoints( pChild
->GetHWND()
5333 ,pGrandChild
->GetHWND()
5337 ::WinQueryWindowRect(pGrandChild
->GetHWND(), &vRect
);
5338 if (::WinPtInRect(vHabmain
, &vRect
, &vPoint3
))
5340 hWndUnderMouse
= GetHwndOf(pGrandChild
);
5341 pWinUnderMouse
= pGrandChild
;
5344 current2
= current2
->GetNext();
5349 hWndUnderMouse
= GetHwndOf(pChild
);
5350 pWinUnderMouse
= pChild
;
5351 rcVisible
= ::WinIsWindowVisible(hWndUnderMouse
);
5352 rcEnabled
= ::WinIsWindowEnabled(hWndUnderMouse
);
5353 if (rcVisible
&& rcEnabled
)
5356 current
= current
->GetNext();
5360 rcVisible
= ::WinIsWindowVisible(hWndUnderMouse
);
5361 rcEnabled
= ::WinIsWindowEnabled(hWndUnderMouse
);
5365 // Check that we have a child window which is susceptible to receive mouse
5366 // events: for this it must be shown and enabled
5368 if ( hWndUnderMouse
&&
5369 hWndUnderMouse
!= hWnd
&&
5370 rcVisible
&& rcEnabled
)
5372 wxWindow
* pWinUnderMouse
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
);
5377 // Translate the mouse coords to the other window coords
5379 pWin
= pWinUnderMouse
;
5383 } // end of FindWindowForMouseEvent