]>
git.saurik.com Git - wxWidgets.git/blob - include/wx/msw/window.h
   1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        wx/msw/window.h 
   3 // Purpose:     wxWindow class 
   4 // Author:      Julian Smart 
   5 // Modified by: Vadim Zeitlin on 13.05.99: complete refont of message handling, 
   6 //              elimination of Default(), ... 
   9 // Copyright:   (c) Julian Smart 
  10 // Licence:     wxWindows licence 
  11 ///////////////////////////////////////////////////////////////////////////// 
  16 // --------------------------------------------------------------------------- 
  18 // --------------------------------------------------------------------------- 
  21     #pragma interface "window.h" 
  24 // [at least] some version of Windows send extra mouse move messages after 
  25 // a mouse click or a key press - to temporarily fix this problem, set the 
  28 // a better solution should be found later... 
  29 #define wxUSE_MOUSEEVENT_HACK 0 
  33 // pseudo-template HWND <-> wxWindow hash table 
  34 WX_DECLARE_HASH(wxWindow
, wxWindowList
, wxWinHashTable
); 
  36 extern wxWinHashTable 
*wxWinHandleHash
; 
  38 // --------------------------------------------------------------------------- 
  40 // --------------------------------------------------------------------------- 
  42 // FIXME does anybody use those? they're unused by wxWindows... 
  49 // --------------------------------------------------------------------------- 
  50 // wxWindow declaration for MSW 
  51 // --------------------------------------------------------------------------- 
  53 class WXDLLEXPORT wxWindowMSW 
: public wxWindowBase
 
  56     wxWindowMSW() { Init(); } 
  58     wxWindowMSW(wxWindow 
*parent
, 
  60                 const wxPoint
& pos 
= wxDefaultPosition
, 
  61                 const wxSize
& size 
= wxDefaultSize
, 
  63                 const wxString
& name 
= wxPanelNameStr
) 
  66         Create(parent
, id
, pos
, size
, style
, name
); 
  69     virtual ~wxWindowMSW(); 
  71     bool Create(wxWindow 
*parent
, 
  73                 const wxPoint
& pos 
= wxDefaultPosition
, 
  74                 const wxSize
& size 
= wxDefaultSize
, 
  76                 const wxString
& name 
= wxPanelNameStr
); 
  78     // implement base class pure virtuals 
  79     virtual void SetTitle( const wxString
& title
); 
  80     virtual wxString 
GetTitle() const; 
  85     virtual bool Show( bool show 
= TRUE 
); 
  86     virtual bool Enable( bool enable 
= TRUE 
); 
  88     virtual void SetFocus(); 
  89     virtual void SetFocusFromKbd(); 
  91     virtual bool Reparent(wxWindowBase 
*newParent
); 
  93     virtual void WarpPointer(int x
, int y
); 
  95     virtual void Refresh( bool eraseBackground 
= TRUE
, 
  96                           const wxRect 
*rect 
= (const wxRect 
*) NULL 
); 
  97     virtual void Update(); 
  99     virtual void Freeze(); 
 102     virtual void SetWindowStyleFlag( long style 
); 
 103     virtual bool SetCursor( const wxCursor 
&cursor 
); 
 104     virtual bool SetFont( const wxFont 
&font 
); 
 106     virtual int GetCharHeight() const; 
 107     virtual int GetCharWidth() const; 
 108     virtual void GetTextExtent(const wxString
& string
, 
 110                                int *descent 
= (int *) NULL
, 
 111                                int *externalLeading 
= (int *) NULL
, 
 112                                const wxFont 
*theFont 
= (const wxFont 
*) NULL
) 
 115 #if wxUSE_MENUS_NATIVE 
 116     virtual bool DoPopupMenu( wxMenu 
*menu
, int x
, int y 
); 
 117 #endif // wxUSE_MENUS_NATIVE 
 119     virtual void SetScrollbar( int orient
, int pos
, int thumbVisible
, 
 120                                int range
, bool refresh 
= TRUE 
); 
 121     virtual void SetScrollPos( int orient
, int pos
, bool refresh 
= TRUE 
); 
 122     virtual int GetScrollPos( int orient 
) const; 
 123     virtual int GetScrollThumb( int orient 
) const; 
 124     virtual int GetScrollRange( int orient 
) const; 
 125     virtual void ScrollWindow( int dx
, int dy
, 
 126                                const wxRect
* rect 
= (wxRect 
*) NULL 
); 
 128     virtual bool ScrollLines(int lines
); 
 129     virtual bool ScrollPages(int pages
); 
 131 #if wxUSE_DRAG_AND_DROP 
 132     virtual void SetDropTarget( wxDropTarget 
*dropTarget 
); 
 133 #endif // wxUSE_DRAG_AND_DROP 
 135     // Accept files for dragging 
 136     virtual void DragAcceptFiles(bool accept
); 
 138 #if WXWIN_COMPATIBILITY_2_4 
 139     wxDEPRECATED( bool GetUseCtl3D() const ); 
 140     wxDEPRECATED( bool GetTransparentBackground() const ); 
 141     wxDEPRECATED( void SetTransparent(bool t 
= TRUE
) ); 
 142 #endif // WXWIN_COMPATIBILITY_2_4 
 144 #if WXWIN_COMPATIBILITY 
 145     // Set/get scroll attributes 
 146     virtual void SetScrollRange(int orient
, int range
, bool refresh 
= TRUE
); 
 147     virtual void SetScrollPage(int orient
, int page
, bool refresh 
= TRUE
); 
 148     virtual int OldGetScrollRange(int orient
) const; 
 149     virtual int GetScrollPage(int orient
) const; 
 152         // Handle a control command 
 153     virtual void OnCommand(wxWindow
& win
, wxCommandEvent
& event
); 
 155         // Override to define new behaviour for default action (e.g. double 
 156         // clicking on a listbox) 
 157     virtual void OnDefaultAction(wxControl 
* WXUNUSED(initiatingItem
)) { } 
 158 #endif // WXWIN_COMPATIBILITY 
 160 #if wxUSE_CARET && WXWIN_COMPATIBILITY 
 161     // caret manipulation (old MSW only functions, see wxCaret class for the 
 163     void CreateCaret(int w
, int h
); 
 164     void CreateCaret(const wxBitmap 
*bitmap
); 
 166     void ShowCaret(bool show
); 
 167     void SetCaretPos(int x
, int y
); 
 168     void GetCaretPos(int *x
, int *y
) const; 
 169 #endif // wxUSE_CARET 
 171 #ifndef __WXUNIVERSAL__ 
 172     // Native resource loading (implemented in src/msw/nativdlg.cpp) 
 173     // FIXME: should they really be all virtual? 
 174     virtual bool LoadNativeDialog(wxWindow
* parent
, wxWindowID
& id
); 
 175     virtual bool LoadNativeDialog(wxWindow
* parent
, const wxString
& name
); 
 176     wxWindow
* GetWindowChild1(wxWindowID id
); 
 177     wxWindow
* GetWindowChild(wxWindowID id
); 
 178 #endif // __WXUNIVERSAL__ 
 181     // install and deinstall a system wide hotkey 
 182     virtual bool RegisterHotKey(int hotkeyId
, int modifiers
, int keycode
); 
 183     virtual bool UnregisterHotKey(int hotkeyId
); 
 184 #endif // wxUSE_HOTKEY 
 186     // implementation from now on 
 187     // -------------------------- 
 192     WXHWND 
GetHWND() const { return m_hWnd
; } 
 193     void SetHWND(WXHWND hWnd
) { m_hWnd 
= hWnd
; } 
 194     virtual WXWidget 
GetHandle() const { return GetHWND(); } 
 199     void OnEraseBackground(wxEraseEvent
& event
); 
 200     void OnPaint(wxPaintEvent
& event
); 
 203     // For implementation purposes - sometimes decorations make the client area 
 205     virtual wxPoint 
GetClientAreaOrigin() const; 
 207     // Windows subclassing 
 208     void SubclassWin(WXHWND hWnd
); 
 209     void UnsubclassWin(); 
 211     WXFARPROC 
MSWGetOldWndProc() const { return m_oldWndProc
; } 
 212     void MSWSetOldWndProc(WXFARPROC proc
) { m_oldWndProc 
= proc
; } 
 214     // return TRUE if the window is of a standard (i.e. not wxWindows') class 
 216     // to understand why does it work, look at SubclassWin() code and comments 
 217     bool IsOfStandardClass() const { return m_oldWndProc 
!= NULL
; } 
 219     wxWindow 
*FindItem(long id
) const; 
 220     wxWindow 
*FindItemByHWND(WXHWND hWnd
, bool controlOnly 
= FALSE
) const; 
 222     // MSW only: TRUE if this control is part of the main control 
 223     virtual bool ContainsHWND(WXHWND 
WXUNUSED(hWnd
)) const { return FALSE
; }; 
 225     // translate wxWindows style flags for this control into the Windows style 
 226     // and optional extended style for the corresponding native control 
 228     // this is the function that should be overridden in the derived classes, 
 229     // but you will mostly use MSWGetCreateWindowFlags() below 
 230     virtual WXDWORD 
MSWGetStyle(long flags
, WXDWORD 
*exstyle 
= NULL
) const ; 
 232     // get the MSW window flags corresponding to wxWindows ones 
 234     // the functions returns the flags (WS_XXX) directly and puts the ext 
 235     // (WS_EX_XXX) flags into the provided pointer if not NULL 
 236     WXDWORD 
MSWGetCreateWindowFlags(WXDWORD 
*exflags 
= NULL
) const 
 237         { return MSWGetStyle(GetWindowStyle(), exflags
); } 
 239     // translate wxWindows coords into Windows ones suitable to be passed to 
 242     // returns TRUE if non default coords are returned, FALSE otherwise 
 243     bool MSWGetCreateWindowCoords(const wxPoint
& pos
, 
 246                                   int& w
, int& h
) const; 
 248     // get the HWND to be used as parent of this window with CreateWindow() 
 249     virtual WXHWND 
MSWGetParent() const; 
 251     // creates the window of specified Windows class with given style, extended 
 252     // style, title and geometry (default values 
 254     // returns TRUE if the window has been created, FALSE if creation failed 
 255     bool MSWCreate(const wxChar 
*wclass
, 
 256                    const wxChar 
*title 
= NULL
, 
 257                    const wxPoint
& pos 
= wxDefaultPosition
, 
 258                    const wxSize
& size 
= wxDefaultSize
, 
 260                    WXDWORD exendedStyle 
= 0); 
 262     virtual bool MSWCommand(WXUINT param
, WXWORD id
); 
 264 #if WXWIN_COMPATIBILITY 
 265     wxObject 
*GetChild(int number
) const; 
 266     virtual void MSWDeviceToLogical(float *x
, float *y
) const; 
 267 #endif // WXWIN_COMPATIBILITY 
 269 #ifndef __WXUNIVERSAL__ 
 270     // Create an appropriate wxWindow from a HWND 
 271     virtual wxWindow
* CreateWindowFromHWND(wxWindow
* parent
, WXHWND hWnd
); 
 273     // Make sure the window style reflects the HWND style (roughly) 
 274     virtual void AdoptAttributesFromHWND(); 
 275 #endif // __WXUNIVERSAL__ 
 277     // Setup background and foreground colours correctly 
 278     virtual void SetupColours(); 
 280     // ------------------------------------------------------------------------ 
 281     // helpers for message handlers: these perform the same function as the 
 282     // message crackers from <windowsx.h> - they unpack WPARAM and LPARAM into 
 283     // the correct parameters 
 284     // ------------------------------------------------------------------------ 
 286     void UnpackCommand(WXWPARAM wParam
, WXLPARAM lParam
, 
 287                        WXWORD 
*id
, WXHWND 
*hwnd
, WXWORD 
*cmd
); 
 288     void UnpackActivate(WXWPARAM wParam
, WXLPARAM lParam
, 
 289                         WXWORD 
*state
, WXWORD 
*minimized
, WXHWND 
*hwnd
); 
 290     void UnpackScroll(WXWPARAM wParam
, WXLPARAM lParam
, 
 291                       WXWORD 
*code
, WXWORD 
*pos
, WXHWND 
*hwnd
); 
 292     void UnpackCtlColor(WXWPARAM wParam
, WXLPARAM lParam
, 
 293                         WXWORD 
*nCtlColor
, WXHDC 
*hdc
, WXHWND 
*hwnd
); 
 294     void UnpackMenuSelect(WXWPARAM wParam
, WXLPARAM lParam
, 
 295                           WXWORD 
*item
, WXWORD 
*flags
, WXHMENU 
*hmenu
); 
 297     // ------------------------------------------------------------------------ 
 298     // internal handlers for MSW messages: all handlers return a boolean value: 
 299     // TRUE means that the handler processed the event and FALSE that it didn't 
 300     // ------------------------------------------------------------------------ 
 302     // there are several cases where we have virtual functions for Windows 
 303     // message processing: this is because these messages often require to be 
 304     // processed in a different manner in the derived classes. For all other 
 305     // messages, however, we do *not* have corresponding MSWOnXXX() function 
 306     // and if the derived class wants to process them, it should override 
 307     // MSWWindowProc() directly. 
 309     // scroll event (both horizontal and vertical) 
 310     virtual bool MSWOnScroll(int orientation
, WXWORD nSBCode
, 
 311                              WXWORD pos
, WXHWND control
); 
 313     // child control notifications 
 315     virtual bool MSWOnNotify(int idCtrl
, WXLPARAM lParam
, WXLPARAM 
*result
); 
 318     // owner-drawn controls need to process these messages 
 319     virtual bool MSWOnDrawItem(int id
, WXDRAWITEMSTRUCT 
*item
); 
 320     virtual bool MSWOnMeasureItem(int id
, WXMEASUREITEMSTRUCT 
*item
); 
 322     // the rest are not virtual 
 323     bool HandleCreate(WXLPCREATESTRUCT cs
, bool *mayCreate
); 
 324     bool HandleInitDialog(WXHWND hWndFocus
); 
 325     bool HandleDestroy(); 
 328     bool HandleEraseBkgnd(WXHDC pDC
); 
 330     bool HandleMinimize(); 
 331     bool HandleMaximize(); 
 332     bool HandleSize(int x
, int y
, WXUINT flag
); 
 333     bool HandleSizing(wxRect
& rect
); 
 334     bool HandleGetMinMaxInfo(void *mmInfo
); 
 336     bool HandleShow(bool show
, int status
); 
 337     bool HandleActivate(int flag
, bool minimized
, WXHWND activate
); 
 339     bool HandleCommand(WXWORD id
, WXWORD cmd
, WXHWND control
); 
 340     bool HandleSysCommand(WXWPARAM wParam
, WXLPARAM lParam
); 
 342     bool HandleCtlColor(WXHBRUSH 
*hBrush
, 
 350     bool HandlePaletteChanged(WXHWND hWndPalChange
); 
 351     bool HandleQueryNewPalette(); 
 352     bool HandleSysColorChange(); 
 353     bool HandleDisplayChange(); 
 354     bool HandleCaptureChanged(WXHWND gainedCapture
); 
 356     bool HandleQueryEndSession(long logOff
, bool *mayEnd
); 
 357     bool HandleEndSession(bool endSession
, long logOff
); 
 359     bool HandleSetFocus(WXHWND wnd
); 
 360     bool HandleKillFocus(WXHWND wnd
); 
 362     bool HandleDropFiles(WXWPARAM wParam
); 
 364     bool HandleMouseEvent(WXUINT msg
, int x
, int y
, WXUINT flags
); 
 365     bool HandleMouseMove(int x
, int y
, WXUINT flags
); 
 366     bool HandleMouseWheel(WXWPARAM wParam
, WXLPARAM lParam
); 
 368     bool HandleChar(WXWPARAM wParam
, WXLPARAM lParam
, bool isASCII 
= FALSE
); 
 369     bool HandleKeyDown(WXWPARAM wParam
, WXLPARAM lParam
); 
 370     bool HandleKeyUp(WXWPARAM wParam
, WXLPARAM lParam
); 
 372     bool HandleHotKey(WXWPARAM wParam
, WXLPARAM lParam
); 
 375     int HandleMenuChar(int chAccel
, WXLPARAM lParam
); 
 378     bool HandleQueryDragIcon(WXHICON 
*hIcon
); 
 380     bool HandleSetCursor(WXHWND hWnd
, short nHitTest
, int mouseMsg
); 
 383     virtual long MSWWindowProc(WXUINT nMsg
, WXWPARAM wParam
, WXLPARAM lParam
); 
 385     // Calls an appropriate default window procedure 
 386     virtual long MSWDefWindowProc(WXUINT nMsg
, WXWPARAM wParam
, WXLPARAM lParam
); 
 388     // message processing helpers 
 390     // return FALSE if the message shouldn't be translated/preprocessed but 
 391     // dispatched normally 
 392     virtual bool MSWShouldPreProcessMessage(WXMSG
* pMsg
); 
 394     // return TRUE if the message was preprocessed and shouldn't be dispatched 
 395     virtual bool MSWProcessMessage(WXMSG
* pMsg
); 
 397     // return TRUE if the message was translated and shouldn't be dispatched 
 398     virtual bool MSWTranslateMessage(WXMSG
* pMsg
); 
 400     // called when the window is about to be destroyed 
 401     virtual void MSWDestroyWindow(); 
 403     // this function should return the brush to paint the window background 
 404     // with or 0 for the default brush 
 405     virtual WXHBRUSH 
OnCtlColor(WXHDC hDC
, 
 412 #if WXWIN_COMPATIBILITY 
 413     void SetShowing(bool show
) { (void)Show(show
); } 
 414     bool IsUserEnabled() const { return IsEnabled(); } 
 415 #endif // WXWIN_COMPATIBILITY 
 417     // Responds to colour changes: passes event on to children. 
 418     void OnSysColourChanged(wxSysColourChangedEvent
& event
); 
 420     // initialize various fields of wxMouseEvent (common part of MSWOnMouseXXX) 
 421     void InitMouseEvent(wxMouseEvent
& event
, int x
, int y
, WXUINT flags
); 
 423     // check if mouse is in the window 
 424     bool IsMouseInWindow() const; 
 426     // virtual function for implementing internal idle 
 428     virtual void OnInternalIdle() ; 
 434     // the old window proc (we subclass all windows) 
 435     WXFARPROC             m_oldWndProc
; 
 437     // additional (MSW specific) flags 
 438     bool                  m_mouseInWindow
:1; 
 439     bool                  m_lastKeydownProcessed
:1; 
 441     // the size of one page for scrolling 
 445 #if wxUSE_MOUSEEVENT_HACK 
 446     // the coordinates of the last mouse event and the type of it 
 449     int                   m_lastMouseEvent
; 
 450 #endif // wxUSE_MOUSEEVENT_HACK 
 452     WXHMENU               m_hMenu
; // Menu, if any 
 454     // implement the base class pure virtuals 
 455     virtual void DoClientToScreen( int *x
, int *y 
) const; 
 456     virtual void DoScreenToClient( int *x
, int *y 
) const; 
 457     virtual void DoGetPosition( int *x
, int *y 
) const; 
 458     virtual void DoGetSize( int *width
, int *height 
) const; 
 459     virtual void DoGetClientSize( int *width
, int *height 
) const; 
 460     virtual void DoSetSize(int x
, int y
, 
 461                            int width
, int height
, 
 462                            int sizeFlags 
= wxSIZE_AUTO
); 
 463     virtual void DoSetClientSize(int width
, int height
); 
 465     virtual void DoCaptureMouse(); 
 466     virtual void DoReleaseMouse(); 
 468     // move the window to the specified location and resize it: this is called 
 469     // from both DoSetSize() and DoSetClientSize() and would usually just call 
 470     // ::MoveWindow() except for composite controls which will want to arrange 
 471     // themselves inside the given rectangle 
 472     virtual void DoMoveWindow(int x
, int y
, int width
, int height
); 
 475     virtual void DoSetToolTip( wxToolTip 
*tip 
); 
 477     // process TTN_NEEDTEXT message properly (i.e. fixing the bugs in 
 478     // comctl32.dll in our code -- see the function body for more info) 
 479     bool HandleTooltipNotify(WXUINT code
, 
 481                              const wxString
& ttip
); 
 482 #endif // wxUSE_TOOLTIPS 
 484     // the helper functions used by HandleChar/KeyXXX methods 
 485     wxKeyEvent 
CreateKeyEvent(wxEventType evType
, int id
, 
 486                               WXLPARAM lParam 
= 0, WXWPARAM wParam 
= 0) const; 
 489     // common part of all ctors 
 492     // the (non-virtual) handlers for the events 
 493     bool HandleMove(int x
, int y
); 
 494     bool HandleMoving(wxRect
& rect
); 
 495     bool HandleJoystickEvent(WXUINT msg
, int x
, int y
, WXUINT flags
); 
 498     bool HandleNotify(int idCtrl
, WXLPARAM lParam
, WXLPARAM 
*result
); 
 501     // list of disabled children before last call to our Disable() 
 502     wxWindowList 
*m_childrenDisabled
; 
 504     DECLARE_DYNAMIC_CLASS(wxWindowMSW
) 
 505     DECLARE_NO_COPY_CLASS(wxWindowMSW
) 
 506     DECLARE_EVENT_TABLE() 
 509 // ---------------------------------------------------------------------------- 
 511 // ---------------------------------------------------------------------------- 
 513 #if WXWIN_COMPATIBILITY_2_4 
 515 inline bool wxWindowMSW::GetUseCtl3D() const { return false; } 
 516 inline bool wxWindowMSW::GetTransparentBackground() const { return false; } 
 517 inline void wxWindowMSW::SetTransparent(bool WXUNUSED(t
)) { } 
 519 #endif // WXWIN_COMPATIBILITY_2_4 
 521 // --------------------------------------------------------------------------- 
 523 // --------------------------------------------------------------------------- 
 525 // kbd code translation 
 526 WXDLLEXPORT 
int wxCharCodeMSWToWX(int keySym
); 
 527 WXDLLEXPORT 
int wxCharCodeWXToMSW(int id
, bool *IsVirtual
); 
 529 // window creation helper class: before creating a new HWND, instantiate an 
 530 // object of this class on stack - this allows to process the messages sent to 
 531 // the window even before CreateWindow() returns 
 532 class wxWindowCreationHook
 
 535     wxWindowCreationHook(wxWindowMSW 
*winBeingCreated
); 
 536     ~wxWindowCreationHook();