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
;
730 ULONG ulStyle
= WS_VISIBLE
| WS_SYNCPAINT
;
735 wxWindow
* pParent
= GetParent();
737 if (pParent
&& pParent
->IsKindOf(CLASSINFO(wxFrame
)))
741 pFrame
= wxDynamicCast(pParent
, wxFrame
);
742 hWndParent
= pFrame
->GetFrame();
743 hWndClient
= GetHwndOf(pParent
);
748 hWndParent
= GetHwndOf(pParent
);
750 hWndParent
= GetHwnd();
751 hWndClient
= hWndParent
;
753 ::WinQueryWindowPos(hWndClient
, &vSwp
);
754 ::WinQueryWindowPos(hWnd
, &vSwpOwner
);
756 if (nPageSize
> 1 && nRange
> 0)
758 nRange1
+= (nPageSize
- 1);
761 vInfo
.cb
= sizeof(SBCDATA
);
763 vInfo
.posLast
= (SHORT
)nRange1
;
764 vInfo
.posThumb
= (SHORT
)nPos
;
766 if (nOrient
== wxHORIZONTAL
)
769 if (m_hWndScrollBarHorz
== 0L)
772 // Since the scrollbars are usually created before the owner is
773 // sized either via an OnSize event directly or via sizers or
774 // layout constraints, we will initially just use the coords of
775 // the parent window (this is usually a frame client window). But
776 // the bars themselves, are children of the parent frame (i.e
777 // siblings of the frame client. The owner, however is the actual
778 // window being scrolled (or at least the one responsible for
779 // handling the scroll events). The owner will be resized later,
780 // as it is usually a child of a top level window, and when that
781 // is done its scrollbars will be resized and repositioned as well.
783 m_hWndScrollBarHorz
= ::WinCreateWindow( hWndParent
801 // The owner (the scrolled window) is a child of the Frame's
802 // client window, usually. The scrollbars are children of the
803 // frame, itself, and thus are positioned relative to the frame's
804 // origin, not the frame's client window origin.
805 // The starting x position is the same as the starting x position
806 // of the owner, but in terms of the parent frame.
807 // The starting y position is 20 pels below the origin of the
808 // owner in terms of the parent frame.
809 // The horz bar is the same width as the owner and 20 pels high.
811 if (nRange1
>= nThumbVisible
)
813 ::WinSetWindowPos( m_hWndScrollBarHorz
815 ,vSwp
.x
+ vSwpOwner
.x
816 ,(vSwp
.y
+ vSwpOwner
.y
) - 20
819 ,SWP_MOVE
| SWP_SIZE
| SWP_SHOW
| SWP_ACTIVATE
| SWP_ZORDER
821 ::WinSendMsg( m_hWndScrollBarHorz
824 ,MPFROM2SHORT(0, (SHORT
)nRange1
)
826 ::WinSendMsg( m_hWndScrollBarHorz
828 ,MPFROM2SHORT( (SHORT
)nThumbVisible
835 ::WinShowWindow(m_hWndScrollBarHorz
, FALSE
);
841 if (m_hWndScrollBarVert
== 0L)
844 // Since the scrollbars are usually created before the owner is
845 // sized either via an OnSize event directly or via sizers or
846 // layout constraints, we will initially just use the coords of
847 // the parent window (this is usually a frame client window). But
848 // the bars themselves, are children of the parent frame (i.e
849 // siblings of the frame client. The owner, however is the actual
850 // window being scrolled (or at least the one responsible for
851 // handling the scroll events). The owner will be resized later,
852 // as it is usually a child of a top level window, and when that
853 // is done its scrollbars will be resized and repositioned as well.
855 m_hWndScrollBarVert
= ::WinCreateWindow( hWndParent
859 ,vSwp
.x
+ vSwp
.cx
- 20
873 // The owner (the scrolled window) is a child of the Frame's
874 // client window, usually. The scrollbars are children of the
875 // frame, itself and thus are positioned relative to the frame's
876 // origin, not the frame's client window's origin.
877 // Thus, the x position will be frame client's x (usually a few
878 // pels inside the parent frame, plus the width of the owner.
879 // Since we may be using sizers or layout constraints for multiple
880 // child scrolled windows, the y position will be the frame client's
881 // y pos plus the scrolled windows y position, yielding the y
882 // position of the scrollbar relative to the parent frame (the vert
883 // scrollbar is on the right and starts at the bottom of the
885 // It is 20 pels wide and the same height as the owner.
887 if (nRange1
>= nThumbVisible
)
889 ::WinSetWindowPos( m_hWndScrollBarVert
891 ,vSwp
.x
+ vSwpOwner
.x
+ vSwpOwner
.cx
892 ,vSwp
.y
+ vSwpOwner
.y
895 ,SWP_ACTIVATE
| SWP_MOVE
| SWP_SIZE
| SWP_SHOW
897 ::WinSendMsg( m_hWndScrollBarVert
900 ,MPFROM2SHORT(0, (SHORT
)nRange1
)
902 ::WinSendMsg( m_hWndScrollBarVert
904 ,MPFROM2SHORT( (SHORT
)nThumbVisible
911 ::WinShowWindow(m_hWndScrollBarVert
, FALSE
);
913 m_nYThumbSize
= nThumbVisible
;
915 } // end of wxWindowOS2::SetScrollbar
918 void wxWindowOS2::ScrollWindow( int nDx
,
920 const wxRect
* pRect
)
924 ::WinQueryWindowRect(GetHwnd(), &vRect
);
925 int height
= vRect
.yTop
;
928 vRect
.xLeft
= pRect
->x
;
929 vRect
.yTop
= height
- pRect
->y
;
930 vRect
.xRight
= pRect
->x
+ pRect
->width
;
931 vRect
.yBottom
= vRect
.yTop
- pRect
->height
;
933 nDy
*= -1; // flip the sign of Dy as OS/2 is opposite Windows.
934 ::WinScrollWindow( GetHwnd()
941 ,SW_SCROLLCHILDREN
| SW_INVALIDATERGN
943 } // end of wxWindowOS2::ScrollWindow
945 // ---------------------------------------------------------------------------
947 // ---------------------------------------------------------------------------
949 void wxWindowOS2::SubclassWin(
953 HWND hwnd
= (HWND
)hWnd
;
955 wxCHECK_RET(::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in SubclassWin") );
956 wxAssociateWinWithHandle( hWnd
959 if (!wxCheckWindowWndProc( hWnd
960 ,(WXFARPROC
)wxWndProc
963 m_fnOldWndProc
= (WXFARPROC
) ::WinSubclassWindow(hwnd
, (PFNWP
)wxWndProc
);
967 m_fnOldWndProc
= (WXFARPROC
)NULL
;
969 } // end of wxWindowOS2::SubclassWin
971 void wxWindowOS2::UnsubclassWin()
974 // Restore old Window proc
976 HWND hwnd
= GetHWND();
980 wxCHECK_RET( ::WinIsWindow(vHabmain
, hwnd
), wxT("invalid HWND in UnsubclassWin") );
982 PFNWP fnProc
= (PFNWP
)::WinQueryWindowPtr(hwnd
, QWP_PFNWP
);
984 if ( (m_fnOldWndProc
!= 0) && (fnProc
!= (PFNWP
) m_fnOldWndProc
))
986 WinSubclassWindow(hwnd
, (PFNWP
)m_fnOldWndProc
);
990 } // end of wxWindowOS2::UnsubclassWin
992 bool wxCheckWindowWndProc(
994 , WXFARPROC fnWndProc
997 static char zBuffer
[512];
1000 ::WinQueryClassName((HWND
)hWnd
, (LONG
)512, (PCH
)zBuffer
);
1001 ::WinQueryClassInfo(wxGetInstance(), (PSZ
)zBuffer
, &vCls
);
1002 return(fnWndProc
== (WXFARPROC
)vCls
.pfnWindowProc
);
1003 } // end of WinGuiBase_CheckWindowWndProc
1005 void wxWindowOS2::SetWindowStyleFlag(
1009 long lFlagsOld
= GetWindowStyleFlag();
1011 if (lFlags
== lFlagsOld
)
1015 // Update the internal variable
1017 wxWindowBase::SetWindowStyleFlag(lFlags
);
1020 // Now update the Windows style as well if needed - and if the window had
1021 // been already created
1027 WXDWORD dwExstyleOld
;
1028 long lStyle
= OS2GetStyle( lFlags
1031 long lStyleOld
= OS2GetStyle( lFlagsOld
1035 if (lStyle
!= lStyleOld
)
1038 // Some flags (e.g. WS_VISIBLE or WS_DISABLED) should not be changed by
1039 // this function so instead of simply setting the style to the new
1040 // value we clear the bits which were set in styleOld but are set in
1041 // the new one and set the ones which were not set before
1043 long lStyleReal
= ::WinQueryWindowULong(GetHwnd(), QWL_STYLE
);
1045 lStyleReal
&= ~lStyleOld
;
1046 lStyleReal
|= lStyle
;
1048 ::WinSetWindowULong(GetHwnd(), QWL_STYLE
, lStyleReal
);
1050 } // end of wxWindowOS2::SetWindowStyleFlag
1052 WXDWORD
wxWindowOS2::OS2GetStyle( long lFlags
,
1053 WXDWORD
* WXUNUSED(pdwExstyle
) ) const
1055 WXDWORD dwStyle
= 0L;
1057 if (lFlags
& wxCLIP_CHILDREN
)
1058 dwStyle
|= WS_CLIPCHILDREN
;
1060 if (lFlags
& wxCLIP_SIBLINGS
)
1061 dwStyle
|= WS_CLIPSIBLINGS
;
1064 } // end of wxWindowOS2::OS2GetStyle
1067 // Make a Windows extended style from the given wxWidgets window style
1069 WXDWORD
wxWindowOS2::MakeExtendedStyle(
1071 , bool bEliminateBorders
1075 // Simply fill out with wxWindow extended styles. We'll conjure
1076 // something up in OS2Create and all window redrawing pieces later
1078 WXDWORD dwStyle
= 0;
1080 if (lStyle
& wxTRANSPARENT_WINDOW
)
1081 dwStyle
|= wxTRANSPARENT_WINDOW
;
1083 if (!bEliminateBorders
)
1085 if (lStyle
& wxSUNKEN_BORDER
)
1086 dwStyle
|= wxSUNKEN_BORDER
;
1087 if (lStyle
& wxDOUBLE_BORDER
)
1088 dwStyle
|= wxDOUBLE_BORDER
;
1089 if (lStyle
& wxRAISED_BORDER
)
1090 dwStyle
|= wxRAISED_BORDER
;
1091 if (lStyle
& wxSTATIC_BORDER
)
1092 dwStyle
|= wxSTATIC_BORDER
;
1095 } // end of wxWindowOS2::MakeExtendedStyle
1098 // Setup background and foreground colours correctly
1100 void wxWindowOS2::SetupColours()
1103 SetBackgroundColour(GetParent()->GetBackgroundColour());
1104 } // end of wxWindowOS2::SetupColours
1106 void wxWindowOS2::OnIdle(
1107 wxIdleEvent
& WXUNUSED(rEvent
)
1111 // Check if we need to send a LEAVE event
1113 if (m_bMouseInWindow
)
1117 ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
);
1118 if (::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, FALSE
) != (HWND
)GetHwnd())
1121 // Generate a LEAVE event
1123 m_bMouseInWindow
= false;
1126 // Unfortunately the mouse button and keyboard state may have changed
1127 // by the time the OnIdle function is called, so 'state' may be
1137 wxMouseEvent
rEvent(wxEVT_LEAVE_WINDOW
);
1139 InitMouseEvent( rEvent
1144 (void)GetEventHandler()->ProcessEvent(rEvent
);
1147 if (wxUpdateUIEvent::CanUpdate(this))
1148 UpdateWindowUI(wxUPDATE_UI_FROMIDLE
);
1149 } // end of wxWindowOS2::OnIdle
1152 // Set this window to be the child of 'parent'.
1154 bool wxWindowOS2::Reparent( wxWindow
* pParent
)
1156 if (!wxWindowBase::Reparent(pParent
))
1159 HWND hWndChild
= GetHwnd();
1160 HWND hWndParent
= GetParent() ? GetWinHwnd(GetParent()) : (HWND
)0;
1162 ::WinSetParent(hWndChild
, hWndParent
, TRUE
);
1164 } // end of wxWindowOS2::Reparent
1166 void wxWindowOS2::Update()
1168 ::WinUpdateWindow(GetHwnd());
1169 } // end of wxWindowOS2::Update
1171 void wxWindowOS2::Freeze()
1173 ::WinSendMsg(GetHwnd(), WM_VRNDISABLED
, (MPARAM
)0, (MPARAM
)0);
1174 } // end of wxWindowOS2::Freeze
1176 void wxWindowOS2::Thaw()
1178 ::WinSendMsg(GetHwnd(), WM_VRNENABLED
, (MPARAM
)TRUE
, (MPARAM
)0);
1181 // We need to refresh everything or otherwise he invalidated area is not
1185 } // end of wxWindowOS2::Thaw
1187 void wxWindowOS2::Refresh( bool bEraseBack
,
1188 const wxRect
* pRect
)
1190 HWND hWnd
= GetHwnd();
1199 ::WinQueryWindowRect(GetHwnd(), &vOs2Rect
);
1200 height
= vOs2Rect
.yTop
;
1201 vOs2Rect
.xLeft
= pRect
->x
;
1202 vOs2Rect
.yTop
= height
- pRect
->y
;
1203 vOs2Rect
.xRight
= pRect
->x
+ pRect
->width
;
1204 vOs2Rect
.yBottom
= vOs2Rect
.yTop
- pRect
->height
;
1206 ::WinInvalidateRect(hWnd
, &vOs2Rect
, bEraseBack
);
1209 ::WinInvalidateRect(hWnd
, NULL
, bEraseBack
);
1210 if (m_hWndScrollBarHorz
!= NULLHANDLE
)
1211 ::WinInvalidateRect(m_hWndScrollBarHorz
, NULL
, TRUE
);
1212 if (m_hWndScrollBarVert
!= NULLHANDLE
)
1213 ::WinInvalidateRect(m_hWndScrollBarVert
, NULL
, TRUE
);
1215 } // end of wxWindowOS2::Refresh
1217 // ---------------------------------------------------------------------------
1219 // ---------------------------------------------------------------------------
1221 #if wxUSE_DRAG_AND_DROP
1222 void wxWindowOS2::SetDropTarget(
1223 wxDropTarget
* pDropTarget
1226 m_dropTarget
= pDropTarget
;
1227 } // end of wxWindowOS2::SetDropTarget
1231 // old style file-manager drag&drop support: we retain the old-style
1232 // DragAcceptFiles in parallel with SetDropTarget.
1234 void wxWindowOS2::DragAcceptFiles(
1238 HWND hWnd
= GetHwnd();
1240 if (hWnd
&& bAccept
)
1241 ::DrgAcceptDroppedFiles(hWnd
, NULL
, NULL
, DO_COPY
, 0L);
1242 } // end of wxWindowOS2::DragAcceptFiles
1244 // ----------------------------------------------------------------------------
1246 // ----------------------------------------------------------------------------
1250 void wxWindowOS2::DoSetToolTip(
1254 wxWindowBase::DoSetToolTip(pTooltip
);
1257 m_tooltip
->SetWindow(this);
1258 } // end of wxWindowOS2::DoSetToolTip
1260 #endif // wxUSE_TOOLTIPS
1262 // ---------------------------------------------------------------------------
1263 // moving and resizing
1264 // ---------------------------------------------------------------------------
1267 void wxWindowOS2::DoGetSize(
1275 if (IsKindOf(CLASSINFO(wxFrame
)))
1277 wxFrame
* pFrame
= wxDynamicCast(this, wxFrame
);
1278 hWnd
= pFrame
->GetFrame();
1283 ::WinQueryWindowRect(hWnd
, &vRect
);
1286 *pWidth
= vRect
.xRight
- vRect
.xLeft
;
1288 // OS/2 PM is backwards from windows
1289 *pHeight
= vRect
.yTop
- vRect
.yBottom
;
1290 } // end of wxWindowOS2::DoGetSize
1292 void wxWindowOS2::DoGetPosition(
1297 HWND hWnd
= GetHwnd();
1300 wxWindow
* pParent
= GetParent();
1303 // It would seem that WinQueryWindowRect would be the correlary to
1304 // the WIN32 WinGetRect, but unlike WinGetRect which returns the window
1305 // origin position in screen coordinates, WinQueryWindowRect returns it
1306 // relative to itself, i.e. (0,0). To get the same under PM we must
1307 // us WinQueryWindowPos. This call, unlike the WIN32 call, however,
1308 // returns a position relative to it's parent, so no parent adujstments
1309 // are needed under OS/2. Also, windows should be created using
1310 // wxWindow coordinates, i.e 0,0 is the TOP left so vSwp will already
1313 ::WinQueryWindowPos(hWnd
, &vSwp
);
1319 // We may be faking the client origin. So a window that's really at (0,
1320 // 30) may appear (to wxWin apps) to be at (0, 0).
1324 wxPoint
vPt(pParent
->GetClientAreaOrigin());
1334 } // end of wxWindowOS2::DoGetPosition
1336 void wxWindowOS2::DoScreenToClient(
1341 HWND hWnd
= GetHwnd();
1344 ::WinQueryWindowPos(hWnd
, &vSwp
);
1350 } // end of wxWindowOS2::DoScreenToClient
1352 void wxWindowOS2::DoClientToScreen(
1357 HWND hWnd
= GetHwnd();
1360 ::WinQueryWindowPos(hWnd
, &vSwp
);
1366 } // end of wxWindowOS2::DoClientToScreen
1369 // Get size *available for subwindows* i.e. excluding menu bar etc.
1370 // Must be a frame type window
1372 void wxWindowOS2::DoGetClientSize(
1377 HWND hWnd
= GetHwnd();
1380 ::WinQueryWindowRect(hWnd
, &vRect
);
1381 if (IsKindOf(CLASSINFO(wxDialog
)))
1386 // For a Dialog we have to explicitly request the client portion.
1387 // For a Frame the hWnd IS the client window
1389 hWndTitle
= ::WinWindowFromID(hWnd
, FID_TITLEBAR
);
1390 if (::WinQueryWindowRect(hWndTitle
, &vTitle
))
1392 if (vTitle
.yTop
- vTitle
.yBottom
== 0)
1395 // Dialog has not been created yet, use a default
1399 vRect
.yTop
-= (vTitle
.yTop
- vTitle
.yBottom
);
1402 ULONG uStyle
= ::WinQueryWindowULong(hWnd
, QWL_STYLE
);
1405 // Deal with borders
1407 if (uStyle
& FCF_DLGBORDER
)
1414 else if (uStyle
& FCF_SIZEBORDER
)
1421 else if (uStyle
& FCF_BORDER
)
1428 else // make some kind of adjustment or top sizers ram into the titlebar!
1437 *pWidth
= vRect
.xRight
- vRect
.xLeft
;
1439 *pHeight
= vRect
.yTop
- vRect
.yBottom
;
1440 } // end of wxWindowOS2::DoGetClientSize
1442 void wxWindowOS2::DoMoveWindow(
1450 wxWindow
* pParent
= GetParent();
1452 /* Due to OS/2's inverted coordinate system, changing the height
1453 of a window requires repositioning all it's children, e.g. if
1454 you want a child of height 100 to be at the top left corner of
1455 the parent you need to position the lower left corner of the
1456 child at (0, (height of parent - 100)), so, obviously, if the
1457 height of the parent changes, the child needs to be repositioned. */
1459 GetSize(0, &nHeightDelta
);
1460 nHeightDelta
= nHeight
- nHeightDelta
;
1462 if (pParent
&& !IsKindOf(CLASSINFO(wxDialog
)))
1464 int nOS2Height
= GetOS2ParentHeight(pParent
);
1466 nY
= nOS2Height
- (nY
+ nHeight
);
1472 ::WinQueryWindowRect(HWND_DESKTOP
, &vRect
);
1473 nY
= vRect
.yTop
- (nY
+ nHeight
);
1477 // In the case of a frame whose client is sized, the client cannot be
1478 // large than its parent frame minus its borders! This usually happens
1479 // when using an autosizer to size a frame to precisely hold client
1480 // controls as in the notebook sample.
1482 // In this case, we may need to resize both a frame and its client so we
1483 // need a quick calc of the frame border size, then if the frame
1484 // (less its borders) is smaller than the client, size the frame to
1485 // encompass the client with the appropriate border size.
1487 if (IsKindOf(CLASSINFO(wxFrame
)))
1491 int nWidthFrameDelta
= 0;
1492 int nHeightFrameDelta
= 0;
1493 int nHeightFrame
= 0;
1494 int nWidthFrame
= 0;
1497 pFrame
= wxDynamicCast(this, wxFrame
);
1498 hWndFrame
= pFrame
->GetFrame();
1499 ::WinQueryWindowRect(hWndFrame
, &vRect
);
1500 ::WinMapWindowPoints(hWndFrame
, HWND_DESKTOP
, (PPOINTL
)&vRect
, 2);
1502 ::WinCalcFrameRect(hWndFrame
, &vRect
, TRUE
);
1503 nWidthFrameDelta
= ((vRect
.xLeft
- vFRect
.xLeft
) + (vFRect
.xRight
- vRect
.xRight
));
1504 nHeightFrameDelta
= ((vRect
.yBottom
- vFRect
.yBottom
) + (vFRect
.yTop
- vRect
.yTop
));
1505 nWidthFrame
= vFRect
.xRight
- vFRect
.xLeft
;
1506 nHeightFrame
= vFRect
.yTop
- vFRect
.yBottom
;
1508 if (nWidth
== vFRect
.xRight
- vFRect
.xLeft
&&
1509 nHeight
== vFRect
.yTop
- vFRect
.yBottom
)
1512 // In this case the caller is not aware of OS/2's need to size both
1513 // the frame and it's client and is really only moving the window,
1514 // not resizeing it. So move the frame, and back off the sizes
1515 // for a proper client fit.
1517 ::WinSetWindowPos( hWndFrame
1519 ,(LONG
)nX
- (vRect
.xLeft
- vFRect
.xLeft
)
1520 ,(LONG
)nY
- (vRect
.yBottom
- vFRect
.yBottom
)
1525 nX
+= (vRect
.xLeft
- vFRect
.xLeft
);
1526 nY
+= (vRect
.yBottom
- vFRect
.yBottom
);
1527 nWidth
-= nWidthFrameDelta
;
1528 nHeight
-= nHeightFrameDelta
;
1532 if (nWidth
> nWidthFrame
- nHeightFrameDelta
||
1533 nHeight
> nHeightFrame
- nHeightFrameDelta
)
1535 ::WinSetWindowPos( hWndFrame
1537 ,(LONG
)nX
- (vRect
.xLeft
- vFRect
.xLeft
)
1538 ,(LONG
)nY
- (vRect
.yBottom
- vFRect
.yBottom
)
1539 ,(LONG
)nWidth
+ nWidthFrameDelta
1540 ,(LONG
)nHeight
+ nHeightFrameDelta
1541 ,SWP_MOVE
| SWP_SIZE
1547 ::WinSetWindowPos( GetHwnd()
1553 ,SWP_SIZE
| SWP_MOVE
1555 if (m_vWinSwp
.cx
== 0 && m_vWinSwp
.cy
== 0 && m_vWinSwp
.fl
== 0)
1559 ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp
);
1562 int nYDiff
= m_vWinSwp
.cy
- nHeight
;
1565 // Handle resizing of scrolled windows. The target or window to
1566 // be scrolled is the owner (gets the scroll notificaitons). The
1567 // parent is usually the parent frame of the scrolled panel window.
1568 // In order to show the scrollbars the target window will be shrunk
1569 // by the size of the scroll bar widths (20) and moved in the X and Y
1570 // directon. That value will be computed as part of the diff for
1571 // moving the children. Everytime the window is sized the
1572 // toplevel OnSize is going to resize the panel to fit the client
1573 // or the whole sizer and will need to me resized. This will send
1574 // a WM_SIZE out which will be intercepted by the ScrollHelper
1575 // which will cause the scrollbars to be displayed via the SetScrollbar
1578 if (IsKindOf(CLASSINFO(wxScrolledWindow
)))
1580 int nAdjustWidth
= 0;
1581 int nAdjustHeight
= 0;
1584 if (GetScrollBarHorz() == NULLHANDLE
||
1585 !WinIsWindowShowing(GetScrollBarHorz()))
1588 nAdjustHeight
= 20L;
1589 if (GetScrollBarVert() == NULLHANDLE
||
1590 !WinIsWindowShowing(GetScrollBarVert()))
1594 ::WinQueryWindowPos(GetHWND(), &vSwpScroll
);
1595 ::WinSetWindowPos( GetHWND()
1598 ,vSwpScroll
.y
+ nAdjustHeight
1599 ,vSwpScroll
.cx
- nAdjustWidth
1600 ,vSwpScroll
.cy
- nAdjustHeight
1601 ,SWP_MOVE
| SWP_SIZE
1603 nYDiff
-= nAdjustHeight
;
1605 MoveChildren(nYDiff
);
1606 ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp
);
1609 // FIXME: By my logic, the next line should be needed as it moves child
1610 // windows when resizing the parent (see comment at beginning of
1611 // function). However, this seems to cause lots of problems. At
1612 // least, e.g. the grid sample almost works with this line
1613 // commented out but crashes badly with it.
1614 MoveChildren(nHeightDelta
);
1616 } // end of wxWindowOS2::DoMoveWindow
1619 // Set the size of the window: if the dimensions are positive, just use them,
1620 // but if any of them is equal to -1, it means that we must find the value for
1621 // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in
1622 // which case -1 is a valid value for x and y)
1624 // If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate
1625 // the width/height to best suit our contents, otherwise we reuse the current
1628 void wxWindowOS2::DoSetSize( int nX
,
1635 // Get the current size and position...
1641 wxSize vSize
= wxDefaultSize
;
1643 GetPosition(&nCurrentX
, &nCurrentY
);
1644 GetSize(&nCurrentWidth
, &nCurrentHeight
);
1647 // ... and don't do anything (avoiding flicker) if it's already ok
1650 // Must convert Y coords to test for equality under OS/2
1654 if (nX
== nCurrentX
&& nY2
== nCurrentY
&&
1655 nWidth
== nCurrentWidth
&& nHeight
== nCurrentHeight
)
1660 if (nX
== wxDefaultCoord
&& !(nSizeFlags
& wxSIZE_ALLOW_MINUS_ONE
))
1662 if (nY
== wxDefaultCoord
&& !(nSizeFlags
& wxSIZE_ALLOW_MINUS_ONE
))
1665 AdjustForParentClientOrigin(nX
, nY
, nSizeFlags
);
1667 if (nWidth
== wxDefaultCoord
)
1669 if (nSizeFlags
& wxSIZE_AUTO_WIDTH
)
1671 vSize
= DoGetBestSize();
1677 // Just take the current one
1679 nWidth
= nCurrentWidth
;
1683 if (nHeight
== wxDefaultCoord
)
1685 if (nSizeFlags
& wxSIZE_AUTO_HEIGHT
)
1687 if (vSize
.x
== wxDefaultCoord
)
1689 vSize
= DoGetBestSize();
1695 // just take the current one
1696 nHeight
= nCurrentHeight
;
1700 DoMoveWindow( nX
, nY
, nWidth
, nHeight
);
1701 } // end of wxWindowOS2::DoSetSize
1703 void wxWindowOS2::DoSetClientSize( int nWidth
,
1709 wxWindow
* pParent
= (wxWindow
*)GetParent();
1710 HWND hParentWnd
= (HWND
)0;
1713 hParentWnd
= (HWND
)pParent
->GetHWND();
1715 if (IsKindOf(CLASSINFO(wxFrame
)))
1717 wxFrame
* pFrame
= wxDynamicCast(this, wxFrame
);
1718 HWND hFrame
= pFrame
->GetFrame();
1723 ::WinQueryWindowRect(GetHwnd(), &vRect2
);
1724 ::WinQueryWindowRect(hFrame
, &vRect
);
1725 ::WinQueryWindowRect(hParentWnd
, &vRect3
);
1726 nActualWidth
= vRect2
.xRight
- vRect2
.xLeft
- vRect
.xRight
+ nWidth
;
1727 nActualHeight
= vRect2
.yTop
- vRect2
.yBottom
- vRect
.yTop
+ nHeight
;
1729 vPoint
.x
= vRect2
.xLeft
;
1730 vPoint
.y
= vRect2
.yBottom
;
1733 vPoint
.x
-= vRect3
.xLeft
;
1734 vPoint
.y
-= vRect3
.yBottom
;
1742 GetPosition(&nX
, &nY
);
1743 nActualWidth
= nWidth
;
1744 nActualHeight
= nHeight
;
1749 DoMoveWindow( vPoint
.x
, vPoint
.y
, nActualWidth
, nActualHeight
);
1751 wxSize
size( nWidth
, nHeight
);
1752 wxSizeEvent
vEvent( size
, m_windowId
);
1753 vEvent
.SetEventObject(this);
1754 GetEventHandler()->ProcessEvent(vEvent
);
1755 } // end of wxWindowOS2::DoSetClientSize
1757 // ---------------------------------------------------------------------------
1759 // ---------------------------------------------------------------------------
1761 int wxWindowOS2::GetCharHeight() const
1764 FONTMETRICS vFontMetrics
;
1766 hPs
= ::WinGetPS(GetHwnd());
1768 if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
))
1770 ::WinReleasePS(hPs
);
1773 ::WinReleasePS(hPs
);
1774 return(vFontMetrics
.lMaxAscender
+ vFontMetrics
.lMaxDescender
);
1775 } // end of wxWindowOS2::GetCharHeight
1777 int wxWindowOS2::GetCharWidth() const
1780 FONTMETRICS vFontMetrics
;
1782 hPs
= ::WinGetPS(GetHwnd());
1784 if(!GpiQueryFontMetrics(hPs
, sizeof(FONTMETRICS
), &vFontMetrics
))
1786 ::WinReleasePS(hPs
);
1789 ::WinReleasePS(hPs
);
1790 return(vFontMetrics
.lAveCharWidth
);
1791 } // end of wxWindowOS2::GetCharWidth
1793 void wxWindowOS2::GetTextExtent( const wxString
& rString
,
1797 int* pExternalLeading
,
1798 const wxFont
* WXUNUSED(pTheFont
) ) const
1800 POINTL avPoint
[TXTBOX_COUNT
];
1805 FONTMETRICS vFM
; // metrics structure
1810 hPS
= ::WinGetPS(GetHwnd());
1812 l
= rString
.length();
1815 pStr
= (PCH
)rString
.c_str();
1818 // In world coordinates.
1820 bRc
= ::GpiQueryTextBox( hPS
,
1823 TXTBOX_COUNT
,// return maximum information
1824 avPoint
// array of coordinates points
1828 vPtMin
.x
= avPoint
[0].x
;
1829 vPtMax
.x
= avPoint
[0].x
;
1830 vPtMin
.y
= avPoint
[0].y
;
1831 vPtMax
.y
= avPoint
[0].y
;
1832 for (i
= 1; i
< 4; i
++)
1834 if(vPtMin
.x
> avPoint
[i
].x
) vPtMin
.x
= avPoint
[i
].x
;
1835 if(vPtMin
.y
> avPoint
[i
].y
) vPtMin
.y
= avPoint
[i
].y
;
1836 if(vPtMax
.x
< avPoint
[i
].x
) vPtMax
.x
= avPoint
[i
].x
;
1837 if(vPtMax
.y
< avPoint
[i
].y
) vPtMax
.y
= avPoint
[i
].y
;
1839 bRc
= ::GpiQueryFontMetrics( hPS
1840 ,sizeof(FONTMETRICS
)
1867 *pX
= (vPtMax
.x
- vPtMin
.x
+ 1);
1869 *pY
= (vPtMax
.y
- vPtMin
.y
+ 1);
1873 *pDescent
= vFM
.lMaxDescender
;
1877 if (pExternalLeading
)
1880 *pExternalLeading
= vFM
.lExternalLeading
;
1882 *pExternalLeading
= 0;
1884 ::WinReleasePS(hPS
);
1885 } // end of wxWindow::GetTextExtent
1887 bool wxWindowOS2::IsMouseInWindow() const
1890 // Get the mouse position
1893 ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
);
1896 // Find the window which currently has the cursor and go up the window
1897 // chain until we find this window - or exhaust it
1899 HWND hWnd
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt
, TRUE
);
1901 while (hWnd
&& (hWnd
!= GetHwnd()))
1902 hWnd
= ::WinQueryWindow(hWnd
, QW_PARENT
);
1904 return hWnd
!= NULL
;
1905 } // end of wxWindowOS2::IsMouseInWindow
1908 // ---------------------------------------------------------------------------
1910 // ---------------------------------------------------------------------------
1912 #if wxUSE_MENUS_NATIVE
1913 bool wxWindowOS2::DoPopupMenu( wxMenu
* pMenu
, int nX
, int nY
)
1915 HWND hWndOwner
= GetHwnd();
1916 HWND hWndParent
= GetHwnd();
1917 HWND hMenu
= GetHmenuOf(pMenu
);
1918 bool bIsWaiting
= true;
1921 // Protect against recursion
1922 if (wxCurrentPopupMenu
)
1925 pMenu
->SetInvokingWindow(this);
1928 if ( nX
== -1 && nY
== -1 )
1930 wxPoint mouse
= wxGetMousePosition();
1931 nX
= mouse
.x
; nY
= mouse
.y
;
1935 DoClientToScreen( &nX
1938 DoGetSize(0,&nHeight
);
1941 wxCurrentPopupMenu
= pMenu
;
1943 ::WinPopupMenu( hWndParent
1949 ,PU_HCONSTRAIN
| PU_VCONSTRAIN
| PU_MOUSEBUTTON1
| PU_KEYBOARD
1956 ::WinGetMsg(vHabmain
,&vMsg
, (HWND
)0, 0, 0);
1957 if (vMsg
.msg
== WM_COMMAND
)
1959 ::WinDispatchMsg(vHabmain
, (PQMSG
)&vMsg
);
1962 wxCurrentPopupMenu
= NULL
;
1963 pMenu
->SetInvokingWindow(NULL
);
1965 } // end of wxWindowOS2::DoPopupMenu
1966 #endif // wxUSE_MENUS_NATIVE
1968 // ===========================================================================
1969 // pre/post message processing
1970 // ===========================================================================
1972 MRESULT
wxWindowOS2::OS2DefWindowProc( WXUINT uMsg
,
1977 return (MRESULT
)m_fnOldWndProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
);
1979 return ::WinDefWindowProc(GetHWND(), uMsg
, (MPARAM
)wParam
, (MPARAM
)lParam
);
1980 } // end of wxWindowOS2::OS2DefWindowProc
1982 bool wxWindowOS2::OS2ProcessMessage( WXMSG
* pMsg
)
1984 // wxUniversal implements tab traversal itself
1985 #ifndef __WXUNIVERSAL__
1986 QMSG
* pQMsg
= (QMSG
*)pMsg
;
1988 if (m_hWnd
!= 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL
))
1991 // Intercept dialog navigation keys
1993 bool bProcess
= true;
1994 USHORT uKeyFlags
= SHORT1FROMMP(pQMsg
->mp1
);
1996 if (uKeyFlags
& KC_KEYUP
)
1999 if (uKeyFlags
& KC_ALT
)
2002 if (!(uKeyFlags
& KC_VIRTUALKEY
))
2007 bool bCtrlDown
= IsCtrlDown();
2008 bool bShiftDown
= IsShiftDown();
2011 // WM_QUERYDLGCODE: ask the control if it wants the key for itself,
2012 // don't process it if it's the case (except for Ctrl-Tab/Enter
2013 // combinations which are always processed)
2015 ULONG ulDlgCode
= 0;
2019 ulDlgCode
= (ULONG
)::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0);
2022 bool bForward
= true;
2023 bool bWindowChange
= false;
2025 switch (SHORT2FROMMP(pQMsg
->mp2
))
2028 // Going to make certain assumptions about specific types of controls
2029 // here, so we may have to alter some things later if they prove invalid
2033 // Shift tabl will always be a nav-key but tabs may be wanted
2042 // Entry Fields want tabs for themselve usually
2046 case DLGC_ENTRYFIELD
:
2056 // Ctrl-Tab cycles thru notebook pages
2058 bWindowChange
= bCtrlDown
;
2059 bForward
= !bShiftDown
;
2082 // ctrl-enter is not processed
2086 else if (ulDlgCode
& DLGC_BUTTON
)
2089 // buttons want process Enter themselevs
2095 wxButton
* pBtn
= wxDynamicCast( GetDefaultItem()
2099 if (pBtn
&& pBtn
->IsEnabled())
2102 // If we do have a default button, do press it
2104 pBtn
->OS2Command(BN_CLICKED
, 0 /* unused */);
2107 else if (!IsTopLevel())
2110 // if not a top level window, let parent
2115 // else: but if it does not it makes sense to make
2116 // it work like a TAB - and that's what we do.
2117 // Note that Ctrl-Enter always works this way.
2128 wxNavigationKeyEvent vEvent
;
2130 vEvent
.SetDirection(bForward
);
2131 vEvent
.SetWindowChange(bWindowChange
);
2132 vEvent
.SetEventObject(this);
2134 if (GetEventHandler()->ProcessEvent(vEvent
))
2136 wxButton
* pBtn
= wxDynamicCast(FindFocus(), wxButton
);
2141 // The button which has focus should be default
2150 // Let Dialogs process
2152 if (::WinSendMsg(pQMsg
->hwnd
, WM_QUERYDLGCODE
, pQMsg
, 0));
2156 pMsg
= pMsg
; // just shut up the compiler
2157 #endif // __WXUNIVERSAL__
2160 } // end of wxWindowOS2::OS2ProcessMessage
2162 bool wxWindowOS2::OS2TranslateMessage( WXMSG
* pMsg
)
2164 #if wxUSE_ACCEL && !defined(__WXUNIVERSAL__)
2165 return m_acceleratorTable
.Translate(m_hWnd
, pMsg
);
2169 #endif //wxUSE_ACCEL
2170 } // end of wxWindowOS2::OS2TranslateMessage
2172 bool wxWindowOS2::OS2ShouldPreProcessMessage( WXMSG
* WXUNUSED(pMsg
) )
2174 // preprocess all messages by default
2176 } // end of wxWindowOS2::OS2ShouldPreProcessMessage
2178 // ---------------------------------------------------------------------------
2179 // message params unpackers
2180 // ---------------------------------------------------------------------------
2182 void wxWindowOS2::UnpackCommand(
2190 *pId
= LOWORD(wParam
);
2191 *phWnd
= NULL
; // or may be GetHWND() ?
2192 *pCmd
= LOWORD(lParam
);
2193 } // end of wxWindowOS2::UnpackCommand
2195 void wxWindowOS2::UnpackActivate(
2202 *pState
= LOWORD(wParam
);
2203 *phWnd
= (WXHWND
)lParam
;
2204 } // end of wxWindowOS2::UnpackActivate
2206 void wxWindowOS2::UnpackScroll(
2217 ulId
= (ULONG
)LONGFROMMP(wParam
);
2218 hWnd
= ::WinWindowFromID(GetHwnd(), ulId
);
2219 if (hWnd
== m_hWndScrollBarHorz
|| hWnd
== m_hWndScrollBarVert
)
2220 *phWnd
= NULLHANDLE
;
2224 *pPos
= SHORT1FROMMP(lParam
);
2225 *pCode
= SHORT2FROMMP(lParam
);
2226 } // end of wxWindowOS2::UnpackScroll
2228 void wxWindowOS2::UnpackMenuSelect(
2236 *pItem
= (WXWORD
)LOWORD(wParam
);
2237 *pFlags
= HIWORD(wParam
);
2238 *phMenu
= (WXHMENU
)lParam
;
2239 } // end of wxWindowOS2::UnpackMenuSelect
2241 // ---------------------------------------------------------------------------
2242 // Main wxWidgets window proc and the window proc for wxWindow
2243 // ---------------------------------------------------------------------------
2246 // Hook for new window just as it's being created, when the window isn't yet
2247 // associated with the handle
2249 wxWindowOS2
* wxWndHook
= NULL
;
2254 MRESULT EXPENTRY
wxWndProc(
2261 wxWindowOS2
* pWnd
= wxFindWinFromHandle((WXHWND
)hWnd
);
2264 // When we get the first message for the HWND we just created, we associate
2265 // it with wxWindow stored in wxWndHook
2267 if (!pWnd
&& wxWndHook
)
2269 wxAssociateWinWithHandle(hWnd
, wxWndHook
);
2272 pWnd
->SetHWND((WXHWND
)hWnd
);
2275 MRESULT rc
= (MRESULT
)0;
2279 // Stop right here if we don't have a valid handle in our wxWindow object.
2281 if (pWnd
&& !pWnd
->GetHWND())
2283 pWnd
->SetHWND((WXHWND
) hWnd
);
2284 rc
= pWnd
->OS2DefWindowProc(ulMsg
, wParam
, lParam
);
2291 rc
= pWnd
->OS2WindowProc(ulMsg
, wParam
, lParam
);
2292 if ( (pWnd
->GetScrollBarHorz() != NULLHANDLE
||
2293 pWnd
->GetScrollBarVert() != NULLHANDLE
) &&
2296 if (pWnd
->GetScrollBarHorz() != NULLHANDLE
)
2297 ::WinInvalidateRect(pWnd
->GetScrollBarHorz(), NULL
, TRUE
);
2298 if (pWnd
->GetScrollBarVert() != NULLHANDLE
)
2299 ::WinInvalidateRect(pWnd
->GetScrollBarVert(), NULL
, TRUE
);
2303 rc
= ::WinDefWindowProc(hWnd
, ulMsg
, wParam
, lParam
);
2307 } // end of wxWndProc
2310 // We will add (or delete) messages we need to handle at this default
2313 MRESULT
wxWindowOS2::OS2WindowProc( WXUINT uMsg
,
2318 // Did we process the uMsg?
2320 bool bProcessed
= false;
2324 // For most messages we should return 0 when we do process the message
2326 mResult
= (MRESULT
)0;
2334 bProcessed
= HandleCreate( (WXLPCREATESTRUCT
)lParam
2340 // Return 0 to bAllow window creation
2342 mResult
= (MRESULT
)(bMayCreate
? 0 : -1);
2353 bProcessed
= HandleMove( LOWORD(lParam
)
2359 bProcessed
= HandleSize( LOWORD(lParam
)
2365 case WM_WINDOWPOSCHANGED
:
2368 // Dialogs under OS/2 do not get WM_SIZE events at all.
2369 // Instead they get this, which can function much like WM_SIZE
2370 // PSWP contains the new sizes and positioning, PSWP+1 the old
2371 // We use this because ADJUSTWINDOWPOS comes BEFORE the new
2372 // position is added and our auto layout does a WinQueryWindowRect
2373 // to get the CURRENT client size. That is the size used to position
2374 // child controls, so we need to already be sized
2375 // in order to get the child controls positoned properly.
2377 if (IsKindOf(CLASSINFO(wxDialog
)) || IsKindOf(CLASSINFO(wxFrame
)))
2379 PSWP pSwp
= (PSWP
)PVOIDFROMMP(wParam
);
2380 PSWP pSwp2
= pSwp
++;
2382 if (!(pSwp
->cx
== pSwp2
->cx
&&
2383 pSwp
->cy
== pSwp2
->cy
))
2384 bProcessed
= HandleSize( pSwp
->cx
2388 if (IsKindOf(CLASSINFO(wxFrame
)))
2390 wxFrame
* pFrame
= wxDynamicCast(this, wxFrame
);
2394 if (pFrame
->GetStatusBar())
2395 pFrame
->PositionStatusBar();
2396 if (pFrame
->GetToolBar())
2397 pFrame
->PositionToolBar();
2408 UnpackActivate( wParam
2414 bProcessed
= HandleActivate( wState
2422 if (SHORT1FROMMP((MPARAM
)lParam
) == TRUE
)
2423 bProcessed
= HandleSetFocus((WXHWND
)(HWND
)wParam
);
2425 bProcessed
= HandleKillFocus((WXHWND
)(HWND
)wParam
);
2429 bProcessed
= HandlePaint();
2434 // Don't let the DefWindowProc() destroy our window - we'll do it
2435 // ourselves in ~wxWindow
2438 mResult
= (MRESULT
)TRUE
;
2442 bProcessed
= HandleShow(wParam
!= 0, (int)lParam
);
2446 // Under OS2 PM Joysticks are treated just like mouse events
2447 // The "Motion" events will be prevelent in joysticks
2450 case WM_BUTTON1DOWN
:
2452 case WM_BUTTON1DBLCLK
:
2453 case WM_BUTTON1MOTIONEND
:
2454 case WM_BUTTON1MOTIONSTART
:
2455 case WM_BUTTON2DOWN
:
2457 case WM_BUTTON2DBLCLK
:
2458 case WM_BUTTON2MOTIONEND
:
2459 case WM_BUTTON2MOTIONSTART
:
2460 case WM_BUTTON3DOWN
:
2462 case WM_BUTTON3DBLCLK
:
2463 case WM_BUTTON3MOTIONEND
:
2464 case WM_BUTTON3MOTIONSTART
:
2466 if (uMsg
== WM_BUTTON1DOWN
&& AcceptsFocus())
2469 short nX
= LOWORD(wParam
);
2470 short nY
= HIWORD(wParam
);
2473 // Redirect the event to a static control if necessary
2475 if (this == GetCapture())
2477 bProcessed
= HandleMouseEvent( uMsg
2480 ,(WXUINT
)SHORT2FROMMP(lParam
)
2485 wxWindow
* pWin
= FindWindowForMouseEvent( this
2489 if (!pWin
->IsOfStandardClass())
2491 if (uMsg
== WM_BUTTON1DOWN
&& pWin
->AcceptsFocus() )
2494 bProcessed
= pWin
->HandleMouseEvent( uMsg
2497 ,(WXUINT
)SHORT2FROMMP(lParam
)
2504 bProcessed
= HandleSysCommand(wParam
, lParam
);
2511 UnpackCommand(wParam
, lParam
, &id
, &hwnd
, &cmd
);
2513 bProcessed
= HandleCommand(id
, cmd
, hwnd
);
2518 // For these messages we must return TRUE if process the message
2521 case WM_MEASUREITEM
:
2523 int nIdCtrl
= (UINT
)wParam
;
2525 if ( uMsg
== WM_DRAWITEM
)
2527 bProcessed
= OS2OnDrawItem(nIdCtrl
,
2528 (WXDRAWITEMSTRUCT
*)lParam
);
2532 return MRFROMLONG(OS2OnMeasureItem( nIdCtrl
2533 ,(WXMEASUREITEMSTRUCT
*)lParam
2538 mResult
= (MRESULT
)TRUE
;
2542 case WM_QUERYDLGCODE
:
2543 if (!IsOfStandardClass())
2547 mResult
= (MRESULT
)m_lDlgCode
;
2552 //else: get the dlg code from the DefWindowProc()
2557 // In OS/2 PM all keyboard events are of the WM_CHAR type. Virtual key and key-up
2558 // and key-down events are obtained from the WM_CHAR params.
2562 USHORT uKeyFlags
= SHORT1FROMMP((MPARAM
)wParam
);
2564 if (uKeyFlags
& KC_KEYUP
)
2566 //TODO: check if the cast to WXWORD isn't causing trouble
2567 bProcessed
= HandleKeyUp(wParam
, lParam
);
2570 else // keydown event
2572 m_bLastKeydownProcessed
= false;
2574 // If this has been processed by an event handler,
2575 // return 0 now (we've handled it). DON't RETURN
2576 // we still need to process further
2578 m_bLastKeydownProcessed
= HandleKeyDown(wParam
, lParam
);
2579 if (uKeyFlags
& KC_VIRTUALKEY
)
2581 USHORT uVk
= SHORT2FROMMP((MPARAM
)lParam
);
2584 // We consider these message "not interesting" to OnChar
2597 // Avoid duplicate messages to OnChar for these ASCII keys: they
2598 // will be translated by TranslateMessage() and received in WM_CHAR
2603 // But set processed to false, not true to still pass them to
2604 // the control's default window proc - otherwise built-in
2605 // keyboard handling won't work
2610 bProcessed
= HandleChar(wParam
, lParam
);
2614 else // WM_CHAR -- Always an ASCII character
2616 if (m_bLastKeydownProcessed
)
2619 // The key was handled in the EVT_KEY_DOWN and handling
2620 // a key in an EVT_KEY_DOWN handler is meant, by
2621 // design, to prevent EVT_CHARs from happening
2623 m_bLastKeydownProcessed
= false;
2626 else // do generate a CHAR event
2628 bProcessed
= HandleChar(wParam
, lParam
, true);
2641 UnpackScroll( wParam
2648 bProcessed
= OS2OnScroll( uMsg
== WM_HSCROLL
? wxHORIZONTAL
2658 switch(SHORT2FROMMP(wParam
))
2662 HWND hWnd
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
));
2663 wxWindowOS2
* pWin
= wxFindWinFromHandle(hWnd
);
2670 if (pWin
->IsKindOf(CLASSINFO(wxBitmapButton
)))
2672 wxBitmapButton
* pBitmapButton
= wxDynamicCast(pWin
, wxBitmapButton
);
2674 pBitmapButton
->OS2OnDraw((WXDRAWITEMSTRUCT
*)lParam
);
2680 case BKN_PAGESELECTEDPENDING
:
2682 PPAGESELECTNOTIFY pPage
= (PPAGESELECTNOTIFY
)lParam
;
2684 if ((pPage
->ulPageIdNew
!= pPage
->ulPageIdCur
) &&
2685 (pPage
->ulPageIdNew
> 0L && pPage
->ulPageIdCur
> 0L))
2687 wxWindowOS2
* pWin
= wxFindWinFromHandle(pPage
->hwndBook
);
2688 wxNotebookEvent
vEvent( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
2689 ,(int)SHORT1FROMMP(wParam
)
2690 ,(int)pPage
->ulPageIdNew
2691 ,(int)pPage
->ulPageIdCur
2698 if (pWin
->IsKindOf(CLASSINFO(wxNotebook
)))
2700 wxNotebook
* pNotebook
= wxDynamicCast(pWin
, wxNotebook
);
2702 vEvent
.SetEventObject(pWin
);
2703 pNotebook
->OnSelChange(vEvent
);
2714 case BN_CLICKED
: // Dups as LN_SELECT and CBN_LBSELECT
2716 HWND hWnd
= ::WinWindowFromID((HWND
)GetHwnd(), SHORT1FROMMP(wParam
));
2717 wxWindowOS2
* pWin
= wxFindWinFromHandle(hWnd
);
2725 // Simulate a WM_COMMAND here, as wxWidgets expects all control
2726 // button clicks to generate WM_COMMAND msgs, not WM_CONTROL
2728 if (pWin
->IsKindOf(CLASSINFO(wxRadioBox
)))
2730 wxRadioBox
* pRadioBox
= wxDynamicCast(pWin
, wxRadioBox
);
2732 pRadioBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2733 ,(WXWORD
)SHORT1FROMMP(wParam
)
2736 if (pWin
->IsKindOf(CLASSINFO(wxRadioButton
)))
2738 wxRadioButton
* pRadioButton
= wxDynamicCast(pWin
, wxRadioButton
);
2740 pRadioButton
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2741 ,(WXWORD
)SHORT1FROMMP(wParam
)
2744 if (pWin
->IsKindOf(CLASSINFO(wxCheckBox
)))
2746 wxCheckBox
* pCheckBox
= wxDynamicCast(pWin
, wxCheckBox
);
2748 pCheckBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2749 ,(WXWORD
)SHORT1FROMMP(wParam
)
2752 if (pWin
->IsKindOf(CLASSINFO(wxListBox
)))
2754 wxListBox
* pListBox
= wxDynamicCast(pWin
, wxListBox
);
2756 pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2757 ,(WXWORD
)SHORT1FROMMP(wParam
)
2759 if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
)
2762 if (pWin
->IsKindOf(CLASSINFO(wxComboBox
)))
2764 wxComboBox
* pComboBox
= wxDynamicCast(pWin
, wxComboBox
);
2766 pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2767 ,(WXWORD
)SHORT1FROMMP(wParam
)
2774 case LN_ENTER
: /* dups as CBN_EFCHANGE */
2776 HWND hWnd
= HWNDFROMMP(lParam
);
2777 wxWindowOS2
* pWin
= wxFindWinFromHandle(hWnd
);
2785 // Simulate a WM_COMMAND here, as wxWidgets expects all control
2786 // button clicks to generate WM_COMMAND msgs, not WM_CONTROL
2788 if (pWin
->IsKindOf(CLASSINFO(wxListBox
)))
2790 wxListBox
* pListBox
= wxDynamicCast(pWin
, wxListBox
);
2792 pListBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2793 ,(WXWORD
)SHORT1FROMMP(wParam
)
2795 if (pListBox
->GetWindowStyle() & wxLB_OWNERDRAW
)
2799 if (pWin
->IsKindOf(CLASSINFO(wxComboBox
)))
2801 wxComboBox
* pComboBox
= wxDynamicCast(pWin
, wxComboBox
);
2803 pComboBox
->OS2Command( (WXUINT
)SHORT2FROMMP(wParam
)
2804 ,(WXWORD
)SHORT1FROMMP(wParam
)
2812 case SPBN_DOWNARROW
:
2818 ::WinSendMsg( HWNDFROMMP(lParam
)
2821 ,MPFROM2SHORT( (USHORT
)10
2822 ,(USHORT
)SPBQ_UPDATEIFVALID
2826 bProcessed
= OS2OnScroll( wxVERTICAL
2827 ,(WXWORD
)SHORT2FROMMP(wParam
)
2834 case SLN_SLIDERTRACK
:
2836 HWND hWnd
= ::WinWindowFromID(GetHWND(), SHORT1FROMMP(wParam
));
2837 wxWindowOS2
* pChild
= wxFindWinFromHandle(hWnd
);
2844 if (pChild
->IsKindOf(CLASSINFO(wxSlider
)))
2845 bProcessed
= OS2OnScroll( wxVERTICAL
2846 ,(WXWORD
)SHORT2FROMMP(wParam
)
2847 ,(WXWORD
)LONGFROMMP(lParam
)
2855 #if defined(__VISAGECPP__) && (__IBMCPP__ >= 400)
2856 case WM_CTLCOLORCHANGE
:
2858 bProcessed
= HandleCtlColor(&hBrush
);
2862 case WM_ERASEBACKGROUND
:
2864 // Returning TRUE to requestw PM to paint the window background
2865 // in SYSCLR_WINDOW. We don't really want that
2867 bProcessed
= HandleEraseBkgnd((WXHDC
)(HPS
)wParam
);
2868 mResult
= (MRESULT
)(FALSE
);
2871 // the return value for this message is ignored
2872 case WM_SYSCOLORCHANGE
:
2873 bProcessed
= HandleSysColorChange();
2876 case WM_REALIZEPALETTE
:
2877 bProcessed
= HandlePaletteChanged();
2880 // move all drag and drops to wxDrg
2882 bProcessed
= HandleEndDrag(wParam
);
2886 bProcessed
= HandleInitDialog((WXHWND
)(HWND
)wParam
);
2890 // we never set focus from here
2891 mResult
= (MRESULT
)FALSE
;
2895 // wxFrame specific message
2896 case WM_MINMAXFRAME
:
2897 bProcessed
= HandleGetMinMaxInfo((PSWP
)wParam
);
2900 case WM_SYSVALUECHANGED
:
2901 // TODO: do something
2902 mResult
= (MRESULT
)TRUE
;
2906 // Comparable to WM_SETPOINTER for windows, only for just controls
2908 case WM_CONTROLPOINTER
:
2909 bProcessed
= HandleSetCursor( SHORT1FROMMP(wParam
) // Control ID
2910 ,(HWND
)lParam
// Cursor Handle
2915 // Returning TRUE stops the DefWindowProc() from further
2916 // processing this message - exactly what we need because we've
2917 // just set the cursor.
2919 mResult
= (MRESULT
)TRUE
;
2923 #if wxUSE_MENUS_NATIVE
2925 if (wxCurrentPopupMenu
)
2927 if (GetHmenuOf(wxCurrentPopupMenu
) == (HWND
)lParam
)
2929 // Break out of msg loop in DoPopupMenu
2930 ::WinPostMsg((HWND
)lParam
,WM_COMMAND
,wParam
,0);
2934 #endif // wxUSE_MENUS_NATIVE
2940 wxLogTrace(wxTraceMessages
, wxT("Forwarding %s to DefWindowProc."),
2941 wxGetMessageName(uMsg
));
2942 #endif // __WXDEBUG__
2943 if (IsKindOf(CLASSINFO(wxFrame
)))
2944 mResult
= ::WinDefWindowProc(m_hWnd
, uMsg
, wParam
, lParam
);
2945 else if (IsKindOf(CLASSINFO(wxDialog
)))
2946 mResult
= ::WinDefDlgProc( m_hWnd
, uMsg
, wParam
, lParam
);
2948 mResult
= OS2DefWindowProc(uMsg
, wParam
, lParam
);
2951 } // end of wxWindowOS2::OS2WindowProc
2953 // ----------------------------------------------------------------------------
2954 // wxWindow <-> HWND map
2955 // ----------------------------------------------------------------------------
2957 wxWinHashTable
*wxWinHandleHash
= NULL
;
2959 wxWindow
* wxFindWinFromHandle(
2963 return (wxWindow
*)wxWinHandleHash
->Get((long)hWnd
);
2964 } // end of wxFindWinFromHandle
2966 void wxAssociateWinWithHandle(
2972 // Adding NULL hWnd is (first) surely a result of an error and
2973 // (secondly) breaks menu command processing
2975 wxCHECK_RET( hWnd
!= (HWND
)NULL
,
2976 wxT("attempt to add a NULL hWnd to window list ignored") );
2979 wxWindow
* pOldWin
= wxFindWinFromHandle((WXHWND
) hWnd
);
2981 if (pOldWin
&& (pOldWin
!= pWin
))
2983 wxString
str(pWin
->GetClassInfo()->GetClassName());
2985 wxLogError( _T("Bug! Found existing HWND %X for new window of class %s")
2992 wxWinHandleHash
->Put( (long)hWnd
2996 } // end of wxAssociateWinWithHandle
2998 void wxRemoveHandleAssociation( wxWindowOS2
* pWin
)
3000 wxWinHandleHash
->Delete((long)pWin
->GetHWND());
3001 } // end of wxRemoveHandleAssociation
3004 // Default destroyer - override if you destroy it in some other way
3005 // (e.g. with MDI child windows)
3007 void wxWindowOS2::OS2DestroyWindow()
3011 bool wxWindowOS2::OS2GetCreateWindowCoords( const wxPoint
& rPos
,
3012 const wxSize
& rSize
,
3016 int& rnHeight
) const
3018 bool bNonDefault
= false;
3019 static const int DEFAULT_Y
= 200;
3020 static const int DEFAULT_H
= 250;
3022 if (rPos
.x
== wxDefaultCoord
)
3024 rnX
= rnY
= CW_USEDEFAULT
;
3029 rnY
= rPos
.y
== wxDefaultCoord
? DEFAULT_Y
: rPos
.y
;
3032 if (rSize
.x
== wxDefaultCoord
)
3034 rnWidth
= rnHeight
= CW_USEDEFAULT
;
3039 rnHeight
= rSize
.y
== wxDefaultCoord
? DEFAULT_H
: rSize
.y
;
3043 } // end of wxWindowOS2::OS2GetCreateWindowCoords
3045 WXHWND
wxWindowOS2::OS2GetParent() const
3047 return m_parent
? m_parent
->GetHWND() : NULL
;
3050 bool wxWindowOS2::OS2Create( PSZ zClass
,
3051 const wxChar
* zTitle
,
3053 const wxPoint
& rPos
,
3054 const wxSize
& rSize
,
3056 WXDWORD
WXUNUSED(dwExStyle
),
3065 long lControlId
= 0L;
3066 wxWindowCreationHook
vHook(this);
3067 wxString
sClassName((wxChar
*)zClass
);
3069 OS2GetCreateWindowCoords( rPos
3079 lControlId
= GetId();
3080 if (GetWindowStyleFlag() & wxCLIP_SIBLINGS
)
3082 dwStyle
|= WS_CLIPSIBLINGS
;
3086 // For each class "Foo" we have we also have "FooNR" ("no repaint") class
3087 // which is the same but without CS_[HV]REDRAW class styles so using it
3088 // ensures that the window is not fully repainted on each resize
3090 if (!HasFlag(wxFULL_REPAINT_ON_RESIZE
))
3092 sClassName
+= wxT("NR");
3094 m_hWnd
= (WXHWND
)::WinCreateWindow( (HWND
)OS2GetParent()
3095 ,(PSZ
)sClassName
.c_str()
3096 ,(PSZ
)(zTitle
? zTitle
: wxEmptyString
)
3110 vError
= ::WinGetLastError(wxGetInstance());
3111 sError
= wxPMErrorToStr(vError
);
3114 SubclassWin(m_hWnd
);
3115 SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
));
3117 m_backgroundColour
.Set(wxString(wxT("GREY")));
3119 LONG lColor
= (LONG
)m_backgroundColour
.GetPixel();
3121 if (!::WinSetPresParam( m_hWnd
3127 vError
= ::WinGetLastError(vHabmain
);
3128 sError
= wxPMErrorToStr(vError
);
3129 wxLogError(_T("Error creating frame. Error: %s\n"), sError
.c_str());
3138 } // end of WinGuiBase_Window::OS2Create
3140 // ===========================================================================
3141 // OS2 PM message handlers
3142 // ===========================================================================
3144 // ---------------------------------------------------------------------------
3145 // window creation/destruction
3146 // ---------------------------------------------------------------------------
3148 bool wxWindowOS2::HandleCreate( WXLPCREATESTRUCT
WXUNUSED(vCs
),
3151 wxWindowCreateEvent
vEvent((wxWindow
*)this);
3153 (void)GetEventHandler()->ProcessEvent(vEvent
);
3154 *pbMayCreate
= true;
3156 } // end of wxWindowOS2::HandleCreate
3158 bool wxWindowOS2::HandleDestroy()
3160 wxWindowDestroyEvent
vEvent((wxWindow
*)this);
3161 vEvent
.SetId(GetId());
3162 (void)GetEventHandler()->ProcessEvent(vEvent
);
3165 // Delete our drop target if we've got one
3167 #if wxUSE_DRAG_AND_DROP
3168 if (m_dropTarget
!= NULL
)
3170 delete m_dropTarget
;
3171 m_dropTarget
= NULL
;
3173 #endif // wxUSE_DRAG_AND_DROP
3176 // WM_DESTROY handled
3179 } // end of wxWindowOS2::HandleDestroy
3181 // ---------------------------------------------------------------------------
3183 // ---------------------------------------------------------------------------
3184 void wxWindowOS2::OnSetFocus(
3185 wxFocusEvent
& rEvent
3189 } // end of wxWindowOS2::OnSetFocus
3191 bool wxWindowOS2::HandleActivate(
3193 , WXHWND
WXUNUSED(hActivate
)
3196 wxActivateEvent
vEvent( wxEVT_ACTIVATE
3200 vEvent
.SetEventObject(this);
3201 return GetEventHandler()->ProcessEvent(vEvent
);
3202 } // end of wxWindowOS2::HandleActivate
3204 bool wxWindowOS2::HandleSetFocus( WXHWND
WXUNUSED(hWnd
) )
3207 // Notify the parent keeping track of focus for the kbd navigation
3208 // purposes that we got it
3210 wxChildFocusEvent
vEventFocus((wxWindow
*)this);
3211 (void)GetEventHandler()->ProcessEvent(vEventFocus
);
3219 m_caret
->OnSetFocus();
3221 #endif // wxUSE_CARET
3224 // If it's a wxTextCtrl don't send the event as it will be done
3225 // after the control gets to process it from EN_FOCUS handler
3226 if ( wxDynamicCastThis(wxTextCtrl
) )
3230 #endif // wxUSE_TEXTCTRL
3232 wxFocusEvent
vEvent(wxEVT_SET_FOCUS
, m_windowId
);
3234 vEvent
.SetEventObject(this);
3235 return GetEventHandler()->ProcessEvent(vEvent
);
3236 } // end of wxWindowOS2::HandleSetFocus
3238 bool wxWindowOS2::HandleKillFocus( WXHWND hWnd
)
3246 m_caret
->OnKillFocus();
3248 #endif // wxUSE_CARET
3252 // If it's a wxTextCtrl don't send the event as it will be done
3253 // after the control gets to process it.
3255 wxTextCtrl
* pCtrl
= wxDynamicCastThis(wxTextCtrl
);
3264 // Don't send the event when in the process of being deleted. This can
3265 // only cause problems if the event handler tries to access the object.
3267 if ( m_isBeingDeleted
)
3272 wxFocusEvent
vEvent( wxEVT_KILL_FOCUS
3276 vEvent
.SetEventObject(this);
3279 // wxFindWinFromHandle() may return NULL, it is ok
3281 vEvent
.SetWindow(wxFindWinFromHandle(hWnd
));
3282 return GetEventHandler()->ProcessEvent(vEvent
);
3283 } // end of wxWindowOS2::HandleKillFocus
3285 // ---------------------------------------------------------------------------
3287 // ---------------------------------------------------------------------------
3289 bool wxWindowOS2::HandleShow(
3291 , int WXUNUSED(nStatus
)
3294 wxShowEvent
vEvent(GetId(), bShow
);
3296 vEvent
.SetEventObject(this);
3297 return GetEventHandler()->ProcessEvent(vEvent
);
3298 } // end of wxWindowOS2::HandleShow
3300 bool wxWindowOS2::HandleInitDialog( WXHWND
WXUNUSED(hWndFocus
) )
3302 wxInitDialogEvent
vEvent(GetId());
3304 vEvent
.SetEventObject(this);
3305 return GetEventHandler()->ProcessEvent(vEvent
);
3306 } // end of wxWindowOS2::HandleInitDialog
3308 bool wxWindowOS2::HandleEndDrag(WXWPARAM
WXUNUSED(wParam
))
3310 // TODO: We'll handle drag and drop later
3314 bool wxWindowOS2::HandleSetCursor( USHORT
WXUNUSED(vId
),
3318 // Under OS/2 PM this allows the pointer to be changed
3319 // as it passes over a control
3321 ::WinSetPointer(HWND_DESKTOP
, (HPOINTER
)hPointer
);
3323 } // end of wxWindowOS2::HandleSetCursor
3325 // ---------------------------------------------------------------------------
3326 // owner drawn stuff
3327 // ---------------------------------------------------------------------------
3328 bool wxWindowOS2::OS2OnDrawItem( int vId
,
3329 WXDRAWITEMSTRUCT
* pItemStruct
)
3331 #if wxUSE_OWNER_DRAWN
3334 #if wxUSE_MENUS_NATIVE
3336 // Is it a menu item?
3342 POWNERITEM pMeasureStruct
= (POWNERITEM
)pItemStruct
;
3343 wxFrame
* pFrame
= (wxFrame
*)this;
3344 wxMenuItem
* pMenuItem
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
);
3345 HDC hDC
= ::GpiQueryDevice(pMeasureStruct
->hps
);
3346 wxRect
vRect( pMeasureStruct
->rclItem
.xLeft
3347 ,pMeasureStruct
->rclItem
.yBottom
3348 ,pMeasureStruct
->rclItem
.xRight
- pMeasureStruct
->rclItem
.xLeft
3349 ,pMeasureStruct
->rclItem
.yTop
- pMeasureStruct
->rclItem
.yBottom
3351 vDc
.SetHDC( hDC
, false );
3352 vDc
.SetHPS( pMeasureStruct
->hps
);
3354 // Load the wxWidgets Pallete and set to RGB mode
3356 if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
3360 ,(LONG
)wxTheColourDatabase
->m_nSize
3361 ,(PLONG
)wxTheColourDatabase
->m_palTable
3364 vError
= ::WinGetLastError(vHabmain
);
3365 sError
= wxPMErrorToStr(vError
);
3366 wxLogError(_T("Unable to set current color table. Error: %s\n"), sError
.c_str());
3369 // Set the color table to RGB mode
3371 if (!::GpiCreateLogColorTable( pMeasureStruct
->hps
3379 vError
= ::WinGetLastError(vHabmain
);
3380 sError
= wxPMErrorToStr(vError
);
3381 wxLogError(_T("Unable to set current color table. Error: %s\n"), sError
.c_str());
3384 wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE
);
3389 if (pMeasureStruct
->fsAttribute
== pMeasureStruct
->fsAttributeOld
)
3392 // Entire Item needs to be redrawn (either it has reappeared from
3393 // behind another window or is being displayed for the first time
3395 eAction
= wxOwnerDrawn::wxODDrawAll
;
3397 if (pMeasureStruct
->fsAttribute
& MIA_HILITED
)
3400 // If it is currently selected we let the system handle it
3402 eStatus
|= wxOwnerDrawn::wxODSelected
;
3404 if (pMeasureStruct
->fsAttribute
& MIA_CHECKED
)
3407 // If it is currently checked we draw our own
3409 eStatus
|= wxOwnerDrawn::wxODChecked
;
3410 pMeasureStruct
->fsAttributeOld
= pMeasureStruct
->fsAttribute
&= ~MIA_CHECKED
;
3412 if (pMeasureStruct
->fsAttribute
& MIA_DISABLED
)
3415 // If it is currently disabled we let the system handle it
3417 eStatus
|= wxOwnerDrawn::wxODDisabled
;
3420 // Don't really care about framed (indicationg focus) or NoDismiss
3425 if (pMeasureStruct
->fsAttribute
& MIA_HILITED
)
3427 eAction
= wxOwnerDrawn::wxODDrawAll
;
3428 eStatus
|= wxOwnerDrawn::wxODSelected
;
3430 // Keep the system from trying to highlight with its bogus colors
3432 pMeasureStruct
->fsAttributeOld
= pMeasureStruct
->fsAttribute
&= ~MIA_HILITED
;
3434 else if (!(pMeasureStruct
->fsAttribute
& MIA_HILITED
))
3436 eAction
= wxOwnerDrawn::wxODDrawAll
;
3439 // Keep the system from trying to highlight with its bogus colors
3441 pMeasureStruct
->fsAttribute
= pMeasureStruct
->fsAttributeOld
&= ~MIA_HILITED
;
3446 // For now we don't care about anything else
3447 // just ignore the entire message!
3453 // Now redraw the item
3455 return(pMenuItem
->OnDrawItem( vDc
3457 ,(wxOwnerDrawn::wxODAction
)eAction
3458 ,(wxOwnerDrawn::wxODStatus
)eStatus
3461 // leave the fsAttribute and fsOldAttribute unchanged. If different,
3462 // the system will do the highlight or fraeming or disabling for us,
3463 // otherwise, we'd have to do it ourselves.
3466 #endif // wxUSE_MENUS_NATIVE
3468 wxWindow
* pItem
= FindItem(vId
);
3470 if (pItem
&& pItem
->IsKindOf(CLASSINFO(wxControl
)))
3472 return ((wxControl
*)pItem
)->OS2OnDraw(pItemStruct
);
3476 pItemStruct
= pItemStruct
;
3479 } // end of wxWindowOS2::OS2OnDrawItem
3481 long wxWindowOS2::OS2OnMeasureItem( int lId
,
3482 WXMEASUREITEMSTRUCT
* pItemStruct
)
3484 #if wxUSE_OWNER_DRAWN
3486 // Is it a menu item?
3488 if (lId
== 65536) // I really don't like this...has to be a better indicator
3490 if (IsKindOf(CLASSINFO(wxFrame
))) // we'll assume if Frame then a menu
3494 POWNERITEM pMeasureStruct
= (POWNERITEM
)pItemStruct
;
3495 wxFrame
* pFrame
= (wxFrame
*)this;
3496 wxMenuItem
* pMenuItem
= pFrame
->GetMenuBar()->FindItem(pMeasureStruct
->idItem
, pMeasureStruct
->hItem
);
3498 wxCHECK( pMenuItem
->IsKindOf(CLASSINFO(wxMenuItem
)), FALSE
);
3501 if (pMenuItem
->OnMeasureItem( &nWidth
3507 pMeasureStruct
->rclItem
.xRight
= nWidth
;
3508 pMeasureStruct
->rclItem
.xLeft
= 0L;
3509 pMeasureStruct
->rclItem
.yTop
= nHeight
;
3510 pMeasureStruct
->rclItem
.yBottom
= 0L;
3511 mRc
= MRFROM2SHORT(nHeight
, nWidth
);
3512 return LONGFROMMR(mRc
);
3517 wxWindow
* pItem
= FindItem(lId
);
3519 if (pItem
&& pItem
->IsKindOf(CLASSINFO(wxControl
)))
3523 vItem
.idItem
= (LONG
)pItemStruct
;
3524 return ((wxControl
*)pItem
)->OS2OnMeasure((WXMEASUREITEMSTRUCT
*)&vItem
);
3528 pItemStruct
= pItemStruct
;
3529 #endif // wxUSE_OWNER_DRAWN
3533 // ---------------------------------------------------------------------------
3534 // colours and palettes
3535 // ---------------------------------------------------------------------------
3537 bool wxWindowOS2::HandleSysColorChange()
3539 wxSysColourChangedEvent vEvent
;
3541 vEvent
.SetEventObject(this);
3542 return GetEventHandler()->ProcessEvent(vEvent
);
3543 } // end of wxWindowOS2::HandleSysColorChange
3545 bool wxWindowOS2::HandleCtlColor( WXHBRUSH
* WXUNUSED(phBrush
) )
3548 // Not much provided with message. So not sure I can do anything with it
3551 } // end of wxWindowOS2::HandleCtlColor
3554 // Define for each class of dialog and control
3555 WXHBRUSH
wxWindowOS2::OnCtlColor(WXHDC
WXUNUSED(hDC
),
3556 WXHWND
WXUNUSED(hWnd
),
3557 WXUINT
WXUNUSED(nCtlColor
),
3558 WXUINT
WXUNUSED(message
),
3559 WXWPARAM
WXUNUSED(wParam
),
3560 WXLPARAM
WXUNUSED(lParam
))
3565 bool wxWindowOS2::HandlePaletteChanged()
3567 // need to set this to something first
3568 WXHWND hWndPalChange
= NULLHANDLE
;
3570 wxPaletteChangedEvent
vEvent(GetId());
3572 vEvent
.SetEventObject(this);
3573 vEvent
.SetChangedWindow(wxFindWinFromHandle(hWndPalChange
));
3575 return GetEventHandler()->ProcessEvent(vEvent
);
3576 } // end of wxWindowOS2::HandlePaletteChanged
3579 // Responds to colour changes: passes event on to children.
3581 void wxWindowOS2::OnSysColourChanged(
3582 wxSysColourChangedEvent
& rEvent
3585 wxWindowList::compatibility_iterator node
= GetChildren().GetFirst();
3590 // Only propagate to non-top-level windows
3592 wxWindow
* pWin
= (wxWindow
*)node
->GetData();
3594 if (pWin
->GetParent())
3596 wxSysColourChangedEvent vEvent
;
3598 rEvent
.SetEventObject(pWin
);
3599 pWin
->GetEventHandler()->ProcessEvent(vEvent
);
3601 node
= node
->GetNext();
3603 } // end of wxWindowOS2::OnSysColourChanged
3605 // ---------------------------------------------------------------------------
3607 // ---------------------------------------------------------------------------
3609 void wxWindow::OnPaint (
3610 wxPaintEvent
& rEvent
3613 HDC hDC
= (HDC
)wxPaintDC::FindDCInCache((wxWindow
*) rEvent
.GetEventObject());
3617 OS2DefWindowProc( (WXUINT
)WM_PAINT
3622 } // end of wxWindow::OnPaint
3624 bool wxWindowOS2::HandlePaint()
3627 wxPaintEvent
vEvent(m_windowId
);
3631 // Create empty region
3632 // TODO: get HPS somewhere else if possible
3633 hPS
= ::WinGetPS(GetHwnd());
3634 hRgn
= ::GpiCreateRegion(hPS
, 0, NULL
);
3636 if (::WinQueryUpdateRegion(GetHwnd(), hRgn
) == RGN_ERROR
)
3638 wxLogLastError(wxT("CreateRectRgn"));
3642 // Get all the rectangles from the region, convert the individual
3643 // rectangles to "the other" coordinate system and reassemble a
3644 // region from the rectangles, to be feed into m_updateRegion.
3646 // FIXME: This is a bad hack since OS/2 API specifies that rectangles
3647 // passed into GpiSetRegion must not have Bottom > Top,
3648 // however, at first sight, it _seems_ to work nonetheless.
3651 PRECTL pUpdateRects
= NULL
;
3652 vRgnData
.ulDirection
= RECTDIR_LFRT_TOPBOT
;
3653 if (::GpiQueryRegionRects( hPS
// Pres space
3654 ,hRgn
// Handle of region to query
3655 ,NULL
// Return all RECTs
3656 ,&vRgnData
// Will contain number or RECTs in region
3657 ,NULL
// NULL to return number of RECTs
3660 pUpdateRects
= new RECTL
[vRgnData
.crcReturned
];
3661 vRgnData
.crc
= vRgnData
.crcReturned
;
3662 vRgnData
.ircStart
= 1;
3663 if (::GpiQueryRegionRects( hPS
// Pres space of source
3664 ,hRgn
// Handle of source region
3665 ,NULL
// Return all RECTs
3666 ,&vRgnData
// Operations set to return rects
3667 ,pUpdateRects
// Will contain the actual RECTS
3672 ::WinQueryWindowRect(GetHwnd(), &vRect
);
3673 height
= vRect
.yTop
;
3675 for(size_t i
= 0; i
< vRgnData
.crc
; i
++)
3678 rectHeight
= pUpdateRects
[i
].yTop
- pUpdateRects
[i
].yBottom
;
3679 pUpdateRects
[i
].yTop
= height
- pUpdateRects
[i
].yTop
;
3680 pUpdateRects
[i
].yBottom
= pUpdateRects
[i
].yTop
+ rectHeight
;
3682 ::GpiSetRegion(hPS
, hRgn
, vRgnData
.crc
, pUpdateRects
);
3683 delete [] pUpdateRects
;
3687 m_updateRegion
= wxRegion(hRgn
, hPS
);
3689 vEvent
.SetEventObject(this);
3690 bProcessed
= GetEventHandler()->ProcessEvent(vEvent
);
3693 IsKindOf(CLASSINFO(wxPanel
)) &&
3694 GetChildren().GetCount() == 0
3698 // OS/2 needs to process this right here, not by the default proc
3699 // Window's default proc correctly paints everything, OS/2 does not.
3700 // For decorative panels that typically have no children, we draw
3706 hPS
= ::WinBeginPaint( GetHwnd()
3712 ::GpiCreateLogColorTable( hPS
3716 ,(LONG
)wxTheColourDatabase
->m_nSize
3717 ,(PLONG
)wxTheColourDatabase
->m_palTable
3719 ::GpiCreateLogColorTable( hPS
3726 if (::WinIsWindowVisible(GetHWND()))
3727 ::WinFillRect(hPS
, &vRect
, GetBackgroundColour().GetPixel());
3730 LINEBUNDLE vLineBundle
;
3732 vLineBundle
.lColor
= 0x00000000; // Black
3733 vLineBundle
.usMixMode
= FM_OVERPAINT
;
3734 vLineBundle
.fxWidth
= 1;
3735 vLineBundle
.lGeomWidth
= 1;
3736 vLineBundle
.usType
= LINETYPE_SOLID
;
3737 vLineBundle
.usEnd
= 0;
3738 vLineBundle
.usJoin
= 0;
3741 ,LBB_COLOR
| LBB_MIX_MODE
| LBB_WIDTH
| LBB_GEOM_WIDTH
| LBB_TYPE
3745 ::WinQueryWindowRect(GetHwnd(), &vRect
);
3755 else if (!bProcessed
&&
3756 IsKindOf(CLASSINFO(wxPanel
))
3760 // Panel with children, usually fills a frame client so no borders.
3765 hPS
= ::WinBeginPaint( GetHwnd()
3771 ::GpiCreateLogColorTable( hPS
3775 ,(LONG
)wxTheColourDatabase
->m_nSize
3776 ,(PLONG
)wxTheColourDatabase
->m_palTable
3778 ::GpiCreateLogColorTable( hPS
3786 if (::WinIsWindowVisible(GetHWND()))
3787 ::WinFillRect(hPS
, &vRect
, GetBackgroundColour().GetPixel());
3793 } // end of wxWindowOS2::HandlePaint
3795 bool wxWindowOS2::HandleEraseBkgnd( WXHDC hDC
)
3800 ::WinQueryWindowPos(GetHwnd(), &vSwp
);
3801 if (vSwp
.fl
& SWP_MINIMIZE
)
3806 vDC
.m_hPS
= (HPS
)hDC
; // this is really a PS
3807 vDC
.SetWindow((wxWindow
*)this);
3810 wxEraseEvent
vEvent(m_windowId
, &vDC
);
3812 vEvent
.SetEventObject(this);
3814 rc
= GetEventHandler()->ProcessEvent(vEvent
);
3817 vDC
.m_hPS
= NULLHANDLE
;
3819 } // end of wxWindowOS2::HandleEraseBkgnd
3821 void wxWindowOS2::OnEraseBackground(wxEraseEvent
& rEvent
)
3824 HPS hPS
= rEvent
.GetDC()->GetHPS();
3826 LONG lColor
= m_backgroundColour
.GetPixel();
3828 rc
= ::WinQueryWindowRect(GetHwnd(), &vRect
);
3829 rc
= ::WinFillRect(hPS
, &vRect
, lColor
);
3830 } // end of wxWindowOS2::OnEraseBackground
3832 // ---------------------------------------------------------------------------
3833 // moving and resizing
3834 // ---------------------------------------------------------------------------
3836 bool wxWindowOS2::HandleMinimize()
3838 wxIconizeEvent
vEvent(m_windowId
);
3840 vEvent
.SetEventObject(this);
3841 return GetEventHandler()->ProcessEvent(vEvent
);
3842 } // end of wxWindowOS2::HandleMinimize
3844 bool wxWindowOS2::HandleMaximize()
3846 wxMaximizeEvent
vEvent(m_windowId
);
3848 vEvent
.SetEventObject(this);
3849 return GetEventHandler()->ProcessEvent(vEvent
);
3850 } // end of wxWindowOS2::HandleMaximize
3852 bool wxWindowOS2::HandleMove( int nX
, int nY
)
3855 wxMoveEvent
vEvent(pt
, m_windowId
);
3857 vEvent
.SetEventObject(this);
3858 return GetEventHandler()->ProcessEvent(vEvent
);
3859 } // end of wxWindowOS2::HandleMove
3861 bool wxWindowOS2::HandleSize( int nWidth
,
3863 WXUINT
WXUNUSED(nFlag
) )
3865 wxSize
sz(nWidth
, nHeight
);
3866 wxSizeEvent
vEvent(sz
, m_windowId
);
3868 vEvent
.SetEventObject(this);
3869 return GetEventHandler()->ProcessEvent(vEvent
);
3870 } // end of wxWindowOS2::HandleSize
3872 bool wxWindowOS2::HandleGetMinMaxInfo( PSWP pSwp
)
3879 ::WinGetMaxPosition(GetHwnd(), pSwp
);
3880 m_maxWidth
= pSwp
->cx
;
3881 m_maxHeight
= pSwp
->cy
;
3885 ::WinGetMinPosition(GetHwnd(), pSwp
, &vPoint
);
3886 m_minWidth
= pSwp
->cx
;
3887 m_minHeight
= pSwp
->cy
;
3894 } // end of wxWindowOS2::HandleGetMinMaxInfo
3896 // ---------------------------------------------------------------------------
3898 // ---------------------------------------------------------------------------
3899 bool wxWindowOS2::HandleCommand( WXWORD wId
,
3903 #if wxUSE_MENUS_NATIVE
3904 if (wxCurrentPopupMenu
)
3906 wxMenu
* pPopupMenu
= wxCurrentPopupMenu
;
3908 wxCurrentPopupMenu
= NULL
;
3909 return pPopupMenu
->OS2Command(wCmd
, wId
);
3911 #endif // wxUSE_MENUS_NATIVE
3913 wxWindow
* pWin
= FindItem(wId
);
3917 pWin
= wxFindWinFromHandle(hControl
);
3921 return pWin
->OS2Command(wCmd
, wId
);
3924 } // end of wxWindowOS2::HandleCommand
3926 bool wxWindowOS2::HandleSysCommand( WXWPARAM wParam
,
3927 WXLPARAM
WXUNUSED(lParam
) )
3930 // 4 bits are reserved
3932 switch (SHORT1FROMMP(wParam
))
3935 return HandleMaximize();
3938 return HandleMinimize();
3941 } // end of wxWindowOS2::HandleSysCommand
3943 // ---------------------------------------------------------------------------
3945 // ---------------------------------------------------------------------------
3946 //TODO: check against MSW
3947 void wxWindowOS2::InitMouseEvent(
3948 wxMouseEvent
& rEvent
3955 DoGetSize(0, &nHeight
);
3957 // Convert to wxWidgets standard coordinate system!
3958 rEvent
.m_y
= nHeight
- nY
;
3959 rEvent
.m_shiftDown
= ((uFlags
& KC_SHIFT
) != 0);
3960 rEvent
.m_controlDown
= ((uFlags
& KC_CTRL
) != 0);
3961 rEvent
.m_altDown
= ((uFlags
& KC_ALT
) != 0);
3962 rEvent
.m_leftDown
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON1
) &
3964 rEvent
.m_middleDown
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON3
) &
3966 rEvent
.m_rightDown
= (::WinGetKeyState(HWND_DESKTOP
, VK_BUTTON2
) &
3968 rEvent
.SetTimestamp(s_currentMsg
.time
);
3969 rEvent
.SetEventObject(this);
3970 rEvent
.SetId(GetId());
3972 #if wxUSE_MOUSEEVENT_HACK
3975 m_lastMouseEvent
= rEvent
.GetEventType();
3976 #endif // wxUSE_MOUSEEVENT_HACK
3977 } // end of wxWindowOS2::InitMouseEvent
3979 bool wxWindowOS2::HandleMouseEvent( WXUINT uMsg
,
3984 bool bProcessed
= false;
3987 // The mouse events take consecutive IDs from WM_MOUSEFIRST to
3988 // WM_MOUSELAST, so it's enough to subtract WM_MOUSEMOVE == WM_MOUSEFIRST
3989 // from the message id and take the value in the table to get wxWin event
3992 static const wxEventType eventsMouse
[] =
4007 if ((uMsg
>= WM_MOUSEMOVE
) && (uMsg
<= WM_BUTTON3DBLCLK
))
4009 wxMouseEvent
vEvent(eventsMouse
[uMsg
- WM_MOUSEMOVE
]);
4011 InitMouseEvent( vEvent
4017 bProcessed
= GetEventHandler()->ProcessEvent(vEvent
);
4020 HPOINTER hCursor
= (HPOINTER
)GetCursor().GetHCURSOR();
4022 if (hCursor
!= NULLHANDLE
)
4024 ::WinSetPointer(HWND_DESKTOP
, hCursor
);
4030 } // end of wxWindowOS2::HandleMouseEvent
4032 bool wxWindowOS2::HandleMouseMove( int nX
,
4036 if (!m_bMouseInWindow
)
4039 // Generate an ENTER event
4041 m_bMouseInWindow
= true;
4043 wxMouseEvent
vEvent(wxEVT_ENTER_WINDOW
);
4045 InitMouseEvent( vEvent
4051 (void)GetEventHandler()->ProcessEvent(vEvent
);
4053 return HandleMouseEvent( WM_MOUSEMOVE
4058 } // end of wxWindowOS2::HandleMouseMove
4060 // ---------------------------------------------------------------------------
4061 // keyboard handling
4062 // ---------------------------------------------------------------------------
4065 // Create the key event of the given type for the given key - used by
4066 // HandleChar and HandleKeyDown/Up
4068 wxKeyEvent
wxWindowOS2::CreateKeyEvent(
4075 wxKeyEvent
vEvent(eType
);
4077 vEvent
.SetId(GetId());
4078 vEvent
.m_shiftDown
= IsShiftDown();
4079 vEvent
.m_controlDown
= IsCtrlDown();
4080 vEvent
.m_altDown
= (HIWORD(lParam
) & KC_ALT
) == KC_ALT
;
4082 vEvent
.SetEventObject((wxWindow
*)this); // const_cast
4083 vEvent
.m_keyCode
= nId
;
4084 vEvent
.m_rawCode
= (wxUint32
)wParam
;
4085 vEvent
.m_rawFlags
= (wxUint32
)lParam
;
4086 vEvent
.SetTimestamp(s_currentMsg
.time
);
4089 // Translate the position to client coords
4094 ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
);
4095 ::WinQueryWindowRect( GetHwnd()
4099 vPoint
.x
-= vRect
.xLeft
;
4100 vPoint
.y
-= vRect
.yBottom
;
4102 vEvent
.m_x
= vPoint
.x
;
4103 vEvent
.m_y
= vPoint
.y
;
4106 } // end of wxWindowOS2::CreateKeyEvent
4109 // isASCII is true only when we're called from WM_CHAR handler and not from
4112 bool wxWindowOS2::HandleChar( WXWPARAM
WXUNUSED(wParam
),
4116 bool bCtrlDown
= false;
4119 if (m_bLastKeydownProcessed
)
4122 // The key was handled in the EVT_KEY_DOWN. Handling a key in an
4123 // EVT_KEY_DOWN handler is meant, by design, to prevent EVT_CHARs
4124 // from happening, so just bail out at this point.
4126 m_bLastKeydownProcessed
= false;
4132 // If 1 -> 26, translate to either special keycode or just set
4133 // ctrlDown. IOW, Ctrl-C should result in keycode == 3 and
4134 // ControlDown() == true.
4136 vId
= SHORT1FROMMP(lParam
);
4137 if ((vId
> 0) && (vId
< 27))
4159 else // we're called from WM_KEYDOWN
4161 vId
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
));
4166 wxKeyEvent
vEvent(CreateKeyEvent( wxEVT_CHAR
, vId
, lParam
));
4170 vEvent
.m_controlDown
= true;
4173 return (GetEventHandler()->ProcessEvent(vEvent
));
4176 bool wxWindowOS2::HandleKeyDown( WXWPARAM wParam
,
4179 int nId
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
));
4184 // Normal ASCII char
4186 nId
= SHORT1FROMMP(lParam
);
4191 wxKeyEvent
vEvent(CreateKeyEvent( wxEVT_KEY_DOWN
4197 if (GetEventHandler()->ProcessEvent(vEvent
))
4203 } // end of wxWindowOS2::HandleKeyDown
4205 bool wxWindowOS2::HandleKeyUp( WXWPARAM wParam
,
4208 int nId
= wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam
));
4213 // Normal ASCII char
4215 nId
= CHAR1FROMMP(lParam
);
4220 wxKeyEvent
vEvent(CreateKeyEvent( wxEVT_KEY_UP
4226 if (GetEventHandler()->ProcessEvent(vEvent
))
4230 } // end of wxWindowOS2::HandleKeyUp
4232 // ---------------------------------------------------------------------------
4234 // ---------------------------------------------------------------------------
4236 // ---------------------------------------------------------------------------
4238 // ---------------------------------------------------------------------------
4240 bool wxWindowOS2::OS2OnScroll( int nOrientation
,
4247 wxWindow
* pChild
= wxFindWinFromHandle(hControl
);
4250 return pChild
->OS2OnScroll( nOrientation
4257 wxScrollWinEvent vEvent
;
4259 vEvent
.SetPosition(wPos
);
4260 vEvent
.SetOrientation(nOrientation
);
4261 vEvent
.SetEventObject(this);
4266 vEvent
.SetEventType(wxEVT_SCROLLWIN_LINEUP
);
4270 vEvent
.SetEventType(wxEVT_SCROLLWIN_LINEDOWN
);
4274 vEvent
.SetEventType(wxEVT_SCROLLWIN_PAGEUP
);
4278 vEvent
.SetEventType(wxEVT_SCROLLWIN_PAGEDOWN
);
4281 case SB_SLIDERPOSITION
:
4282 vEvent
.SetEventType(wxEVT_SCROLLWIN_THUMBRELEASE
);
4285 case SB_SLIDERTRACK
:
4286 vEvent
.SetEventType(wxEVT_SCROLLWIN_THUMBTRACK
);
4292 return GetEventHandler()->ProcessEvent(vEvent
);
4293 } // end of wxWindowOS2::OS2OnScroll
4295 void wxWindowOS2::MoveChildren(
4300 // We want to handle top levels ourself, manually
4302 if (!IsTopLevel() && GetAutoLayout())
4310 for (wxWindowList::compatibility_iterator node
= GetChildren().GetFirst();
4312 node
= node
->GetNext())
4314 wxWindow
* pWin
= node
->GetData();
4316 ::WinQueryWindowPos( GetHwndOf(pWin
)
4319 // Actually, only move children that already are placed on the
4320 // frame, not ones which are still at wxDefaultCoord.
4321 if (vSwp
.y
== wxDefaultCoord
)
4323 if (pWin
->IsKindOf(CLASSINFO(wxControl
)))
4328 // Must deal with controls that have margins like ENTRYFIELD. The SWP
4329 // struct of such a control will have and origin offset from its intended
4330 // position by the width of the margins.
4332 pCtrl
= wxDynamicCast(pWin
, wxControl
);
4333 vSwp
.y
-= pCtrl
->GetYComp();
4334 vSwp
.x
-= pCtrl
->GetXComp();
4336 ::WinSetWindowPos( GetHwndOf(pWin
)
4344 ::WinQueryWindowPos(GetHwndOf(pWin
), pWin
->GetSwp());
4345 if (pWin
->IsKindOf(CLASSINFO(wxRadioBox
)))
4347 wxRadioBox
* pRadioBox
;
4349 pRadioBox
= wxDynamicCast(pWin
, wxRadioBox
);
4350 pRadioBox
->AdjustButtons( (int)vSwp
.x
4351 ,(int)vSwp
.y
- nDiff
4354 ,pRadioBox
->GetSizeFlags()
4357 if (pWin
->IsKindOf(CLASSINFO(wxSlider
)))
4361 pSlider
= wxDynamicCast(pWin
, wxSlider
);
4362 pSlider
->AdjustSubControls( (int)vSwp
.x
4363 ,(int)vSwp
.y
- nDiff
4366 ,(int)pSlider
->GetSizeFlags()
4372 } // end of wxWindowOS2::MoveChildren
4375 // Getting the Y position for a window, like a control, is a real
4376 // pain. There are three sitatuions we must deal with in determining
4377 // the OS2 to wxWidgets Y coordinate.
4379 // 1) The controls are created in a dialog.
4380 // This is the easiest since a dialog is created with its original
4381 // size so the standard: Y = ParentHeight - (Y + ControlHeight);
4383 // 2) The controls are direct children of a frame
4384 // In this instance the controls are actually children of the Frame's
4385 // client. During creation the frame's client resizes several times
4386 // during creation of the status bar and toolbars. The CFrame class
4387 // will take care of this using its AlterChildPos proc.
4389 // 3) The controls are children of a panel, which in turn is a child of
4391 // The panel may be one of many, in which case the same treatment
4392 // as 1 applies. It may be the only child, though.
4393 // This is the nastiest case. A panel is created as the only child of
4394 // the frame and as such, when a frame has only one child, the child is
4395 // expanded to fit the entire client area of the frame. Because the
4396 // controls are created BEFORE this occurs their positions are totally
4397 // whacked and any call to WinQueryWindowPos will return invalid
4398 // coordinates. So for this situation we have to compare the size of
4399 // the panel at control creation time with that of the frame client. If
4400 // they are the same we can use the standard Y position equation. If
4401 // not, then we must use the Frame Client's dimensions to position them
4402 // as that will be the eventual size of the panel after the frame resizes
4405 int wxWindowOS2::GetOS2ParentHeight( wxWindowOS2
* pParent
)
4410 if (pParent
->IsKindOf(CLASSINFO(wxDialog
)))
4411 return(pParent
->GetClientSize().y
);
4414 // Case 2 -- if we are one of the separately built standard Frame
4415 // children, like a statusbar, menubar, or toolbar we want to
4416 // use the frame, itself, for positioning. Otherwise we are
4417 // child window and want to use the Frame's client.
4419 else if (pParent
->IsKindOf(CLASSINFO(wxFrame
)))
4421 if (IsKindOf(CLASSINFO(wxStatusBar
)) ||
4422 IsKindOf(CLASSINFO(wxMenuBar
)) ||
4423 IsKindOf(CLASSINFO(wxToolBar
))
4426 if (IsKindOf(CLASSINFO(wxToolBar
)))
4428 wxFrame
* pFrame
= wxDynamicCast(GetParent(), wxFrame
);
4430 if (pFrame
->GetToolBar() == this)
4431 return(pParent
->GetSize().y
);
4433 return(pParent
->GetClientSize().y
);
4436 return(pParent
->GetSize().y
);
4439 return(pParent
->GetClientSize().y
);
4442 // Case -- this is for any window that is the sole child of a Frame.
4443 // The grandparent must exist and it must be of type CFrame
4444 // and it's height must be different. Otherwise the standard
4450 return(pParent
->GetClientSize().y
);
4453 } // end of wxWindowOS2::GetOS2ParentHeight
4456 // OS/2 needs a lot extra manipulation to deal with layouts
4457 // for canvas windows, particularly scrolled ones.
4459 wxWindowCreationHook::wxWindowCreationHook(
4460 wxWindow
* pWinBeingCreated
4463 gpWinBeingCreated
= pWinBeingCreated
;
4464 } // end of wxWindowCreationHook::wxWindowCreationHook
4466 wxWindowCreationHook::~wxWindowCreationHook()
4468 gpWinBeingCreated
= NULL
;
4469 } // end of wxWindowCreationHook::~wxWindowCreationHook
4471 // ===========================================================================
4473 // ===========================================================================
4479 ,wxFont
* WXUNUSED(pTheFont
)
4486 hPS
=::WinGetPS(hWnd
);
4488 rc
= ::GpiQueryFontMetrics(hPS
, sizeof(FONTMETRICS
), &vFM
);
4492 *pX
= vFM
.lAveCharWidth
;
4494 *pY
= vFM
.lEmHeight
+ vFM
.lExternalLeading
;
4503 ::WinReleasePS(hPS
);
4504 } // end of wxGetCharSize
4507 // Returns 0 if was a normal ASCII value, not a special key. This indicates that
4508 // the key should be ignored by WM_KEYDOWN and processed by WM_CHAR instead.
4510 int wxCharCodeOS2ToWX(
4518 case VK_BACKTAB
: nId
= WXK_BACK
; break;
4519 case VK_TAB
: nId
= WXK_TAB
; break;
4520 case VK_CLEAR
: nId
= WXK_CLEAR
; break;
4521 case VK_ENTER
: nId
= WXK_RETURN
; break;
4522 case VK_SHIFT
: nId
= WXK_SHIFT
; break;
4523 case VK_CTRL
: nId
= WXK_CONTROL
; break;
4524 case VK_PAUSE
: nId
= WXK_PAUSE
; break;
4525 case VK_SPACE
: nId
= WXK_SPACE
; break;
4526 case VK_PAGEUP
: nId
= WXK_PRIOR
; break;
4527 case VK_PAGEDOWN
: nId
= WXK_NEXT
; break;
4528 case VK_ESC
: nId
= WXK_ESCAPE
; break;
4529 case VK_END
: nId
= WXK_END
; break;
4530 case VK_HOME
: nId
= WXK_HOME
; break;
4531 case VK_LEFT
: nId
= WXK_LEFT
; break;
4532 case VK_UP
: nId
= WXK_UP
; break;
4533 case VK_RIGHT
: nId
= WXK_RIGHT
; break;
4534 case VK_DOWN
: nId
= WXK_DOWN
; break;
4535 case VK_PRINTSCRN
: nId
= WXK_PRINT
; break;
4536 case VK_INSERT
: nId
= WXK_INSERT
; break;
4537 case VK_DELETE
: nId
= WXK_DELETE
; break;
4538 case VK_CAPSLOCK
: nId
= WXK_CAPITAL
; break;
4539 case VK_F1
: nId
= WXK_F1
; break;
4540 case VK_F2
: nId
= WXK_F2
; break;
4541 case VK_F3
: nId
= WXK_F3
; break;
4542 case VK_F4
: nId
= WXK_F4
; break;
4543 case VK_F5
: nId
= WXK_F5
; break;
4544 case VK_F6
: nId
= WXK_F6
; break;
4545 case VK_F7
: nId
= WXK_F7
; break;
4546 case VK_F8
: nId
= WXK_F8
; break;
4547 case VK_F9
: nId
= WXK_F9
; break;
4548 case VK_F10
: nId
= WXK_F10
; break;
4549 case VK_F11
: nId
= WXK_F11
; break;
4550 case VK_F12
: nId
= WXK_F12
; break;
4551 case VK_F13
: nId
= WXK_F13
; break;
4552 case VK_F14
: nId
= WXK_F14
; break;
4553 case VK_F15
: nId
= WXK_F15
; break;
4554 case VK_F16
: nId
= WXK_F16
; break;
4555 case VK_F17
: nId
= WXK_F17
; break;
4556 case VK_F18
: nId
= WXK_F18
; break;
4557 case VK_F19
: nId
= WXK_F19
; break;
4558 case VK_F20
: nId
= WXK_F20
; break;
4559 case VK_F21
: nId
= WXK_F21
; break;
4560 case VK_F22
: nId
= WXK_F22
; break;
4561 case VK_F23
: nId
= WXK_F23
; break;
4562 case VK_F24
: nId
= WXK_F24
; break;
4563 case VK_OEM_1
: nId
= ';'; break;
4564 case VK_OEM_PLUS
: nId
= '+'; break;
4565 case VK_OEM_COMMA
: nId
= ','; break;
4566 case VK_OEM_MINUS
: nId
= '-'; break;
4567 case VK_OEM_PERIOD
: nId
= '.'; break;
4568 case VK_OEM_2
: nId
= '/'; break;
4569 case VK_OEM_3
: nId
= '~'; break;
4570 case VK_OEM_4
: nId
= '['; break;
4571 case VK_OEM_5
: nId
= '\\'; break;
4572 case VK_OEM_6
: nId
= ']'; break;
4573 case VK_OEM_7
: nId
= '\''; break;
4574 case VK_NUMLOCK
: nId
= WXK_NUMLOCK
; break;
4575 case VK_SCRLLOCK
: nId
= WXK_SCROLL
; break;
4582 } // end of wxCharCodeOS2ToWX
4584 int wxCharCodeWXToOS2( int nId
,
4592 case WXK_CLEAR
: nKeySym
= VK_CLEAR
; break;
4593 case WXK_SHIFT
: nKeySym
= VK_SHIFT
; break;
4594 case WXK_CONTROL
: nKeySym
= VK_CTRL
; break;
4595 case WXK_PAUSE
: nKeySym
= VK_PAUSE
; break;
4596 case WXK_PRIOR
: nKeySym
= VK_PAGEUP
; break;
4597 case WXK_NEXT
: nKeySym
= VK_PAGEDOWN
; break;
4598 case WXK_END
: nKeySym
= VK_END
; break;
4599 case WXK_HOME
: nKeySym
= VK_HOME
; break;
4600 case WXK_LEFT
: nKeySym
= VK_LEFT
; break;
4601 case WXK_UP
: nKeySym
= VK_UP
; break;
4602 case WXK_RIGHT
: nKeySym
= VK_RIGHT
; break;
4603 case WXK_DOWN
: nKeySym
= VK_DOWN
; break;
4604 case WXK_PRINT
: nKeySym
= VK_PRINTSCRN
; break;
4605 case WXK_INSERT
: nKeySym
= VK_INSERT
; break;
4606 case WXK_DELETE
: nKeySym
= VK_DELETE
; break;
4607 case WXK_F1
: nKeySym
= VK_F1
; break;
4608 case WXK_F2
: nKeySym
= VK_F2
; break;
4609 case WXK_F3
: nKeySym
= VK_F3
; break;
4610 case WXK_F4
: nKeySym
= VK_F4
; break;
4611 case WXK_F5
: nKeySym
= VK_F5
; break;
4612 case WXK_F6
: nKeySym
= VK_F6
; break;
4613 case WXK_F7
: nKeySym
= VK_F7
; break;
4614 case WXK_F8
: nKeySym
= VK_F8
; break;
4615 case WXK_F9
: nKeySym
= VK_F9
; break;
4616 case WXK_F10
: nKeySym
= VK_F10
; break;
4617 case WXK_F11
: nKeySym
= VK_F11
; break;
4618 case WXK_F12
: nKeySym
= VK_F12
; break;
4619 case WXK_F13
: nKeySym
= VK_F13
; break;
4620 case WXK_F14
: nKeySym
= VK_F14
; break;
4621 case WXK_F15
: nKeySym
= VK_F15
; break;
4622 case WXK_F16
: nKeySym
= VK_F16
; break;
4623 case WXK_F17
: nKeySym
= VK_F17
; break;
4624 case WXK_F18
: nKeySym
= VK_F18
; break;
4625 case WXK_F19
: nKeySym
= VK_F19
; break;
4626 case WXK_F20
: nKeySym
= VK_F20
; break;
4627 case WXK_F21
: nKeySym
= VK_F21
; break;
4628 case WXK_F22
: nKeySym
= VK_F22
; break;
4629 case WXK_F23
: nKeySym
= VK_F23
; break;
4630 case WXK_F24
: nKeySym
= VK_F24
; break;
4631 case WXK_NUMLOCK
: nKeySym
= VK_NUMLOCK
; break;
4632 case WXK_SCROLL
: nKeySym
= VK_SCRLLOCK
; break;
4635 *bIsVirtual
= false;
4641 } // end of wxCharCodeWXToOS2
4643 wxWindow
* wxGetActiveWindow()
4645 HWND hWnd
= ::WinQueryActiveWindow(HWND_DESKTOP
);
4649 return wxFindWinFromHandle((WXHWND
)hWnd
);
4652 } // end of wxGetActiveWindow
4655 const wxChar
* wxGetMessageName( int nMessage
)
4659 case 0x0000: return wxT("WM_NULL");
4660 case 0x0001: return wxT("WM_CREATE");
4661 case 0x0002: return wxT("WM_DESTROY");
4662 case 0x0004: return wxT("WM_ENABLE");
4663 case 0x0005: return wxT("WM_SHOW");
4664 case 0x0006: return wxT("WM_MOVE");
4665 case 0x0007: return wxT("WM_SIZE");
4666 case 0x0008: return wxT("WM_ADJUSTWINDOWPOS");
4667 case 0x0009: return wxT("WM_CALCVALIDRECTS");
4668 case 0x000A: return wxT("WM_SETWINDOWPARAMS");
4669 case 0x000B: return wxT("WM_QUERYWINDOWPARAMS");
4670 case 0x000C: return wxT("WM_HITTEST");
4671 case 0x000D: return wxT("WM_ACTIVATE");
4672 case 0x000F: return wxT("WM_SETFOCUS");
4673 case 0x0010: return wxT("WM_SETSELECTION");
4674 case 0x0011: return wxT("WM_PPAINT");
4675 case 0x0012: return wxT("WM_PSETFOCUS");
4676 case 0x0013: return wxT("WM_PSYSCOLORCHANGE");
4677 case 0x0014: return wxT("WM_PSIZE");
4678 case 0x0015: return wxT("WM_PACTIVATE");
4679 case 0x0016: return wxT("WM_PCONTROL");
4680 case 0x0020: return wxT("WM_COMMAND");
4681 case 0x0021: return wxT("WM_SYSCOMMAND");
4682 case 0x0022: return wxT("WM_HELP");
4683 case 0x0023: return wxT("WM_PAINT");
4684 case 0x0024: return wxT("WM_TIMER");
4685 case 0x0025: return wxT("WM_SEM1");
4686 case 0x0026: return wxT("WM_SEM2");
4687 case 0x0027: return wxT("WM_SEM3");
4688 case 0x0028: return wxT("WM_SEM4");
4689 case 0x0029: return wxT("WM_CLOSE");
4690 case 0x002A: return wxT("WM_QUIT");
4691 case 0x002B: return wxT("WM_SYSCOLORCHANGE");
4692 case 0x002D: return wxT("WM_SYSVALUECHANGE");
4693 case 0x002E: return wxT("WM_APPTERMINATENOTIFY");
4694 case 0x002F: return wxT("WM_PRESPARAMCHANGED");
4695 // Control notification messages
4696 case 0x0030: return wxT("WM_CONTROL");
4697 case 0x0031: return wxT("WM_VSCROLL");
4698 case 0x0032: return wxT("WM_HSCROLL");
4699 case 0x0033: return wxT("WM_INITMENU");
4700 case 0x0034: return wxT("WM_MENUSELECT");
4701 case 0x0035: return wxT("WM_MENUSEND");
4702 case 0x0036: return wxT("WM_DRAWITEM");
4703 case 0x0037: return wxT("WM_MEASUREITEM");
4704 case 0x0038: return wxT("WM_CONTROLPOINTER");
4705 case 0x003A: return wxT("WM_QUERYDLGCODE");
4706 case 0x003B: return wxT("WM_INITDLG");
4707 case 0x003C: return wxT("WM_SUBSTITUTESTRING");
4708 case 0x003D: return wxT("WM_MATCHMNEMONIC");
4709 case 0x003E: return wxT("WM_SAVEAPPLICATION");
4710 case 0x0129: return wxT("WM_CTLCOLORCHANGE");
4711 case 0x0130: return wxT("WM_QUERYCTLTYPE");
4713 case 0x0040: return wxT("WM_FLASHWINDOW");
4714 case 0x0041: return wxT("WM_FORMATFRAME");
4715 case 0x0042: return wxT("WM_UPDATEFRAME");
4716 case 0x0043: return wxT("WM_FOCUSCHANGE");
4717 case 0x0044: return wxT("WM_SETBORDERSIZE");
4718 case 0x0045: return wxT("WM_TRACKFRAME");
4719 case 0x0046: return wxT("WM_MINMAXFRAME");
4720 case 0x0047: return wxT("WM_SETICON");
4721 case 0x0048: return wxT("WM_QUERYICON");
4722 case 0x0049: return wxT("WM_SETACCELTABLE");
4723 case 0x004A: return wxT("WM_QUERYACCELTABLE");
4724 case 0x004B: return wxT("WM_TRANSLATEACCEL");
4725 case 0x004C: return wxT("WM_QUERYTRACKINFO");
4726 case 0x004D: return wxT("WM_QUERYBORDERSIZE");
4727 case 0x004E: return wxT("WM_NEXTMENU");
4728 case 0x004F: return wxT("WM_ERASEBACKGROUND");
4729 case 0x0050: return wxT("WM_QUERYFRAMEINFO");
4730 case 0x0051: return wxT("WM_QUERYFOCUSCHAIN");
4731 case 0x0052: return wxT("WM_OWNERPOSCHANGE");
4732 case 0x0053: return wxT("WM_CACLFRAMERECT");
4733 case 0x0055: return wxT("WM_WINDOWPOSCHANGED");
4734 case 0x0056: return wxT("WM_ADJUSTFRAMEPOS");
4735 case 0x0059: return wxT("WM_QUERYFRAMECTLCOUNT");
4736 case 0x005B: return wxT("WM_QUERYHELPINFO");
4737 case 0x005C: return wxT("WM_SETHELPINFO");
4738 case 0x005D: return wxT("WM_ERROR");
4739 case 0x005E: return wxT("WM_REALIZEPALETTE");
4740 // Clipboard messages
4741 case 0x0060: return wxT("WM_RENDERFMT");
4742 case 0x0061: return wxT("WM_RENDERALLFMTS");
4743 case 0x0062: return wxT("WM_DESTROYCLIPBOARD");
4744 case 0x0063: return wxT("WM_PAINTCLIPBOARD");
4745 case 0x0064: return wxT("WM_SIZECLIPBOARD");
4746 case 0x0065: return wxT("WM_HSCROLLCLIPBOARD");
4747 case 0x0066: return wxT("WM_VSCROLLCLIPBOARD");
4748 case 0x0067: return wxT("WM_DRAWCLIPBOARD");
4750 case 0x0070: return wxT("WM_MOUSEMOVE");
4751 case 0x0071: return wxT("WM_BUTTON1DOWN");
4752 case 0x0072: return wxT("WM_BUTTON1UP");
4753 case 0x0073: return wxT("WM_BUTTON1DBLCLK");
4754 case 0x0074: return wxT("WM_BUTTON2DOWN");
4755 case 0x0075: return wxT("WM_BUTTON2UP");
4756 case 0x0076: return wxT("WM_BUTTON2DBLCLK");
4757 case 0x0077: return wxT("WM_BUTTON3DOWN");
4758 case 0x0078: return wxT("WM_BUTTON3UP");
4759 case 0x0079: return wxT("WM_BUTTON3DBLCLK");
4760 case 0x007D: return wxT("WM_MOUSEMAP");
4761 case 0x007E: return wxT("WM_VRNDISABLED");
4762 case 0x007F: return wxT("WM_VRNENABLED");
4763 case 0x0410: return wxT("WM_CHORD");
4764 case 0x0411: return wxT("WM_BUTTON1MOTIONSTART");
4765 case 0x0412: return wxT("WM_BUTTON1MOTIONEND");
4766 case 0x0413: return wxT("WM_BUTTON1CLICK");
4767 case 0x0414: return wxT("WM_BUTTON2MOTIONSTART");
4768 case 0x0415: return wxT("WM_BUTTON2MOTIONEND");
4769 case 0x0416: return wxT("WM_BUTTON2CLICK");
4770 case 0x0417: return wxT("WM_BUTTON3MOTIONSTART");
4771 case 0x0418: return wxT("WM_BUTTON3MOTIONEND");
4772 case 0x0419: return wxT("WM_BUTTON3CLICK");
4773 case 0x0420: return wxT("WM_BEGINDRAG");
4774 case 0x0421: return wxT("WM_ENDDRAG");
4775 case 0x0422: return wxT("WM_SINGLESELECT");
4776 case 0x0423: return wxT("WM_OPEN");
4777 case 0x0424: return wxT("WM_CONTEXTMENU");
4778 case 0x0425: return wxT("WM_CONTEXTHELP");
4779 case 0x0426: return wxT("WM_TEXTEDIT");
4780 case 0x0427: return wxT("WM_BEGINSELECT");
4781 case 0x0228: return wxT("WM_ENDSELECT");
4782 case 0x0429: return wxT("WM_PICKUP");
4783 case 0x04C0: return wxT("WM_PENFIRST");
4784 case 0x04FF: return wxT("WM_PENLAST");
4785 case 0x0500: return wxT("WM_MMPMFIRST");
4786 case 0x05FF: return wxT("WM_MMPMLAST");
4787 case 0x0600: return wxT("WM_STDDLGFIRST");
4788 case 0x06FF: return wxT("WM_STDDLGLAST");
4789 case 0x0BD0: return wxT("WM_BIDI_FIRST");
4790 case 0x0BFF: return wxT("WM_BIDI_LAST");
4792 case 0x007A: return wxT("WM_CHAR");
4793 case 0x007B: return wxT("WM_VIOCHAR");
4795 case 0x00A0: return wxT("WM_DDE_INITIATE");
4796 case 0x00A1: return wxT("WM_DDE_REQUEST");
4797 case 0x00A2: return wxT("WM_DDE_ACK");
4798 case 0x00A3: return wxT("WM_DDE_DATA");
4799 case 0x00A4: return wxT("WM_DDE_ADVISE");
4800 case 0x00A5: return wxT("WM_DDE_UNADVISE");
4801 case 0x00A6: return wxT("WM_DDE_POKE");
4802 case 0x00A7: return wxT("WM_DDE_EXECUTE");
4803 case 0x00A8: return wxT("WM_DDE_TERMINATE");
4804 case 0x00A9: return wxT("WM_DDE_INITIATEACK");
4805 case 0x00AF: return wxT("WM_DDE_LAST");
4807 case 0x0120: return wxT("BM_CLICK");
4808 case 0x0121: return wxT("BM_QUERYCHECKINDEX");
4809 case 0x0122: return wxT("BM_QUERYHILITE");
4810 case 0x0123: return wxT("BM_SETHILITE");
4811 case 0x0124: return wxT("BM_QUERYCHECK");
4812 case 0x0125: return wxT("BM_SETCHECK");
4813 case 0x0126: return wxT("BM_SETDEFAULT");
4814 case 0x0128: return wxT("BM_AUTOSIZE");
4816 case 0x029A: return wxT("CBID_LIST");
4817 case 0x029B: return wxT("CBID_EDIT");
4818 case 0x0170: return wxT("CBM_SHOWLIST");
4819 case 0x0171: return wxT("CBM_HILITE");
4820 case 0x0172: return wxT("CBM_ISLISTSHOWING");
4822 case 0x0140: return wxT("EM_QUERYCHANGED");
4823 case 0x0141: return wxT("EM_QUERYSEL");
4824 case 0x0142: return wxT("EM_SETSEL");
4825 case 0x0143: return wxT("EM_SETTEXTLIMIT");
4826 case 0x0144: return wxT("EM_CUT");
4827 case 0x0145: return wxT("EM_COPY");
4828 case 0x0146: return wxT("EM_CLEAR");
4829 case 0x0147: return wxT("EM_PASTE");
4830 case 0x0148: return wxT("EM_QUERYFIRSTCHAR");
4831 case 0x0149: return wxT("EM_SETFIRSTCHAR");
4832 case 0x014A: return wxT("EM_QUERYREADONLY");
4833 case 0x014B: return wxT("EM_SETREADONLY");
4834 case 0x014C: return wxT("EM_SETINSERTMODE");
4836 case 0x0160: return wxT("LM_QUERYITEMCOUNT");
4837 case 0x0161: return wxT("LM_INSERTITEM");
4838 case 0x0162: return wxT("LM_SETOPENINDEX");
4839 case 0x0163: return wxT("LM_DELETEITEM");
4840 case 0x0164: return wxT("LM_SELECTITEM");
4841 case 0x0165: return wxT("LM_QUERYSELECTION");
4842 case 0x0166: return wxT("LM_SETITEMTEXT");
4843 case 0x0167: return wxT("LM_QUERYITEMTEXTLENGTH");
4844 case 0x0168: return wxT("LM_QUERYITEMTEXT");
4845 case 0x0169: return wxT("LM_SETITEMHANDLE");
4846 case 0x016A: return wxT("LM_QUERYITEMHANDLE");
4847 case 0x016B: return wxT("LM_SEARCHSTRING");
4848 case 0x016C: return wxT("LM_SETITEMHEIGHT");
4849 case 0x016D: return wxT("LM_QUERYTOPINDEX");
4850 case 0x016E: return wxT("LM_DELETEALL");
4851 case 0x016F: return wxT("LM_INSERTMULITEMS");
4852 case 0x0660: return wxT("LM_SETITEMWIDTH");
4854 case 0x0180: return wxT("MM_INSERTITEM");
4855 case 0x0181: return wxT("MM_DELETEITEM");
4856 case 0x0182: return wxT("MM_QUERYITEM");
4857 case 0x0183: return wxT("MM_SETITEM");
4858 case 0x0184: return wxT("MM_QUERYITEMCOUNT");
4859 case 0x0185: return wxT("MM_STARTMENUMODE");
4860 case 0x0186: return wxT("MM_ENDMENUMODE");
4861 case 0x0188: return wxT("MM_REMOVEITEM");
4862 case 0x0189: return wxT("MM_SELECTITEM");
4863 case 0x018A: return wxT("MM_QUERYSELITEMID");
4864 case 0x018B: return wxT("MM_QUERYITEMTEXT");
4865 case 0x018C: return wxT("MM_QUERYITEMTEXTLENGTH");
4866 case 0x018D: return wxT("MM_SETITEMHANDLE");
4867 case 0x018E: return wxT("MM_SETITEMTEXT");
4868 case 0x018F: return wxT("MM_ITEMPOSITIONFROMID");
4869 case 0x0190: return wxT("MM_ITEMIDFROMPOSITION");
4870 case 0x0191: return wxT("MM_QUERYITEMATTR");
4871 case 0x0192: return wxT("MM_SETITEMATTR");
4872 case 0x0193: return wxT("MM_ISITEMVALID");
4873 case 0x0194: return wxT("MM_QUERYITEMRECT");
4874 case 0x0431: return wxT("MM_QUERYDEFAULTITEMID");
4875 case 0x0432: return wxT("MM_SETDEFAULTITEMID");
4877 case 0x01A0: return wxT("SBM_SETSCROLLBAR");
4878 case 0x01A1: return wxT("SBM_SETPOS");
4879 case 0x01A2: return wxT("SBM_QUERYPOS");
4880 case 0x01A3: return wxT("SBM_QUERYRANGE");
4881 case 0x01A6: return wxT("SBM_SETTHUMBSIZE");
4884 case 0x0F00: return wxT("WM_HELPBASE");
4885 case 0x0FFF: return wxT("WM_HELPTOP");
4886 // Beginning of user defined messages
4887 case 0x1000: return wxT("WM_USER");
4889 // wxWidgets user defined types
4892 // case 0x1000 + 0: return wxT("LVM_GETBKCOLOR");
4893 case 0x1000 + 1: return wxT("LVM_SETBKCOLOR");
4894 case 0x1000 + 2: return wxT("LVM_GETIMAGELIST");
4895 case 0x1000 + 3: return wxT("LVM_SETIMAGELIST");
4896 case 0x1000 + 4: return wxT("LVM_GETITEMCOUNT");
4897 case 0x1000 + 5: return wxT("LVM_GETITEMA");
4898 case 0x1000 + 75: return wxT("LVM_GETITEMW");
4899 case 0x1000 + 6: return wxT("LVM_SETITEMA");
4900 case 0x1000 + 76: return wxT("LVM_SETITEMW");
4901 case 0x1000 + 7: return wxT("LVM_INSERTITEMA");
4902 case 0x1000 + 77: return wxT("LVM_INSERTITEMW");
4903 case 0x1000 + 8: return wxT("LVM_DELETEITEM");
4904 case 0x1000 + 9: return wxT("LVM_DELETEALLITEMS");
4905 case 0x1000 + 10: return wxT("LVM_GETCALLBACKMASK");
4906 case 0x1000 + 11: return wxT("LVM_SETCALLBACKMASK");
4907 case 0x1000 + 12: return wxT("LVM_GETNEXTITEM");
4908 case 0x1000 + 13: return wxT("LVM_FINDITEMA");
4909 case 0x1000 + 83: return wxT("LVM_FINDITEMW");
4910 case 0x1000 + 14: return wxT("LVM_GETITEMRECT");
4911 case 0x1000 + 15: return wxT("LVM_SETITEMPOSITION");
4912 case 0x1000 + 16: return wxT("LVM_GETITEMPOSITION");
4913 case 0x1000 + 17: return wxT("LVM_GETSTRINGWIDTHA");
4914 case 0x1000 + 87: return wxT("LVM_GETSTRINGWIDTHW");
4915 case 0x1000 + 18: return wxT("LVM_HITTEST");
4916 case 0x1000 + 19: return wxT("LVM_ENSUREVISIBLE");
4917 case 0x1000 + 20: return wxT("LVM_SCROLL");
4918 case 0x1000 + 21: return wxT("LVM_REDRAWITEMS");
4919 case 0x1000 + 22: return wxT("LVM_ARRANGE");
4920 case 0x1000 + 23: return wxT("LVM_EDITLABELA");
4921 case 0x1000 + 118: return wxT("LVM_EDITLABELW");
4922 case 0x1000 + 24: return wxT("LVM_GETEDITCONTROL");
4923 case 0x1000 + 25: return wxT("LVM_GETCOLUMNA");
4924 case 0x1000 + 95: return wxT("LVM_GETCOLUMNW");
4925 case 0x1000 + 26: return wxT("LVM_SETCOLUMNA");
4926 case 0x1000 + 96: return wxT("LVM_SETCOLUMNW");
4927 case 0x1000 + 27: return wxT("LVM_INSERTCOLUMNA");
4928 case 0x1000 + 97: return wxT("LVM_INSERTCOLUMNW");
4929 case 0x1000 + 28: return wxT("LVM_DELETECOLUMN");
4930 case 0x1000 + 29: return wxT("LVM_GETCOLUMNWIDTH");
4931 case 0x1000 + 30: return wxT("LVM_SETCOLUMNWIDTH");
4932 case 0x1000 + 31: return wxT("LVM_GETHEADER");
4933 case 0x1000 + 33: return wxT("LVM_CREATEDRAGIMAGE");
4934 case 0x1000 + 34: return wxT("LVM_GETVIEWRECT");
4935 case 0x1000 + 35: return wxT("LVM_GETTEXTCOLOR");
4936 case 0x1000 + 36: return wxT("LVM_SETTEXTCOLOR");
4937 case 0x1000 + 37: return wxT("LVM_GETTEXTBKCOLOR");
4938 case 0x1000 + 38: return wxT("LVM_SETTEXTBKCOLOR");
4939 case 0x1000 + 39: return wxT("LVM_GETTOPINDEX");
4940 case 0x1000 + 40: return wxT("LVM_GETCOUNTPERPAGE");
4941 case 0x1000 + 41: return wxT("LVM_GETORIGIN");
4942 case 0x1000 + 42: return wxT("LVM_UPDATE");
4943 case 0x1000 + 43: return wxT("LVM_SETITEMSTATE");
4944 case 0x1000 + 44: return wxT("LVM_GETITEMSTATE");
4945 case 0x1000 + 45: return wxT("LVM_GETITEMTEXTA");
4946 case 0x1000 + 115: return wxT("LVM_GETITEMTEXTW");
4947 case 0x1000 + 46: return wxT("LVM_SETITEMTEXTA");
4948 case 0x1000 + 116: return wxT("LVM_SETITEMTEXTW");
4949 case 0x1000 + 47: return wxT("LVM_SETITEMCOUNT");
4950 case 0x1000 + 48: return wxT("LVM_SORTITEMS");
4951 case 0x1000 + 49: return wxT("LVM_SETITEMPOSITION32");
4952 case 0x1000 + 50: return wxT("LVM_GETSELECTEDCOUNT");
4953 case 0x1000 + 51: return wxT("LVM_GETITEMSPACING");
4954 case 0x1000 + 52: return wxT("LVM_GETISEARCHSTRINGA");
4955 case 0x1000 + 117: return wxT("LVM_GETISEARCHSTRINGW");
4956 case 0x1000 + 53: return wxT("LVM_SETICONSPACING");
4957 case 0x1000 + 54: return wxT("LVM_SETEXTENDEDLISTVIEWSTYLE");
4958 case 0x1000 + 55: return wxT("LVM_GETEXTENDEDLISTVIEWSTYLE");
4959 case 0x1000 + 56: return wxT("LVM_GETSUBITEMRECT");
4960 case 0x1000 + 57: return wxT("LVM_SUBITEMHITTEST");
4961 case 0x1000 + 58: return wxT("LVM_SETCOLUMNORDERARRAY");
4962 case 0x1000 + 59: return wxT("LVM_GETCOLUMNORDERARRAY");
4963 case 0x1000 + 60: return wxT("LVM_SETHOTITEM");
4964 case 0x1000 + 61: return wxT("LVM_GETHOTITEM");
4965 case 0x1000 + 62: return wxT("LVM_SETHOTCURSOR");
4966 case 0x1000 + 63: return wxT("LVM_GETHOTCURSOR");
4967 case 0x1000 + 64: return wxT("LVM_APPROXIMATEVIEWRECT");
4968 case 0x1000 + 65: return wxT("LVM_SETWORKAREA");
4971 case 0x1100 + 0: return wxT("TVM_INSERTITEMA");
4972 case 0x1100 + 50: return wxT("TVM_INSERTITEMW");
4973 case 0x1100 + 1: return wxT("TVM_DELETEITEM");
4974 case 0x1100 + 2: return wxT("TVM_EXPAND");
4975 case 0x1100 + 4: return wxT("TVM_GETITEMRECT");
4976 case 0x1100 + 5: return wxT("TVM_GETCOUNT");
4977 case 0x1100 + 6: return wxT("TVM_GETINDENT");
4978 case 0x1100 + 7: return wxT("TVM_SETINDENT");
4979 case 0x1100 + 8: return wxT("TVM_GETIMAGELIST");
4980 case 0x1100 + 9: return wxT("TVM_SETIMAGELIST");
4981 case 0x1100 + 10: return wxT("TVM_GETNEXTITEM");
4982 case 0x1100 + 11: return wxT("TVM_SELECTITEM");
4983 case 0x1100 + 12: return wxT("TVM_GETITEMA");
4984 case 0x1100 + 62: return wxT("TVM_GETITEMW");
4985 case 0x1100 + 13: return wxT("TVM_SETITEMA");
4986 case 0x1100 + 63: return wxT("TVM_SETITEMW");
4987 case 0x1100 + 14: return wxT("TVM_EDITLABELA");
4988 case 0x1100 + 65: return wxT("TVM_EDITLABELW");
4989 case 0x1100 + 15: return wxT("TVM_GETEDITCONTROL");
4990 case 0x1100 + 16: return wxT("TVM_GETVISIBLECOUNT");
4991 case 0x1100 + 17: return wxT("TVM_HITTEST");
4992 case 0x1100 + 18: return wxT("TVM_CREATEDRAGIMAGE");
4993 case 0x1100 + 19: return wxT("TVM_SORTCHILDREN");
4994 case 0x1100 + 20: return wxT("TVM_ENSUREVISIBLE");
4995 case 0x1100 + 21: return wxT("TVM_SORTCHILDRENCB");
4996 case 0x1100 + 22: return wxT("TVM_ENDEDITLABELNOW");
4997 case 0x1100 + 23: return wxT("TVM_GETISEARCHSTRINGA");
4998 case 0x1100 + 64: return wxT("TVM_GETISEARCHSTRINGW");
4999 case 0x1100 + 24: return wxT("TVM_SETTOOLTIPS");
5000 case 0x1100 + 25: return wxT("TVM_GETTOOLTIPS");
5003 case 0x1200 + 0: return wxT("HDM_GETITEMCOUNT");
5004 case 0x1200 + 1: return wxT("HDM_INSERTITEMA");
5005 case 0x1200 + 10: return wxT("HDM_INSERTITEMW");
5006 case 0x1200 + 2: return wxT("HDM_DELETEITEM");
5007 case 0x1200 + 3: return wxT("HDM_GETITEMA");
5008 case 0x1200 + 11: return wxT("HDM_GETITEMW");
5009 case 0x1200 + 4: return wxT("HDM_SETITEMA");
5010 case 0x1200 + 12: return wxT("HDM_SETITEMW");
5011 case 0x1200 + 5: return wxT("HDM_LAYOUT");
5012 case 0x1200 + 6: return wxT("HDM_HITTEST");
5013 case 0x1200 + 7: return wxT("HDM_GETITEMRECT");
5014 case 0x1200 + 8: return wxT("HDM_SETIMAGELIST");
5015 case 0x1200 + 9: return wxT("HDM_GETIMAGELIST");
5016 case 0x1200 + 15: return wxT("HDM_ORDERTOINDEX");
5017 case 0x1200 + 16: return wxT("HDM_CREATEDRAGIMAGE");
5018 case 0x1200 + 17: return wxT("HDM_GETORDERARRAY");
5019 case 0x1200 + 18: return wxT("HDM_SETORDERARRAY");
5020 case 0x1200 + 19: return wxT("HDM_SETHOTDIVIDER");
5023 case 0x1300 + 2: return wxT("TCM_GETIMAGELIST");
5024 case 0x1300 + 3: return wxT("TCM_SETIMAGELIST");
5025 case 0x1300 + 4: return wxT("TCM_GETITEMCOUNT");
5026 case 0x1300 + 5: return wxT("TCM_GETITEMA");
5027 case 0x1300 + 60: return wxT("TCM_GETITEMW");
5028 case 0x1300 + 6: return wxT("TCM_SETITEMA");
5029 case 0x1300 + 61: return wxT("TCM_SETITEMW");
5030 case 0x1300 + 7: return wxT("TCM_INSERTITEMA");
5031 case 0x1300 + 62: return wxT("TCM_INSERTITEMW");
5032 case 0x1300 + 8: return wxT("TCM_DELETEITEM");
5033 case 0x1300 + 9: return wxT("TCM_DELETEALLITEMS");
5034 case 0x1300 + 10: return wxT("TCM_GETITEMRECT");
5035 case 0x1300 + 11: return wxT("TCM_GETCURSEL");
5036 case 0x1300 + 12: return wxT("TCM_SETCURSEL");
5037 case 0x1300 + 13: return wxT("TCM_HITTEST");
5038 case 0x1300 + 14: return wxT("TCM_SETITEMEXTRA");
5039 case 0x1300 + 40: return wxT("TCM_ADJUSTRECT");
5040 case 0x1300 + 41: return wxT("TCM_SETITEMSIZE");
5041 case 0x1300 + 42: return wxT("TCM_REMOVEIMAGE");
5042 case 0x1300 + 43: return wxT("TCM_SETPADDING");
5043 case 0x1300 + 44: return wxT("TCM_GETROWCOUNT");
5044 case 0x1300 + 45: return wxT("TCM_GETTOOLTIPS");
5045 case 0x1300 + 46: return wxT("TCM_SETTOOLTIPS");
5046 case 0x1300 + 47: return wxT("TCM_GETCURFOCUS");
5047 case 0x1300 + 48: return wxT("TCM_SETCURFOCUS");
5048 case 0x1300 + 49: return wxT("TCM_SETMINTABWIDTH");
5049 case 0x1300 + 50: return wxT("TCM_DESELECTALL");
5052 case WM_USER
+1000+1: return wxT("TB_ENABLEBUTTON");
5053 case WM_USER
+1000+2: return wxT("TB_CHECKBUTTON");
5054 case WM_USER
+1000+3: return wxT("TB_PRESSBUTTON");
5055 case WM_USER
+1000+4: return wxT("TB_HIDEBUTTON");
5056 case WM_USER
+1000+5: return wxT("TB_INDETERMINATE");
5057 case WM_USER
+1000+9: return wxT("TB_ISBUTTONENABLED");
5058 case WM_USER
+1000+10: return wxT("TB_ISBUTTONCHECKED");
5059 case WM_USER
+1000+11: return wxT("TB_ISBUTTONPRESSED");
5060 case WM_USER
+1000+12: return wxT("TB_ISBUTTONHIDDEN");
5061 case WM_USER
+1000+13: return wxT("TB_ISBUTTONINDETERMINATE");
5062 case WM_USER
+1000+17: return wxT("TB_SETSTATE");
5063 case WM_USER
+1000+18: return wxT("TB_GETSTATE");
5064 case WM_USER
+1000+19: return wxT("TB_ADDBITMAP");
5065 case WM_USER
+1000+20: return wxT("TB_ADDBUTTONS");
5066 case WM_USER
+1000+21: return wxT("TB_INSERTBUTTON");
5067 case WM_USER
+1000+22: return wxT("TB_DELETEBUTTON");
5068 case WM_USER
+1000+23: return wxT("TB_GETBUTTON");
5069 case WM_USER
+1000+24: return wxT("TB_BUTTONCOUNT");
5070 case WM_USER
+1000+25: return wxT("TB_COMMANDTOINDEX");
5071 case WM_USER
+1000+26: return wxT("TB_SAVERESTOREA");
5072 case WM_USER
+1000+76: return wxT("TB_SAVERESTOREW");
5073 case WM_USER
+1000+27: return wxT("TB_CUSTOMIZE");
5074 case WM_USER
+1000+28: return wxT("TB_ADDSTRINGA");
5075 case WM_USER
+1000+77: return wxT("TB_ADDSTRINGW");
5076 case WM_USER
+1000+29: return wxT("TB_GETITEMRECT");
5077 case WM_USER
+1000+30: return wxT("TB_BUTTONSTRUCTSIZE");
5078 case WM_USER
+1000+31: return wxT("TB_SETBUTTONSIZE");
5079 case WM_USER
+1000+32: return wxT("TB_SETBITMAPSIZE");
5080 case WM_USER
+1000+33: return wxT("TB_AUTOSIZE");
5081 case WM_USER
+1000+35: return wxT("TB_GETTOOLTIPS");
5082 case WM_USER
+1000+36: return wxT("TB_SETTOOLTIPS");
5083 case WM_USER
+1000+37: return wxT("TB_SETPARENT");
5084 case WM_USER
+1000+39: return wxT("TB_SETROWS");
5085 case WM_USER
+1000+40: return wxT("TB_GETROWS");
5086 case WM_USER
+1000+42: return wxT("TB_SETCMDID");
5087 case WM_USER
+1000+43: return wxT("TB_CHANGEBITMAP");
5088 case WM_USER
+1000+44: return wxT("TB_GETBITMAP");
5089 case WM_USER
+1000+45: return wxT("TB_GETBUTTONTEXTA");
5090 case WM_USER
+1000+75: return wxT("TB_GETBUTTONTEXTW");
5091 case WM_USER
+1000+46: return wxT("TB_REPLACEBITMAP");
5092 case WM_USER
+1000+47: return wxT("TB_SETINDENT");
5093 case WM_USER
+1000+48: return wxT("TB_SETIMAGELIST");
5094 case WM_USER
+1000+49: return wxT("TB_GETIMAGELIST");
5095 case WM_USER
+1000+50: return wxT("TB_LOADIMAGES");
5096 case WM_USER
+1000+51: return wxT("TB_GETRECT");
5097 case WM_USER
+1000+52: return wxT("TB_SETHOTIMAGELIST");
5098 case WM_USER
+1000+53: return wxT("TB_GETHOTIMAGELIST");
5099 case WM_USER
+1000+54: return wxT("TB_SETDISABLEDIMAGELIST");
5100 case WM_USER
+1000+55: return wxT("TB_GETDISABLEDIMAGELIST");
5101 case WM_USER
+1000+56: return wxT("TB_SETSTYLE");
5102 case WM_USER
+1000+57: return wxT("TB_GETSTYLE");
5103 case WM_USER
+1000+58: return wxT("TB_GETBUTTONSIZE");
5104 case WM_USER
+1000+59: return wxT("TB_SETBUTTONWIDTH");
5105 case WM_USER
+1000+60: return wxT("TB_SETMAXTEXTROWS");
5106 case WM_USER
+1000+61: return wxT("TB_GETTEXTROWS");
5107 case WM_USER
+1000+41: return wxT("TB_GETBITMAPFLAGS");
5110 static wxString s_szBuf
;
5111 s_szBuf
.Printf(wxT("<unknown message = %d>"), nMessage
);
5112 return s_szBuf
.c_str();
5114 } // end of wxGetMessageName
5116 #endif // __WXDEBUG__
5120 static void TranslateKbdEventToMouse(
5128 // Construct the key mask
5129 ULONG
& fwKeys
= *pFlags
;
5131 fwKeys
= VK_BUTTON2
;
5132 if ((::WinGetKeyState(HWND_DESKTOP
, VK_CTRL
) & 0x100) != 0)
5134 if ((::WinGetKeyState(HWND_DESKTOP
, VK_SHIFT
) & 0x100) != 0)
5138 // Simulate right mouse button click
5142 ::WinQueryMsgPos(vHabmain
, &vPoint
);
5146 pWin
->ScreenToClient(pX
, pY
);
5147 } // end of TranslateKbdEventToMouse
5150 // Find the wxWindow at the current mouse position, returning the mouse
5152 wxWindow
* wxFindWindowAtPointer(wxPoint
& WXUNUSED(rPt
))
5154 return wxFindWindowAtPoint(wxGetMousePosition());
5157 wxWindow
* wxFindWindowAtPoint(const wxPoint
& rPt
)
5164 HWND hWndHit
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPt2
, FALSE
);
5165 wxWindow
* pWin
= wxFindWinFromHandle((WXHWND
)hWndHit
) ;
5166 HWND hWnd
= hWndHit
;
5169 // Try to find a window with a wxWindow associated with it
5171 while (!pWin
&& (hWnd
!= 0))
5173 hWnd
= ::WinQueryWindow(hWnd
, QW_PARENT
);
5174 pWin
= wxFindWinFromHandle((WXHWND
)hWnd
) ;
5179 // Get the current mouse position.
5180 wxPoint
wxGetMousePosition()
5184 ::WinQueryPointerPos(HWND_DESKTOP
, &vPt
);
5185 return wxPoint(vPt
.x
, vPt
.y
);
5188 wxWindowOS2
* FindWindowForMouseEvent( wxWindow
* pWin
,
5189 short* WXUNUSED(pnX
),
5190 short* WXUNUSED(pnY
) )
5192 HWND hWnd
= GetHwndOf(pWin
);
5193 HWND hWndUnderMouse
;
5195 BOOL rcEnabled
= FALSE
;
5196 BOOL rcVisible
= FALSE
;
5198 ::WinQueryPointerPos(HWND_DESKTOP
, &vPoint
);
5199 hWndUnderMouse
= ::WinWindowFromPoint(HWND_DESKTOP
, &vPoint
, TRUE
);
5200 if (hWndUnderMouse
!= HWND_DESKTOP
)
5202 wxWindow
* pWinUnderMouse
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
);
5206 wxWindowList::compatibility_iterator current
= pWinUnderMouse
->GetChildren().GetFirst();
5207 wxWindow
* pGrandChild
= NULL
;
5211 ::WinMapWindowPoints(HWND_DESKTOP
, hWndUnderMouse
, &vPoint
, 1);
5213 // Find a child window mouse might be under
5217 wxWindow
* pChild
= current
->GetData();
5219 vPoint2
.x
= vPoint
.x
;
5220 vPoint2
.y
= vPoint
.y
;
5221 ::WinMapWindowPoints(hWndUnderMouse
, pChild
->GetHWND(), &vPoint2
, 1);
5222 ::WinQueryWindowRect(pChild
->GetHWND(), &vRect
);
5223 if (::WinPtInRect(vHabmain
, &vRect
, &vPoint2
))
5225 if (pChild
->IsTopLevel())
5228 wxWindowList::compatibility_iterator current2
=pChild
->GetChildren().GetFirst();
5232 wxWindow
* pGrandChild
= current2
->GetData();
5234 vPoint3
.x
= vPoint2
.x
;
5235 vPoint3
.y
= vPoint2
.y
;
5236 ::WinMapWindowPoints( pChild
->GetHWND()
5237 ,pGrandChild
->GetHWND()
5241 ::WinQueryWindowRect(pGrandChild
->GetHWND(), &vRect
);
5242 if (::WinPtInRect(vHabmain
, &vRect
, &vPoint3
))
5244 hWndUnderMouse
= GetHwndOf(pGrandChild
);
5245 pWinUnderMouse
= pGrandChild
;
5248 current2
= current2
->GetNext();
5253 hWndUnderMouse
= GetHwndOf(pChild
);
5254 pWinUnderMouse
= pChild
;
5255 rcVisible
= ::WinIsWindowVisible(hWndUnderMouse
);
5256 rcEnabled
= ::WinIsWindowEnabled(hWndUnderMouse
);
5257 if (rcVisible
&& rcEnabled
)
5260 current
= current
->GetNext();
5264 rcVisible
= ::WinIsWindowVisible(hWndUnderMouse
);
5265 rcEnabled
= ::WinIsWindowEnabled(hWndUnderMouse
);
5269 // Check that we have a child window which is susceptible to receive mouse
5270 // events: for this it must be shown and enabled
5272 if ( hWndUnderMouse
&&
5273 hWndUnderMouse
!= hWnd
&&
5274 rcVisible
&& rcEnabled
)
5276 wxWindow
* pWinUnderMouse
= wxFindWinFromHandle((WXHWND
)hWndUnderMouse
);
5281 // Translate the mouse coords to the other window coords
5283 pWin
= pWinUnderMouse
;
5287 } // end of FindWindowForMouseEvent