1 /////////////////////////////////////////////////////////////////////////////
8 // Copyright: (c) AUTHOR
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "window.h"
20 #include "wx/window.h"
25 #include "wx/dcclient.h"
29 #include "wx/layout.h"
30 #include "wx/dialog.h"
32 #include "wx/listbox.h"
33 #include "wx/button.h"
34 #include "wx/msgdlg.h"
40 #include "wx/ownerdrw.h"
43 #if wxUSE_DRAG_AND_DROP
47 #include "wx/menuitem.h"
51 #include "wx/tooltip.h"
62 #include "wx/textctrl.h"
66 // place compiler, OS specific includes here
69 // standard macros -- these are for OS/2 PM, but most GUI's have something similar
71 // SHORT1FROMMP -- LOWORD
72 #define GET_X_LPARAM(mp) ((unsigned short)(unsigned long)(mp))
73 // SHORT2FROMMP -- HIWORD
74 #define GET_Y_LPARAM(mp) ((unsigned short)(unsigned long)(mp >> 16))
75 #endif // GET_X_LPARAM
77 // ---------------------------------------------------------------------------
79 // ---------------------------------------------------------------------------
81 // the last Windows message we got (MT-UNSAFE)
82 extern WXMSGID s_currentMsg
;
83 extern wxList WXDLLEXPORT wxPendingDelete
;
84 extern wxChar wxCanvasClassName
[];
86 wxMenu
*wxCurrentPopupMenu
= NULL
;
87 wxList
*wxWinHandleList
= NULL
;
89 // ---------------------------------------------------------------------------
91 // ---------------------------------------------------------------------------
92 // the window proc for all our windows; most gui's have something similar
93 MRESULT
wxWndProc( HWND hWnd
98 void wxRemoveHandleAssociation(wxWindow
*win
);
99 void wxAssociateWinWithHandle(HWND hWnd
, wxWindow
*win
);
100 wxWindow
*wxFindWinFromHandle(WXHWND hWnd
);
102 // ---------------------------------------------------------------------------
104 // ---------------------------------------------------------------------------
106 #if !USE_SHARED_LIBRARY
107 IMPLEMENT_DYNAMIC_CLASS(wxWindow
, wxWindowBase
)
110 BEGIN_EVENT_TABLE(wxWindow
, wxWindowBase
)
111 EVT_ERASE_BACKGROUND(wxWindow::OnEraseBackground
)
112 EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged
)
113 EVT_INIT_DIALOG(wxWindow::OnInitDialog
)
114 EVT_IDLE(wxWindow::OnIdle
)
117 // ===========================================================================
119 // ===========================================================================
121 void wxWindow::Init()
127 m_winCaptured
= FALSE
;
128 m_isBeingDeleted
= FALSE
;
129 m_mouseInWindow
= FALSE
;
130 m_backgroundTransparent
= FALSE
;
137 // pass WM_GETDLGCODE to DefWindowProc()
143 // as all windows are created with WS_VISIBLE style...
148 bool wxWindow::Create(wxWindow
*parent
, wxWindowID id
,
152 const wxString
& name
)
154 wxCHECK_MSG( parent
, FALSE
, _T("can't create wxWindow without parent") );
156 if ( !CreateBase(parent
, id
, pos
, size
, style
, wxDefaultValidator
, name
) )
159 // TODO: PM Specific initialization
160 parent
->AddChild(this);
165 wxWindow::~wxWindow()
167 m_isBeingDeleted
= TRUE
;
169 PMDetachWindowMenu();
172 m_parent
->RemoveChild(this);
176 if(!WinDestroyWindow(GetHwnd()))
177 wxLogLastError("DestroyWindow");
178 // remove hWnd <-> wxWindow association
179 wxRemoveHandleAssociation(this);
183 // ---------------------------------------------------------------------------
185 // ---------------------------------------------------------------------------
187 void wxWindow::Raise()
192 void wxWindow::Lower()
197 void wxWindow::SetFocus()
202 void wxWindow::WarpPointer(int x_pos
, int y_pos
)
207 void wxWindow::CaptureMouse()
212 void wxWindow::ReleaseMouse()
217 void wxWindow::Refresh(bool eraseBack
, const wxRect
*rect
)
222 void wxWindow::Clear()
227 bool wxWindow::SetFont(const wxFont
& f
)
233 int wxWindow::GetCharHeight() const
239 int wxWindow::GetCharWidth() const
245 void wxWindow::GetTextExtent( const wxString
& string
249 ,int* externalLeading
250 ,const wxFont
* theFont
256 void wxWindow::SetScrollbar( int orient
266 void wxWindow::SetScrollPos( int orient
274 int wxWindow::GetScrollPos(int orient
) const
280 int wxWindow::GetScrollRange(int orient
) const
286 int wxWindow::GetScrollThumb(int orient
) const
292 void wxWindow::ScrollWindow( int dx
300 #if wxUSE_DRAG_AND_DROP
301 void wxWindow::SetDropTarget(wxDropTarget
*pDropTarget
)
307 void wxWindow::DoClientToScreen( int *x
, int *y
) const
312 void wxWindow::DoScreenToClient( int *x
, int *y
) const
317 void wxWindow::DoGetPosition( int *x
, int *y
) const
322 void wxWindow::DoGetSize( int *width
, int *height
) const
327 void wxWindow::DoGetClientSize( int *width
, int *height
) const
332 void wxWindow::DoSetSize(int x
, int y
,
333 int width
, int height
,
339 void wxWindow::DoSetClientSize(int width
, int height
)
344 bool wxWindow::DoPopupMenu( wxMenu
*menu
, int x
, int y
)
355 bool wxWindow::Show(bool show
) // check if base implementation is OK
361 bool wxWindow::Enable(bool enable
) // check if base implementation is OK
367 bool wxWindow::SetCursor(const wxCursor
& cursor
) // check if base implementation is OK
373 bool wxWindow::Validate()
379 wxWindow
* wxWindow::FindFocus()
381 wxWindow
* window
= NULL
;
386 void wxWindow::DragAcceptFiles(bool accept
)
391 #if wxUSE_CARET && WXWIN_COMPATIBILITY
392 void wxWindow::CreateCaret(int w
, int h
)
397 void wxWindow::CreateCaret(const wxBitmap
*bitmap
)
402 void wxWindow::DestroyCaret()
407 void wxWindow::ShowCaret(bool show
)
412 void wxWindow::SetCaretPos(int x
, int y
)
417 void wxWindow::GetCaretPos(int *x
, int *y
) const
424 void wxWindow::OnCommand(wxWindow
& win
, wxCommandEvent
& event
)
429 void wxWindow::OnDefaultAction(wxControl
*initiatingItem
)
434 void wxWindow::OnEraseBackground(wxEraseEvent
& event
)
439 void wxWindow::OnChar(wxKeyEvent
& event
)
444 void wxWindow::OnKeyDown(wxKeyEvent
& event
)
449 void wxWindow::OnKeyUp(wxKeyEvent
& event
)
454 void wxWindow::OnPaint(wxPaintEvent
& event
)
459 void wxWindow::OnIdle(wxIdleEvent
& event
)
464 void wxWindow::OnInitDialog(wxInitDialogEvent
& event
)
470 wxPoint
wxWindow::GetClientAreaOrigin() const
473 return wxPoint(0, 0);
476 void wxWindow::AdjustForParentClientOrigin(int& x
, int& y
, int sizeFlags
)
481 long wxWindow::Default()
487 void wxWindow::UnsetConstraints(wxLayoutConstraints
*c
)
492 wxObject
* wxWindow::GetChild(int number
) const
495 return((wxObject
*)this);
498 WXWidget
wxWindow::GetHandle() const
501 return((WXWidget
)m_hWnd
);
504 void wxWindow::PMDetachWindowMenu()
508 HMENU hMenu
= (HMENU
)m_hMenu
;
510 int N
= (int)WinSendMsg(hMenu
, MM_QUERYITEMCOUNT
, 0, 0);
512 for (i
= 0; i
< N
; i
++)
515 int chars
= (int)WinSendMsg(hMenu
, MM_QUERYITEMTEXT
, MPFROM2SHORT(i
, N
), buf
);
518 wxLogLastError(_T("GetMenuString"));
523 if ( wxStrcmp(buf
, _T("&Window")) == 0 )
525 WinSendMsg(hMenu
, MM_DELETEITEM
, MPFROM2SHORT(i
, TRUE
), 0);
532 void wxAssociateWinWithHandle(HWND hWnd
, wxWindow
*win
)
534 // adding NULL hWnd is (first) surely a result of an error and
535 // (secondly) breaks menu command processing
536 wxCHECK_RET( hWnd
!= (HWND
)NULL
,
537 _T("attempt to add a NULL hWnd to window list ignored") );
539 if ( !wxWinHandleList
->Find((long)hWnd
) )
540 wxWinHandleList
->Append((long)hWnd
, win
);
543 wxWindow
*wxFindWinFromHandle(WXHWND hWnd
)
545 wxNode
*node
= wxWinHandleList
->Find((long)hWnd
);
548 return (wxWindow
*)node
->Data();
551 void wxRemoveHandleAssociation(wxWindow
*win
)
553 wxWinHandleList
->DeleteObject(win
);