1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/os2/window.cpp
4 // Author: David Webster
8 // Copyright: (c) David Webster
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 // For compilers that support precompilation, includes "wx.h".
15 #include "wx/wxprec.h"
21 #include "wx/window.h"
26 #include "wx/dcclient.h"
30 #include "wx/layout.h"
31 #include "wx/checkbox.h"
32 #include "wx/combobox.h"
33 #include "wx/dialog.h"
35 #include "wx/listbox.h"
36 #include "wx/button.h"
37 #include "wx/bmpbuttn.h"
38 #include "wx/msgdlg.h"
39 #include "wx/scrolwin.h"
40 #include "wx/radiobox.h"
41 #include "wx/radiobut.h"
42 #include "wx/slider.h"
43 #include "wx/statbox.h"
44 #include "wx/statusbr.h"
45 #include "wx/toolbar.h"
46 #include "wx/settings.h"
51 #include "wx/ownerdrw.h"
54 #if wxUSE_DRAG_AND_DROP
58 #include "wx/menuitem.h"
61 #include "wx/os2/private.h"
64 #include "wx/tooltip.h"
68 #include "wx/notebook.h"
79 #include "wx/textctrl.h"
84 // Place compiler, OS specific includes here
88 // Standard macros -- these are for OS/2 PM, but most GUI's have something similar
92 // SHORT1FROMMP -- LOWORD
94 #define GET_X_LPARAM(mp) ((unsigned short)(unsigned long)(mp))
96 // SHORT2FROMMP -- HIWORD
98 #define GET_Y_LPARAM(mp) ((unsigned short)(unsigned long)(mp >> 16))
99 #endif // GET_X_LPARAM
101 #ifndef CW_USEDEFAULT
102 # define CW_USEDEFAULT ((int)0x80000000)
106 #define VK_OEM_1 0xBA
107 #define VK_OEM_PLUS 0xBB
108 #define VK_OEM_COMMA 0xBC
109 #define VK_OEM_MINUS 0xBD
110 #define VK_OEM_PERIOD 0xBE
111 #define VK_OEM_2 0xBF
112 #define VK_OEM_3 0xC0
113 #define VK_OEM_4 0xDB
114 #define VK_OEM_5 0xDC
115 #define VK_OEM_6 0xDD
116 #define VK_OEM_7 0xDE
119 // ---------------------------------------------------------------------------
121 // ---------------------------------------------------------------------------
124 // The last PM message we got (MT-UNSAFE)
128 #if wxUSE_MENUS_NATIVE
129 wxMenu
* wxCurrentPopupMenu
= NULL
;
130 #endif // wxUSE_MENUS_NATIVE
132 // ---------------------------------------------------------------------------
134 // ---------------------------------------------------------------------------
137 // the window proc for all our windows; most gui's have something similar
139 MRESULT EXPENTRY
wxWndProc( HWND hWnd
146 const wxChar
*wxGetMessageName(int message
);
149 wxWindowOS2
* FindWindowForMouseEvent( wxWindow
* pWin
153 void wxRemoveHandleAssociation(wxWindowOS2
* pWin
);
154 void wxAssociateWinWithHandle( HWND hWnd
157 wxWindow
* wxFindWinFromHandle(WXHWND hWnd
);
160 // get the current state of SHIFT/CTRL keys
162 static inline bool IsShiftDown() { return (::WinGetKeyState(HWND_DESKTOP
, VK_SHIFT
) & 0x8000) != 0; }
163 static inline bool IsCtrlDown() { return (::WinGetKeyState(HWND_DESKTOP
, VK_CTRL
) & 0x8000) != 0; }
165 static wxWindow
* gpWinBeingCreated
= NULL
;
167 // ---------------------------------------------------------------------------
169 // ---------------------------------------------------------------------------
171 // in wxUniv-OS/2 this class is abstract because it doesn't have DoPopupMenu()
173 #ifdef __WXUNIVERSAL__
174 IMPLEMENT_ABSTRACT_CLASS(wxWindowOS2
, wxWindowBase
)
176 IMPLEMENT_DYNAMIC_CLASS(wxWindow
, wxWindowBase
)
177 #endif // __WXUNIVERSAL__/__WXPM__
179 BEGIN_EVENT_TABLE(wxWindowOS2
, wxWindowBase
)
180 EVT_ERASE_BACKGROUND(wxWindowOS2::OnEraseBackground
)
181 EVT_SYS_COLOUR_CHANGED(wxWindowOS2::OnSysColourChanged
)
182 EVT_IDLE(wxWindowOS2::OnIdle
)
183 EVT_SET_FOCUS(wxWindowOS2::OnSetFocus
)
186 // ===========================================================================
188 // ===========================================================================
190 // ---------------------------------------------------------------------------
191 // wxWindow utility functions
192 // ---------------------------------------------------------------------------
195 // Find an item given the PM Window id
197 wxWindow
* wxWindowOS2::FindItem(
202 wxControl
* pItem
= wxDynamicCast(this, wxControl
);
207 // I it we or one of our "internal" children?
209 if (pItem
->GetId() == lId
210 #ifndef __WXUNIVERSAL__
211 || (pItem
->GetSubcontrols().Index(lId
) != wxNOT_FOUND
)
218 #endif // wxUSE_CONTROLS
220 wxWindowList::compatibility_iterator current
= GetChildren().GetFirst();
224 wxWindow
* pChildWin
= current
->GetData();
225 wxWindow
* pWnd
= pChildWin
->FindItem(lId
);
230 current
= current
->GetNext();
233 } // end of wxWindowOS2::FindItem
236 // Find an item given the PM Window handle
238 wxWindow
* wxWindowOS2::FindItemByHWND(
243 wxWindowList::compatibility_iterator current
= GetChildren().GetFirst();
247 wxWindow
* pParent
= current
->GetData();
250 // Do a recursive search.
252 wxWindow
* pWnd
= pParent
->FindItemByHWND(hWnd
);
259 || pParent
->IsKindOf(CLASSINFO(wxControl
))
260 #endif // wxUSE_CONTROLS
263 wxWindow
* pItem
= current
->GetData();
265 if (pItem
->GetHWND() == hWnd
)
269 if (pItem
->ContainsHWND(hWnd
))
273 current
= current
->GetNext();
276 } // end of wxWindowOS2::FindItemByHWND
279 // Default command handler
281 bool wxWindowOS2::OS2Command( WXUINT
WXUNUSED(uParam
),
282 WXWORD
WXUNUSED(uId
) )
287 // ----------------------------------------------------------------------------
288 // constructors and such
289 // ----------------------------------------------------------------------------
291 void wxWindowOS2::Init()
296 m_bWinCaptured
= false;
298 m_fnOldWndProc
= NULL
;
300 m_bMouseInWindow
= false;
301 m_bLastKeydownProcessed
= false;
302 m_pChildrenDisabled
= NULL
;
309 m_hWndScrollBarHorz
= 0L;
310 m_hWndScrollBarVert
= 0L;
312 memset(&m_vWinSwp
, '\0', sizeof (SWP
));
315 // Pass WM_GETDLGCODE to DefWindowProc()
321 m_bBackgroundTransparent
= false;
324 // As all windows are created with WS_VISIBLE style...
328 #if wxUSE_MOUSEEVENT_HACK
331 m_nLastMouseEvent
= -1;
332 #endif // wxUSE_MOUSEEVENT_HACK
333 } // wxWindowOS2::Init
338 wxWindowOS2::~wxWindowOS2()
340 m_isBeingDeleted
= true;
342 for (wxWindow
* pWin
= GetParent(); pWin
; pWin
= pWin
->GetParent())
344 wxTopLevelWindow
* pFrame
= wxDynamicCast(pWin
, wxTopLevelWindow
);
348 if (pFrame
->GetLastFocus() == this)
349 pFrame
->SetLastFocus(NULL
);
357 if(!::WinDestroyWindow(GetHWND()))
358 wxLogLastError(wxT("DestroyWindow"));
360 // remove hWnd <-> wxWindow association
362 wxRemoveHandleAssociation(this);
364 delete m_pChildrenDisabled
;
365 } // end of wxWindowOS2::~wxWindowOS2
367 // real construction (Init() must have been called before!)
368 bool wxWindowOS2::Create( wxWindow
* pParent
,
373 const wxString
& rName
)
375 HWND hParent
= NULLHANDLE
;
376 ULONG ulCreateFlags
= 0;
377 WXDWORD dwExStyle
= 0;
379 wxCHECK_MSG(pParent
, false, wxT("can't create wxWindow without parent"));
383 // wxGTK doesn't allow to create controls with static box as the parent so
384 // this will result in a crash when the program is ported to wxGTK - warn
387 // the correct solution is to create the controls as siblings of the
390 wxASSERT_MSG( !wxDynamicCast(pParent
, wxStaticBox
),
391 _T("wxStaticBox can't be used as a window parent!") );
392 #endif // wxUSE_STATBOX
394 // Ensure groupbox backgrounds are painted
395 if (IsKindOf(CLASSINFO(wxPanel
)))
396 lStyle
&= ~wxCLIP_CHILDREN
;
398 if ( !CreateBase( pParent
410 pParent
->AddChild(this);
411 hParent
= GetWinHwnd(pParent
);
413 if (pParent
->IsKindOf(CLASSINFO(wxScrolledWindow
)))
414 ulCreateFlags
|= WS_CLIPSIBLINGS
;
418 // Most wxSTYLES are really PM Class specific styles and will be
419 // set in those class create procs. PM's basic windows styles are
422 ulCreateFlags
|= OS2GetCreateWindowFlags(&dwExStyle
);
425 #ifdef __WXUNIVERSAL__
426 // no 3d effects, we draw them ourselves
428 #endif // !wxUniversal
429 if (lStyle
& wxPOPUP_WINDOW
)
431 ulCreateFlags
&= ~WS_VISIBLE
;
436 ulCreateFlags
|= WS_VISIBLE
;
440 // Generic OS/2 Windows have no Control Data but other classes
441 // that call OS2Create may have some.
443 return(OS2Create( (PSZ
)wxCanvasClassName
448 ,NULL
// Control Data
452 } // end of wxWindowOS2::Create
454 // ---------------------------------------------------------------------------
456 // ---------------------------------------------------------------------------
458 void wxWindowOS2::SetFocus()
460 HWND hWnd
= GetHwnd();
461 wxCHECK_RET( hWnd
, _T("can't set focus to invalid window") );
464 ::WinSetFocus(HWND_DESKTOP
, hWnd
);
465 } // end of wxWindowOS2::SetFocus
467 void wxWindowOS2::SetFocusFromKbd()
470 // Nothing else to do under OS/2
472 wxWindowBase::SetFocusFromKbd();
473 } // end of wxWindowOS2::SetFocus
475 wxWindow
* wxWindowBase::DoFindFocus()
477 HWND hWnd
= ::WinQueryFocus(HWND_DESKTOP
);
481 return wxFindWinFromHandle((WXHWND
)hWnd
);
484 } // wxWindowBase::DoFindFocus
486 bool wxWindowOS2::Enable( bool bEnable
)
488 if (!wxWindowBase::Enable(bEnable
))
491 HWND hWnd
= GetHwnd();
494 ::WinEnableWindow(hWnd
, (BOOL
)bEnable
);
497 // The logic below doesn't apply to the top level windows -- otherwise
498 // showing a modal dialog would result in total greying out (and ungreying
499 // out later) of everything which would be really ugly
504 wxWindowList::compatibility_iterator node
= GetChildren().GetFirst();
508 wxWindow
* pChild
= node
->GetData();
513 // Enable the child back unless it had been disabled before us
515 if (!m_pChildrenDisabled
|| !m_pChildrenDisabled
->Find(pChild
))
518 else // we're being disabled
520 if (pChild
->IsEnabled())
523 // Disable it as children shouldn't stay enabled while the
528 else // child already disabled, remember it
531 // Have we created the list of disabled children already?
533 if (!m_pChildrenDisabled
)
534 m_pChildrenDisabled
= new wxWindowList
;
535 m_pChildrenDisabled
->Append(pChild
);
538 node
= node
->GetNext();
540 if (bEnable
&& m_pChildrenDisabled
)
543 // We don't need this list any more, don't keep unused memory
545 delete m_pChildrenDisabled
;
546 m_pChildrenDisabled
= NULL
;
549 } // end of wxWindowOS2::Enable
551 bool wxWindowOS2::Show( bool bShow
)
553 if (!wxWindowBase::Show(bShow
))
556 HWND hWnd
= GetHwnd();
558 ::WinShowWindow(hWnd
, bShow
);
562 ::WinSetWindowPos(hWnd
, HWND_TOP
, 0, 0, 0, 0, SWP_ACTIVATE
| SWP_ZORDER
);
565 } // end of wxWindowOS2::Show
567 void wxWindowOS2::Raise()
569 ::WinSetWindowPos(GetHwnd(), HWND_TOP
, 0, 0, 0, 0, SWP_ZORDER
| SWP_ACTIVATE
);
570 } // end of wxWindowOS2::Raise
572 void wxWindowOS2::Lower()
574 ::WinSetWindowPos(GetHwnd(), HWND_BOTTOM
, 0, 0, 0, 0, SWP_ZORDER
| SWP_DEACTIVATE
);
575 } // end of wxWindowOS2::Lower
577 void wxWindowOS2::SetLabel( const wxString
& label
)
579 ::WinSetWindowText(GetHwnd(), (PSZ
)label
.c_str());
580 } // end of wxWindowOS2::SetLabel
582 wxString
wxWindowOS2::GetLabel() const
584 return wxGetWindowText(GetHWND());
585 } // end of wxWindowOS2::GetLabel
587 void wxWindowOS2::DoCaptureMouse()
589 HWND hWnd
= GetHwnd();
591 if (hWnd
&& !m_bWinCaptured
)
593 ::WinSetCapture(HWND_DESKTOP
, hWnd
);
594 m_bWinCaptured
= true;
596 } // end of wxWindowOS2::DoCaptureMouse
598 void wxWindowOS2::DoReleaseMouse()
602 ::WinSetCapture(HWND_DESKTOP
, NULLHANDLE
);
603 m_bWinCaptured
= false;
605 } // end of wxWindowOS2::ReleaseMouse
607 /* static */ wxWindow
* wxWindowBase::GetCapture()
609 HWND hwnd
= ::WinQueryCapture(HWND_DESKTOP
);
610 return hwnd
? wxFindWinFromHandle((WXHWND
)hwnd
) : (wxWindow
*)NULL
;
611 } // end of wxWindowBase::GetCapture
613 bool wxWindowOS2::SetFont( const wxFont
& rFont
)
615 if (!wxWindowBase::SetFont(rFont
))
621 HWND hWnd
= GetHwnd();
623 wxOS2SetFont( hWnd
, rFont
);
625 } // end of wxWindowOS2::SetFont
627 // check if base implementation is OK
628 bool wxWindowOS2::SetCursor( const wxCursor
& rCursor
)
630 if ( !wxWindowBase::SetCursor(rCursor
))
636 if ( m_cursor
.Ok() ) {
637 HWND hWnd
= GetHwnd();
641 ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
);
642 ::WinQueryWindowRect(hWnd
, &vRect
);
644 if (::WinPtInRect(vHabmain
, &vRect
, &vPoint
) && !wxIsBusy())
646 ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)m_cursor
.GetHCURSOR());
650 } // end of wxWindowOS2::SetCursor
652 void wxWindowOS2::WarpPointer(
661 ::WinQueryWindowRect(GetHwnd(), &vRect
);
665 ::WinSetPointerPos(HWND_DESKTOP
, (LONG
)nX
, (LONG
)(nY
));
666 } // end of wxWindowOS2::WarpPointer
669 // ---------------------------------------------------------------------------
671 // ---------------------------------------------------------------------------
673 int wxWindowOS2::GetScrollPos(
677 if (nOrient
== wxHORIZONTAL
)
678 return((int)::WinSendMsg(m_hWndScrollBarHorz
, SBM_QUERYPOS
, (MPARAM
)NULL
, (MPARAM
)NULL
));
680 return((int)::WinSendMsg(m_hWndScrollBarVert
, SBM_QUERYPOS
, (MPARAM
)NULL
, (MPARAM
)NULL
));
681 } // end of wxWindowOS2::GetScrollPos
683 int wxWindowOS2::GetScrollRange(
689 if (nOrient
== wxHORIZONTAL
)
690 mr
= ::WinSendMsg(m_hWndScrollBarHorz
, SBM_QUERYRANGE
, (MPARAM
)NULL
, (MPARAM
)NULL
);
692 mr
= ::WinSendMsg(m_hWndScrollBarVert
, SBM_QUERYRANGE
, (MPARAM
)NULL
, (MPARAM
)NULL
);
693 return((int)SHORT2FROMMR(mr
));
694 } // end of wxWindowOS2::GetScrollRange
696 int wxWindowOS2::GetScrollThumb(
700 if (nOrient
== wxHORIZONTAL
)
701 return m_nXThumbSize
;
703 return m_nYThumbSize
;
704 } // end of wxWindowOS2::GetScrollThumb
706 void wxWindowOS2::SetScrollPos(
709 , bool WXUNUSED(bRefresh
)
712 if (nOrient
== wxHORIZONTAL
)
713 ::WinSendMsg(m_hWndScrollBarHorz
, SBM_SETPOS
, (MPARAM
)nPos
, (MPARAM
)NULL
);
715 ::WinSendMsg(m_hWndScrollBarVert
, SBM_SETPOS
, (MPARAM
)nPos
, (MPARAM
)NULL
);
716 } // end of wxWindowOS2::SetScrollPos
718 void wxWindowOS2::SetScrollbar( int nOrient
,
722 bool WXUNUSED(bRefresh
) )
724 HWND hWnd
= GetHwnd();
725 int nOldRange
= nRange
- nThumbVisible
;
726 int nRange1
= nOldRange
;
727 int nPageSize
= nThumbVisible
;
728 int nVSBWidth
= wxSystemSettingsNative::GetMetric(wxSYS_VSCROLL_X
,
730 int nHSBHeight
= wxSystemSettingsNative::GetMetric(wxSYS_HSCROLL_Y
,
734 ULONG ulStyle
= WS_VISIBLE
| WS_SYNCPAINT
;
739 wxWindow
* pParent
= GetParent();
741 if (pParent
&& pParent
->IsKindOf(CLASSINFO(wxFrame
)))
745 pFrame
= wxDynamicCast(pParent
, wxFrame
);
746 hWndParent
= pFrame
->GetFrame();
747 hWndClient
= GetHwndOf(pParent
);
752 hWndParent
= GetHwndOf(pParent
);
754 hWndParent
= GetHwnd();
755 hWndClient
= hWndParent
;
757 ::WinQueryWindowPos(hWndClient
, &vSwp
);
758 ::WinQueryWindowPos(hWnd
, &vSwpOwner
);
760 if (nPageSize
> 1 && nRange
> 0)
762 nRange1
+= (nPageSize
- 1);
765 vInfo
.cb
= sizeof(SBCDATA
);
767 vInfo
.posLast
= (SHORT
)nRange1
;
768 vInfo
.posThumb
= (SHORT
)nPos
;
770 if (nOrient
== wxHORIZONTAL
)
773 if (m_hWndScrollBarHorz
== 0L)
776 // Since the scrollbars are usually created before the owner is
777 // sized either via an OnSize event directly or via sizers or
778 // layout constraints, we will initially just use the coords of
779 // the parent window (this is usually a frame client window). But
780 // the bars themselves, are children of the parent frame (i.e
781 // siblings of the frame client. The owner, however is the actual
782 // window being scrolled (or at least the one responsible for
783 // handling the scroll events). The owner will be resized later,
784 // as it is usually a child of a top level window, and when that
785 // is done its scrollbars will be resized and repositioned as well.
787 m_hWndScrollBarHorz
= ::WinCreateWindow( hWndParent
805 // The owner (the scrolled window) is a child of the Frame's
806 // client window, usually. The scrollbars are children of the
807 // frame, itself, and thus are positioned relative to the frame's
808 // origin, not the frame's client window origin.
809 // The starting x position is the same as the starting x position
810 // of the owner, but in terms of the parent frame.
811 // The starting y position is wxSYS_HSCROLL_Y pels below the
812 // origin of the owner in terms of the parent frame.
813 // The horz bar is the same width as the owner and wxSYS_HSCROLL_Y
816 if (nRange1
>= nThumbVisible
)
818 ::WinSetWindowPos( m_hWndScrollBarHorz
820 ,vSwp
.x
+ vSwpOwner
.x
821 ,(vSwp
.y
+ vSwpOwner
.y
) - nHSBHeight
824 ,SWP_MOVE
| SWP_SIZE
| SWP_SHOW
| SWP_ACTIVATE
| SWP_ZORDER
826 ::WinSendMsg( m_hWndScrollBarHorz
829 ,MPFROM2SHORT(0, (SHORT
)nRange1
)
831 ::WinSendMsg( m_hWndScrollBarHorz
833 ,MPFROM2SHORT( (SHORT
)nThumbVisible
840 ::WinShowWindow(m_hWndScrollBarHorz
, FALSE
);
846 if (m_hWndScrollBarVert
== 0L)
849 // Since the scrollbars are usually created before the owner is
850 // sized either via an OnSize event directly or via sizers or
851 // layout constraints, we will initially just use the coords of
852 // the parent window (this is usually a frame client window). But
853 // the bars themselves, are children of the parent frame (i.e
854 // siblings of the frame client. The owner, however is the actual
855 // window being scrolled (or at least the one responsible for
856 // handling the scroll events). The owner will be resized later,
857 // as it is usually a child of a top level window, and when that
858 // is done its scrollbars will be resized and repositioned as well.
860 m_hWndScrollBarVert
= ::WinCreateWindow( hWndParent
864 ,vSwp
.x
+ vSwp
.cx
- nVSBWidth
867 ,vSwp
.cy
- nHSBHeight
878 // The owner (the scrolled window) is a child of the Frame's
879 // client window, usually. The scrollbars are children of the
880 // frame, itself and thus are positioned relative to the frame's
881 // origin, not the frame's client window's origin.
882 // Thus, the x position will be frame client's x (usually a few
883 // pels inside the parent frame, plus the width of the owner.
884 // Since we may be using sizers or layout constraints for multiple
885 // child scrolled windows, the y position will be the frame client's
886 // y pos plus the scrolled windows y position, yielding the y
887 // position of the scrollbar relative to the parent frame (the vert
888 // scrollbar is on the right and starts at the bottom of the
890 // It is wxSYS_VSCROLL_X pels wide and the same height as the owner.
892 if (nRange1
>= nThumbVisible
)
894 ::WinSetWindowPos( m_hWndScrollBarVert
896 ,vSwp
.x
+ vSwpOwner
.x
+ vSwpOwner
.cx
897 ,vSwp
.y
+ vSwpOwner
.y
900 ,SWP_ACTIVATE
| SWP_MOVE
| SWP_SIZE
| SWP_SHOW
902 ::WinSendMsg( m_hWndScrollBarVert
905 ,MPFROM2SHORT(0, (SHORT
)nRange1
)
907 ::WinSendMsg( m_hWndScrollBarVert
909 ,MPFROM2SHORT( (SHORT
)nThumbVisible
916 ::WinShowWindow(m_hWndScrollBarVert
, FALSE
);
918 m_nYThumbSize
= nThumbVisible
;
920 } // end of wxWindowOS2::SetScrollbar
923 void wxWindowOS2::ScrollWindow( int nDx
,
925 const wxRect
* pRect
)
929 ::WinQueryWindowRect(GetHwnd(), &vRect
);
930 int height
= vRect
.yTop
;
933 vRect
.xLeft
= pRect
->x
;
934 vRect
.yTop
= height
- pRect
->y
;
935 vRect
.xRight
= pRect
->x
+ pRect
->width
;
936 vRect
.yBottom
= vRect
.yTop
- pRect
->height
;
938 nDy
*= -1; // flip the sign of Dy as OS/2 is opposite Windows.
939 ::WinScrollWindow( GetHwnd()
946 ,SW_SCROLLCHILDREN
| SW_INVALIDATERGN
948 } // end of wxWindowOS2::ScrollWindow
950 // ---------------------------------------------------------------------------
952 // ---------------------------------------------------------------------------
954 void wxWindowOS2::SubclassWin(
958 HWND hwnd
= (HWND
)hWnd
;
960 wxCHECK_RET(::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in SubclassWin") );
961 wxAssociateWinWithHandle( hWnd
964 if (!wxCheckWindowWndProc( hWnd
965 ,(WXFARPROC
)wxWndProc
968 m_fnOldWndProc
= (WXFARPROC
) ::WinSubclassWindow(hwnd
, (PFNWP
)wxWndProc
);
972 m_fnOldWndProc
= (WXFARPROC
)NULL
;
974 } // end of wxWindowOS2::SubclassWin
976 void wxWindowOS2::UnsubclassWin()
979 // Restore old Window proc
981 HWND hwnd
= GetHWND();
985 wxCHECK_RET( ::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in UnsubclassWin") );
987 PFNWP fnProc
= (PFNWP
)::WinQueryWindowPtr(hwnd
, QWP_PFNWP
);
989 if ( (m_fnOldWndProc
!= 0) && (fnProc
!= (PFNWP
) m_fnOldWndProc
))
991 WinSubclassWindow(hwnd
, (PFNWP
)m_fnOldWndProc
);
995 } // end of wxWindowOS2::UnsubclassWin
997 bool wxCheckWindowWndProc(
999 , WXFARPROC fnWndProc
1002 static char zBuffer
[512];
1005 ::WinQueryClassName((HWND
)hWnd
, (LONG
)512, (PCH
)zBuffer
);
1006 ::WinQueryClassInfo(wxGetInstance(), (PSZ
)zBuffer
, &vCls
);
1007 return(fnWndProc
== (WXFARPROC
)vCls
.pfnWindowProc
);
1008 } // end of WinGuiBase_CheckWindowWndProc
1010 void wxWindowOS2::SetWindowStyleFlag(
1014 long lFlagsOld
= GetWindowStyleFlag();
1016 if (lFlags
== lFlagsOld
)
1020 // Update the internal variable
1022 wxWindowBase::SetWindowStyleFlag(lFlags
);
1025 // Now update the Windows style as well if needed - and if the window had
1026 // been already created
1032 WXDWORD dwExstyleOld
;
1033 long lStyle
= OS2GetStyle( lFlags
1036 long lStyleOld
= OS2GetStyle( lFlagsOld
1040 if (lStyle
!= lStyleOld
)
1043 // Some flags (e.g. WS_VISIBLE or WS_DISABLED) should not be changed by
1044 // this function so instead of simply setting the style to the new
1045 // value we clear the bits which were set in styleOld but are set in
1046 // the new one and set the ones which were not set before
1048 long lStyleReal
= ::WinQueryWindowULong(GetHwnd(), QWL_STYLE
);
1050 lStyleReal
&= ~lStyleOld
;
1051 lStyleReal
|= lStyle
;
1053 ::WinSetWindowULong(GetHwnd(), QWL_STYLE
, lStyleReal
);
1055 } // end of wxWindowOS2::SetWindowStyleFlag
1057 WXDWORD
wxWindowOS2::OS2GetStyle( long lFlags
,
1058 WXDWORD
* WXUNUSED(pdwExstyle
) ) const
1060 WXDWORD dwStyle
= 0L;
1062 if (lFlags
& wxCLIP_CHILDREN
)
1063 dwStyle
|= WS_CLIPCHILDREN
;
1065 if (lFlags
& wxCLIP_SIBLINGS
)
1066 dwStyle
|= WS_CLIPSIBLINGS
;
1069 } // end of wxWindowOS2::OS2GetStyle
1072 // Make a Windows extended style from the given wxWidgets window style
1074 WXDWORD
wxWindowOS2::MakeExtendedStyle(
1076 , bool bEliminateBorders
1080 // Simply fill out with wxWindow extended styles. We'll conjure
1081 // something up in OS2Create and all window redrawing pieces later
1083 WXDWORD dwStyle
= 0;
1085 if (lStyle
& wxTRANSPARENT_WINDOW
)
1086 dwStyle
|= wxTRANSPARENT_WINDOW
;
1088 if (!bEliminateBorders
)
1090 if (lStyle
& wxSUNKEN_BORDER
)
1091 dwStyle
|= wxSUNKEN_BORDER
;
1092 if (lStyle
& wxDOUBLE_BORDER
)
1093 dwStyle
|= wxDOUBLE_BORDER
;
1094 if (lStyle
& wxRAISED_BORDER
)
1095 dwStyle
|= wxRAISED_BORDER
;
1096 if (lStyle
& wxSTATIC_BORDER
)
1097 dwStyle
|= wxSTATIC_BORDER
;
1100 } // end of wxWindowOS2::MakeExtendedStyle
1103 // Setup background and foreground colours correctly
1105 void wxWindowOS2::SetupColours()
1108 SetBackgroundColour(GetParent()->GetBackgroundColour());
1109 } // end of wxWindowOS2::SetupColours
1111 void wxWindowOS2::OnIdle(
1112 wxIdleEvent
& WXUNUSED(rEvent
)
1116 // Check if we need to send a LEAVE event
1118 if (m_bMouseInWindow
)
1122 ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
);
1123 if (::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, FALSE
) != (HWND
)GetHwnd())
1126 // Generate a LEAVE event
1128 m_bMouseInWindow
= false;
1131 // Unfortunately the mouse button and keyboard state may have changed
1132 // by the time the OnIdle function is called, so 'state' may be
1142 wxMouseEvent
rEvent(wxEVT_LEAVE_WINDOW
);
1144 InitMouseEvent( rEvent
1149 (void)GetEventHandler()->ProcessEvent(rEvent
);
1152 if (wxUpdateUIEvent::CanUpdate(this))
1153 UpdateWindowUI(wxUPDATE_UI_FROMIDLE
);
1154 } // end of wxWindowOS2::OnIdle
1157 // Set this window to be the child of 'parent'.
1159 bool wxWindowOS2::Reparent( wxWindow
* pParent
)
1161 if (!wxWindowBase::Reparent(pParent
))
1164 HWND hWndChild
= GetHwnd();
1165 HWND hWndParent
= GetParent() ? GetWinHwnd(GetParent()) : (HWND
)0;
1167 ::WinSetParent(hWndChild
, hWndParent
, TRUE
);
1169 } // end of wxWindowOS2::Reparent
1171 void wxWindowOS2::Update()
1173 ::WinUpdateWindow(GetHwnd());
1174 } // end of wxWindowOS2::Update
1176 void wxWindowOS2::Freeze()
1178 ::WinSendMsg(GetHwnd(), WM_VRNDISABLED
, (MPARAM
)0, (MPARAM
)0);
1179 } // end of wxWindowOS2::Freeze
1181 void wxWindowOS2::Thaw()
1183 ::WinSendMsg(GetHwnd(), WM_VRNENABLED
, (MPARAM
)TRUE
, (MPARAM
)0);
1186 // We need to refresh everything or otherwise he invalidated area is not
1190 } // end of wxWindowOS2::Thaw
1192 void wxWindowOS2::Refresh( bool bEraseBack
,
1193 const wxRect
* pRect
)
1195 HWND hWnd
= GetHwnd();
1204 ::WinQueryWindowRect(GetHwnd(), &vOs2Rect
);
1205 height
= vOs2Rect
.yTop
;
1206 vOs2Rect
.xLeft
= pRect
->x
;
1207 vOs2Rect
.yTop
= height
- pRect
->y
;
1208 vOs2Rect
.xRight
= pRect
->x
+ pRect
->width
;
1209 vOs2Rect
.yBottom
= vOs2Rect
.yTop
- pRect
->height
;
1211 ::WinInvalidateRect(hWnd
, &vOs2Rect
, bEraseBack
);
1214 ::WinInvalidateRect(hWnd
, NULL
, bEraseBack
);
1215 if (m_hWndScrollBarHorz
!= NULLHANDLE
)
1216 ::WinInvalidateRect(m_hWndScrollBarHorz
, NULL
, TRUE
);
1217 if (m_hWndScrollBarVert
!= NULLHANDLE
)
1218 ::WinInvalidateRect(m_hWndScrollBarVert
, NULL
, TRUE
);
1220 } // end of wxWindowOS2::Refresh
1222 // ---------------------------------------------------------------------------
1224 // ---------------------------------------------------------------------------
1226 #if wxUSE_DRAG_AND_DROP
1227 void wxWindowOS2::SetDropTarget(
1228 wxDropTarget
* pDropTarget
1231 m_dropTarget
= pDropTarget
;
1232 } // end of wxWindowOS2::SetDropTarget
1236 // old style file-manager drag&drop support: we retain the old-style
1237 // DragAcceptFiles in parallel with SetDropTarget.
1239 void wxWindowOS2::DragAcceptFiles(
1243 HWND hWnd
= GetHwnd();
1245 if (hWnd
&& bAccept
)
1246 ::DrgAcceptDroppedFiles(hWnd
, NULL
, NULL
, DO_COPY
, 0L);
1247 } // end of wxWindowOS2::DragAcceptFiles
1249 // ----------------------------------------------------------------------------
1251 // ----------------------------------------------------------------------------
1255 void wxWindowOS2::DoSetToolTip(
1259 wxWindowBase::DoSetToolTip(pTooltip
);
1262 m_tooltip
->SetWindow(this);
1263 } // end of wxWindowOS2::DoSetToolTip
1265 #endif // wxUSE_TOOLTIPS
1267 // ---------------------------------------------------------------------------
1268 // moving and resizing
1269 // ---------------------------------------------------------------------------
1272 void wxWindowOS2::DoGetSize(
1280 if (IsKindOf(CLASSINFO(wxFrame
)))
1282 wxFrame
* pFrame
= wxDynamicCast(this, wxFrame
);
1283 hWnd
= pFrame
->GetFrame();
1288 ::WinQueryWindowRect(hWnd
, &vRect
);
1291 *pWidth
= vRect
.xRight
- vRect
.xLeft
;
1293 // OS/2 PM is backwards from windows
1294 *pHeight
= vRect
.yTop
- vRect
.yBottom
;
1295 } // end of wxWindowOS2::DoGetSize
1297 void wxWindowOS2::DoGetPosition(
1302 HWND hWnd
= GetHwnd();
1305 wxWindow
* pParent
= GetParent();
1308 // It would seem that WinQueryWindowRect would be the correlary to
1309 // the WIN32 WinGetRect, but unlike WinGetRect which returns the window
1310 // origin position in screen coordinates, WinQueryWindowRect returns it
1311 // relative to itself, i.e. (0,0). To get the same under PM we must
1312 // us WinQueryWindowPos. This call, unlike the WIN32 call, however,
1313 // returns a position relative to it's parent, so no parent adujstments
1314 // are needed under OS/2. Also, windows should be created using
1315 // wxWindow coordinates, i.e 0,0 is the TOP left so vSwp will already
1318 ::WinQueryWindowPos(hWnd
, &vSwp
);
1324 // We may be faking the client origin. So a window that's really at (0,
1325 // 30) may appear (to wxWin apps) to be at (0, 0).
1329 wxPoint
vPt(pParent
->GetClientAreaOrigin());
1339 } // end of wxWindowOS2::DoGetPosition
1341 void wxWindowOS2::DoScreenToClient(
1346 HWND hWnd
= GetHwnd();
1349 ::WinQueryWindowPos(hWnd
, &vSwp
);
1355 } // end of wxWindowOS2::DoScreenToClient
1357 void wxWindowOS2::DoClientToScreen(
1362 HWND hWnd
= GetHwnd();
1365 ::WinQueryWindowPos(hWnd
, &vSwp
);
1371 } // end of wxWindowOS2::DoClientToScreen
1374 // Get size *available for subwindows* i.e. excluding menu bar etc.
1375 // Must be a frame type window
1377 void wxWindowOS2::DoGetClientSize(
1382 HWND hWnd
= GetHwnd();
1385 ::WinQueryWindowRect(hWnd
, &vRect
);
1386 if (IsKindOf(CLASSINFO(wxDialog
)))
1391 // For a Dialog we have to explicitly request the client portion.
1392 // For a Frame the hWnd IS the client window
1394 hWndTitle
= ::WinWindowFromID(hWnd
, FID_TITLEBAR
);
1395 if (::WinQueryWindowRect(hWndTitle
, &vTitle
))
1397 if (vTitle
.yTop
- vTitle
.yBottom
== 0)
1400 // Dialog has not been created yet, use a default
1404 vRect
.yTop
-= (vTitle
.yTop
- vTitle
.yBottom
);
1407 ULONG uStyle
= ::WinQueryWindowULong(hWnd
, QWL_STYLE
);
1410 // Deal with borders
1412 if (uStyle
& FCF_DLGBORDER
)
1419 else if (uStyle
& FCF_SIZEBORDER
)
1426 else if (uStyle
& FCF_BORDER
)
1433 else // make some kind of adjustment or top sizers ram into the titlebar!
1442 *pWidth
= vRect
.xRight
- vRect
.xLeft
;
1444 *pHeight
= vRect
.yTop
- vRect
.yBottom
;
1445 } // end of wxWindowOS2::DoGetClientSize
1447 void wxWindowOS2::DoMoveWindow(
1455 wxWindow
* pParent
= GetParent();
1457 /* Due to OS/2's inverted coordinate system, changing the height
1458 of a window requires repositioning all it's children, e.g. if
1459 you want a child of height 100 to be at the top left corner of
1460 the parent you need to position the lower left corner of the
1461 child at (0, (height of parent - 100)), so, obviously, if the
1462 height of the parent changes, the child needs to be repositioned. */
1464 GetSize(0, &nHeightDelta
);
1465 nHeightDelta
= nHeight
- nHeightDelta
;
1467 if (pParent
&& !IsKindOf(CLASSINFO(wxDialog
)))
1469 int nOS2Height
= GetOS2ParentHeight(pParent
);
1471 nY
= nOS2Height
- (nY
+ nHeight
);
1477 ::WinQueryWindowRect(HWND_DESKTOP
, &vRect
);
1478 nY
= vRect
.yTop
- (nY
+ nHeight
);
1482 // In the case of a frame whose client is sized, the client cannot be
1483 // large than its parent frame minus its borders! This usually happens
1484 // when using an autosizer to size a frame to precisely hold client
1485 // controls as in the notebook sample.
1487 // In this case, we may need to resize both a frame and its client so we
1488 // need a quick calc of the frame border size, then if the frame
1489 // (less its borders) is smaller than the client, size the frame to
1490 // encompass the client with the appropriate border size.
1492 if (IsKindOf(CLASSINFO(wxFrame
)))
1496 int nWidthFrameDelta
= 0;
1497 int nHeightFrameDelta
= 0;
1498 int nHeightFrame
= 0;
1499 int nWidthFrame
= 0;
1502 pFrame
= wxDynamicCast(this, wxFrame
);
1503 hWndFrame
= pFrame
->GetFrame();
1504 ::WinQueryWindowRect(hWndFrame
, &vRect
);
1505 ::WinMapWindowPoints(hWndFrame
, HWND_DESKTOP
, (PPOINTL
)&vRect
, 2);
1507 ::WinCalcFrameRect(hWndFrame
, &vRect
, TRUE
);
1508 nWidthFrameDelta
= ((vRect
.xLeft
- vFRect
.xLeft
) + (vFRect
.xRight
- vRect
.xRight
));
1509 nHeightFrameDelta
= ((vRect
.yBottom
- vFRect
.yBottom
) + (vFRect
.yTop
- vRect
.yTop
));
1510 nWidthFrame
= vFRect
.xRight
- vFRect
.xLeft
;
1511 nHeightFrame
= vFRect
.yTop
- vFRect
.yBottom
;
1513 if (nWidth
== vFRect
.xRight
- vFRect
.xLeft
&&
1514 nHeight
== vFRect
.yTop
- vFRect
.yBottom
)
1517 // In this case the caller is not aware of OS/2's need to size both
1518 // the frame and it's client and is really only moving the window,
1519 // not resizeing it. So move the frame, and back off the sizes
1520 // for a proper client fit.
1522 ::WinSetWindowPos( hWndFrame
1524 ,(LONG
)nX
- (vRect
.xLeft
- vFRect
.xLeft
)
1525 ,(LONG
)nY
- (vRect
.yBottom
- vFRect
.yBottom
)
1530 nX
+= (vRect
.xLeft
- vFRect
.xLeft
);
1531 nY
+= (vRect
.yBottom
- vFRect
.yBottom
);
1532 nWidth
-= nWidthFrameDelta
;
1533 nHeight
-= nHeightFrameDelta
;
1537 if (nWidth
> nWidthFrame
- nHeightFrameDelta
||
1538 nHeight
> nHeightFrame
- nHeightFrameDelta
)
1540 ::WinSetWindowPos( hWndFrame
1542 ,(LONG
)nX
- (vRect
.xLeft
- vFRect
.xLeft
)
1543 ,(LONG
)nY
- (vRect
.yBottom
- vFRect
.yBottom
)
1544 ,(LONG
)nWidth
+ nWidthFrameDelta
1545 ,(LONG
)nHeight
+ nHeightFrameDelta
1546 ,SWP_MOVE
| SWP_SIZE
1552 ::WinSetWindowPos( GetHwnd()
1558 ,SWP_SIZE
| SWP_MOVE
1560 if (m_vWinSwp
.cx
== 0 && m_vWinSwp
.cy
== 0 && m_vWinSwp
.fl
== 0)
1564 ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp
);
1567 int nYDiff
= m_vWinSwp
.cy
- nHeight
;
1570 // Handle resizing of scrolled windows. The target or window to
1571 // be scrolled is the owner (gets the scroll notifications). The
1572 // parent is usually the parent frame of the scrolled panel window.
1573 // In order to show the scrollbars the target window will be shrunk
1574 // by the size of the scroll bar widths and moved in the X and Y
1575 // directon. That value will be computed as part of the diff for
1576 // moving the children. Everytime the window is sized the
1577 // toplevel OnSize is going to resize the panel to fit the client
1578 // or the whole sizer and will need to me resized. This will send
1579 // a WM_SIZE out which will be intercepted by the ScrollHelper
1580 // which will cause the scrollbars to be displayed via the SetScrollbar
1583 if (IsKindOf(CLASSINFO(wxScrolledWindow
)))
1585 int nAdjustWidth
= 0;
1586 int nAdjustHeight
= 0;
1587 int nHSBHeight
= wxSystemSettingsNative::GetMetric(wxSYS_HSCROLL_Y
,
1589 int nVSBWidth
= wxSystemSettingsNative::GetMetric(wxSYS_VSCROLL_X
,
1593 if (GetScrollBarHorz() == NULLHANDLE
||
1594 !WinIsWindowShowing(GetScrollBarHorz()))
1597 nAdjustHeight
= nHSBHeight
;
1598 if (GetScrollBarVert() == NULLHANDLE
||
1599 !WinIsWindowShowing(GetScrollBarVert()))
1602 nAdjustWidth
= nVSBWidth
;
1603 ::WinQueryWindowPos(GetHwnd(), &vSwpScroll
);
1604 ::WinSetWindowPos( GetHwnd()
1607 ,vSwpScroll
.y
+ nAdjustHeight
1608 ,vSwpScroll
.cx
- nAdjustWidth
1609 ,vSwpScroll
.cy
- nAdjustHeight
1610 ,SWP_MOVE
| SWP_SIZE
1612 nYDiff
-= nAdjustHeight
;
1614 MoveChildren(nYDiff
);
1615 ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp
);
1618 // FIXME: By my logic, the next line should be needed as it moves child
1619 // windows when resizing the parent (see comment at beginning of
1620 // function). However, this seems to cause lots of problems. At
1621 // least, e.g. the grid sample almost works with this line
1622 // commented out but crashes badly with it.
1623 MoveChildren(nHeightDelta
);
1625 } // end of wxWindowOS2::DoMoveWindow
1628 // Set the size of the window: if the dimensions are positive, just use them,
1629 // but if any of them is equal to -1, it means that we must find the value for
1630 // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in
1631 // which case -1 is a valid value for x and y)
1633 // If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate
1634 // the width/height to best suit our contents, otherwise we reuse the current
1637 void wxWindowOS2::DoSetSize( int nX
,
1644 // Get the current size and position...
1650 wxSize vSize
= wxDefaultSize
;
1652 GetPosition(&nCurrentX
, &nCurrentY
);
1653 GetSize(&nCurrentWidth
, &nCurrentHeight
);
1656 // ... and don't do anything (avoiding flicker) if it's already ok
1659 // Must convert Y coords to test for equality under OS/2
1663 if (nX
== nCurrentX
&& nY2
== nCurrentY
&&
1664 nWidth
== nCurrentWidth
&& nHeight
== nCurrentHeight
)
1669 if (nX
== wxDefaultCoord
&& !(nSizeFlags
& wxSIZE_ALLOW_MINUS_ONE
))
1671 if (nY
== wxDefaultCoord
&& !(nSizeFlags
& wxSIZE_ALLOW_MINUS_ONE
))
1674 AdjustForParentClientOrigin(nX
, nY
, nSizeFlags
);
1676 if (nWidth
== wxDefaultCoord
)
1678 if (nSizeFlags
& wxSIZE_AUTO_WIDTH
)
1680 vSize
= DoGetBestSize();
1686 // Just take the current one
1688 nWidth
= nCurrentWidth
;
1692 if (nHeight
== wxDefaultCoord
)
1694 if (nSizeFlags
& wxSIZE_AUTO_HEIGHT
)
1696 if (vSize
.x
== wxDefaultCoord
)
1698 vSize
= DoGetBestSize();
1704 // just take the current one
1705 nHeight
= nCurrentHeight
;
1709 DoMoveWindow( nX
, nY
, nWidth
, nHeight
);
1710 } // end of wxWindowOS2::DoSetSize
1712 void wxWindowOS2::DoSetClientSize( int nWidth
,
1718 wxWindow
* pParent
= (wxWindow
*)GetParent();
1719 HWND hParentWnd
= (HWND
)0;
1722 hParentWnd
= (HWND
)pParent
->GetHWND();
1724 if (IsKindOf(CLASSINFO(wxFrame
)))
1726 wxFrame
* pFrame
= wxDynamicCast(this, wxFrame
);
1727 HWND hFrame
= pFrame
->GetFrame();
1732 ::WinQueryWindowRect(GetHwnd(), &vRect2
);
1733 ::WinQueryWindowRect(hFrame
, &vRect
);
1734 ::WinQueryWindowRect(hParentWnd
, &vRect3
);
1735 nActualWidth
= vRect2
.xRight
- vRect2
.xLeft
- vRect
.xRight
+ nWidth
;
1736 nActualHeight
= vRect2
.yTop
- vRect2
.yBottom
- vRect
.yTop
+ nHeight
;
1738 vPoint
.x
= vRect2
.xLeft
;
1739 vPoint
.y
= vRect2
.yBottom
;
1742 vPoint
.x
-= vRect3
.xLeft
;
1743 vPoint
.y
-= vRect3
.yBottom
;
1751 GetPosition(&nX
, &nY
);
1752 nActualWidth
= nWidth
;
1753 nActualHeight
= nHeight
;
1758 DoMoveWindow( vPoint
.x
, vPoint
.y
, nActualWidth
, nActualHeight
);
1760 wxSize
size( nWidth
, nHeight
);
1761 wxSizeEvent
vEvent( size
, m_windowId
);
1762 vEvent
.SetEventObject(this);
1763 GetEventHandler()->ProcessEvent(vEvent
);
1764 } // end of wxWindowOS2::DoSetClientSize
1766 // ---------------------------------------------------------------------------
1768 // ---------------------------------------------------------------------------
1770 int wxWindowOS2::GetCharHeight() const
1773 FONTMETRICS vFontMetrics
;
1775 hPs
= ::WinGetPS(GetHwnd());
1777 if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
))
1779 ::WinReleasePS(hPs
);
1782 ::WinReleasePS(hPs
);
1783 return(vFontMetrics
.lMaxAscender
+ vFontMetrics
.lMaxDescender
);
1784 } // end of wxWindowOS2::GetCharHeight
1786 int wxWindowOS2::GetCharWidth() const
1789 FONTMETRICS vFontMetrics
;
1791 hPs
= ::WinGetPS(GetHwnd());
1793 if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
))
1795 ::WinReleasePS(hPs
);
1798 ::WinReleasePS(hPs
);
1799 return(vFontMetrics
.lAveCharWidth
);
1800 } // end of wxWindowOS2::GetCharWidth
1802 void wxWindowOS2::GetTextExtent( const wxString
& rString
,
1806 int* pExternalLeading
,
1807 const wxFont
* WXUNUSED(pTheFont
) ) const
1809 POINTL avPoint
[TXTBOX_COUNT
];
1814 FONTMETRICS vFM
; // metrics structure
1819 hPS
= ::WinGetPS(GetHwnd());
1821 l
= rString
.length();
1824 pStr
= (PCH
)rString
.c_str();
1827 // In world coordinates.
1829 bRc
= ::GpiQueryTextBox( hPS
,
1832 TXTBOX_COUNT
,// return maximum information
1833 avPoint
// array of coordinates points
1837 vPtMin
.x
= avPoint
[0].x
;
1838 vPtMax
.x
= avPoint
[0].x
;
1839 vPtMin
.y
= avPoint
[0].y
;
1840 vPtMax
.y
= avPoint
[0].y
;
1841 for (i
= 1; i
< 4; i
++)
1843 if(vPtMin
.x
> avPoint
[i
].x
) vPtMin
.x
= avPoint
[i
].x
;
1844 if(vPtMin
.y
> avPoint
[i
].y
) vPtMin
.y
= avPoint
[i
].y
;
1845 if(vPtMax
.x
< avPoint
[i
].x
) vPtMax
.x
= avPoint
[i
].x
;
1846 if(vPtMax
.y
< avPoint
[i
].y
) vPtMax
.y
= avPoint
[i
].y
;
1848 bRc
= ::GpiQueryFontMetrics( hPS
1849 ,sizeof(FONTMETRICS
)
1876 *pX
= (vPtMax
.x
- vPtMin
.x
+ 1);
1878 *pY
= (vPtMax
.y
- vPtMin
.y
+ 1);
1882 *pDescent
= vFM
.lMaxDescender
;
1886 if (pExternalLeading
)
1889 *pExternalLeading
= vFM
.lExternalLeading
;
1891 *pExternalLeading
= 0;
1893 ::WinReleasePS(hPS
);
1894 } // end of wxWindow::GetTextExtent
1896 bool wxWindowOS2::IsMouseInWindow() const
1899 // Get the mouse position
1902 ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
);
1905 // Find the window which currently has the cursor and go up the window
1906 // chain until we find this window - or exhaust it
1908 HWND hWnd
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt
, TRUE
);
1910 while (hWnd
&& (hWnd
!= GetHwnd()))
1911 hWnd
= ::WinQueryWindow(hWnd
, QW_PARENT
);
1913 return hWnd
!= NULL
;
1914 } // end of wxWindowOS2::IsMouseInWindow
1917 // ---------------------------------------------------------------------------
1919 // ---------------------------------------------------------------------------
1921 #if wxUSE_MENUS_NATIVE
1922 bool wxWindowOS2::DoPopupMenu( wxMenu
* pMenu
, int nX
, int nY
)
1924 HWND hWndOwner
= GetHwnd();
1925 HWND hWndParent
= GetHwnd();
1926 HWND hMenu
= GetHmenuOf(pMenu
);
1927 bool bIsWaiting
= true;
1930 // Protect against recursion
1931 if (wxCurrentPopupMenu
)
1934 pMenu
->SetInvokingWindow(this);
1937 if ( nX
== -1 && nY
== -1 )
1939 wxPoint mouse
= wxGetMousePosition();
1940 nX
= mouse
.x
; nY
= mouse
.y
;
1944 DoClientToScreen( &nX
1947 DoGetSize(0,&nHeight
);
1950 wxCurrentPopupMenu
= pMenu
;
1952 ::WinPopupMenu( hWndParent
1958 ,PU_HCONSTRAIN
| PU_VCONSTRAIN
| PU_MOUSEBUTTON1
| PU_KEYBOARD
1965 ::WinGetMsg(vHabmain
,&vMsg
, (HWND
)0, 0, 0);
1966 if (vMsg
.msg
== WM_COMMAND
)
1968 ::WinDispatchMsg(vHabmain
, (PQMSG
)&vMsg
);
1971 wxCurrentPopupMenu
= NULL
;
1972 pMenu
->SetInvokingWindow(NULL
);
1974 } // end of wxWindowOS2::DoPopupMenu
1975 #endif // wxUSE_MENUS_NATIVE
1977 // ===========================================================================
1978 // pre/post message processing
1979 // ===========================================================================
1981 MRESULT
wxWindowOS2::OS2DefWindowProc( WXUINT uMsg
,
1986 return (MRESULT
)m_fnOldWndProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
);
1988 return ::WinDefWindowProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
);
1989 } // end of wxWindowOS2::OS2DefWindowProc
1991 bool wxWindowOS2::OS2ProcessMessage( WXMSG
* pMsg
)
1993 // wxUniversal implements tab traversal itself
1994 #ifndef __WXUNIVERSAL__
1995 QMSG
* pQMsg
= (QMSG
*)pMsg
;
1997 if (m_hWnd
!= 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL
))
2000 // Intercept dialog navigation keys
2002 bool bProcess
= true;
2003 USHORT uKeyFlags
= SHORT1FROMMP(pQMsg
->mp1
);
2005 if (uKeyFlags
& KC_KEYUP
)
2008 if (uKeyFlags
& KC_ALT
)
2011 if (!(uKeyFlags
& KC_VIRTUALKEY
))
2016 bool bCtrlDown
= IsCtrlDown();
2017 bool bShiftDown
= IsShiftDown();
2020 // WM_QUERYDLGCODE: ask the control if it wants the key for itself,
2021 // don't process it if it's the case (except for Ctrl-Tab/Enter
2022 // combinations which are always processed)
2024 ULONG ulDlgCode
= 0;
2028 ulDlgCode
= (ULONG
)::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0);
2031 bool bForward
= true;
2032 bool bWindowChange
= false;
2034 switch (SHORT2FROMMP(pQMsg
->mp2
))
2037 // Going to make certain assumptions about specific types of controls
2038 // here, so we may have to alter some things later if they prove invalid
2042 // Shift tabl will always be a nav-key but tabs may be wanted
2051 // Entry Fields want tabs for themselve usually
2055 case DLGC_ENTRYFIELD
:
2065 // Ctrl-Tab cycles thru notebook pages
2067 bWindowChange
= bCtrlDown
;
2068 bForward
= !bShiftDown
;
2091 // ctrl-enter is not processed
2095 else if (ulDlgCode
& DLGC_BUTTON
)
2098 // buttons want process Enter themselevs
2104 wxButton
* pBtn
= wxDynamicCast( GetDefaultItem()
2108 if (pBtn
&& pBtn
->IsEnabled())
2111 // If we do have a default button, do press it
2113 pBtn
->OS2Command(BN_CLICKED
, 0 /* unused */);
2116 else if (!IsTopLevel())
2119 // if not a top level window, let parent
2124 // else: but if it does not it makes sense to make
2125 // it work like a TAB - and that's what we do.
2126 // Note that Ctrl-Enter always works this way.
2137 wxNavigationKeyEvent vEvent
;
2139 vEvent
.SetDirection(bForward
);
2140 vEvent
.SetWindowChange(bWindowChange
);
2141 vEvent
.SetEventObject(this);
2143 if (GetEventHandler()->ProcessEvent(vEvent
))
2145 wxButton
* pBtn
= wxDynamicCast(FindFocus(), wxButton
);
2150 // The button which has focus should be default
2159 // Let Dialogs process
2161 if (::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0));
2165 pMsg
= pMsg
; // just shut up the compiler
2166 #endif // __WXUNIVERSAL__
2169 } // end of wxWindowOS2::OS2ProcessMessage
2171 bool wxWindowOS2::OS2TranslateMessage( WXMSG
* pMsg
)
2173 #if wxUSE_ACCEL && !defined(__WXUNIVERSAL__)
2174 return m_acceleratorTable
.Translate(m_hWnd
, pMsg
);
2178 #endif //wxUSE_ACCEL
2179 } // end of wxWindowOS2::OS2TranslateMessage
2181 bool wxWindowOS2::OS2ShouldPreProcessMessage( WXMSG
* WXUNUSED(pMsg
) )
2183 // preprocess all messages by default
2185 } // end of wxWindowOS2::OS2ShouldPreProcessMessage
2187 // ---------------------------------------------------------------------------
2188 // message params unpackers
2189 // ---------------------------------------------------------------------------
2191 void wxWindowOS2::UnpackCommand(
2199 *pId
= LOWORD(wParam
);
2200 *phWnd
= NULL
; // or may be GetHWND() ?
2201 *pCmd
= LOWORD(lParam
);
2202 } // end of wxWindowOS2::UnpackCommand
2204 void wxWindowOS2::UnpackActivate(
2211 *pState
= LOWORD(wParam
);
2212 *phWnd
= (WXHWND
)lParam
;
2213 } // end of wxWindowOS2::UnpackActivate
2215 void wxWindowOS2::UnpackScroll(
2226 ulId
= (ULONG
)LONGFROMMP(wParam
);
2227 hWnd
= ::WinWindowFromID(GetHwnd(), ulId
);
2228 if (hWnd
== m_hWndScrollBarHorz
|| hWnd
== m_hWndScrollBarVert
)
2229 *phWnd
= NULLHANDLE
;
2233 *pPos
= SHORT1FROMMP(lParam
);
2234 *pCode
= SHORT2FROMMP(lParam
);
2235 } // end of wxWindowOS2::UnpackScroll
2237 void wxWindowOS2::UnpackMenuSelect(
2245 *pItem
= (WXWORD
)LOWORD(wParam
);
2246 *pFlags
= HIWORD(wParam
);
2247 *phMenu
= (WXHMENU
)lParam
;
2248 } // end of wxWindowOS2::UnpackMenuSelect
2250 // ---------------------------------------------------------------------------
2251 // Main wxWidgets window proc and the window proc for wxWindow
2252 // ---------------------------------------------------------------------------
2255 // Hook for new window just as it's being created, when the window isn't yet
2256 // associated with the handle
2258 wxWindowOS2
* wxWndHook
= NULL
;
2263 MRESULT EXPENTRY
wxWndProc(
2270 wxWindowOS2
* pWnd
= wxFindWinFromHandle((WXHWND
)hWnd
);
2273 // When we get the first message for the HWND we just created, we associate
2274 // it with wxWindow stored in wxWndHook
2276 if (!pWnd
&& wxWndHook
)
2278 wxAssociateWinWithHandle(hWnd
, wxWndHook
);
2281 pWnd
->SetHWND((WXHWND
)hWnd
);
2284 MRESULT rc
= (MRESULT
)0;
2288 // Stop right here if we don't have a valid handle in our wxWindow object.
2290 if (pWnd
&& !pWnd
->GetHWND())
2292 pWnd
->SetHWND((WXHWND
) hWnd
);
2293 rc
= pWnd
->OS2DefWindowProc(ulMsg
, wParam
, lParam
);
2300 rc
= pWnd
->OS2WindowProc(ulMsg
, wParam
, lParam
);
2301 if ( (pWnd
->GetScrollBarHorz() != NULLHANDLE
||
2302 pWnd
->GetScrollBarVert() != NULLHANDLE
) &&
2305 if (pWnd
->GetScrollBarHorz() != NULLHANDLE
)
2306 ::WinInvalidateRect(pWnd
->GetScrollBarHorz(), NULL
, TRUE
);
2307 if (pWnd
->GetScrollBarVert() != NULLHANDLE
)
2308 ::WinInvalidateRect(pWnd
->GetScrollBarVert(), NULL
, TRUE
);
2312 rc
= ::WinDefWindowProc(hWnd
, ulMsg
, wParam
, lParam
);
2316 } // end of wxWndProc
2319 // We will add (or delete) messages we need to handle at this default
2322 MRESULT
wxWindowOS2::OS2WindowProc( WXUINT uMsg
,
2327 // Did we process the uMsg?
2329 bool bProcessed
= false;
2333 // For most messages we should return 0 when we do process the message
2335 mResult
= (MRESULT
)0;
2343 bProcessed
= HandleCreate( (WXLPCREATESTRUCT
)lParam
2349 // Return 0 to bAllow window creation
2351 mResult
= (MRESULT
)(bMayCreate
? 0 : -1);
2362 bProcessed
= HandleMove( LOWORD(lParam
)
2368 bProcessed
= HandleSize( LOWORD(lParam
)
2374 case WM_WINDOWPOSCHANGED
:
2377 // Dialogs under OS/2 do not get WM_SIZE events at all.
2378 // Instead they get this, which can function much like WM_SIZE
2379 // PSWP contains the new sizes and positioning, PSWP+1 the old
2380 // We use this because ADJUSTWINDOWPOS comes BEFORE the new
2381 // position is added and our auto layout does a WinQueryWindowRect
2382 // to get the CURRENT client size. That is the size used to position
2383 // child controls, so we need to already be sized
2384 // in order to get the child controls positoned properly.
2386 if (IsKindOf(CLASSINFO(wxDialog
)) || IsKindOf(CLASSINFO(wxFrame
)))
2388 PSWP pSwp
= (PSWP
)PVOIDFROMMP(wParam
);
2389 PSWP pSwp2
= pSwp
++;
2391 if (!(pSwp
->cx
== pSwp2
->cx
&&
2392 pSwp
->cy
== pSwp2
->cy
))
2393 bProcessed
= HandleSize( pSwp
->cx
2397 if (IsKindOf(CLASSINFO(wxFrame
)))
2399 wxFrame
* pFrame
= wxDynamicCast(this, wxFrame
);
2403 if (pFrame
->GetStatusBar())
2404 pFrame
->PositionStatusBar();
2405 if (pFrame
->GetToolBar())
2406 pFrame
->PositionToolBar();
2417 UnpackActivate( wParam
2423 bProcessed
= HandleActivate( wState
2431 if (SHORT1FROMMP((MPARAM
)lParam
) == TRUE
)
2432 bProcessed
= HandleSetFocus((WXHWND
)(HWND
)wParam
);
2434 bProcessed
= HandleKillFocus((WXHWND
)(HWND
)wParam
);
2438 bProcessed
= HandlePaint();
2443 // Don't let the DefWindowProc() destroy our window - we'll do it
2444 // ourselves in ~wxWindow
2447 mResult
= (MRESULT
)TRUE
;
2451 bProcessed
= HandleShow(wParam
!= 0, (int)lParam
);
2455 // Under OS2 PM Joysticks are treated just like mouse events
2456 // The "Motion" events will be prevelent in joysticks
2459 case WM_BUTTON1DOWN
:
2461 case WM_BUTTON1DBLCLK
:
2462 case WM_BUTTON1MOTIONEND
:
2463 case WM_BUTTON1MOTIONSTART
:
2464 case WM_BUTTON2DOWN
:
2466 case WM_BUTTON2DBLCLK
:
2467 case WM_BUTTON2MOTIONEND
:
2468 case WM_BUTTON2MOTIONSTART
:
2469 case WM_BUTTON3DOWN
:
2471 case WM_BUTTON3DBLCLK
:
2472 case WM_BUTTON3MOTIONEND
:
2473 case WM_BUTTON3MOTIONSTART
:
2475 if (uMsg
== WM_BUTTON1DOWN
&& AcceptsFocus())
2478 short nX
= LOWORD(wParam
);
2479 short nY
= HIWORD(wParam
);
2482 // Redirect the event to a static control if necessary
2484 if (this == GetCapture())
2486 bProcessed
= HandleMouseEvent( uMsg
2489 ,(WXUINT
)SHORT2FROMMP(lParam
)
2494 wxWindow
* pWin
= FindWindowForMouseEvent( this
2498 if (!pWin
->IsOfStandardClass())
2500 if (uMsg
== WM_BUTTON1DOWN
&& pWin
->AcceptsFocus() )
2503 bProcessed
= pWin
->HandleMouseEvent( uMsg
2506 ,(WXUINT
)SHORT2FROMMP(lParam
)
2513 bProcessed
= HandleSysCommand(wParam
, lParam
);
2520 UnpackCommand(wParam
, lParam
, &id
, &hwnd
, &cmd
);
2522 bProcessed
= HandleCommand(id
, cmd
, hwnd
);
2527 // For these messages we must return TRUE if process the message
2530 case WM_MEASUREITEM
:
2532 int nIdCtrl
= (UINT
)wParam
;
2534 if ( uMsg
== WM_DRAWITEM
)
2536 bProcessed
= OS2OnDrawItem(nIdCtrl
,
2537 (WXDRAWITEMSTRUCT
*)lParam
);
2541 return MRFROMLONG(OS2OnMeasureItem( nIdCtrl
2542 ,(WXMEASUREITEMSTRUCT
*)lParam
2547 mResult
= (MRESULT
)TRUE
;
2551 case WM_QUERYDLGCODE
:
2552 if (!IsOfStandardClass())
2556 mResult
= (MRESULT
)m_lDlgCode
;
2561 //else: get the dlg code from the DefWindowProc()
2566 // In OS/2 PM all keyboard events are of the WM_CHAR type. Virtual key and key-up
2567 // and key-down events are obtained from the WM_CHAR params.
2571 USHORT uKeyFlags
= SHORT1FROMMP((MPARAM
)wParam
);
2573 if (uKeyFlags
& KC_KEYUP
)
2575 //TODO: check if the cast to WXWORD isn't causing trouble
2576 bProcessed
= HandleKeyUp(wParam
, lParam
);
2579 else // keydown event
2581 m_bLastKeydownProcessed
= false;
2583 // If this has been processed by an event handler,
2584 // return 0 now (we've handled it). DON't RETURN
2585 // we still need to process further
2587 m_bLastKeydownProcessed
= HandleKeyDown(wParam
, lParam
);
2588 if (uKeyFlags
& KC_VIRTUALKEY
)
2590 USHORT uVk
= SHORT2FROMMP((MPARAM
)lParam
);
2593 // We consider these message "not interesting" to OnChar
2606 // Avoid duplicate messages to OnChar for these ASCII keys: they
2607 // will be translated by TranslateMessage() and received in WM_CHAR
2612 // But set processed to false, not true to still pass them to
2613 // the control's default window proc - otherwise built-in
2614 // keyboard handling won't work
2619 bProcessed
= HandleChar(wParam
, lParam
);
2623 else // WM_CHAR -- Always an ASCII character
2625 if (m_bLastKeydownProcessed
)
2628 // The key was handled in the EVT_KEY_DOWN and handling
2629 // a key in an EVT_KEY_DOWN handler is meant, by
2630 // design, to prevent EVT_CHARs from happening
2632 m_bLastKeydownProcessed
= false;
2635 else // do generate a CHAR event
2637 bProcessed
= HandleChar(wParam
, lParam
, true);
2650 UnpackScroll( wParam
2657 bProcessed
= OS2OnScroll( uMsg
== WM_HSCROLL
? wxHORIZONTAL
2667 switch(SHORT2FROMMP(wParam
))
2671 HWND hWnd
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
));
2672 wxWindowOS2
* pWin
= wxFindWinFromHandle(hWnd
);
2679 if (pWin
->IsKindOf(CLASSINFO(wxBitmapButton
)))
2681 wxBitmapButton
* pBitmapButton
= wxDynamicCast(pWin
, wxBitmapButton
);
2683 pBitmapButton
->OS2OnDraw((WXDRAWITEMSTRUCT
*)lParam
);
2689 case BKN_PAGESELECTEDPENDING
:
2691 PPAGESELECTNOTIFY pPage
= (PPAGESELECTNOTIFY
)lParam
;
2693 if ((pPage
->ulPageIdNew
!= pPage
->ulPageIdCur
) &&
2694 (pPage
->ulPageIdNew
> 0L && pPage
->ulPageIdCur
> 0L))
2696 wxWindowOS2
* pWin
= wxFindWinFromHandle(pPage
->hwndBook
);
2697 wxNotebookEvent
vEvent( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
2698 ,(int)SHORT1FROMMP(wParam
)
2699 ,(int)pPage
->ulPageIdNew
2700 ,(int)pPage
->ulPageIdCur
2707 if (pWin
->IsKindOf(CLASSINFO(wxNotebook
)))
2709 wxNotebook
* pNotebook
= wxDynamicCast(pWin
, wxNotebook
);
2711 vEvent
.SetEventObject(pWin
);
2712 pNotebook
->OnSelChange(vEvent
);
2723 case BN_CLICKED
: // Dups as LN_SELECT and CBN_LBSELECT
2725 HWND hWnd
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
));
2726 wxWindowOS2
* pWin
= wxFindWinFromHandle(hWnd
);
2734 // Simulate a WM_COMMAND here, as wxWidgets expects all control
2735 // button clicks to generate WM_COMMAND msgs, not WM_CONTROL
2737 if (pWin
->IsKindOf(CLASSINFO(wxRadioBox
)))
2739 wxRadioBox
* pRadioBox
= wxDynamicCast(pWin
, wxRadioBox
);
2741 pRadioBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2742 ,(WXWORD
)SHORT1FROMMP(wParam
)
2745 if (pWin
->IsKindOf(CLASSINFO(wxRadioButton
)))
2747 wxRadioButton
* pRadioButton
= wxDynamicCast(pWin
, wxRadioButton
);
2749 pRadioButton
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2750 ,(WXWORD
)SHORT1FROMMP(wParam
)
2753 if (pWin
->IsKindOf(CLASSINFO(wxCheckBox
)))
2755 wxCheckBox
* pCheckBox
= wxDynamicCast(pWin
, wxCheckBox
);
2757 pCheckBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2758 ,(WXWORD
)SHORT1FROMMP(wParam
)
2761 if (pWin
->IsKindOf(CLASSINFO(wxListBox
)))
2763 wxListBox
* pListBox
= wxDynamicCast(pWin
, wxListBox
);
2765 pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2766 ,(WXWORD
)SHORT1FROMMP(wParam
)
2768 if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
)
2771 if (pWin
->IsKindOf(CLASSINFO(wxComboBox
)))
2773 wxComboBox
* pComboBox
= wxDynamicCast(pWin
, wxComboBox
);
2775 pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2776 ,(WXWORD
)SHORT1FROMMP(wParam
)
2783 case LN_ENTER
: /* dups as CBN_EFCHANGE */
2785 HWND hWnd
= HWNDFROMMP(lParam
);
2786 wxWindowOS2
* pWin
= wxFindWinFromHandle(hWnd
);
2794 // Simulate a WM_COMMAND here, as wxWidgets expects all control
2795 // button clicks to generate WM_COMMAND msgs, not WM_CONTROL
2797 if (pWin
->IsKindOf(CLASSINFO(wxListBox
)))
2799 wxListBox
* pListBox
= wxDynamicCast(pWin
, wxListBox
);
2801 pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2802 ,(WXWORD
)SHORT1FROMMP(wParam
)
2804 if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
)
2808 if (pWin
->IsKindOf(CLASSINFO(wxComboBox
)))
2810 wxComboBox
* pComboBox
= wxDynamicCast(pWin
, wxComboBox
);
2812 pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2813 ,(WXWORD
)SHORT1FROMMP(wParam
)
2821 case SPBN_DOWNARROW
:
2827 ::WinSendMsg( HWNDFROMMP(lParam
)
2830 ,MPFROM2SHORT( (USHORT
)10
2831 ,(USHORT
)SPBQ_UPDATEIFVALID
2835 bProcessed
= OS2OnScroll( wxVERTICAL
2836 ,(WXWORD
)SHORT2FROMMP(wParam
)
2843 case SLN_SLIDERTRACK
:
2845 HWND hWnd
= ::WinWindowFromID(GetHWND(), SHORT1FROMMP(wParam
));
2846 wxWindowOS2
* pChild
= wxFindWinFromHandle(hWnd
);
2853 if (pChild
->IsKindOf(CLASSINFO(wxSlider
)))
2854 bProcessed
= OS2OnScroll( wxVERTICAL
2855 ,(WXWORD
)SHORT2FROMMP(wParam
)
2856 ,(WXWORD
)LONGFROMMP(lParam
)
2864 #if defined(__VISAGECPP__) && (__IBMCPP__ >= 400)
2865 case WM_CTLCOLORCHANGE
:
2867 bProcessed
= HandleCtlColor(&hBrush
);
2871 case WM_ERASEBACKGROUND
:
2873 // Returning TRUE to requestw PM to paint the window background
2874 // in SYSCLR_WINDOW. We don't really want that
2876 bProcessed
= HandleEraseBkgnd((WXHDC
)(HPS
)wParam
);
2877 mResult
= (MRESULT
)(FALSE
);
2880 // the return value for this message is ignored
2881 case WM_SYSCOLORCHANGE
:
2882 bProcessed
= HandleSysColorChange();
2885 case WM_REALIZEPALETTE
:
2886 bProcessed
= HandlePaletteChanged();
2889 // move all drag and drops to wxDrg
2891 bProcessed
= HandleEndDrag(wParam
);
2895 bProcessed
= HandleInitDialog((WXHWND
)(HWND
)wParam
);
2899 // we never set focus from here
2900 mResult
= (MRESULT
)FALSE
;
2904 // wxFrame specific message
2905 case WM_MINMAXFRAME
:
2906 bProcessed
= HandleGetMinMaxInfo((PSWP
)wParam
);
2909 case WM_SYSVALUECHANGED
:
2910 // TODO: do something
2911 mResult
= (MRESULT
)TRUE
;
2915 // Comparable to WM_SETPOINTER for windows, only for just controls
2917 case WM_CONTROLPOINTER
:
2918 bProcessed
= HandleSetCursor( SHORT1FROMMP(wParam
) // Control ID
2919 ,(HWND
)lParam
// Cursor Handle
2924 // Returning TRUE stops the DefWindowProc() from further
2925 // processing this message - exactly what we need because we've
2926 // just set the cursor.
2928 mResult
= (MRESULT
)TRUE
;
2932 #if wxUSE_MENUS_NATIVE
2934 if (wxCurrentPopupMenu
)
2936 if (GetHmenuOf(wxCurrentPopupMenu
) == (HWND
)lParam
)
2938 // Break out of msg loop in DoPopupMenu
2939 ::WinPostMsg((HWND
)lParam
,WM_COMMAND
,wParam
,0);
2943 #endif // wxUSE_MENUS_NATIVE
2949 wxLogTrace(wxTraceMessages
, wxT("Forwarding %s to DefWindowProc."),
2950 wxGetMessageName(uMsg
));
2951 #endif // __WXDEBUG__
2952 if (IsKindOf(CLASSINFO(wxFrame
)))
2953 mResult
= ::WinDefWindowProc(m_hWnd
, uMsg
, wParam
, lParam
);
2954 else if (IsKindOf(CLASSINFO(wxDialog
)))
2955 mResult
= ::WinDefDlgProc( m_hWnd
, uMsg
, wParam
, lParam
);
2957 mResult
= OS2DefWindowProc(uMsg
, wParam
, lParam
);
2960 } // end of wxWindowOS2::OS2WindowProc
2962 // ----------------------------------------------------------------------------
2963 // wxWindow <-> HWND map
2964 // ----------------------------------------------------------------------------
2966 wxWinHashTable
*wxWinHandleHash
= NULL
;
2968 wxWindow
* wxFindWinFromHandle(
2972 return (wxWindow
*)wxWinHandleHash
->Get((long)hWnd
);
2973 } // end of wxFindWinFromHandle
2975 void wxAssociateWinWithHandle(
2981 // Adding NULL hWnd is (first) surely a result of an error and
2982 // (secondly) breaks menu command processing
2984 wxCHECK_RET( hWnd
!= (HWND
)NULL
,
2985 wxT("attempt to add a NULL hWnd to window list ignored") );
2988 wxWindow
* pOldWin
= wxFindWinFromHandle((WXHWND
) hWnd
);
2990 if (pOldWin
&& (pOldWin
!= pWin
))
2992 wxString
str(pWin
->GetClassInfo()->GetClassName());
2994 wxLogError( _T("Bug! Found existing HWND %X for new window of class %s")
3001 wxWinHandleHash
->Put( (long)hWnd
3005 } // end of wxAssociateWinWithHandle
3007 void wxRemoveHandleAssociation( wxWindowOS2
* pWin
)
3009 wxWinHandleHash
->Delete((long)pWin
->GetHWND());
3010 } // end of wxRemoveHandleAssociation
3013 // Default destroyer - override if you destroy it in some other way
3014 // (e.g. with MDI child windows)
3016 void wxWindowOS2::OS2DestroyWindow()
3020 bool wxWindowOS2::OS2GetCreateWindowCoords( const wxPoint
& rPos
,
3021 const wxSize
& rSize
,
3025 int& rnHeight
) const
3027 bool bNonDefault
= false;
3028 static const int DEFAULT_Y
= 200;
3029 static const int DEFAULT_H
= 250;
3031 if (rPos
.x
== wxDefaultCoord
)
3033 rnX
= rnY
= CW_USEDEFAULT
;
3038 rnY
= rPos
.y
== wxDefaultCoord
? DEFAULT_Y
: rPos
.y
;
3041 if (rSize
.x
== wxDefaultCoord
)
3043 rnWidth
= rnHeight
= CW_USEDEFAULT
;
3048 rnHeight
= rSize
.y
== wxDefaultCoord
? DEFAULT_H
: rSize
.y
;
3052 } // end of wxWindowOS2::OS2GetCreateWindowCoords
3054 WXHWND
wxWindowOS2::OS2GetParent() const
3056 return m_parent
? m_parent
->GetHWND() : NULL
;
3059 bool wxWindowOS2::OS2Create( PSZ zClass
,
3060 const wxChar
* zTitle
,
3062 const wxPoint
& rPos
,
3063 const wxSize
& rSize
,
3065 WXDWORD
WXUNUSED(dwExStyle
),
3074 long lControlId
= 0L;
3075 wxWindowCreationHook
vHook(this);
3076 wxString
sClassName((wxChar
*)zClass
);
3078 OS2GetCreateWindowCoords( rPos
3088 lControlId
= GetId();
3089 if (GetWindowStyleFlag() & wxCLIP_SIBLINGS
)
3091 dwStyle
|= WS_CLIPSIBLINGS
;
3095 // For each class "Foo" we have we also have "FooNR" ("no repaint") class
3096 // which is the same but without CS_[HV]REDRAW class styles so using it
3097 // ensures that the window is not fully repainted on each resize
3099 if (!HasFlag(wxFULL_REPAINT_ON_RESIZE
))
3101 sClassName
+= wxT("NR");
3103 m_hWnd
= (WXHWND
)::WinCreateWindow( (HWND
)OS2GetParent()
3104 ,(PSZ
)sClassName
.c_str()
3105 ,(PSZ
)(zTitle
? zTitle
: wxEmptyString
)
3119 vError
= ::WinGetLastError(wxGetInstance());
3120 sError
= wxPMErrorToStr(vError
);
3123 SubclassWin(m_hWnd
);
3124 SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
));
3126 SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE
));
3128 LONG lColor
= (LONG
)m_backgroundColour
.GetPixel();
3130 if (!::WinSetPresParam( m_hWnd
3136 vError
= ::WinGetLastError(vHabmain
);
3137 sError
= wxPMErrorToStr(vError
);
3138 wxLogError(_T("Error creating frame. Error: %s\n"), sError
.c_str());
3147 } // end of WinGuiBase_Window::OS2Create
3149 // ===========================================================================
3150 // OS2 PM message handlers
3151 // ===========================================================================
3153 // ---------------------------------------------------------------------------
3154 // window creation/destruction
3155 // ---------------------------------------------------------------------------
3157 bool wxWindowOS2::HandleCreate( WXLPCREATESTRUCT
WXUNUSED(vCs
),
3160 wxWindowCreateEvent
vEvent((wxWindow
*)this);
3162 (void)GetEventHandler()->ProcessEvent(vEvent
);
3163 *pbMayCreate
= true;
3165 } // end of wxWindowOS2::HandleCreate
3167 bool wxWindowOS2::HandleDestroy()
3169 wxWindowDestroyEvent
vEvent((wxWindow
*)this);
3170 vEvent
.SetId(GetId());
3171 (void)GetEventHandler()->ProcessEvent(vEvent
);
3174 // Delete our drop target if we've got one
3176 #if wxUSE_DRAG_AND_DROP
3177 if (m_dropTarget
!= NULL
)
3179 delete m_dropTarget
;
3180 m_dropTarget
= NULL
;
3182 #endif // wxUSE_DRAG_AND_DROP
3185 // WM_DESTROY handled
3188 } // end of wxWindowOS2::HandleDestroy
3190 // ---------------------------------------------------------------------------
3192 // ---------------------------------------------------------------------------
3193 void wxWindowOS2::OnSetFocus(
3194 wxFocusEvent
& rEvent
3198 } // end of wxWindowOS2::OnSetFocus
3200 bool wxWindowOS2::HandleActivate(
3202 , WXHWND
WXUNUSED(hActivate
)
3205 wxActivateEvent
vEvent( wxEVT_ACTIVATE
3209 vEvent
.SetEventObject(this);
3210 return GetEventHandler()->ProcessEvent(vEvent
);
3211 } // end of wxWindowOS2::HandleActivate
3213 bool wxWindowOS2::HandleSetFocus( WXHWND
WXUNUSED(hWnd
) )
3216 // Notify the parent keeping track of focus for the kbd navigation
3217 // purposes that we got it
3219 wxChildFocusEvent
vEventFocus((wxWindow
*)this);
3220 (void)GetEventHandler()->ProcessEvent(vEventFocus
);
3228 m_caret
->OnSetFocus();
3230 #endif // wxUSE_CARET
3233 // If it's a wxTextCtrl don't send the event as it will be done
3234 // after the control gets to process it from EN_FOCUS handler
3235 if ( wxDynamicCastThis(wxTextCtrl
) )
3239 #endif // wxUSE_TEXTCTRL
3241 wxFocusEvent
vEvent(wxEVT_SET_FOCUS
, m_windowId
);
3243 vEvent
.SetEventObject(this);
3244 return GetEventHandler()->ProcessEvent(vEvent
);
3245 } // end of wxWindowOS2::HandleSetFocus
3247 bool wxWindowOS2::HandleKillFocus( WXHWND hWnd
)
3255 m_caret
->OnKillFocus();
3257 #endif // wxUSE_CARET
3261 // If it's a wxTextCtrl don't send the event as it will be done
3262 // after the control gets to process it.
3264 wxTextCtrl
* pCtrl
= wxDynamicCastThis(wxTextCtrl
);
3273 // Don't send the event when in the process of being deleted. This can
3274 // only cause problems if the event handler tries to access the object.
3276 if ( m_isBeingDeleted
)
3281 wxFocusEvent
vEvent( wxEVT_KILL_FOCUS
3285 vEvent
.SetEventObject(this);
3288 // wxFindWinFromHandle() may return NULL, it is ok
3290 vEvent
.SetWindow(wxFindWinFromHandle(hWnd
));
3291 return GetEventHandler()->ProcessEvent(vEvent
);
3292 } // end of wxWindowOS2::HandleKillFocus
3294 // ---------------------------------------------------------------------------
3296 // ---------------------------------------------------------------------------
3298 bool wxWindowOS2::HandleShow(
3300 , int WXUNUSED(nStatus
)
3303 wxShowEvent
vEvent(GetId(), bShow
);
3305 vEvent
.SetEventObject(this);
3306 return GetEventHandler()->ProcessEvent(vEvent
);
3307 } // end of wxWindowOS2::HandleShow
3309 bool wxWindowOS2::HandleInitDialog( WXHWND
WXUNUSED(hWndFocus
) )
3311 wxInitDialogEvent
vEvent(GetId());
3313 vEvent
.SetEventObject(this);
3314 return GetEventHandler()->ProcessEvent(vEvent
);
3315 } // end of wxWindowOS2::HandleInitDialog
3317 bool wxWindowOS2::HandleEndDrag(WXWPARAM
WXUNUSED(wParam
))
3319 // TODO: We'll handle drag and drop later
3323 bool wxWindowOS2::HandleSetCursor( USHORT
WXUNUSED(vId
),
3327 // Under OS/2 PM this allows the pointer to be changed
3328 // as it passes over a control
3330 ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)hPointer
);
3332 } // end of wxWindowOS2::HandleSetCursor
3334 // ---------------------------------------------------------------------------
3335 // owner drawn stuff
3336 // ---------------------------------------------------------------------------
3337 bool wxWindowOS2::OS2OnDrawItem( int vId
,
3338 WXDRAWITEMSTRUCT
* pItemStruct
)
3340 #if wxUSE_OWNER_DRAWN
3343 #if wxUSE_MENUS_NATIVE
3345 // Is it a menu item?
3351 POWNERITEM pMeasureStruct
= (POWNERITEM
)pItemStruct
;
3352 wxFrame
* pFrame
= (wxFrame
*)this;
3353 wxMenuItem
* pMenuItem
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
);
3354 HDC hDC
= ::GpiQueryDevice(pMeasureStruct
->hps
);
3355 wxRect
vRect( pMeasureStruct
->rclItem
.xLeft
3356 ,pMeasureStruct
->rclItem
.yBottom
3357 ,pMeasureStruct
->rclItem
.xRight
- pMeasureStruct
->rclItem
.xLeft
3358 ,pMeasureStruct
->rclItem
.yTop
- pMeasureStruct
->rclItem
.yBottom
3360 vDc
.SetHDC( hDC
, false );
3361 vDc
.SetHPS( pMeasureStruct
->hps
);
3363 // Load the wxWidgets Pallete and set to RGB mode
3365 if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
3369 ,(LONG
)wxTheColourDatabase
->m_nSize
3370 ,(PLONG
)wxTheColourDatabase
->m_palTable
3373 vError
= ::WinGetLastError(vHabmain
);
3374 sError
= wxPMErrorToStr(vError
);
3375 wxLogError(_T("Unable to set current color table. Error: %s\n"), sError
.c_str());
3378 // Set the color table to RGB mode
3380 if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
3388 vError
= ::WinGetLastError(vHabmain
);
3389 sError
= wxPMErrorToStr(vError
);
3390 wxLogError(_T("Unable to set current color table. Error: %s\n"), sError
.c_str());
3393 wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE
);
3398 if (pMeasureStruct
->fsAttribute
== pMeasureStruct
->fsAttributeOld
)
3401 // Entire Item needs to be redrawn (either it has reappeared from
3402 // behind another window or is being displayed for the first time
3404 eAction
= wxOwnerDrawn::wxODDrawAll
;
3406 if (pMeasureStruct
->fsAttribute
& MIA_HILITED
)
3409 // If it is currently selected we let the system handle it
3411 eStatus
|= wxOwnerDrawn::wxODSelected
;
3413 if (pMeasureStruct
->fsAttribute
& MIA_CHECKED
)
3416 // If it is currently checked we draw our own
3418 eStatus
|= wxOwnerDrawn::wxODChecked
;
3419 pMeasureStruct
->fsAttributeOld
= pMeasureStruct
->fsAttribute
&= ~MIA_CHECKED
;
3421 if (pMeasureStruct
->fsAttribute
& MIA_DISABLED
)
3424 // If it is currently disabled we let the system handle it
3426 eStatus
|= wxOwnerDrawn::wxODDisabled
;
3429 // Don't really care about framed (indicationg focus) or NoDismiss
3434 if (pMeasureStruct
->fsAttribute
& MIA_HILITED
)
3436 eAction
= wxOwnerDrawn::wxODDrawAll
;
3437 eStatus
|= wxOwnerDrawn::wxODSelected
;
3439 // Keep the system from trying to highlight with its bogus colors
3441 pMeasureStruct
->fsAttributeOld
= pMeasureStruct
->fsAttribute
&= ~MIA_HILITED
;
3443 else if (!(pMeasureStruct
->fsAttribute
& MIA_HILITED
))
3445 eAction
= wxOwnerDrawn::wxODDrawAll
;
3448 // Keep the system from trying to highlight with its bogus colors
3450 pMeasureStruct
->fsAttribute
= pMeasureStruct
->fsAttributeOld
&= ~MIA_HILITED
;
3455 // For now we don't care about anything else
3456 // just ignore the entire message!
3462 // Now redraw the item
3464 return(pMenuItem
->OnDrawItem( vDc
3466 ,(wxOwnerDrawn::wxODAction
)eAction
3467 ,(wxOwnerDrawn::wxODStatus
)eStatus
3470 // leave the fsAttribute and fsOldAttribute unchanged. If different,
3471 // the system will do the highlight or fraeming or disabling for us,
3472 // otherwise, we'd have to do it ourselves.
3475 #endif // wxUSE_MENUS_NATIVE
3477 wxWindow
* pItem
= FindItem(vId
);
3479 if (pItem
&& pItem
->IsKindOf(CLASSINFO(wxControl
)))
3481 return ((wxControl
*)pItem
)->OS2OnDraw(pItemStruct
);
3485 pItemStruct
= pItemStruct
;
3488 } // end of wxWindowOS2::OS2OnDrawItem
3490 long wxWindowOS2::OS2OnMeasureItem( int lId
,
3491 WXMEASUREITEMSTRUCT
* pItemStruct
)
3493 #if wxUSE_OWNER_DRAWN
3495 // Is it a menu item?
3497 if (lId
== 65536) // I really don't like this...has to be a better indicator
3499 if (IsKindOf(CLASSINFO(wxFrame
))) // we'll assume if Frame then a menu
3503 POWNERITEM pMeasureStruct
= (POWNERITEM
)pItemStruct
;
3504 wxFrame
* pFrame
= (wxFrame
*)this;
3505 wxMenuItem
* pMenuItem
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
);
3507 wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE
);
3510 if (pMenuItem
->OnMeasureItem( &nWidth
3516 pMeasureStruct
->rclItem
.xRight
= nWidth
;
3517 pMeasureStruct
->rclItem
.xLeft
= 0L;
3518 pMeasureStruct
->rclItem
.yTop
= nHeight
;
3519 pMeasureStruct
->rclItem
.yBottom
= 0L;
3520 mRc
= MRFROM2SHORT(nHeight
, nWidth
);
3521 return LONGFROMMR(mRc
);
3526 wxWindow
* pItem
= FindItem(lId
);
3528 if (pItem
&& pItem
->IsKindOf(CLASSINFO(wxControl
)))
3532 vItem
.idItem
= (LONG
)pItemStruct
;
3533 return ((wxControl
*)pItem
)->OS2OnMeasure((WXMEASUREITEMSTRUCT
*)&vItem
);
3537 pItemStruct
= pItemStruct
;
3538 #endif // wxUSE_OWNER_DRAWN
3542 // ---------------------------------------------------------------------------
3543 // colours and palettes
3544 // ---------------------------------------------------------------------------
3546 bool wxWindowOS2::HandleSysColorChange()
3548 wxSysColourChangedEvent vEvent
;
3550 vEvent
.SetEventObject(this);
3551 return GetEventHandler()->ProcessEvent(vEvent
);
3552 } // end of wxWindowOS2::HandleSysColorChange
3554 bool wxWindowOS2::HandleCtlColor( WXHBRUSH
* WXUNUSED(phBrush
) )
3557 // Not much provided with message. So not sure I can do anything with it
3560 } // end of wxWindowOS2::HandleCtlColor
3563 // Define for each class of dialog and control
3564 WXHBRUSH
wxWindowOS2::OnCtlColor(WXHDC
WXUNUSED(hDC
),
3565 WXHWND
WXUNUSED(hWnd
),
3566 WXUINT
WXUNUSED(nCtlColor
),
3567 WXUINT
WXUNUSED(message
),
3568 WXWPARAM
WXUNUSED(wParam
),
3569 WXLPARAM
WXUNUSED(lParam
))
3574 bool wxWindowOS2::HandlePaletteChanged()
3576 // need to set this to something first
3577 WXHWND hWndPalChange
= NULLHANDLE
;
3579 wxPaletteChangedEvent
vEvent(GetId());
3581 vEvent
.SetEventObject(this);
3582 vEvent
.SetChangedWindow(wxFindWinFromHandle(hWndPalChange
));
3584 return GetEventHandler()->ProcessEvent(vEvent
);
3585 } // end of wxWindowOS2::HandlePaletteChanged
3588 // Responds to colour changes: passes event on to children.
3590 void wxWindowOS2::OnSysColourChanged(
3591 wxSysColourChangedEvent
& rEvent
3594 wxWindowList::compatibility_iterator node
= GetChildren().GetFirst();
3599 // Only propagate to non-top-level windows
3601 wxWindow
* pWin
= (wxWindow
*)node
->GetData();
3603 if (pWin
->GetParent())
3605 wxSysColourChangedEvent vEvent
;
3607 rEvent
.SetEventObject(pWin
);
3608 pWin
->GetEventHandler()->ProcessEvent(vEvent
);
3610 node
= node
->GetNext();
3612 } // end of wxWindowOS2::OnSysColourChanged
3614 // ---------------------------------------------------------------------------
3616 // ---------------------------------------------------------------------------
3618 void wxWindow::OnPaint (
3619 wxPaintEvent
& rEvent
3622 HDC hDC
= (HDC
)wxPaintDC::FindDCInCache((wxWindow
*) rEvent
.GetEventObject());
3626 OS2DefWindowProc( (WXUINT
)WM_PAINT
3631 } // end of wxWindow::OnPaint
3633 bool wxWindowOS2::HandlePaint()
3636 wxPaintEvent
vEvent(m_windowId
);
3640 // Create empty region
3641 // TODO: get HPS somewhere else if possible
3642 hPS
= ::WinGetPS(GetHwnd());
3643 hRgn
= ::GpiCreateRegion(hPS
, 0, NULL
);
3645 if (::WinQueryUpdateRegion(GetHwnd(), hRgn
) == RGN_ERROR
)
3647 wxLogLastError(wxT("CreateRectRgn"));
3651 // Get all the rectangles from the region, convert the individual
3652 // rectangles to "the other" coordinate system and reassemble a
3653 // region from the rectangles, to be feed into m_updateRegion.
3655 // FIXME: This is a bad hack since OS/2 API specifies that rectangles
3656 // passed into GpiSetRegion must not have Bottom > Top,
3657 // however, at first sight, it _seems_ to work nonetheless.
3660 PRECTL pUpdateRects
= NULL
;
3661 vRgnData
.ulDirection
= RECTDIR_LFRT_TOPBOT
;
3662 if (::GpiQueryRegionRects( hPS
// Pres space
3663 ,hRgn
// Handle of region to query
3664 ,NULL
// Return all RECTs
3665 ,&vRgnData
// Will contain number or RECTs in region
3666 ,NULL
// NULL to return number of RECTs
3669 pUpdateRects
= new RECTL
[vRgnData
.crcReturned
];
3670 vRgnData
.crc
= vRgnData
.crcReturned
;
3671 vRgnData
.ircStart
= 1;
3672 if (::GpiQueryRegionRects( hPS
// Pres space of source
3673 ,hRgn
// Handle of source region
3674 ,NULL
// Return all RECTs
3675 ,&vRgnData
// Operations set to return rects
3676 ,pUpdateRects
// Will contain the actual RECTS
3681 ::WinQueryWindowRect(GetHwnd(), &vRect
);
3682 height
= vRect
.yTop
;
3684 for(size_t i
= 0; i
< vRgnData
.crc
; i
++)
3687 rectHeight
= pUpdateRects
[i
].yTop
- pUpdateRects
[i
].yBottom
;
3688 pUpdateRects
[i
].yTop
= height
- pUpdateRects
[i
].yTop
;
3689 pUpdateRects
[i
].yBottom
= pUpdateRects
[i
].yTop
+ rectHeight
;
3691 ::GpiSetRegion(hPS
, hRgn
, vRgnData
.crc
, pUpdateRects
);
3692 delete [] pUpdateRects
;
3696 m_updateRegion
= wxRegion(hRgn
, hPS
);
3698 vEvent
.SetEventObject(this);
3699 bProcessed
= GetEventHandler()->ProcessEvent(vEvent
);
3702 IsKindOf(CLASSINFO(wxPanel
)) &&
3703 GetChildren().GetCount() == 0
3707 // OS/2 needs to process this right here, not by the default proc
3708 // Window's default proc correctly paints everything, OS/2 does not.
3709 // For decorative panels that typically have no children, we draw
3715 hPS
= ::WinBeginPaint( GetHwnd()
3721 ::GpiCreateLogColorTable( hPS
3725 ,(LONG
)wxTheColourDatabase
->m_nSize
3726 ,(PLONG
)wxTheColourDatabase
->m_palTable
3728 ::GpiCreateLogColorTable( hPS
3735 if (::WinIsWindowVisible(GetHWND()))
3736 ::WinFillRect(hPS
, &vRect
, GetBackgroundColour().GetPixel());
3739 LINEBUNDLE vLineBundle
;
3741 vLineBundle
.lColor
= 0x00000000; // Black
3742 vLineBundle
.usMixMode
= FM_OVERPAINT
;
3743 vLineBundle
.fxWidth
= 1;
3744 vLineBundle
.lGeomWidth
= 1;
3745 vLineBundle
.usType
= LINETYPE_SOLID
;
3746 vLineBundle
.usEnd
= 0;
3747 vLineBundle
.usJoin
= 0;
3750 ,LBB_COLOR
| LBB_MIX_MODE
| LBB_WIDTH
| LBB_GEOM_WIDTH
| LBB_TYPE
3754 ::WinQueryWindowRect(GetHwnd(), &vRect
);
3764 else if (!bProcessed
&&
3765 IsKindOf(CLASSINFO(wxPanel
))
3769 // Panel with children, usually fills a frame client so no borders.
3774 hPS
= ::WinBeginPaint( GetHwnd()
3780 ::GpiCreateLogColorTable( hPS
3784 ,(LONG
)wxTheColourDatabase
->m_nSize
3785 ,(PLONG
)wxTheColourDatabase
->m_palTable
3787 ::GpiCreateLogColorTable( hPS
3795 if (::WinIsWindowVisible(GetHWND()))
3796 ::WinFillRect(hPS
, &vRect
, GetBackgroundColour().GetPixel());
3802 } // end of wxWindowOS2::HandlePaint
3804 bool wxWindowOS2::HandleEraseBkgnd( WXHDC hDC
)
3809 ::WinQueryWindowPos(GetHwnd(), &vSwp
);
3810 if (vSwp
.fl
& SWP_MINIMIZE
)
3815 vDC
.m_hPS
= (HPS
)hDC
; // this is really a PS
3816 vDC
.SetWindow((wxWindow
*)this);
3819 wxEraseEvent
vEvent(m_windowId
, &vDC
);
3821 vEvent
.SetEventObject(this);
3823 rc
= GetEventHandler()->ProcessEvent(vEvent
);
3826 vDC
.m_hPS
= NULLHANDLE
;
3828 } // end of wxWindowOS2::HandleEraseBkgnd
3830 void wxWindowOS2::OnEraseBackground(wxEraseEvent
& rEvent
)
3833 HPS hPS
= rEvent
.GetDC()->GetHPS();
3835 LONG lColor
= m_backgroundColour
.GetPixel();
3837 rc
= ::WinQueryWindowRect(GetHwnd(), &vRect
);
3838 rc
= ::WinFillRect(hPS
, &vRect
, lColor
);
3839 } // end of wxWindowOS2::OnEraseBackground
3841 // ---------------------------------------------------------------------------
3842 // moving and resizing
3843 // ---------------------------------------------------------------------------
3845 bool wxWindowOS2::HandleMinimize()
3847 wxIconizeEvent
vEvent(m_windowId
);
3849 vEvent
.SetEventObject(this);
3850 return GetEventHandler()->ProcessEvent(vEvent
);
3851 } // end of wxWindowOS2::HandleMinimize
3853 bool wxWindowOS2::HandleMaximize()
3855 wxMaximizeEvent
vEvent(m_windowId
);
3857 vEvent
.SetEventObject(this);
3858 return GetEventHandler()->ProcessEvent(vEvent
);
3859 } // end of wxWindowOS2::HandleMaximize
3861 bool wxWindowOS2::HandleMove( int nX
, int nY
)
3864 wxMoveEvent
vEvent(pt
, m_windowId
);
3866 vEvent
.SetEventObject(this);
3867 return GetEventHandler()->ProcessEvent(vEvent
);
3868 } // end of wxWindowOS2::HandleMove
3870 bool wxWindowOS2::HandleSize( int nWidth
,
3872 WXUINT
WXUNUSED(nFlag
) )
3874 wxSize
sz(nWidth
, nHeight
);
3875 wxSizeEvent
vEvent(sz
, m_windowId
);
3877 vEvent
.SetEventObject(this);
3878 return GetEventHandler()->ProcessEvent(vEvent
);
3879 } // end of wxWindowOS2::HandleSize
3881 bool wxWindowOS2::HandleGetMinMaxInfo( PSWP pSwp
)
3888 ::WinGetMaxPosition(GetHwnd(), pSwp
);
3889 m_maxWidth
= pSwp
->cx
;
3890 m_maxHeight
= pSwp
->cy
;
3894 ::WinGetMinPosition(GetHwnd(), pSwp
, &vPoint
);
3895 m_minWidth
= pSwp
->cx
;
3896 m_minHeight
= pSwp
->cy
;
3903 } // end of wxWindowOS2::HandleGetMinMaxInfo
3905 // ---------------------------------------------------------------------------
3907 // ---------------------------------------------------------------------------
3908 bool wxWindowOS2::HandleCommand( WXWORD wId
,
3912 #if wxUSE_MENUS_NATIVE
3913 if (wxCurrentPopupMenu
)
3915 wxMenu
* pPopupMenu
= wxCurrentPopupMenu
;
3917 wxCurrentPopupMenu
= NULL
;
3918 return pPopupMenu
->OS2Command(wCmd
, wId
);
3920 #endif // wxUSE_MENUS_NATIVE
3922 wxWindow
* pWin
= FindItem(wId
);
3926 pWin
= wxFindWinFromHandle(hControl
);
3930 return pWin
->OS2Command(wCmd
, wId
);
3933 } // end of wxWindowOS2::HandleCommand
3935 bool wxWindowOS2::HandleSysCommand( WXWPARAM wParam
,
3936 WXLPARAM
WXUNUSED(lParam
) )
3939 // 4 bits are reserved
3941 switch (SHORT1FROMMP(wParam
))
3944 return HandleMaximize();
3947 return HandleMinimize();
3950 } // end of wxWindowOS2::HandleSysCommand
3952 // ---------------------------------------------------------------------------
3954 // ---------------------------------------------------------------------------
3955 //TODO: check against MSW
3956 void wxWindowOS2::InitMouseEvent(
3957 wxMouseEvent
& rEvent
3964 DoGetSize(0, &nHeight
);
3966 // Convert to wxWidgets standard coordinate system!
3967 rEvent
.m_y
= nHeight
- nY
;
3968 rEvent
.m_shiftDown
= ((uFlags
& KC_SHIFT
) != 0);
3969 rEvent
.m_controlDown
= ((uFlags
& KC_CTRL
) != 0);
3970 rEvent
.m_altDown
= ((uFlags
& KC_ALT
) != 0);
3971 rEvent
.m_leftDown
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON1
) &
3973 rEvent
.m_middleDown
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON3
) &
3975 rEvent
.m_rightDown
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON2
) &
3977 rEvent
.SetTimestamp(s_currentMsg
.time
);
3978 rEvent
.SetEventObject(this);
3979 rEvent
.SetId(GetId());
3981 #if wxUSE_MOUSEEVENT_HACK
3984 m_lastMouseEvent
= rEvent
.GetEventType();
3985 #endif // wxUSE_MOUSEEVENT_HACK
3986 } // end of wxWindowOS2::InitMouseEvent
3988 bool wxWindowOS2::HandleMouseEvent( WXUINT uMsg
,
3993 bool bProcessed
= false;
3996 // The mouse events take consecutive IDs from WM_MOUSEFIRST to
3997 // WM_MOUSELAST, so it's enough to subtract WM_MOUSEMOVE == WM_MOUSEFIRST
3998 // from the message id and take the value in the table to get wxWin event
4001 static const wxEventType eventsMouse
[] =
4016 if ((uMsg
>= WM_MOUSEMOVE
) && (uMsg
<= WM_BUTTON3DBLCLK
))
4018 wxMouseEvent
vEvent(eventsMouse
[uMsg
- WM_MOUSEMOVE
]);
4020 InitMouseEvent( vEvent
4026 bProcessed
= GetEventHandler()->ProcessEvent(vEvent
);
4029 HPOINTER hCursor
= (HPOINTER
)GetCursor().GetHCURSOR();
4031 if (hCursor
!= NULLHANDLE
)
4033 ::WinSetPointer(HWND_DESKTOP
, hCursor
);
4039 } // end of wxWindowOS2::HandleMouseEvent
4041 bool wxWindowOS2::HandleMouseMove( int nX
,
4045 if (!m_bMouseInWindow
)
4048 // Generate an ENTER event
4050 m_bMouseInWindow
= true;
4052 wxMouseEvent
vEvent(wxEVT_ENTER_WINDOW
);
4054 InitMouseEvent( vEvent
4060 (void)GetEventHandler()->ProcessEvent(vEvent
);
4062 return HandleMouseEvent( WM_MOUSEMOVE
4067 } // end of wxWindowOS2::HandleMouseMove
4069 // ---------------------------------------------------------------------------
4070 // keyboard handling
4071 // ---------------------------------------------------------------------------
4074 // Create the key event of the given type for the given key - used by
4075 // HandleChar and HandleKeyDown/Up
4077 wxKeyEvent
wxWindowOS2::CreateKeyEvent(
4084 wxKeyEvent
vEvent(eType
);
4086 vEvent
.SetId(GetId());
4087 vEvent
.m_shiftDown
= IsShiftDown();
4088 vEvent
.m_controlDown
= IsCtrlDown();
4089 vEvent
.m_altDown
= (HIWORD(lParam
) & KC_ALT
) == KC_ALT
;
4091 vEvent
.SetEventObject((wxWindow
*)this); // const_cast
4092 vEvent
.m_keyCode
= nId
;
4093 vEvent
.m_rawCode
= (wxUint32
)wParam
;
4094 vEvent
.m_rawFlags
= (wxUint32
)lParam
;
4095 vEvent
.SetTimestamp(s_currentMsg
.time
);
4098 // Translate the position to client coords
4103 ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
);
4104 ::WinQueryWindowRect( GetHwnd()
4108 vPoint
.x
-= vRect
.xLeft
;
4109 vPoint
.y
-= vRect
.yBottom
;
4111 vEvent
.m_x
= vPoint
.x
;
4112 vEvent
.m_y
= vPoint
.y
;
4115 } // end of wxWindowOS2::CreateKeyEvent
4118 // isASCII is true only when we're called from WM_CHAR handler and not from
4121 bool wxWindowOS2::HandleChar( WXWPARAM
WXUNUSED(wParam
),
4125 bool bCtrlDown
= false;
4128 if (m_bLastKeydownProcessed
)
4131 // The key was handled in the EVT_KEY_DOWN. Handling a key in an
4132 // EVT_KEY_DOWN handler is meant, by design, to prevent EVT_CHARs
4133 // from happening, so just bail out at this point.
4135 m_bLastKeydownProcessed
= false;
4141 // If 1 -> 26, translate to either special keycode or just set
4142 // ctrlDown. IOW, Ctrl-C should result in keycode == 3 and
4143 // ControlDown() == true.
4145 vId
= SHORT1FROMMP(lParam
);
4146 if ((vId
> 0) && (vId
< 27))
4168 else // we're called from WM_KEYDOWN
4170 vId
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
));
4175 wxKeyEvent
vEvent(CreateKeyEvent( wxEVT_CHAR
, vId
, lParam
));
4179 vEvent
.m_controlDown
= true;
4182 return (GetEventHandler()->ProcessEvent(vEvent
));
4185 bool wxWindowOS2::HandleKeyDown( WXWPARAM wParam
,
4188 int nId
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
));
4193 // Normal ASCII char
4195 nId
= SHORT1FROMMP(lParam
);
4200 wxKeyEvent
vEvent(CreateKeyEvent( wxEVT_KEY_DOWN
4206 if (GetEventHandler()->ProcessEvent(vEvent
))
4212 } // end of wxWindowOS2::HandleKeyDown
4214 bool wxWindowOS2::HandleKeyUp( WXWPARAM wParam
,
4217 int nId
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
));
4222 // Normal ASCII char
4224 nId
= CHAR1FROMMP(lParam
);
4229 wxKeyEvent
vEvent(CreateKeyEvent( wxEVT_KEY_UP
4235 if (GetEventHandler()->ProcessEvent(vEvent
))
4239 } // end of wxWindowOS2::HandleKeyUp
4241 // ---------------------------------------------------------------------------
4243 // ---------------------------------------------------------------------------
4245 // ---------------------------------------------------------------------------
4247 // ---------------------------------------------------------------------------
4249 bool wxWindowOS2::OS2OnScroll( int nOrientation
,
4256 wxWindow
* pChild
= wxFindWinFromHandle(hControl
);
4259 return pChild
->OS2OnScroll( nOrientation
4266 wxScrollWinEvent vEvent
;
4268 vEvent
.SetPosition(wPos
);
4269 vEvent
.SetOrientation(nOrientation
);
4270 vEvent
.SetEventObject(this);
4275 vEvent
.SetEventType(wxEVT_SCROLLWIN_LINEUP
);
4279 vEvent
.SetEventType(wxEVT_SCROLLWIN_LINEDOWN
);
4283 vEvent
.SetEventType(wxEVT_SCROLLWIN_PAGEUP
);
4287 vEvent
.SetEventType(wxEVT_SCROLLWIN_PAGEDOWN
);
4290 case SB_SLIDERPOSITION
:
4291 vEvent
.SetEventType(wxEVT_SCROLLWIN_THUMBRELEASE
);
4294 case SB_SLIDERTRACK
:
4295 vEvent
.SetEventType(wxEVT_SCROLLWIN_THUMBTRACK
);
4301 return GetEventHandler()->ProcessEvent(vEvent
);
4302 } // end of wxWindowOS2::OS2OnScroll
4304 void wxWindowOS2::MoveChildren(
4309 // We want to handle top levels ourself, manually
4311 if (!IsTopLevel() && GetAutoLayout())
4319 for (wxWindowList::compatibility_iterator node
= GetChildren().GetFirst();
4321 node
= node
->GetNext())
4323 wxWindow
* pWin
= node
->GetData();
4325 ::WinQueryWindowPos( GetHwndOf(pWin
)
4328 // Actually, only move children that already are placed on the
4329 // frame, not ones which are still at wxDefaultCoord.
4330 if (vSwp
.y
== wxDefaultCoord
)
4332 if (pWin
->IsKindOf(CLASSINFO(wxControl
)))
4337 // Must deal with controls that have margins like ENTRYFIELD. The SWP
4338 // struct of such a control will have and origin offset from its intended
4339 // position by the width of the margins.
4341 pCtrl
= wxDynamicCast(pWin
, wxControl
);
4342 vSwp
.y
-= pCtrl
->GetYComp();
4343 vSwp
.x
-= pCtrl
->GetXComp();
4345 ::WinSetWindowPos( GetHwndOf(pWin
)
4353 ::WinQueryWindowPos(GetHwndOf(pWin
), pWin
->GetSwp());
4354 if (pWin
->IsKindOf(CLASSINFO(wxRadioBox
)))
4356 wxRadioBox
* pRadioBox
;
4358 pRadioBox
= wxDynamicCast(pWin
, wxRadioBox
);
4359 pRadioBox
->AdjustButtons( (int)vSwp
.x
4360 ,(int)vSwp
.y
- nDiff
4363 ,pRadioBox
->GetSizeFlags()
4366 if (pWin
->IsKindOf(CLASSINFO(wxSlider
)))
4370 pSlider
= wxDynamicCast(pWin
, wxSlider
);
4371 pSlider
->AdjustSubControls( (int)vSwp
.x
4372 ,(int)vSwp
.y
- nDiff
4375 ,(int)pSlider
->GetSizeFlags()
4381 } // end of wxWindowOS2::MoveChildren
4384 // Getting the Y position for a window, like a control, is a real
4385 // pain. There are three sitatuions we must deal with in determining
4386 // the OS2 to wxWidgets Y coordinate.
4388 // 1) The controls are created in a dialog.
4389 // This is the easiest since a dialog is created with its original
4390 // size so the standard: Y = ParentHeight - (Y + ControlHeight);
4392 // 2) The controls are direct children of a frame
4393 // In this instance the controls are actually children of the Frame's
4394 // client. During creation the frame's client resizes several times
4395 // during creation of the status bar and toolbars. The CFrame class
4396 // will take care of this using its AlterChildPos proc.
4398 // 3) The controls are children of a panel, which in turn is a child of
4400 // The panel may be one of many, in which case the same treatment
4401 // as 1 applies. It may be the only child, though.
4402 // This is the nastiest case. A panel is created as the only child of
4403 // the frame and as such, when a frame has only one child, the child is
4404 // expanded to fit the entire client area of the frame. Because the
4405 // controls are created BEFORE this occurs their positions are totally
4406 // whacked and any call to WinQueryWindowPos will return invalid
4407 // coordinates. So for this situation we have to compare the size of
4408 // the panel at control creation time with that of the frame client. If
4409 // they are the same we can use the standard Y position equation. If
4410 // not, then we must use the Frame Client's dimensions to position them
4411 // as that will be the eventual size of the panel after the frame resizes
4414 int wxWindowOS2::GetOS2ParentHeight( wxWindowOS2
* pParent
)
4419 if (pParent
->IsKindOf(CLASSINFO(wxDialog
)))
4420 return(pParent
->GetClientSize().y
);
4423 // Case 2 -- if we are one of the separately built standard Frame
4424 // children, like a statusbar, menubar, or toolbar we want to
4425 // use the frame, itself, for positioning. Otherwise we are
4426 // child window and want to use the Frame's client.
4428 else if (pParent
->IsKindOf(CLASSINFO(wxFrame
)))
4430 if (IsKindOf(CLASSINFO(wxStatusBar
)) ||
4431 IsKindOf(CLASSINFO(wxMenuBar
)) ||
4432 IsKindOf(CLASSINFO(wxToolBar
))
4435 if (IsKindOf(CLASSINFO(wxToolBar
)))
4437 wxFrame
* pFrame
= wxDynamicCast(GetParent(), wxFrame
);
4439 if (pFrame
->GetToolBar() == this)
4440 return(pParent
->GetSize().y
);
4442 return(pParent
->GetClientSize().y
);
4445 return(pParent
->GetSize().y
);
4448 return(pParent
->GetClientSize().y
);
4451 // Case -- this is for any window that is the sole child of a Frame.
4452 // The grandparent must exist and it must be of type CFrame
4453 // and it's height must be different. Otherwise the standard
4459 return(pParent
->GetClientSize().y
);
4462 } // end of wxWindowOS2::GetOS2ParentHeight
4465 // OS/2 needs a lot extra manipulation to deal with layouts
4466 // for canvas windows, particularly scrolled ones.
4468 wxWindowCreationHook::wxWindowCreationHook(
4469 wxWindow
* pWinBeingCreated
4472 gpWinBeingCreated
= pWinBeingCreated
;
4473 } // end of wxWindowCreationHook::wxWindowCreationHook
4475 wxWindowCreationHook::~wxWindowCreationHook()
4477 gpWinBeingCreated
= NULL
;
4478 } // end of wxWindowCreationHook::~wxWindowCreationHook
4480 // ===========================================================================
4482 // ===========================================================================
4488 ,wxFont
* WXUNUSED(pTheFont
)
4495 hPS
=::WinGetPS(hWnd
);
4497 rc
= ::GpiQueryFontMetrics(hPS
, sizeof(FONTMETRICS
), &vFM
);
4501 *pX
= vFM
.lAveCharWidth
;
4503 *pY
= vFM
.lEmHeight
+ vFM
.lExternalLeading
;
4512 ::WinReleasePS(hPS
);
4513 } // end of wxGetCharSize
4516 // Returns 0 if was a normal ASCII value, not a special key. This indicates that
4517 // the key should be ignored by WM_KEYDOWN and processed by WM_CHAR instead.
4519 int wxCharCodeOS2ToWX(
4527 case VK_BACKTAB
: nId
= WXK_BACK
; break;
4528 case VK_TAB
: nId
= WXK_TAB
; break;
4529 case VK_CLEAR
: nId
= WXK_CLEAR
; break;
4530 case VK_ENTER
: nId
= WXK_RETURN
; break;
4531 case VK_SHIFT
: nId
= WXK_SHIFT
; break;
4532 case VK_CTRL
: nId
= WXK_CONTROL
; break;
4533 case VK_PAUSE
: nId
= WXK_PAUSE
; break;
4534 case VK_SPACE
: nId
= WXK_SPACE
; break;
4535 case VK_PAGEUP
: nId
= WXK_PRIOR
; break;
4536 case VK_PAGEDOWN
: nId
= WXK_NEXT
; break;
4537 case VK_ESC
: nId
= WXK_ESCAPE
; break;
4538 case VK_END
: nId
= WXK_END
; break;
4539 case VK_HOME
: nId
= WXK_HOME
; break;
4540 case VK_LEFT
: nId
= WXK_LEFT
; break;
4541 case VK_UP
: nId
= WXK_UP
; break;
4542 case VK_RIGHT
: nId
= WXK_RIGHT
; break;
4543 case VK_DOWN
: nId
= WXK_DOWN
; break;
4544 case VK_PRINTSCRN
: nId
= WXK_PRINT
; break;
4545 case VK_INSERT
: nId
= WXK_INSERT
; break;
4546 case VK_DELETE
: nId
= WXK_DELETE
; break;
4547 case VK_CAPSLOCK
: nId
= WXK_CAPITAL
; break;
4548 case VK_F1
: nId
= WXK_F1
; break;
4549 case VK_F2
: nId
= WXK_F2
; break;
4550 case VK_F3
: nId
= WXK_F3
; break;
4551 case VK_F4
: nId
= WXK_F4
; break;
4552 case VK_F5
: nId
= WXK_F5
; break;
4553 case VK_F6
: nId
= WXK_F6
; break;
4554 case VK_F7
: nId
= WXK_F7
; break;
4555 case VK_F8
: nId
= WXK_F8
; break;
4556 case VK_F9
: nId
= WXK_F9
; break;
4557 case VK_F10
: nId
= WXK_F10
; break;
4558 case VK_F11
: nId
= WXK_F11
; break;
4559 case VK_F12
: nId
= WXK_F12
; break;
4560 case VK_F13
: nId
= WXK_F13
; break;
4561 case VK_F14
: nId
= WXK_F14
; break;
4562 case VK_F15
: nId
= WXK_F15
; break;
4563 case VK_F16
: nId
= WXK_F16
; break;
4564 case VK_F17
: nId
= WXK_F17
; break;
4565 case VK_F18
: nId
= WXK_F18
; break;
4566 case VK_F19
: nId
= WXK_F19
; break;
4567 case VK_F20
: nId
= WXK_F20
; break;
4568 case VK_F21
: nId
= WXK_F21
; break;
4569 case VK_F22
: nId
= WXK_F22
; break;
4570 case VK_F23
: nId
= WXK_F23
; break;
4571 case VK_F24
: nId
= WXK_F24
; break;
4572 case VK_OEM_1
: nId
= ';'; break;
4573 case VK_OEM_PLUS
: nId
= '+'; break;
4574 case VK_OEM_COMMA
: nId
= ','; break;
4575 case VK_OEM_MINUS
: nId
= '-'; break;
4576 case VK_OEM_PERIOD
: nId
= '.'; break;
4577 case VK_OEM_2
: nId
= '/'; break;
4578 case VK_OEM_3
: nId
= '~'; break;
4579 case VK_OEM_4
: nId
= '['; break;
4580 case VK_OEM_5
: nId
= '\\'; break;
4581 case VK_OEM_6
: nId
= ']'; break;
4582 case VK_OEM_7
: nId
= '\''; break;
4583 case VK_NUMLOCK
: nId
= WXK_NUMLOCK
; break;
4584 case VK_SCRLLOCK
: nId
= WXK_SCROLL
; break;
4591 } // end of wxCharCodeOS2ToWX
4593 int wxCharCodeWXToOS2( int nId
,
4601 case WXK_CLEAR
: nKeySym
= VK_CLEAR
; break;
4602 case WXK_SHIFT
: nKeySym
= VK_SHIFT
; break;
4603 case WXK_CONTROL
: nKeySym
= VK_CTRL
; break;
4604 case WXK_PAUSE
: nKeySym
= VK_PAUSE
; break;
4605 case WXK_PRIOR
: nKeySym
= VK_PAGEUP
; break;
4606 case WXK_NEXT
: nKeySym
= VK_PAGEDOWN
; break;
4607 case WXK_END
: nKeySym
= VK_END
; break;
4608 case WXK_HOME
: nKeySym
= VK_HOME
; break;
4609 case WXK_LEFT
: nKeySym
= VK_LEFT
; break;
4610 case WXK_UP
: nKeySym
= VK_UP
; break;
4611 case WXK_RIGHT
: nKeySym
= VK_RIGHT
; break;
4612 case WXK_DOWN
: nKeySym
= VK_DOWN
; break;
4613 case WXK_PRINT
: nKeySym
= VK_PRINTSCRN
; break;
4614 case WXK_INSERT
: nKeySym
= VK_INSERT
; break;
4615 case WXK_DELETE
: nKeySym
= VK_DELETE
; break;
4616 case WXK_F1
: nKeySym
= VK_F1
; break;
4617 case WXK_F2
: nKeySym
= VK_F2
; break;
4618 case WXK_F3
: nKeySym
= VK_F3
; break;
4619 case WXK_F4
: nKeySym
= VK_F4
; break;
4620 case WXK_F5
: nKeySym
= VK_F5
; break;
4621 case WXK_F6
: nKeySym
= VK_F6
; break;
4622 case WXK_F7
: nKeySym
= VK_F7
; break;
4623 case WXK_F8
: nKeySym
= VK_F8
; break;
4624 case WXK_F9
: nKeySym
= VK_F9
; break;
4625 case WXK_F10
: nKeySym
= VK_F10
; break;
4626 case WXK_F11
: nKeySym
= VK_F11
; break;
4627 case WXK_F12
: nKeySym
= VK_F12
; break;
4628 case WXK_F13
: nKeySym
= VK_F13
; break;
4629 case WXK_F14
: nKeySym
= VK_F14
; break;
4630 case WXK_F15
: nKeySym
= VK_F15
; break;
4631 case WXK_F16
: nKeySym
= VK_F16
; break;
4632 case WXK_F17
: nKeySym
= VK_F17
; break;
4633 case WXK_F18
: nKeySym
= VK_F18
; break;
4634 case WXK_F19
: nKeySym
= VK_F19
; break;
4635 case WXK_F20
: nKeySym
= VK_F20
; break;
4636 case WXK_F21
: nKeySym
= VK_F21
; break;
4637 case WXK_F22
: nKeySym
= VK_F22
; break;
4638 case WXK_F23
: nKeySym
= VK_F23
; break;
4639 case WXK_F24
: nKeySym
= VK_F24
; break;
4640 case WXK_NUMLOCK
: nKeySym
= VK_NUMLOCK
; break;
4641 case WXK_SCROLL
: nKeySym
= VK_SCRLLOCK
; break;
4644 *bIsVirtual
= false;
4650 } // end of wxCharCodeWXToOS2
4652 wxWindow
* wxGetActiveWindow()
4654 HWND hWnd
= ::WinQueryActiveWindow(HWND_DESKTOP
);
4658 return wxFindWinFromHandle((WXHWND
)hWnd
);
4661 } // end of wxGetActiveWindow
4664 const wxChar
* wxGetMessageName( int nMessage
)
4668 case 0x0000: return wxT("WM_NULL");
4669 case 0x0001: return wxT("WM_CREATE");
4670 case 0x0002: return wxT("WM_DESTROY");
4671 case 0x0004: return wxT("WM_ENABLE");
4672 case 0x0005: return wxT("WM_SHOW");
4673 case 0x0006: return wxT("WM_MOVE");
4674 case 0x0007: return wxT("WM_SIZE");
4675 case 0x0008: return wxT("WM_ADJUSTWINDOWPOS");
4676 case 0x0009: return wxT("WM_CALCVALIDRECTS");
4677 case 0x000A: return wxT("WM_SETWINDOWPARAMS");
4678 case 0x000B: return wxT("WM_QUERYWINDOWPARAMS");
4679 case 0x000C: return wxT("WM_HITTEST");
4680 case 0x000D: return wxT("WM_ACTIVATE");
4681 case 0x000F: return wxT("WM_SETFOCUS");
4682 case 0x0010: return wxT("WM_SETSELECTION");
4683 case 0x0011: return wxT("WM_PPAINT");
4684 case 0x0012: return wxT("WM_PSETFOCUS");
4685 case 0x0013: return wxT("WM_PSYSCOLORCHANGE");
4686 case 0x0014: return wxT("WM_PSIZE");
4687 case 0x0015: return wxT("WM_PACTIVATE");
4688 case 0x0016: return wxT("WM_PCONTROL");
4689 case 0x0020: return wxT("WM_COMMAND");
4690 case 0x0021: return wxT("WM_SYSCOMMAND");
4691 case 0x0022: return wxT("WM_HELP");
4692 case 0x0023: return wxT("WM_PAINT");
4693 case 0x0024: return wxT("WM_TIMER");
4694 case 0x0025: return wxT("WM_SEM1");
4695 case 0x0026: return wxT("WM_SEM2");
4696 case 0x0027: return wxT("WM_SEM3");
4697 case 0x0028: return wxT("WM_SEM4");
4698 case 0x0029: return wxT("WM_CLOSE");
4699 case 0x002A: return wxT("WM_QUIT");
4700 case 0x002B: return wxT("WM_SYSCOLORCHANGE");
4701 case 0x002D: return wxT("WM_SYSVALUECHANGE");
4702 case 0x002E: return wxT("WM_APPTERMINATENOTIFY");
4703 case 0x002F: return wxT("WM_PRESPARAMCHANGED");
4704 // Control notification messages
4705 case 0x0030: return wxT("WM_CONTROL");
4706 case 0x0031: return wxT("WM_VSCROLL");
4707 case 0x0032: return wxT("WM_HSCROLL");
4708 case 0x0033: return wxT("WM_INITMENU");
4709 case 0x0034: return wxT("WM_MENUSELECT");
4710 case 0x0035: return wxT("WM_MENUSEND");
4711 case 0x0036: return wxT("WM_DRAWITEM");
4712 case 0x0037: return wxT("WM_MEASUREITEM");
4713 case 0x0038: return wxT("WM_CONTROLPOINTER");
4714 case 0x003A: return wxT("WM_QUERYDLGCODE");
4715 case 0x003B: return wxT("WM_INITDLG");
4716 case 0x003C: return wxT("WM_SUBSTITUTESTRING");
4717 case 0x003D: return wxT("WM_MATCHMNEMONIC");
4718 case 0x003E: return wxT("WM_SAVEAPPLICATION");
4719 case 0x0129: return wxT("WM_CTLCOLORCHANGE");
4720 case 0x0130: return wxT("WM_QUERYCTLTYPE");
4722 case 0x0040: return wxT("WM_FLASHWINDOW");
4723 case 0x0041: return wxT("WM_FORMATFRAME");
4724 case 0x0042: return wxT("WM_UPDATEFRAME");
4725 case 0x0043: return wxT("WM_FOCUSCHANGE");
4726 case 0x0044: return wxT("WM_SETBORDERSIZE");
4727 case 0x0045: return wxT("WM_TRACKFRAME");
4728 case 0x0046: return wxT("WM_MINMAXFRAME");
4729 case 0x0047: return wxT("WM_SETICON");
4730 case 0x0048: return wxT("WM_QUERYICON");
4731 case 0x0049: return wxT("WM_SETACCELTABLE");
4732 case 0x004A: return wxT("WM_QUERYACCELTABLE");
4733 case 0x004B: return wxT("WM_TRANSLATEACCEL");
4734 case 0x004C: return wxT("WM_QUERYTRACKINFO");
4735 case 0x004D: return wxT("WM_QUERYBORDERSIZE");
4736 case 0x004E: return wxT("WM_NEXTMENU");
4737 case 0x004F: return wxT("WM_ERASEBACKGROUND");
4738 case 0x0050: return wxT("WM_QUERYFRAMEINFO");
4739 case 0x0051: return wxT("WM_QUERYFOCUSCHAIN");
4740 case 0x0052: return wxT("WM_OWNERPOSCHANGE");
4741 case 0x0053: return wxT("WM_CACLFRAMERECT");
4742 case 0x0055: return wxT("WM_WINDOWPOSCHANGED");
4743 case 0x0056: return wxT("WM_ADJUSTFRAMEPOS");
4744 case 0x0059: return wxT("WM_QUERYFRAMECTLCOUNT");
4745 case 0x005B: return wxT("WM_QUERYHELPINFO");
4746 case 0x005C: return wxT("WM_SETHELPINFO");
4747 case 0x005D: return wxT("WM_ERROR");
4748 case 0x005E: return wxT("WM_REALIZEPALETTE");
4749 // Clipboard messages
4750 case 0x0060: return wxT("WM_RENDERFMT");
4751 case 0x0061: return wxT("WM_RENDERALLFMTS");
4752 case 0x0062: return wxT("WM_DESTROYCLIPBOARD");
4753 case 0x0063: return wxT("WM_PAINTCLIPBOARD");
4754 case 0x0064: return wxT("WM_SIZECLIPBOARD");
4755 case 0x0065: return wxT("WM_HSCROLLCLIPBOARD");
4756 case 0x0066: return wxT("WM_VSCROLLCLIPBOARD");
4757 case 0x0067: return wxT("WM_DRAWCLIPBOARD");
4759 case 0x0070: return wxT("WM_MOUSEMOVE");
4760 case 0x0071: return wxT("WM_BUTTON1DOWN");
4761 case 0x0072: return wxT("WM_BUTTON1UP");
4762 case 0x0073: return wxT("WM_BUTTON1DBLCLK");
4763 case 0x0074: return wxT("WM_BUTTON2DOWN");
4764 case 0x0075: return wxT("WM_BUTTON2UP");
4765 case 0x0076: return wxT("WM_BUTTON2DBLCLK");
4766 case 0x0077: return wxT("WM_BUTTON3DOWN");
4767 case 0x0078: return wxT("WM_BUTTON3UP");
4768 case 0x0079: return wxT("WM_BUTTON3DBLCLK");
4769 case 0x007D: return wxT("WM_MOUSEMAP");
4770 case 0x007E: return wxT("WM_VRNDISABLED");
4771 case 0x007F: return wxT("WM_VRNENABLED");
4772 case 0x0410: return wxT("WM_CHORD");
4773 case 0x0411: return wxT("WM_BUTTON1MOTIONSTART");
4774 case 0x0412: return wxT("WM_BUTTON1MOTIONEND");
4775 case 0x0413: return wxT("WM_BUTTON1CLICK");
4776 case 0x0414: return wxT("WM_BUTTON2MOTIONSTART");
4777 case 0x0415: return wxT("WM_BUTTON2MOTIONEND");
4778 case 0x0416: return wxT("WM_BUTTON2CLICK");
4779 case 0x0417: return wxT("WM_BUTTON3MOTIONSTART");
4780 case 0x0418: return wxT("WM_BUTTON3MOTIONEND");
4781 case 0x0419: return wxT("WM_BUTTON3CLICK");
4782 case 0x0420: return wxT("WM_BEGINDRAG");
4783 case 0x0421: return wxT("WM_ENDDRAG");
4784 case 0x0422: return wxT("WM_SINGLESELECT");
4785 case 0x0423: return wxT("WM_OPEN");
4786 case 0x0424: return wxT("WM_CONTEXTMENU");
4787 case 0x0425: return wxT("WM_CONTEXTHELP");
4788 case 0x0426: return wxT("WM_TEXTEDIT");
4789 case 0x0427: return wxT("WM_BEGINSELECT");
4790 case 0x0228: return wxT("WM_ENDSELECT");
4791 case 0x0429: return wxT("WM_PICKUP");
4792 case 0x04C0: return wxT("WM_PENFIRST");
4793 case 0x04FF: return wxT("WM_PENLAST");
4794 case 0x0500: return wxT("WM_MMPMFIRST");
4795 case 0x05FF: return wxT("WM_MMPMLAST");
4796 case 0x0600: return wxT("WM_STDDLGFIRST");
4797 case 0x06FF: return wxT("WM_STDDLGLAST");
4798 case 0x0BD0: return wxT("WM_BIDI_FIRST");
4799 case 0x0BFF: return wxT("WM_BIDI_LAST");
4801 case 0x007A: return wxT("WM_CHAR");
4802 case 0x007B: return wxT("WM_VIOCHAR");
4804 case 0x00A0: return wxT("WM_DDE_INITIATE");
4805 case 0x00A1: return wxT("WM_DDE_REQUEST");
4806 case 0x00A2: return wxT("WM_DDE_ACK");
4807 case 0x00A3: return wxT("WM_DDE_DATA");
4808 case 0x00A4: return wxT("WM_DDE_ADVISE");
4809 case 0x00A5: return wxT("WM_DDE_UNADVISE");
4810 case 0x00A6: return wxT("WM_DDE_POKE");
4811 case 0x00A7: return wxT("WM_DDE_EXECUTE");
4812 case 0x00A8: return wxT("WM_DDE_TERMINATE");
4813 case 0x00A9: return wxT("WM_DDE_INITIATEACK");
4814 case 0x00AF: return wxT("WM_DDE_LAST");
4816 case 0x0120: return wxT("BM_CLICK");
4817 case 0x0121: return wxT("BM_QUERYCHECKINDEX");
4818 case 0x0122: return wxT("BM_QUERYHILITE");
4819 case 0x0123: return wxT("BM_SETHILITE");
4820 case 0x0124: return wxT("BM_QUERYCHECK");
4821 case 0x0125: return wxT("BM_SETCHECK");
4822 case 0x0126: return wxT("BM_SETDEFAULT");
4823 case 0x0128: return wxT("BM_AUTOSIZE");
4825 case 0x029A: return wxT("CBID_LIST");
4826 case 0x029B: return wxT("CBID_EDIT");
4827 case 0x0170: return wxT("CBM_SHOWLIST");
4828 case 0x0171: return wxT("CBM_HILITE");
4829 case 0x0172: return wxT("CBM_ISLISTSHOWING");
4831 case 0x0140: return wxT("EM_QUERYCHANGED");
4832 case 0x0141: return wxT("EM_QUERYSEL");
4833 case 0x0142: return wxT("EM_SETSEL");
4834 case 0x0143: return wxT("EM_SETTEXTLIMIT");
4835 case 0x0144: return wxT("EM_CUT");
4836 case 0x0145: return wxT("EM_COPY");
4837 case 0x0146: return wxT("EM_CLEAR");
4838 case 0x0147: return wxT("EM_PASTE");
4839 case 0x0148: return wxT("EM_QUERYFIRSTCHAR");
4840 case 0x0149: return wxT("EM_SETFIRSTCHAR");
4841 case 0x014A: return wxT("EM_QUERYREADONLY");
4842 case 0x014B: return wxT("EM_SETREADONLY");
4843 case 0x014C: return wxT("EM_SETINSERTMODE");
4845 case 0x0160: return wxT("LM_QUERYITEMCOUNT");
4846 case 0x0161: return wxT("LM_INSERTITEM");
4847 case 0x0162: return wxT("LM_SETOPENINDEX");
4848 case 0x0163: return wxT("LM_DELETEITEM");
4849 case 0x0164: return wxT("LM_SELECTITEM");
4850 case 0x0165: return wxT("LM_QUERYSELECTION");
4851 case 0x0166: return wxT("LM_SETITEMTEXT");
4852 case 0x0167: return wxT("LM_QUERYITEMTEXTLENGTH");
4853 case 0x0168: return wxT("LM_QUERYITEMTEXT");
4854 case 0x0169: return wxT("LM_SETITEMHANDLE");
4855 case 0x016A: return wxT("LM_QUERYITEMHANDLE");
4856 case 0x016B: return wxT("LM_SEARCHSTRING");
4857 case 0x016C: return wxT("LM_SETITEMHEIGHT");
4858 case 0x016D: return wxT("LM_QUERYTOPINDEX");
4859 case 0x016E: return wxT("LM_DELETEALL");
4860 case 0x016F: return wxT("LM_INSERTMULITEMS");
4861 case 0x0660: return wxT("LM_SETITEMWIDTH");
4863 case 0x0180: return wxT("MM_INSERTITEM");
4864 case 0x0181: return wxT("MM_DELETEITEM");
4865 case 0x0182: return wxT("MM_QUERYITEM");
4866 case 0x0183: return wxT("MM_SETITEM");
4867 case 0x0184: return wxT("MM_QUERYITEMCOUNT");
4868 case 0x0185: return wxT("MM_STARTMENUMODE");
4869 case 0x0186: return wxT("MM_ENDMENUMODE");
4870 case 0x0188: return wxT("MM_REMOVEITEM");
4871 case 0x0189: return wxT("MM_SELECTITEM");
4872 case 0x018A: return wxT("MM_QUERYSELITEMID");
4873 case 0x018B: return wxT("MM_QUERYITEMTEXT");
4874 case 0x018C: return wxT("MM_QUERYITEMTEXTLENGTH");
4875 case 0x018D: return wxT("MM_SETITEMHANDLE");
4876 case 0x018E: return wxT("MM_SETITEMTEXT");
4877 case 0x018F: return wxT("MM_ITEMPOSITIONFROMID");
4878 case 0x0190: return wxT("MM_ITEMIDFROMPOSITION");
4879 case 0x0191: return wxT("MM_QUERYITEMATTR");
4880 case 0x0192: return wxT("MM_SETITEMATTR");
4881 case 0x0193: return wxT("MM_ISITEMVALID");
4882 case 0x0194: return wxT("MM_QUERYITEMRECT");
4883 case 0x0431: return wxT("MM_QUERYDEFAULTITEMID");
4884 case 0x0432: return wxT("MM_SETDEFAULTITEMID");
4886 case 0x01A0: return wxT("SBM_SETSCROLLBAR");
4887 case 0x01A1: return wxT("SBM_SETPOS");
4888 case 0x01A2: return wxT("SBM_QUERYPOS");
4889 case 0x01A3: return wxT("SBM_QUERYRANGE");
4890 case 0x01A6: return wxT("SBM_SETTHUMBSIZE");
4893 case 0x0F00: return wxT("WM_HELPBASE");
4894 case 0x0FFF: return wxT("WM_HELPTOP");
4895 // Beginning of user defined messages
4896 case 0x1000: return wxT("WM_USER");
4898 // wxWidgets user defined types
4901 // case 0x1000 + 0: return wxT("LVM_GETBKCOLOR");
4902 case 0x1000 + 1: return wxT("LVM_SETBKCOLOR");
4903 case 0x1000 + 2: return wxT("LVM_GETIMAGELIST");
4904 case 0x1000 + 3: return wxT("LVM_SETIMAGELIST");
4905 case 0x1000 + 4: return wxT("LVM_GETITEMCOUNT");
4906 case 0x1000 + 5: return wxT("LVM_GETITEMA");
4907 case 0x1000 + 75: return wxT("LVM_GETITEMW");
4908 case 0x1000 + 6: return wxT("LVM_SETITEMA");
4909 case 0x1000 + 76: return wxT("LVM_SETITEMW");
4910 case 0x1000 + 7: return wxT("LVM_INSERTITEMA");
4911 case 0x1000 + 77: return wxT("LVM_INSERTITEMW");
4912 case 0x1000 + 8: return wxT("LVM_DELETEITEM");
4913 case 0x1000 + 9: return wxT("LVM_DELETEALLITEMS");
4914 case 0x1000 + 10: return wxT("LVM_GETCALLBACKMASK");
4915 case 0x1000 + 11: return wxT("LVM_SETCALLBACKMASK");
4916 case 0x1000 + 12: return wxT("LVM_GETNEXTITEM");
4917 case 0x1000 + 13: return wxT("LVM_FINDITEMA");
4918 case 0x1000 + 83: return wxT("LVM_FINDITEMW");
4919 case 0x1000 + 14: return wxT("LVM_GETITEMRECT");
4920 case 0x1000 + 15: return wxT("LVM_SETITEMPOSITION");
4921 case 0x1000 + 16: return wxT("LVM_GETITEMPOSITION");
4922 case 0x1000 + 17: return wxT("LVM_GETSTRINGWIDTHA");
4923 case 0x1000 + 87: return wxT("LVM_GETSTRINGWIDTHW");
4924 case 0x1000 + 18: return wxT("LVM_HITTEST");
4925 case 0x1000 + 19: return wxT("LVM_ENSUREVISIBLE");
4926 case 0x1000 + 20: return wxT("LVM_SCROLL");
4927 case 0x1000 + 21: return wxT("LVM_REDRAWITEMS");
4928 case 0x1000 + 22: return wxT("LVM_ARRANGE");
4929 case 0x1000 + 23: return wxT("LVM_EDITLABELA");
4930 case 0x1000 + 118: return wxT("LVM_EDITLABELW");
4931 case 0x1000 + 24: return wxT("LVM_GETEDITCONTROL");
4932 case 0x1000 + 25: return wxT("LVM_GETCOLUMNA");
4933 case 0x1000 + 95: return wxT("LVM_GETCOLUMNW");
4934 case 0x1000 + 26: return wxT("LVM_SETCOLUMNA");
4935 case 0x1000 + 96: return wxT("LVM_SETCOLUMNW");
4936 case 0x1000 + 27: return wxT("LVM_INSERTCOLUMNA");
4937 case 0x1000 + 97: return wxT("LVM_INSERTCOLUMNW");
4938 case 0x1000 + 28: return wxT("LVM_DELETECOLUMN");
4939 case 0x1000 + 29: return wxT("LVM_GETCOLUMNWIDTH");
4940 case 0x1000 + 30: return wxT("LVM_SETCOLUMNWIDTH");
4941 case 0x1000 + 31: return wxT("LVM_GETHEADER");
4942 case 0x1000 + 33: return wxT("LVM_CREATEDRAGIMAGE");
4943 case 0x1000 + 34: return wxT("LVM_GETVIEWRECT");
4944 case 0x1000 + 35: return wxT("LVM_GETTEXTCOLOR");
4945 case 0x1000 + 36: return wxT("LVM_SETTEXTCOLOR");
4946 case 0x1000 + 37: return wxT("LVM_GETTEXTBKCOLOR");
4947 case 0x1000 + 38: return wxT("LVM_SETTEXTBKCOLOR");
4948 case 0x1000 + 39: return wxT("LVM_GETTOPINDEX");
4949 case 0x1000 + 40: return wxT("LVM_GETCOUNTPERPAGE");
4950 case 0x1000 + 41: return wxT("LVM_GETORIGIN");
4951 case 0x1000 + 42: return wxT("LVM_UPDATE");
4952 case 0x1000 + 43: return wxT("LVM_SETITEMSTATE");
4953 case 0x1000 + 44: return wxT("LVM_GETITEMSTATE");
4954 case 0x1000 + 45: return wxT("LVM_GETITEMTEXTA");
4955 case 0x1000 + 115: return wxT("LVM_GETITEMTEXTW");
4956 case 0x1000 + 46: return wxT("LVM_SETITEMTEXTA");
4957 case 0x1000 + 116: return wxT("LVM_SETITEMTEXTW");
4958 case 0x1000 + 47: return wxT("LVM_SETITEMCOUNT");
4959 case 0x1000 + 48: return wxT("LVM_SORTITEMS");
4960 case 0x1000 + 49: return wxT("LVM_SETITEMPOSITION32");
4961 case 0x1000 + 50: return wxT("LVM_GETSELECTEDCOUNT");
4962 case 0x1000 + 51: return wxT("LVM_GETITEMSPACING");
4963 case 0x1000 + 52: return wxT("LVM_GETISEARCHSTRINGA");
4964 case 0x1000 + 117: return wxT("LVM_GETISEARCHSTRINGW");
4965 case 0x1000 + 53: return wxT("LVM_SETICONSPACING");
4966 case 0x1000 + 54: return wxT("LVM_SETEXTENDEDLISTVIEWSTYLE");
4967 case 0x1000 + 55: return wxT("LVM_GETEXTENDEDLISTVIEWSTYLE");
4968 case 0x1000 + 56: return wxT("LVM_GETSUBITEMRECT");
4969 case 0x1000 + 57: return wxT("LVM_SUBITEMHITTEST");
4970 case 0x1000 + 58: return wxT("LVM_SETCOLUMNORDERARRAY");
4971 case 0x1000 + 59: return wxT("LVM_GETCOLUMNORDERARRAY");
4972 case 0x1000 + 60: return wxT("LVM_SETHOTITEM");
4973 case 0x1000 + 61: return wxT("LVM_GETHOTITEM");
4974 case 0x1000 + 62: return wxT("LVM_SETHOTCURSOR");
4975 case 0x1000 + 63: return wxT("LVM_GETHOTCURSOR");
4976 case 0x1000 + 64: return wxT("LVM_APPROXIMATEVIEWRECT");
4977 case 0x1000 + 65: return wxT("LVM_SETWORKAREA");
4980 case 0x1100 + 0: return wxT("TVM_INSERTITEMA");
4981 case 0x1100 + 50: return wxT("TVM_INSERTITEMW");
4982 case 0x1100 + 1: return wxT("TVM_DELETEITEM");
4983 case 0x1100 + 2: return wxT("TVM_EXPAND");
4984 case 0x1100 + 4: return wxT("TVM_GETITEMRECT");
4985 case 0x1100 + 5: return wxT("TVM_GETCOUNT");
4986 case 0x1100 + 6: return wxT("TVM_GETINDENT");
4987 case 0x1100 + 7: return wxT("TVM_SETINDENT");
4988 case 0x1100 + 8: return wxT("TVM_GETIMAGELIST");
4989 case 0x1100 + 9: return wxT("TVM_SETIMAGELIST");
4990 case 0x1100 + 10: return wxT("TVM_GETNEXTITEM");
4991 case 0x1100 + 11: return wxT("TVM_SELECTITEM");
4992 case 0x1100 + 12: return wxT("TVM_GETITEMA");
4993 case 0x1100 + 62: return wxT("TVM_GETITEMW");
4994 case 0x1100 + 13: return wxT("TVM_SETITEMA");
4995 case 0x1100 + 63: return wxT("TVM_SETITEMW");
4996 case 0x1100 + 14: return wxT("TVM_EDITLABELA");
4997 case 0x1100 + 65: return wxT("TVM_EDITLABELW");
4998 case 0x1100 + 15: return wxT("TVM_GETEDITCONTROL");
4999 case 0x1100 + 16: return wxT("TVM_GETVISIBLECOUNT");
5000 case 0x1100 + 17: return wxT("TVM_HITTEST");
5001 case 0x1100 + 18: return wxT("TVM_CREATEDRAGIMAGE");
5002 case 0x1100 + 19: return wxT("TVM_SORTCHILDREN");
5003 case 0x1100 + 20: return wxT("TVM_ENSUREVISIBLE");
5004 case 0x1100 + 21: return wxT("TVM_SORTCHILDRENCB");
5005 case 0x1100 + 22: return wxT("TVM_ENDEDITLABELNOW");
5006 case 0x1100 + 23: return wxT("TVM_GETISEARCHSTRINGA");
5007 case 0x1100 + 64: return wxT("TVM_GETISEARCHSTRINGW");
5008 case 0x1100 + 24: return wxT("TVM_SETTOOLTIPS");
5009 case 0x1100 + 25: return wxT("TVM_GETTOOLTIPS");
5012 case 0x1200 + 0: return wxT("HDM_GETITEMCOUNT");
5013 case 0x1200 + 1: return wxT("HDM_INSERTITEMA");
5014 case 0x1200 + 10: return wxT("HDM_INSERTITEMW");
5015 case 0x1200 + 2: return wxT("HDM_DELETEITEM");
5016 case 0x1200 + 3: return wxT("HDM_GETITEMA");
5017 case 0x1200 + 11: return wxT("HDM_GETITEMW");
5018 case 0x1200 + 4: return wxT("HDM_SETITEMA");
5019 case 0x1200 + 12: return wxT("HDM_SETITEMW");
5020 case 0x1200 + 5: return wxT("HDM_LAYOUT");
5021 case 0x1200 + 6: return wxT("HDM_HITTEST");
5022 case 0x1200 + 7: return wxT("HDM_GETITEMRECT");
5023 case 0x1200 + 8: return wxT("HDM_SETIMAGELIST");
5024 case 0x1200 + 9: return wxT("HDM_GETIMAGELIST");
5025 case 0x1200 + 15: return wxT("HDM_ORDERTOINDEX");
5026 case 0x1200 + 16: return wxT("HDM_CREATEDRAGIMAGE");
5027 case 0x1200 + 17: return wxT("HDM_GETORDERARRAY");
5028 case 0x1200 + 18: return wxT("HDM_SETORDERARRAY");
5029 case 0x1200 + 19: return wxT("HDM_SETHOTDIVIDER");
5032 case 0x1300 + 2: return wxT("TCM_GETIMAGELIST");
5033 case 0x1300 + 3: return wxT("TCM_SETIMAGELIST");
5034 case 0x1300 + 4: return wxT("TCM_GETITEMCOUNT");
5035 case 0x1300 + 5: return wxT("TCM_GETITEMA");
5036 case 0x1300 + 60: return wxT("TCM_GETITEMW");
5037 case 0x1300 + 6: return wxT("TCM_SETITEMA");
5038 case 0x1300 + 61: return wxT("TCM_SETITEMW");
5039 case 0x1300 + 7: return wxT("TCM_INSERTITEMA");
5040 case 0x1300 + 62: return wxT("TCM_INSERTITEMW");
5041 case 0x1300 + 8: return wxT("TCM_DELETEITEM");
5042 case 0x1300 + 9: return wxT("TCM_DELETEALLITEMS");
5043 case 0x1300 + 10: return wxT("TCM_GETITEMRECT");
5044 case 0x1300 + 11: return wxT("TCM_GETCURSEL");
5045 case 0x1300 + 12: return wxT("TCM_SETCURSEL");
5046 case 0x1300 + 13: return wxT("TCM_HITTEST");
5047 case 0x1300 + 14: return wxT("TCM_SETITEMEXTRA");
5048 case 0x1300 + 40: return wxT("TCM_ADJUSTRECT");
5049 case 0x1300 + 41: return wxT("TCM_SETITEMSIZE");
5050 case 0x1300 + 42: return wxT("TCM_REMOVEIMAGE");
5051 case 0x1300 + 43: return wxT("TCM_SETPADDING");
5052 case 0x1300 + 44: return wxT("TCM_GETROWCOUNT");
5053 case 0x1300 + 45: return wxT("TCM_GETTOOLTIPS");
5054 case 0x1300 + 46: return wxT("TCM_SETTOOLTIPS");
5055 case 0x1300 + 47: return wxT("TCM_GETCURFOCUS");
5056 case 0x1300 + 48: return wxT("TCM_SETCURFOCUS");
5057 case 0x1300 + 49: return wxT("TCM_SETMINTABWIDTH");
5058 case 0x1300 + 50: return wxT("TCM_DESELECTALL");
5061 case WM_USER
+1000+1: return wxT("TB_ENABLEBUTTON");
5062 case WM_USER
+1000+2: return wxT("TB_CHECKBUTTON");
5063 case WM_USER
+1000+3: return wxT("TB_PRESSBUTTON");
5064 case WM_USER
+1000+4: return wxT("TB_HIDEBUTTON");
5065 case WM_USER
+1000+5: return wxT("TB_INDETERMINATE");
5066 case WM_USER
+1000+9: return wxT("TB_ISBUTTONENABLED");
5067 case WM_USER
+1000+10: return wxT("TB_ISBUTTONCHECKED");
5068 case WM_USER
+1000+11: return wxT("TB_ISBUTTONPRESSED");
5069 case WM_USER
+1000+12: return wxT("TB_ISBUTTONHIDDEN");
5070 case WM_USER
+1000+13: return wxT("TB_ISBUTTONINDETERMINATE");
5071 case WM_USER
+1000+17: return wxT("TB_SETSTATE");
5072 case WM_USER
+1000+18: return wxT("TB_GETSTATE");
5073 case WM_USER
+1000+19: return wxT("TB_ADDBITMAP");
5074 case WM_USER
+1000+20: return wxT("TB_ADDBUTTONS");
5075 case WM_USER
+1000+21: return wxT("TB_INSERTBUTTON");
5076 case WM_USER
+1000+22: return wxT("TB_DELETEBUTTON");
5077 case WM_USER
+1000+23: return wxT("TB_GETBUTTON");
5078 case WM_USER
+1000+24: return wxT("TB_BUTTONCOUNT");
5079 case WM_USER
+1000+25: return wxT("TB_COMMANDTOINDEX");
5080 case WM_USER
+1000+26: return wxT("TB_SAVERESTOREA");
5081 case WM_USER
+1000+76: return wxT("TB_SAVERESTOREW");
5082 case WM_USER
+1000+27: return wxT("TB_CUSTOMIZE");
5083 case WM_USER
+1000+28: return wxT("TB_ADDSTRINGA");
5084 case WM_USER
+1000+77: return wxT("TB_ADDSTRINGW");
5085 case WM_USER
+1000+29: return wxT("TB_GETITEMRECT");
5086 case WM_USER
+1000+30: return wxT("TB_BUTTONSTRUCTSIZE");
5087 case WM_USER
+1000+31: return wxT("TB_SETBUTTONSIZE");
5088 case WM_USER
+1000+32: return wxT("TB_SETBITMAPSIZE");
5089 case WM_USER
+1000+33: return wxT("TB_AUTOSIZE");
5090 case WM_USER
+1000+35: return wxT("TB_GETTOOLTIPS");
5091 case WM_USER
+1000+36: return wxT("TB_SETTOOLTIPS");
5092 case WM_USER
+1000+37: return wxT("TB_SETPARENT");
5093 case WM_USER
+1000+39: return wxT("TB_SETROWS");
5094 case WM_USER
+1000+40: return wxT("TB_GETROWS");
5095 case WM_USER
+1000+42: return wxT("TB_SETCMDID");
5096 case WM_USER
+1000+43: return wxT("TB_CHANGEBITMAP");
5097 case WM_USER
+1000+44: return wxT("TB_GETBITMAP");
5098 case WM_USER
+1000+45: return wxT("TB_GETBUTTONTEXTA");
5099 case WM_USER
+1000+75: return wxT("TB_GETBUTTONTEXTW");
5100 case WM_USER
+1000+46: return wxT("TB_REPLACEBITMAP");
5101 case WM_USER
+1000+47: return wxT("TB_SETINDENT");
5102 case WM_USER
+1000+48: return wxT("TB_SETIMAGELIST");
5103 case WM_USER
+1000+49: return wxT("TB_GETIMAGELIST");
5104 case WM_USER
+1000+50: return wxT("TB_LOADIMAGES");
5105 case WM_USER
+1000+51: return wxT("TB_GETRECT");
5106 case WM_USER
+1000+52: return wxT("TB_SETHOTIMAGELIST");
5107 case WM_USER
+1000+53: return wxT("TB_GETHOTIMAGELIST");
5108 case WM_USER
+1000+54: return wxT("TB_SETDISABLEDIMAGELIST");
5109 case WM_USER
+1000+55: return wxT("TB_GETDISABLEDIMAGELIST");
5110 case WM_USER
+1000+56: return wxT("TB_SETSTYLE");
5111 case WM_USER
+1000+57: return wxT("TB_GETSTYLE");
5112 case WM_USER
+1000+58: return wxT("TB_GETBUTTONSIZE");
5113 case WM_USER
+1000+59: return wxT("TB_SETBUTTONWIDTH");
5114 case WM_USER
+1000+60: return wxT("TB_SETMAXTEXTROWS");
5115 case WM_USER
+1000+61: return wxT("TB_GETTEXTROWS");
5116 case WM_USER
+1000+41: return wxT("TB_GETBITMAPFLAGS");
5119 static wxString s_szBuf
;
5120 s_szBuf
.Printf(wxT("<unknown message = %d>"), nMessage
);
5121 return s_szBuf
.c_str();
5123 } // end of wxGetMessageName
5125 #endif // __WXDEBUG__
5129 static void TranslateKbdEventToMouse(
5137 // Construct the key mask
5138 ULONG
& fwKeys
= *pFlags
;
5140 fwKeys
= VK_BUTTON2
;
5141 if ((::WinGetKeyState(HWND_DESKTOP
, VK_CTRL
) & 0x100) != 0)
5143 if ((::WinGetKeyState(HWND_DESKTOP
, VK_SHIFT
) & 0x100) != 0)
5147 // Simulate right mouse button click
5151 ::WinQueryMsgPos(vHabmain
, &vPoint
);
5155 pWin
->ScreenToClient(pX
, pY
);
5156 } // end of TranslateKbdEventToMouse
5159 // Find the wxWindow at the current mouse position, returning the mouse
5161 wxWindow
* wxFindWindowAtPointer(wxPoint
& WXUNUSED(rPt
))
5163 return wxFindWindowAtPoint(wxGetMousePosition());
5166 wxWindow
* wxFindWindowAtPoint(const wxPoint
& rPt
)
5173 HWND hWndHit
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt2
, FALSE
);
5174 wxWindow
* pWin
= wxFindWinFromHandle((WXHWND
)hWndHit
) ;
5175 HWND hWnd
= hWndHit
;
5178 // Try to find a window with a wxWindow associated with it
5180 while (!pWin
&& (hWnd
!= 0))
5182 hWnd
= ::WinQueryWindow(hWnd
, QW_PARENT
);
5183 pWin
= wxFindWinFromHandle((WXHWND
)hWnd
) ;
5188 // Get the current mouse position.
5189 wxPoint
wxGetMousePosition()
5193 ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
);
5194 return wxPoint(vPt
.x
, vPt
.y
);
5197 wxWindowOS2
* FindWindowForMouseEvent( wxWindow
* pWin
,
5198 short* WXUNUSED(pnX
),
5199 short* WXUNUSED(pnY
) )
5201 HWND hWnd
= GetHwndOf(pWin
);
5202 HWND hWndUnderMouse
;
5204 BOOL rcEnabled
= FALSE
;
5205 BOOL rcVisible
= FALSE
;
5207 ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
);
5208 hWndUnderMouse
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, TRUE
);
5209 if (hWndUnderMouse
!= HWND_DESKTOP
)
5211 wxWindow
* pWinUnderMouse
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
);
5215 wxWindowList::compatibility_iterator current
= pWinUnderMouse
->GetChildren().GetFirst();
5216 wxWindow
* pGrandChild
= NULL
;
5220 ::WinMapWindowPoints(HWND_DESKTOP
, hWndUnderMouse
, &vPoint
, 1);
5222 // Find a child window mouse might be under
5226 wxWindow
* pChild
= current
->GetData();
5228 vPoint2
.x
= vPoint
.x
;
5229 vPoint2
.y
= vPoint
.y
;
5230 ::WinMapWindowPoints(hWndUnderMouse
, pChild
->GetHWND(), &vPoint2
, 1);
5231 ::WinQueryWindowRect(pChild
->GetHWND(), &vRect
);
5232 if (::WinPtInRect(vHabmain
, &vRect
, &vPoint2
))
5234 if (pChild
->IsTopLevel())
5237 wxWindowList::compatibility_iterator current2
=pChild
->GetChildren().GetFirst();
5241 wxWindow
* pGrandChild
= current2
->GetData();
5243 vPoint3
.x
= vPoint2
.x
;
5244 vPoint3
.y
= vPoint2
.y
;
5245 ::WinMapWindowPoints( pChild
->GetHWND()
5246 ,pGrandChild
->GetHWND()
5250 ::WinQueryWindowRect(pGrandChild
->GetHWND(), &vRect
);
5251 if (::WinPtInRect(vHabmain
, &vRect
, &vPoint3
))
5253 hWndUnderMouse
= GetHwndOf(pGrandChild
);
5254 pWinUnderMouse
= pGrandChild
;
5257 current2
= current2
->GetNext();
5262 hWndUnderMouse
= GetHwndOf(pChild
);
5263 pWinUnderMouse
= pChild
;
5264 rcVisible
= ::WinIsWindowVisible(hWndUnderMouse
);
5265 rcEnabled
= ::WinIsWindowEnabled(hWndUnderMouse
);
5266 if (rcVisible
&& rcEnabled
)
5269 current
= current
->GetNext();
5273 rcVisible
= ::WinIsWindowVisible(hWndUnderMouse
);
5274 rcEnabled
= ::WinIsWindowEnabled(hWndUnderMouse
);
5278 // Check that we have a child window which is susceptible to receive mouse
5279 // events: for this it must be shown and enabled
5281 if ( hWndUnderMouse
&&
5282 hWndUnderMouse
!= hWnd
&&
5283 rcVisible
&& rcEnabled
)
5285 wxWindow
* pWinUnderMouse
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
);
5290 // Translate the mouse coords to the other window coords
5292 pWin
= pWinUnderMouse
;
5296 } // end of FindWindowForMouseEvent