X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2bda0e173844e8e0f8acf4e8ad8b5c26e5c6fe5d..cf1a9b45c7b70f217d3cc282ab77df8feaadcdeb:/include/wx/msw/window.h?ds=sidebyside diff --git a/include/wx/msw/window.h b/include/wx/msw/window.h index 73d5971c39..538051007b 100644 --- a/include/wx/msw/window.h +++ b/include/wx/msw/window.h @@ -6,793 +6,447 @@ // Created: 01/02/97 // RCS-ID: $Id$ // Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifndef __WINDOWH__ -#define __WINDOWH__ +#ifndef _WX_WINDOW_H_ +#define _WX_WINDOW_H_ + +// --------------------------------------------------------------------------- +// headers +// --------------------------------------------------------------------------- #ifdef __GNUG__ -#pragma interface "window.h" + #pragma interface "window.h" #endif -#include "wx/gdicmn.h" -#include "wx/icon.h" -#include "wx/cursor.h" -#include "wx/pen.h" -#include "wx/font.h" -#include "wx/validate.h" -#include "wx/event.h" -#include "wx/string.h" -#include "wx/list.h" +// #include "wx/msw/winundef.h" -#define wxKEY_SHIFT 1 -#define wxKEY_CTRL 2 +// VZ: apparently some version of Windows send extra mouse move messages after +// a mouse click. My tests under NT 4.0 and 95 didn't show it so I'm +// tempted to think that it was just an effect of a poor mouse and so the +// code to work around this is currently disabled - just define this as 1 +// to reenable it +#define wxUSE_MOUSEEVENT_HACK 0 -/* - * Base class for frame, panel, canvas, panel items, dialog box. - * - */ +// --------------------------------------------------------------------------- +// forward declarations +// --------------------------------------------------------------------------- -/* - * Event handler: windows have themselves as their event handlers - * by default, but their event handlers could be set to another - * object entirely. This separation can reduce the amount of - * derivation required, and allow alteration of a window's functionality - * (e.g. by a resource editor that temporarily switches event handlers). - */ - -class WXDLLEXPORT wxWindow; -class WXDLLEXPORT wxEvent; -class WXDLLEXPORT wxCommandEvent; -class WXDLLEXPORT wxKeyEvent; -class WXDLLEXPORT wxControl; -class WXDLLEXPORT wxCursor; -class WXDLLEXPORT wxColourMap; -class WXDLLEXPORT wxFont; -class WXDLLEXPORT wxMenu; -class WXDLLEXPORT wxRectangle; -class WXDLLEXPORT wxBitmap; -class WXDLLEXPORT wxSizer; -class WXDLLEXPORT wxList; -class WXDLLEXPORT wxLayoutConstraints; -class WXDLLEXPORT wxMouseEvent; class WXDLLEXPORT wxButton; -class WXDLLEXPORT wxColour; -class WXDLLEXPORT wxBrush; -class WXDLLEXPORT wxPen; -class WXDLLEXPORT wxIcon; -class WXDLLEXPORT wxDC; -class WXDLLEXPORT wxValidator; - -#if USE_DRAG_AND_DROP -class wxDropTarget; -#endif - -#if USE_WX_RESOURCES -class WXDLLEXPORT wxResourceTable; -class WXDLLEXPORT wxItemResource; -#endif -WXDLLEXPORT_DATA(extern const char*) wxPanelNameStr; +// --------------------------------------------------------------------------- +// constants +// --------------------------------------------------------------------------- -WXDLLEXPORT_DATA(extern const wxSize) wxDefaultSize; -WXDLLEXPORT_DATA(extern const wxPoint) wxDefaultPosition; - -class WXDLLEXPORT wxWindow: public wxEvtHandler +// FIXME does anybody use those? they're unused by wxWindows... +enum { - DECLARE_ABSTRACT_CLASS(wxWindow) + wxKEY_SHIFT = 1, + wxKEY_CTRL = 2 +}; - friend class wxUpdateIterator; - friend class wxDC; - friend class wxPaintDC; +// --------------------------------------------------------------------------- +// wxWindow declaration for MSW +// --------------------------------------------------------------------------- +class WXDLLEXPORT wxWindow : public wxWindowBase +{ public: - wxWindow(void); - inline wxWindow(wxWindow *parent, const wxWindowID id, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - const long style = 0, - const wxString& name = wxPanelNameStr) - { - m_children = new wxList; - Create(parent, id, pos, size, style, name); - } - - virtual ~wxWindow(void); - - bool Create(wxWindow *parent, const wxWindowID id, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - const long style = 0, - const wxString& name = wxPanelNameStr); - - // Fit the window around the items - virtual void Fit(void); - - // Show or hide the window - virtual bool Show(const bool show); - - // Is the window shown? - virtual bool IsShown(void) const; - - // Raise the window to the top of the Z order - virtual void Raise(void); - - // Lower the window to the bottom of the Z order - virtual void Lower(void); - - // Is the window enabled? - virtual bool IsEnabled(void) const; - - // For compatibility - inline bool Enabled(void) const { return IsEnabled(); } - - // Dialog support: override these and call - // base class members to add functionality - // that can't be done using validators. - - // Transfer values to controls. If returns FALSE, - // it's an application error (pops up a dialog) - virtual bool TransferDataToWindow(void); - - // Transfer values from controls. If returns FALSE, - // transfer failed: don't quit - virtual bool TransferDataFromWindow(void); + wxWindow() { Init(); } + + wxWindow(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr) + { + Init(); + Create(parent, id, pos, size, style, name); + } + + virtual ~wxWindow(); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr); + + // implement base class pure virtuals + virtual void SetTitle( const wxString& title); + virtual wxString GetTitle() const; + + virtual void Raise(); + virtual void Lower(); + + virtual bool Show( bool show = TRUE ); + virtual bool Enable( bool enable = TRUE ); + + virtual void SetFocus(); + + virtual bool Reparent( wxWindowBase *newParent ); + + virtual void WarpPointer(int x, int y); + virtual void CaptureMouse(); + virtual void ReleaseMouse(); + + virtual void Refresh( bool eraseBackground = TRUE, + const wxRect *rect = (const wxRect *) NULL ); + virtual void Clear(); + + virtual bool SetCursor( const wxCursor &cursor ); + virtual bool SetFont( const wxFont &font ); + + virtual int GetCharHeight() const; + virtual int GetCharWidth() const; + virtual void GetTextExtent(const wxString& string, + int *x, int *y, + int *descent = (int *) NULL, + int *externalLeading = (int *) NULL, + const wxFont *theFont = (const wxFont *) NULL) + const; + + virtual bool DoPopupMenu( wxMenu *menu, int x, int y ); + + virtual void SetScrollbar( int orient, int pos, int thumbVisible, + int range, bool refresh = TRUE ); + virtual void SetScrollPos( int orient, int pos, bool refresh = TRUE ); + virtual int GetScrollPos( int orient ) const; + virtual int GetScrollThumb( int orient ) const; + virtual int GetScrollRange( int orient ) const; + virtual void ScrollWindow( int dx, int dy, + const wxRect* rect = (wxRect *) NULL ); + +#if wxUSE_DRAG_AND_DROP + virtual void SetDropTarget( wxDropTarget *dropTarget ); +#endif // wxUSE_DRAG_AND_DROP + + // Accept files for dragging + virtual void DragAcceptFiles(bool accept); - // Validate controls. If returns FALSE, - // validation failed: don't quit - virtual bool Validate(void); - - // Return code for dialogs - inline void SetReturnCode(int retCode); - inline int GetReturnCode(void); - - // Set the cursor - virtual void SetCursor(const wxCursor& cursor); - inline virtual wxCursor *GetCursor(void) const { return (wxCursor *)& m_windowCursor; }; - - // Get the window with the focus - static wxWindow *FindFocus(void); - - // Get character size - virtual int GetCharHeight(void) const; - virtual int GetCharWidth(void) const; - - // Get overall window size - virtual void GetSize(int *width, int *height) const; - - // Get window position, relative to parent (or screen if no parent) - virtual void GetPosition(int *x, int *y) const; - - // Get client (application-useable) size - virtual void GetClientSize(int *width, int *height) const; - - // Set overall size and position - virtual void SetSize(const int x, const int y, const int width, const int height, const int sizeFlags = wxSIZE_AUTO); - inline virtual void SetSize(const int width, const int height) { SetSize(-1, -1, width, height, wxSIZE_USE_EXISTING); } - inline virtual void Move(const int x, const int y) { SetSize(x, y, -1, -1, wxSIZE_USE_EXISTING); } - - // Set client size - virtual void SetClientSize(const int width, const int size); - - // Convert client to screen coordinates - virtual void ClientToScreen(int *x, int *y) const; - - // Convert screen to client coordinates - virtual void ScreenToClient(int *x, int *y) const; - - // Set the focus to this window - virtual void SetFocus(void); - - // Capture/release mouse - virtual void CaptureMouse(void); - virtual void ReleaseMouse(void); - - // Enable or disable the window - virtual void Enable(const bool enable); +#if WXWIN_COMPATIBILITY + // Set/get scroll attributes + virtual void SetScrollRange(int orient, int range, bool refresh = TRUE); + virtual void SetScrollPage(int orient, int page, bool refresh = TRUE); + virtual int OldGetScrollRange(int orient) const; + virtual int GetScrollPage(int orient) const; + + // event handlers + // Handle a control command + virtual void OnCommand(wxWindow& win, wxCommandEvent& event); + + // Override to define new behaviour for default action (e.g. double + // clicking on a listbox) + virtual void OnDefaultAction(wxControl * WXUNUSED(initiatingItem)) { } +#endif // WXWIN_COMPATIBILITY + +#if wxUSE_CARET && WXWIN_COMPATIBILITY + // caret manipulation (old MSW only functions, see wxCaret class for the + // new API) + void CreateCaret(int w, int h); + void CreateCaret(const wxBitmap *bitmap); + void DestroyCaret(); + void ShowCaret(bool show); + void SetCaretPos(int x, int y); + void GetCaretPos(int *x, int *y) const; +#endif // wxUSE_CARET + + // Native resource loading (implemented in src/msw/nativdlg.cpp) + // FIXME: should they really be all virtual? + virtual bool LoadNativeDialog(wxWindow* parent, wxWindowID& id); + virtual bool LoadNativeDialog(wxWindow* parent, const wxString& name); + wxWindow* GetWindowChild1(wxWindowID id); + wxWindow* GetWindowChild(wxWindowID id); + + // a MSW only function which sends a size event to the window using its + // current size - this has an effect of refreshing the window layout +/* +FUNCTION IS NOW A MEMBER OF wxFrame - gt + void SendSizeEvent(); +*/ -#if USE_DRAG_AND_DROP - // Associate a drop target with this window (if the window already had a drop - // target, it's deleted!) and return the current drop target (may be NULL). - void SetDropTarget(wxDropTarget *pDropTarget); - wxDropTarget *GetDropTarget() const { return m_pDropTarget; } -#endif + // implementation from now on + // -------------------------- - // Accept files for dragging - virtual void DragAcceptFiles(const bool accept); + // simple accessors + // ---------------- - // Set/get the window title - virtual inline void SetTitle(const wxString& WXUNUSED(title)) {}; - inline virtual wxString GetTitle(void) const { return wxString(""); }; - // Most windows have the concept of a label; for frames, this is the - // title; for items, this is the label or button text. - inline virtual wxString GetLabel(void) const { return GetTitle(); } + WXHWND GetHWND() const { return m_hWnd; } + void SetHWND(WXHWND hWnd) { m_hWnd = hWnd; } + virtual WXWidget GetHandle() const { return GetHWND(); } - // Set/get the window name (used for resource setting in X) - inline virtual wxString GetName(void) const; - inline virtual void SetName(const wxString& name); + bool GetUseCtl3D() const { return m_useCtl3D; } + bool GetTransparentBackground() const { return m_backgroundTransparent; } + void SetTransparent(bool t = TRUE) { m_backgroundTransparent = t; } - // Centre the window - virtual void Centre(const int direction) ; - inline void Center(const int direction = wxHORIZONTAL) { Centre(direction); } + // event handlers + // -------------- - // Popup a menu - virtual bool PopupMenu(wxMenu *menu, const int x, const int y); + void OnSetFocus(wxFocusEvent& event); + void OnEraseBackground(wxEraseEvent& event); + void OnIdle(wxIdleEvent& event); + void OnPaint(wxPaintEvent& event); - // Send the window a refresh event - virtual void Refresh(const bool eraseBack = TRUE, const wxRectangle *rect = NULL); +public: + // For implementation purposes - sometimes decorations make the client area + // smaller + virtual wxPoint GetClientAreaOrigin() const; + + // Makes an adjustment to the window position (for example, a frame that has + // a toolbar that it manages itself). + virtual void AdjustForParentClientOrigin(int& x, int& y, int sizeFlags); + + // Windows subclassing + void SubclassWin(WXHWND hWnd); + void UnsubclassWin(); + + WXFARPROC MSWGetOldWndProc() const { return m_oldWndProc; } + void MSWSetOldWndProc(WXFARPROC proc) { m_oldWndProc = proc; } + + wxWindow *FindItem(long id) const; + wxWindow *FindItemByHWND(WXHWND hWnd, bool controlOnly = FALSE) const; + + // Make a Windows extended style from the given wxWindows window style + static WXDWORD MakeExtendedStyle(long style, + bool eliminateBorders = FALSE); + // Determine whether 3D effects are wanted + WXDWORD Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D) const; + + // MSW only: TRUE if this control is part of the main control + virtual bool ContainsHWND(WXHWND WXUNUSED(hWnd)) const { return FALSE; }; + + // returns TRUE if the window has been created + bool MSWCreate(int id, + wxWindow *parent, + const wxChar *wclass, + wxWindow *wx_win, + const wxChar *title, + int x, int y, int width, int height, + WXDWORD style, + const wxChar *dialog_template = NULL, + WXDWORD exendedStyle = 0); + virtual bool MSWCommand(WXUINT param, WXWORD id); #if WXWIN_COMPATIBILITY - // Set/get scroll attributes - virtual void SetScrollRange(const int orient, const int range, const bool refresh = TRUE); - virtual void SetScrollPage(const int orient, const int page, const bool refresh = TRUE); - virtual int OldGetScrollRange(const int orient) const; - virtual int GetScrollPage(const int orient) const; -#endif + wxObject *GetChild(int number) const; + virtual void MSWDeviceToLogical(float *x, float *y) const; +#endif // WXWIN_COMPATIBILITY + + // Create an appropriate wxWindow from a HWND + virtual wxWindow* CreateWindowFromHWND(wxWindow* parent, WXHWND hWnd); + + // Make sure the window style reflects the HWND style (roughly) + virtual void AdoptAttributesFromHWND(); + + // Setup background and foreground colours correctly + virtual void SetupColours(); + + // ------------------------------------------------------------------------ + // helpers for message handlers: these perform the same function as the + // message crackers from - they unpack WPARAM and LPARAM into + // the correct parameters + // ------------------------------------------------------------------------ + + void UnpackCommand(WXWPARAM wParam, WXLPARAM lParam, + WXWORD *id, WXHWND *hwnd, WXWORD *cmd); + void UnpackActivate(WXWPARAM wParam, WXLPARAM lParam, + WXWORD *state, WXWORD *minimized, WXHWND *hwnd); + void UnpackScroll(WXWPARAM wParam, WXLPARAM lParam, + WXWORD *code, WXWORD *pos, WXHWND *hwnd); + void UnpackCtlColor(WXWPARAM wParam, WXLPARAM lParam, + WXWORD *nCtlColor, WXHDC *hdc, WXHWND *hwnd); + void UnpackMenuSelect(WXWPARAM wParam, WXLPARAM lParam, + WXWORD *item, WXWORD *flags, WXHMENU *hmenu); + + // ------------------------------------------------------------------------ + // internal handlers for MSW messages: all handlers return a boolean value: + // TRUE means that the handler processed the event and FALSE that it didn't + // ------------------------------------------------------------------------ + + // there are several cases where we have virtual functions for Windows + // message processing: this is because these messages often require to be + // processed in a different manner in the derived classes. For all other + // messages, however, we do *not* have corresponding MSWOnXXX() function + // and if the derived class wants to process them, it should override + // MSWWindowProc() directly. + + // scroll event (both horizontal and vertical) + virtual bool MSWOnScroll(int orientation, WXWORD nSBCode, + WXWORD pos, WXHWND control); + + // child control notifications +#ifdef __WIN95__ + virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); +#endif // __WIN95__ + + // owner-drawn controls need to process these messages + virtual bool MSWOnDrawItem(int id, WXDRAWITEMSTRUCT *item); + virtual bool MSWOnMeasureItem(int id, WXMEASUREITEMSTRUCT *item); + + // the rest are not virtual + bool HandleCreate(WXLPCREATESTRUCT cs, bool *mayCreate); + bool HandleInitDialog(WXHWND hWndFocus); + bool HandleDestroy(); + + bool HandlePaint(); + bool HandleEraseBkgnd(WXHDC pDC); + + bool HandleMinimize(); + bool HandleMaximize(); + bool HandleSize(int x, int y, WXUINT flag); + bool HandleGetMinMaxInfo(void *mmInfo); + + bool HandleShow(bool show, int status); + bool HandleActivate(int flag, bool minimized, WXHWND activate); + + bool HandleCommand(WXWORD id, WXWORD cmd, WXHWND control); + bool HandleSysCommand(WXWPARAM wParam, WXLPARAM lParam); + + bool HandleCtlColor(WXHBRUSH *hBrush, + WXHDC hdc, + WXHWND hWnd, + WXUINT nCtlColor, + WXUINT message, + WXWPARAM wParam, + WXLPARAM lParam); + + bool HandlePaletteChanged(WXHWND hWndPalChange); + bool HandleQueryNewPalette(); + bool HandleSysColorChange(); + + bool HandleQueryEndSession(long logOff, bool *mayEnd); + bool HandleEndSession(bool endSession, long logOff); + + bool HandleSetFocus(WXHWND wnd); + bool HandleKillFocus(WXHWND wnd); + + bool HandleDropFiles(WXWPARAM wParam); + + bool HandleMouseEvent(WXUINT msg, int x, int y, WXUINT flags); + bool HandleMouseMove(int x, int y, WXUINT flags); + bool HandleMouseWheel(WXWPARAM wParam, WXLPARAM lParam); + + bool HandleChar(WXWPARAM wParam, WXLPARAM lParam, bool isASCII = FALSE); + bool HandleKeyDown(WXWPARAM wParam, WXLPARAM lParam); + bool HandleKeyUp(WXWPARAM wParam, WXLPARAM lParam); + + bool HandleQueryDragIcon(WXHICON *hIcon); + + bool HandleSetCursor(WXHWND hWnd, short nHitTest, int mouseMsg); + + // Window procedure + virtual long MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); + + // Calls an appropriate default window procedure + virtual long MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); + virtual bool MSWProcessMessage(WXMSG* pMsg); + virtual bool MSWTranslateMessage(WXMSG* pMsg); + virtual void MSWDestroyWindow(); + + // Detach "Window" menu from menu bar so it doesn't get deleted + void MSWDetachWindowMenu(); + + // this function should return the brush to paint the window background + // with or 0 for the default brush + virtual WXHBRUSH OnCtlColor(WXHDC hDC, + WXHWND hWnd, + WXUINT nCtlColor, + WXUINT message, + WXWPARAM wParam, + WXLPARAM lParam); - // New functions that will replace the above. - virtual void SetScrollbar(const int orient, const int pos, const int thumbVisible, - const int range, const bool refresh = TRUE); - - virtual void SetScrollPos(const int orient, const int pos, const bool refresh = TRUE); - virtual int GetScrollPos(const int orient) const; - virtual int GetScrollRange(const int orient) const; - virtual int GetScrollThumb(const int orient) const; - - virtual void ScrollWindow(const int dx, const int dy, const wxRectangle *rect = NULL); - - // Caret manipulation - virtual void CreateCaret(const int w, const int h); - virtual void CreateCaret(const wxBitmap *bitmap); - virtual void DestroyCaret(void); - virtual void ShowCaret(const bool show); - virtual void SetCaretPos(const int x, const int y); - virtual void GetCaretPos(int *x, int *y) const; - - // Tell window how much it can be sized - virtual void SetSizeHints(const int minW = -1, const int minH = -1, const int maxW = -1, const int maxH = -1, const int incW = -1, const int incH = -1); - - // Set/get the window's identifier - inline int GetId() const; - inline void SetId(const int id); - - // Make the window modal (all other windows unresponsive) - virtual void MakeModal(const bool modal); - - // Get the private handle (platform-dependent) - inline void *GetHandle(void) const; - - // Set/get the window's relatives - inline wxWindow *GetParent(void) const; - inline void SetParent(wxWindow *p) ; - inline wxWindow *GetGrandParent(void) const; - inline wxList *GetChildren() const; - - // Set/get the window's font - virtual void SetFont(const wxFont& f); - inline virtual wxFont *GetFont(void) const; - - // Set/get the window's validator - void SetValidator(const wxValidator& validator); - inline wxValidator *GetValidator(void) const; - - // Set/get the window's style - inline void SetWindowStyleFlag(const long flag); - inline long GetWindowStyleFlag(void) const; - - // Set/get double-clickability - // TODO: we probably wish to get rid of this, and - // always allow double clicks. - inline void SetDoubleClick(const bool flag); - inline bool GetDoubleClick(void) const; - inline void AllowDoubleClick(const bool value) { SetDoubleClick(value); } - - // Old way to handle a control command - virtual void OnCommand(wxWindow& win, wxCommandEvent& event); - - // Set/get event handler - inline void SetEventHandler(wxEvtHandler *handler); - inline wxEvtHandler *GetEventHandler(void) const; - - // Push/pop event handler (i.e. allow a chain of event handlers - // be searched) - void PushEventHandler(wxEvtHandler *handler) ; - wxEvtHandler *PopEventHandler(bool deleteHandler = FALSE) ; - - // Close the window by calling OnClose, posting a deletion - virtual bool Close(const bool force = FALSE); - - // Destroy the window (delayed, if a managed window) - virtual bool Destroy(void) ; - - // Mode for telling default OnSize members to - // call Layout(), if not using Sizers, just top-down constraints - inline void SetAutoLayout(const bool a); - inline bool GetAutoLayout(void) const; - - // Set/get constraints - inline wxLayoutConstraints *GetConstraints(void) const; - void SetConstraints(wxLayoutConstraints *c); - - // Set/get window background colour - inline virtual void SetBackgroundColour(const wxColour& col); - inline virtual wxColour GetBackgroundColour(void) const; - - // Set/get window foreground colour - inline virtual void SetForegroundColour(const wxColour& col); - inline virtual wxColour GetForegroundColour(void) const; - - // TODO: are these really necessary??? - // Set/get window default background colour (for children to inherit) - inline virtual void SetDefaultBackgroundColour(const wxColour& col); - inline virtual wxColour GetDefaultBackgroundColour(void) const; - - // Set/get window default foreground colour (for children to inherit) - inline virtual void SetDefaultForegroundColour(const wxColour& col); - inline virtual wxColour GetDefaultForegroundColour(void) const; - - // For backward compatibility - inline virtual void SetButtonFont(const wxFont& font) { SetFont(font); } - inline virtual void SetLabelFont(const wxFont& font) { SetFont(font); } - inline virtual wxFont *GetLabelFont(void) const { return GetFont(); }; - inline virtual wxFont *GetButtonFont(void) const { return GetFont(); }; - - // Get the default button, if there is one - inline virtual wxButton *GetDefaultItem(void) const; - inline virtual void SetDefaultItem(wxButton *but); - - // Override to define new behaviour for default action (e.g. double clicking - // on a listbox) - virtual void OnDefaultAction(wxControl *initiatingItem); - - // Resource loading -#if USE_WX_RESOURCES - virtual bool LoadFromResource(wxWindow *parent, const wxString& resourceName, const wxResourceTable *table = NULL); - virtual wxControl *CreateItem(const wxItemResource *childResource, const wxResourceTable *table = NULL); -#endif - - // Native resource loading - virtual bool LoadNativeDialog(wxWindow* parent, const wxWindowID& id); - virtual bool LoadNativeDialog(wxWindow* parent, const wxString& name); - virtual wxWindow* GetWindowChild1(const wxWindowID& id); - virtual wxWindow* GetWindowChild(const wxWindowID& id); - - virtual void GetTextExtent(const wxString& string, int *x, int *y, - int *descent = NULL, - int *externalLeading = NULL, - const wxFont *theFont = NULL, const bool use16 = FALSE) const; #if WXWIN_COMPATIBILITY - void GetTextExtent(const wxString& string, float *x, float *y, - float *descent = NULL, - float *externalLeading = NULL, - const wxFont *theFont = NULL, const bool use16 = FALSE) const; -#endif - - // Gets 'context' member - // OBSOLETE - // TODO: how to make backward compatible? -// inline wxDC *GetDC(void) const; - - // Is the window retained? - inline bool IsRetained(void) const; - - // Set the window's colourmap/palette - // OBSOLETE -// virtual void SetPalette(wxPalette *palette); - - // Warp the pointer the given position - virtual void WarpPointer(const int x_pos, const int y_pos) ; - - // Clear the window - virtual void Clear(void); - - // Find a window by id or name - virtual wxWindow *FindWindow(const long id); - virtual wxWindow *FindWindow(const wxString& name); - - // Constraint operations - bool Layout(void); - void SetSizer(wxSizer *sizer); // Adds sizer child to this window - inline wxSizer *GetSizer(void) const ; - inline wxWindow *GetSizerParent(void) const ; - inline void SetSizerParent(wxWindow *win); + void SetShowing(bool show) { (void)Show(show); } + bool IsUserEnabled() const { return IsEnabled(); } +#endif // WXWIN_COMPATIBILITY - // Do Update UI processing for controls - void UpdateWindowUI(void); + // Responds to colour changes: passes event on to children. + void OnSysColourChanged(wxSysColourChangedEvent& event); - void OnSize(wxSizeEvent& event); - void OnEraseBackground(wxEraseEvent& event); - void OnChar(wxKeyEvent& event); - void OnPaint(wxPaintEvent& event); - void OnIdle(wxIdleEvent& event); + // initialize various fields of wxMouseEvent (common part of MSWOnMouseXXX) + void InitMouseEvent(wxMouseEvent& event, int x, int y, WXUINT flags); -// virtual void OnChangeFocus(wxControl *from, wxControl *to); -// virtual bool OnFunctionKey(wxKeyEvent &event); - -#if WXWIN_COMPATIBILITY - virtual void OldOnMenuSelect(int WXUNUSED(cmd)); - virtual void OldOnInitMenuPopup(int WXUNUSED(pos)); - virtual void OldOnScroll(wxCommandEvent& WXUNUSED(event)); - virtual void OldOnPaint(void); // Called when needs painting - virtual void OldOnSize(int width, int height); // Called on resize - virtual void OldOnMouseEvent(wxMouseEvent& event); // Called on mouse event - virtual void OldOnChar(wxKeyEvent& event); // Called on character event - virtual void OldOnMenuCommand(int cmd); // Dealt with properly in wxFrame - inline virtual void OldOnMove(int WXUNUSED(x), int WXUNUSED(y)); // Called on move - inline virtual void OldOnActivate(bool WXUNUSED(active)); // Called on window activation (MSW) - virtual void OldOnSetFocus(void); // Called on setting focus - virtual void OldOnKillFocus(void); // Called on killing focus -#endif - -/* THIS IS NOW OBSOLETE - all positions are in device units - // Calculates the position of a point on the window - // taking into account the position of scrollbars. - // Windows doesn't automatically reflect the position of the - // scrollbars - (0, 0) is always the top left of the visible window, - // whereas in XView, (0, 0) moves according to scrollbar positions. - virtual void CalcScrolledPosition(const int x, const int y, int *xx, int *yy) const ; - - // Calculate logical (scroll-bar/scaling aware) position from - // device (pixel) position - virtual void CalcUnscrolledPosition(const int x, const int y, float *xx, float *yy) const ; -*/ - -public: - //////////////////////////////////////////////////////////////////////// - //// IMPLEMENTATION - - // Windows subclassing - void SubclassWin(WXHWND hWnd); - void UnsubclassWin(void); - virtual long Default(void); - virtual bool MSWCommand(const WXUINT param, const WXWORD id); - virtual bool MSWNotify(const WXWPARAM wParam, const WXLPARAM lParam); - virtual wxWindow *FindItem(const int id) const; - virtual wxWindow *FindItemByHWND(const WXHWND hWnd, bool controlOnly = FALSE) const ; - virtual void PreDelete(const WXHDC dc); // Allows system cleanup - // TO DO: how many of these need to be virtual? - virtual WXHWND GetHWND(void) const ; - virtual void SetHWND(WXHWND hWnd); - - // Make a Windows extended style from the given wxWindows window style - virtual WXDWORD MakeExtendedStyle(long style, bool eliminateBorders = TRUE); - // Determine whether 3D effects are wanted - virtual WXDWORD Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D); - - virtual void AddChild(wxWindow *child); // Adds reference to the child object - virtual void RemoveChild(wxWindow *child); // Removes reference to child - // (but doesn't delete the child object) - virtual void DestroyChildren(void); // Removes and destroys all children - - inline bool IsBeingDeleted(void); - - // MSW only: TRUE if this control is part of the main control - virtual bool ContainsHWND(WXHWND WXUNUSED(hWnd)) const { return FALSE; }; - - // Constraint implementation - void UnsetConstraints(wxLayoutConstraints *c); - inline wxList *GetConstraintsInvolvedIn(void) const ; - // Back-pointer to other windows we're involved with, so if we delete - // this window, we must delete any constraints we're involved with. - void AddConstraintReference(wxWindow *otherWin); - void RemoveConstraintReference(wxWindow *otherWin); - void DeleteRelatedConstraints(void); - - virtual void ResetConstraints(void); - virtual void SetConstraintSizes(const bool recurse = TRUE); - virtual bool LayoutPhase1(int *noChanges); - virtual bool LayoutPhase2(int *noChanges); - virtual bool DoPhase(const int); - // Transforms from sizer coordinate space to actual - // parent coordinate space - virtual void TransformSizerToActual(int *x, int *y) const ; - - // Set size with transformation to actual coordinates if nec. - virtual void SizerSetSize(const int x, const int y, const int w, const int h); - virtual void SizerMove(const int x, const int y); - - // Only set/get the size/position of the constraint (if any) - virtual void SetSizeConstraint(const int x, const int y, const int w, const int h); - virtual void MoveConstraint(const int x, const int y); - virtual void GetSizeConstraint(int *w, int *h) const ; - virtual void GetClientSizeConstraint(int *w, int *h) const ; - virtual void GetPositionConstraint(int *x, int *y) const ; - - wxObject *GetChild(const int number) const ; - - void MSWCreate(const int id, wxWindow *parent, const char *wclass, wxWindow *wx_win, const char *title, - const int x, const int y, const int width, const int height, - const WXDWORD style, const char *dialog_template = NULL, - const WXDWORD exendedStyle = 0); - - // Actually defined in wx_canvs.cc since requires wxCanvas declaration - virtual void MSWDeviceToLogical(float *x, float *y) const ; - - // Create an appropriate wxWindow from a HWND - virtual wxWindow* CreateWindowFromHWND(wxWindow* parent, WXHWND hWnd); - - // Make sure the window style reflects the HWND style (roughly) - virtual void AdoptAttributesFromHWND(void); - - // Setup background and foreground colours correctly - virtual void SetupColours(void); - - // Handlers - virtual void MSWOnCreate(WXLPCREATESTRUCT cs); - virtual bool MSWOnPaint(void); - virtual WXHICON MSWOnQueryDragIcon(void) { return 0; } - virtual void MSWOnSize(const int x, const int y, const WXUINT flag); - virtual void MSWOnWindowPosChanging(void *lpPos); - virtual void MSWOnHScroll(const WXWORD nSBCode, const WXWORD pos, const WXHWND control); - virtual void MSWOnVScroll(const WXWORD nSBCode, const WXWORD pos, const WXHWND control); - virtual bool MSWOnCommand(const WXWORD id, const WXWORD cmd, const WXHWND control); - virtual long MSWOnSysCommand(WXWPARAM wParam, WXLPARAM lParam); - virtual bool MSWOnNotify(const WXWPARAM wParam, const WXLPARAM lParam); - virtual WXHBRUSH MSWOnCtlColor(const WXHDC dc, const WXHWND pWnd, const WXUINT nCtlColor, - const WXUINT message, const WXWPARAM wParam, const WXLPARAM lParam); - virtual bool MSWOnColorChange(const WXHWND hWnd, const WXUINT message, const WXWPARAM wParam, const WXLPARAM lParam); - virtual bool MSWOnEraseBkgnd(const WXHDC pDC); - virtual void MSWOnMenuHighlight(const WXWORD item, const WXWORD flags, const WXHMENU sysmenu); - virtual void MSWOnInitMenuPopup(const WXHMENU menu, const int pos, const bool isSystem); - virtual bool MSWOnClose(void); - virtual bool MSWOnDestroy(void); - virtual bool MSWOnSetFocus(const WXHWND wnd); - virtual bool MSWOnKillFocus(const WXHWND wnd); - virtual void MSWOnDropFiles(const WXWPARAM wParam); - virtual bool MSWOnInitDialog(WXHWND hWndFocus); - virtual void MSWOnShow(bool show, int status); - - // TODO: rationalise these functions into 1 or 2 which take the - // event type as argument. - virtual void MSWOnLButtonDown(const int x, const int y, const WXUINT flags); - virtual void MSWOnLButtonUp(const int x, const int y, const WXUINT flags); - virtual void MSWOnLButtonDClick(const int x, const int y, const WXUINT flags); - - virtual void MSWOnMButtonDown(const int x, const int y, const WXUINT flags); - virtual void MSWOnMButtonUp(const int x, const int y, const WXUINT flags); - virtual void MSWOnMButtonDClick(const int x, const int y, const WXUINT flags); - - virtual void MSWOnRButtonDown(const int x, const int y, const WXUINT flags); - virtual void MSWOnRButtonUp(const int x, const int y, const WXUINT flags); - virtual void MSWOnRButtonDClick(const int x, const int y, const WXUINT flags); - - virtual void MSWOnMouseMove(const int x, const int y, const WXUINT flags); - virtual void MSWOnMouseEnter(const int x, const int y, const WXUINT flags); - virtual void MSWOnMouseLeave(const int x, const int y, const WXUINT flags); - - virtual void MSWOnChar(const WXWORD wParam, const WXLPARAM lParam, const bool isASCII = FALSE); - - virtual bool MSWOnActivate(const int flag, const bool minimized, const WXHWND activate); - virtual long MSWOnMDIActivate(const long flag, const WXHWND activate, const WXHWND deactivate); - - virtual bool MSWOnDrawItem(const int id, WXDRAWITEMSTRUCT *item); - virtual bool MSWOnMeasureItem(const int id, WXMEASUREITEMSTRUCT *item); - - virtual void MSWOnJoyDown(const int joystick, const int x, const int y, const WXUINT flags); - virtual void MSWOnJoyUp(const int joystick, const int x, const int y, const WXUINT flags); - virtual void MSWOnJoyMove(const int joystick, const int x, const int y, const WXUINT flags); - virtual void MSWOnJoyZMove(const int joystick, const int z, const WXUINT flags); - - // Window procedure - virtual long MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); - - // Calls an appropriate default window procedure - virtual long MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); - virtual bool MSWProcessMessage(WXMSG* pMsg); - virtual void MSWDestroyWindow(void); - - // Detach "Window" menu from menu bar so it doesn't get deleted - void MSWDetachWindowMenu(void); - - inline WXFARPROC MSWGetOldWndProc() const; - inline void MSWSetOldWndProc(const WXFARPROC proc); - - // Define for each class of dialog and control - virtual WXHBRUSH OnCtlColor(const WXHDC pDC, const WXHWND pWnd, const WXUINT nCtlColor, - WXUINT message, WXWPARAM wParam, WXLPARAM lParam); - - inline void SetShowing(const bool show); - inline bool IsUserEnabled(void) const; - inline bool GetUseCtl3D(void) const ; - inline bool GetTransparentBackground(void) const ; - - // Responds to colour changes: passes event on to children. - void OnSysColourChanged(wxSysColourChangedEvent& event); - - // Transfers data to any child controls - void OnInitDialog(wxInitDialogEvent& event); - - // Sends an OnInitDialog event, which in turns transfers data to - // to the window via validators. - virtual void InitDialog(void); - - //////////////////////////////////////////////////////////////////////// - //// PROTECTED DATA protected: - int m_windowId; - long m_windowStyle; // Store the window's style - wxEvtHandler * m_windowEventHandler; // Usually is 'this' - wxLayoutConstraints * m_constraints; // Constraints for this window - wxList * m_constraintsInvolvedIn; // List of constraints we're involved in - wxSizer * m_windowSizer; // Window's top-level sizer (if any) - wxWindow * m_sizerParent; // Window's parent sizer (if any) - bool m_autoLayout; // Whether to call Layout() in OnSize - wxWindow * m_windowParent; // Each window always knows its parent - wxValidator * m_windowValidator; - // Old window proc, for subclassed controls - WXFARPROC m_oldWndProc; - bool m_useCtl3D; // Using CTL3D for this control - - bool m_inOnSize; // Protection against OnSize reentry -#ifndef __WIN32__ - // Pointer to global memory, for EDIT controls that need - // special treatment to reduce USER area consumption. - WXHGLOBAL m_globalHandle; -#endif - - bool m_winEnabled; - int m_minSizeX; - int m_minSizeY; - int m_maxSizeX; - int m_maxSizeY; - - // Caret data - int m_caretWidth; - int m_caretHeight; - bool m_caretEnabled; - bool m_caretShown; - - // Device context being stored whilst drawing is done -// WXHDC m_tempHDC; - // Temporary device context stored during an OnPaint -// WXHDC m_paintHDC; - wxFont m_windowFont; // Window's font - bool m_isShown; - bool m_doubleClickAllowed ; - wxCursor m_windowCursor; // Window's cursor - bool m_winCaptured; - wxString m_windowName; // Window name - -#if USE_EXTENDED_STATICS - wxList m_staticItems; -#endif - - wxButton * m_defaultItem; - - wxColour m_backgroundColour ; - wxColour m_defaultBackgroundColour; - - wxColour m_foregroundColour ; - wxColour m_defaultForegroundColour; - - bool m_backgroundTransparent; - -// wxDC * m_windowDC; // The canvas's device context - - int m_xThumbSize; - int m_yThumbSize; - - float m_lastXPos; - float m_lastYPos; - int m_lastEvent; - - bool m_mouseInWindow; - -#if USE_DRAG_AND_DROP - wxDropTarget *m_pDropTarget; // the current drop target or NULL -#endif //USE_DRAG_AND_DROP - -public: - WXHWND m_hWnd; // MS Windows window handle - WXUINT m_lastMsg; - WXWPARAM m_lastWParam; - WXLPARAM m_lastLParam; - wxRectangle m_updateRect; // Bounding box for screen damage area -#ifdef __WIN32__ - WXHRGN m_updateRgn; // NT allows access to the rectangle list -#endif - WXHANDLE m_acceleratorTable; - WXHMENU m_hMenu; // Menu, if any - wxList * m_children; // Window's children - int m_returnCode; - bool m_isBeingDeleted; // Fudge because can't access parent - // when being deleted - -DECLARE_EVENT_TABLE() -}; - -//////////////////////////////////////////////////////////////////////// -//// INLINES - -inline void *wxWindow::GetHandle(void) const { return (void *)GetHWND(); } -inline int wxWindow::GetId() const { return m_windowId; } -inline void wxWindow::SetId(const int id) { m_windowId = id; } -inline wxWindow *wxWindow::GetParent(void) const { return m_windowParent; } -inline void wxWindow::SetParent(wxWindow *p) { m_windowParent = p; } -inline wxWindow *wxWindow::GetGrandParent(void) const { return (m_windowParent ? m_windowParent->m_windowParent : NULL); } -inline wxList *wxWindow::GetChildren() const { return m_children; } -inline wxFont *wxWindow::GetFont(void) const { return (wxFont *) & m_windowFont; } -inline wxString wxWindow::GetName(void) const { return m_windowName; } -inline void wxWindow::SetName(const wxString& name) { m_windowName = name; } -inline long wxWindow::GetWindowStyleFlag(void) const { return m_windowStyle; } -inline void wxWindow::SetWindowStyleFlag(const long flag) { m_windowStyle = flag; } -inline void wxWindow::SetDoubleClick(const bool flag) { m_doubleClickAllowed = flag; } -inline bool wxWindow::GetDoubleClick(void) const { return m_doubleClickAllowed; } -inline void wxWindow::SetEventHandler(wxEvtHandler *handler) { m_windowEventHandler = handler; } -inline wxEvtHandler *wxWindow::GetEventHandler(void) const { return m_windowEventHandler; } -inline void wxWindow::SetAutoLayout(const bool a) { m_autoLayout = a; } -inline bool wxWindow::GetAutoLayout(void) const { return m_autoLayout; } -inline wxLayoutConstraints *wxWindow::GetConstraints(void) const { return m_constraints; } -inline void wxWindow::SetBackgroundColour(const wxColour& col) { m_backgroundColour = col; }; -inline wxColour wxWindow::GetBackgroundColour(void) const { return m_backgroundColour; }; -inline void wxWindow::SetForegroundColour(const wxColour& col) { m_foregroundColour = col; }; -inline wxColour wxWindow::GetForegroundColour(void) const { return m_foregroundColour; }; -inline void wxWindow::SetDefaultForegroundColour(const wxColour& col) { m_defaultForegroundColour = col; }; -inline wxColour wxWindow::GetDefaultForegroundColour(void) const { return m_defaultForegroundColour; }; -inline void wxWindow::SetDefaultBackgroundColour(const wxColour& col) { m_defaultBackgroundColour = col; }; -inline wxColour wxWindow::GetDefaultBackgroundColour(void) const { return m_defaultBackgroundColour; }; - -inline wxButton *wxWindow::GetDefaultItem(void) const { return m_defaultItem; } -inline void wxWindow::SetDefaultItem(wxButton *but) { m_defaultItem = but; } -// inline wxDC *wxWindow::GetDC(void) const { return m_windowDC; } -inline bool wxWindow::IsRetained(void) const { return ((m_windowStyle & wxRETAINED) == wxRETAINED); } -#if WXWIN_COMPATIBILITY -inline void wxWindow::OldOnMenuSelect(int WXUNUSED(cmd)) { Default(); }; -inline void wxWindow::OldOnInitMenuPopup(int WXUNUSED(pos)) { Default(); }; -inline void wxWindow::OldOnScroll(wxCommandEvent& WXUNUSED(event)) { Default(); }; -inline void wxWindow::OldOnMenuCommand(int WXUNUSED(cmd)) { Default(); } // Dealt with properly in wxFrame -inline void wxWindow::OldOnMove(int WXUNUSED(x), int WXUNUSED(y)) { Default(); }; // Called on move -inline void wxWindow::OldOnActivate(bool WXUNUSED(active)) { Default(); }; // Called on window activation (MSW) -#endif -inline void wxWindow::SetShowing(const bool show) { m_isShown = show; } -inline wxList *wxWindow::GetConstraintsInvolvedIn(void) const { return m_constraintsInvolvedIn; } -inline wxSizer *wxWindow::GetSizer(void) const { return m_windowSizer; } -inline wxWindow *wxWindow::GetSizerParent(void) const { return m_sizerParent; } -inline void wxWindow::SetSizerParent(wxWindow *win) { m_sizerParent = win; } -inline WXFARPROC wxWindow::MSWGetOldWndProc() const { return m_oldWndProc; } -inline void wxWindow::MSWSetOldWndProc(const WXFARPROC proc) { m_oldWndProc = proc; } -inline wxValidator *wxWindow::GetValidator(void) const { return m_windowValidator; } -inline bool wxWindow::IsUserEnabled(void) const { return m_winEnabled; } -inline bool wxWindow::GetUseCtl3D(void) const { return m_useCtl3D; } -inline bool wxWindow::GetTransparentBackground(void) const { return m_backgroundTransparent; } -inline void wxWindow::SetReturnCode(int retCode) { m_returnCode = retCode; } -inline int wxWindow::GetReturnCode(void) { return m_returnCode; } -inline bool wxWindow::IsBeingDeleted(void) { return m_isBeingDeleted; } - -// Window specific (so far) -wxWindow* WXDLLEXPORT wxGetActiveWindow(void); - -// Allows iteration through damaged rectangles in OnPaint -class WXDLLEXPORT wxUpdateIterator -{ - int rects; // How many rects in Update region - int current; // Current rectangle index - void *rp; // current rectangle -#ifdef __WIN32__ - WXRGNDATA *rlist; // Storage for regiondata -#endif - - public: - wxUpdateIterator(wxWindow* wnd); - ~wxUpdateIterator(void); - - operator int (void); - wxUpdateIterator* operator ++(int); - void GetRect(wxRectangle *rect); - int GetX(); - int GetY(); - int GetW(); - int GetH(); + // the window handle + WXHWND m_hWnd; + + // the old window proc (we subclass all windows) + WXFARPROC m_oldWndProc; + + // additional (MSW specific) flags + bool m_useCtl3D:1; // Using CTL3D for this control + bool m_backgroundTransparent:1; + bool m_mouseInWindow:1; + bool m_doubleClickAllowed:1; + bool m_winCaptured:1; + + // the size of one page for scrolling + int m_xThumbSize; + int m_yThumbSize; + +#if wxUSE_MOUSEEVENT_HACK + // the coordinates of the last mouse event and the type of it + long m_lastMouseX, + m_lastMouseY; + int m_lastMouseEvent; +#endif // wxUSE_MOUSEEVENT_HACK + + WXHMENU m_hMenu; // Menu, if any + + // the return value of WM_GETDLGCODE handler + long m_lDlgCode; + + // implement the base class pure virtuals + virtual void DoClientToScreen( int *x, int *y ) const; + virtual void DoScreenToClient( int *x, int *y ) const; + virtual void DoGetPosition( int *x, int *y ) const; + virtual void DoGetSize( int *width, int *height ) const; + virtual void DoGetClientSize( int *width, int *height ) const; + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + virtual void DoSetClientSize(int width, int height); + + // move the window to the specified location and resize it: this is called + // from both DoSetSize() and DoSetClientSize() and would usually just call + // ::MoveWindow() except for composite controls which will want to arrange + // themselves inside the given rectangle + virtual void DoMoveWindow(int x, int y, int width, int height); + +#if wxUSE_TOOLTIPS + virtual void DoSetToolTip( wxToolTip *tip ); +#endif // wxUSE_TOOLTIPS + +private: + // common part of all ctors + void Init(); + + // the (non-virtual) handlers for the events + bool HandleMove(int x, int y); + bool HandleJoystickEvent(WXUINT msg, int x, int y, WXUINT flags); + +#ifdef __WIN95__ + bool HandleNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); +#endif // __WIN95__ + + // the helper functions used by HandleChar/KeyXXX methods + wxKeyEvent CreateKeyEvent(wxEventType evType, int id, WXLPARAM lp) const; + + DECLARE_DYNAMIC_CLASS(wxWindow); + DECLARE_NO_COPY_CLASS(wxWindow); + DECLARE_EVENT_TABLE() }; -WXDLLEXPORT_DATA(extern wxList) wxTopLevelWindows; - -int WXDLLEXPORT wxCharCodeMSWToWX(int keySym); -int WXDLLEXPORT wxCharCodeWXToMSW(int id, bool *IsVirtual); +// --------------------------------------------------------------------------- +// global functions +// --------------------------------------------------------------------------- -// Allocates control ids -int WXDLLEXPORT NewControlId(void); +// kbd code translation +WXDLLEXPORT int wxCharCodeMSWToWX(int keySym); +WXDLLEXPORT int wxCharCodeWXToMSW(int id, bool *IsVirtual); #endif - // __WINDOWH__ + // _WX_WINDOW_H_