/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corp., 1991 **/ /**********************************************************************/ /* bltwin.hxx Base of the BLT WINDOW hierarchy FILE HISTORY RustanL 20-Nov-1990 Created RustanL 04-Mar-1991 Added OWNER_WINDOW::QueryError mechanism Johnl 12-Mar-1991 Removed _hwndOwner member beng 14-May-1991 Hack for separate compilation terryk 10-Jul-1991 Add IsEnable to the window class terryk 20-Jul-1991 Add QueryClientRect in WINDOW class. terryk 02-Aug-1991 Add QueryWindowRect in WINDOW class. beng 30-Sep-1991 Added ASSOCHWNDTHIS helper class KeithMo 23-Oct-1991 Added forward references. terryk 04-Apr-1992 Added Z position in SetPos Yi-HsinS 10-Dec-1992 Added CalcFixedHeight */ #ifndef _BLT_HXX_ #error "Don't include this file directly; instead, include it through blt.hxx" #endif // _BLT_HXX_ #ifndef _BLTWIN_HXX_ #define _BLTWIN_HXX_ #include "base.hxx" #include "bltglob.hxx" // for CID #include "bltmisc.hxx" // for XYPOINT, XYDIMENSION #include "bltevent.hxx" // // Forward references. // DLL_CLASS WINDOW; DLL_CLASS CONTROL_TABLE; // declared and defined in bltowin.cxx DLL_CLASS CONTROL_WINDOW; // declared in bltctrl.hxx DLL_CLASS ITER_CTRL; DLL_CLASS OWNER_WINDOW; DLL_CLASS ASSOCCHWNDTHIS; DLL_CLASS PROC_INSTANCE; DLL_CLASS NLS_STR; // (declared in string.hxx) DLL_CLASS XYRECT; // (declared in bltrect.hxx) /****************************************************************** NAME: WINDOW SYNOPSIS: Base of the "window" hierarchy. This class provides access to general window-manipulation functionality common to control, client, and dialog windows. It represents a single "window" object in the system, either created by the system or explicitly by the client. INTERFACE: WINDOW() - constructor ~WINDOW() - destructor QueryHwnd() - return the window handle QueryOwnerHwnd() - return the owner window handle Command() - command Show() - show window QueryClientRect() - return the clinet window dimension and position QueryWindowRect() - return the clinet window dimension and position in screen coordinate. Enable() - enable the window IsEnabled() - return the current status of the window QueryStyle() - return the current window style SetStyle() - set the window's style bits (protected) SetText() - set the window caption QueryTextLength() - return caption length QueryTextSize() - return size of caption, in bytes QueryText() - return current caption ClearText() - clear caption SetRedraw() - redraw the window Invalidate() - invalidate some or all of the window, optionally erasing the window RepaintNow() - force an immediate repaint of the window IsChild() - check whether the window is a child window SetPos() - set window position QueryPos() - return current window position SetSize() - set the window size QuerySize() - return current window size IsClientGeneratedMessage() - Returns TRUE if the current message was generated by us, thus it should be ignored. HasFocus() - returns TRUE if the current window has the focus. Center() - centers the window above another window. PARENT: BASE USES: XYPOINT, XYDIMENSION CAVEATS: NOTES: Should destructor be virtual? HISTORY: rustanl 20-Nov-1990 Created rustanl 04-Mar-1991 Added OWNER_WINDOW::QueryError mechanism johnl 12-Mar-1991 Removed _hwndOwner member beng 25-Apr-1991 Relocated QueryOwnerHwnd implementation; removed unused constructor forms rustanl 27-Apr-1991 Changed SetText( PSZ ) to SetText( const TCHAR * ) beng 07-May-1991 Added CreateWindow version of ctor beng 10-May-1991 Added ResetCreator for errors Johnl 10-May-1991 Moved client generated message flag here beng 15-May-1991 Pruned constructors; enhanced Query/Set Pos/Size to grok XY* objects beng 23-May-1991 Changed return type of QueryText beng 10-Jun-1991 Added QueryTextSize; changed QTxtLen return type to INT terryk 10-Jul-1991 Added IsEnable function to the window class terryk 20-Jul-1991 Added QueryClientRect function to the class beng 31-Jul-1991 Added ShowFirst, static _fClientGen'd terryk 02-Aug-1991 Added QueryWindowRect function to the class beng 04-Oct-1991 Win32 conversion Yi-HsinS 08-Jan-1992 Added HasFocus method beng 13-Feb-1992 Moved RepaintNow here from CLIENT_WINDOW; add SetStyle KeithMo 11-Nov-1992 Added new ctor form and Center method. **********************************************************************/ DLL_CLASS WINDOW: public BASE { private: HWND _hwnd; BOOL _fCreator; // This flag indicates that the message was generated internally and not // by the user manipulating controls. It is used where we may want // to ignore internally generated changes (for example, in SetText, // windows sends out an EN_CHANGE message to the control, so anything // that responds and does a SetText will be caught in an infinite loop). // // See SetClientGeneratedMsgFlag and IsClientGeneratedMessage. // static BOOL _fClientGeneratedMessage; protected: VOID SetHwnd( HWND hwnd ); VOID ResetCreator(); static VOID SetClientGeneratedMsgFlag( BOOL fClientGeneratedMessage ) ; static BOOL CalcFixedHeight( HWND hwnd, UINT *pnHeight ); public: WINDOW(); WINDOW( const TCHAR * pszClassName, ULONG flStyle, const WINDOW * pwndOwner = 0, CID cid = 0 ); WINDOW( HWND hwnd ); ~WINDOW(); // These two methods are prime candidates for inlining. // HWND QueryHwnd() const; HWND QueryOwnerHwnd() const; // Note. This method may change things in the window itself, but // will not change any data member per se. The method needs to be // const, however, since many other const methods may call it for // real const kind of operations, e.g. LIST_CONTROL::QueryCount. // // (Should this become a protected method?) // (Also, can I replace it with something that passes an EVENT?) // ULONG_PTR Command( UINT nMsg, WPARAM wParam = 0, LPARAM lParam = 0L ) const; BOOL Show( BOOL f = TRUE ); VOID Enable( BOOL f = TRUE ); BOOL IsEnabled() const; ULONG QueryStyle() const; VOID SetText( const TCHAR * psz ); VOID SetText( const NLS_STR & nls ); INT QueryTextLength() const; INT QueryTextSize() const; APIERR QueryText( TCHAR * pszBuffer, UINT cbBufSize ) const; APIERR QueryText( NLS_STR * pnls ) const; VOID ClearText(); VOID SetRedraw( BOOL f = TRUE ); VOID Invalidate( BOOL fErase = FALSE ); // entire client area VOID Invalidate( const XYRECT & rect ); // selective inval VOID RepaintNow(); VOID ShowFirst(); // Returns TRUE if child style bit is set // BOOL IsChild() const; VOID SetPos( XYPOINT xy, BOOL fRepaint = TRUE, WINDOW *pwin = NULL ); XYPOINT QueryPos() const; VOID SetSize( INT nWidth, INT nHeight, BOOL fRepaint = TRUE ); VOID SetSize( XYDIMENSION dxy, BOOL fRepaint = TRUE ); VOID QuerySize( INT *pnWidth, INT * pnHeight ) const; XYDIMENSION QuerySize() const; VOID QueryClientRect( RECT * pRect ) const; VOID QueryClientRect( XYRECT * pxycd ) const; VOID QueryWindowRect( RECT * pRect ) const; VOID QueryWindowRect( XYRECT * pxycd ) const; static BOOL IsClientGeneratedMessage(); BOOL HasFocus( VOID ) const; VOID SetStyle( ULONG nValue ); VOID Center( HWND hwnd = NULL ); // For the anglophiles & dyslexics in the crowd. // You know who you are... VOID Centre( HWND hwnd = NULL ) { Center( hwnd ); } }; /********************************************************************** NAME: OWNER_WINDOW SYNOPSIS: Owner window class - base of any window owning others. INTERFACE: OWNER_WINDOW() - constructor ~OWNER_WINDOW() - destructor QueryRobustHwnd() - return the handle SetFocus() - set window focus SetDialogFocus() - set window focus to a dialog control. Handles default pushbuttons correctly. PARENT: WINDOW USES: CONTROL_TABLE, ITER_CTRL CAVEATS: NOTES: HISTORY: rustanl 20-Nov-1990 Created rustanl 04-Mar-1991 Added OWNER_WINDOW::QueryError mechanism Johnl 12-Mar-1991 Removed _hwndOwner member beng 25-Apr-1991 Removed it from constructor as well; inherits from BASE beng 15-May-1991 Trimmed constructor beng 21-May-1991 Added sundry owner-draw support beng 15-Oct-1991 Win32 conversion beng 30-Oct-1991 Added ITER_CTRL as a friend KeithMo 14-Oct-1992 Added OnUserMessage. **********************************************************************/ DLL_CLASS OWNER_WINDOW : public WINDOW { friend class CONTROL_WINDOW; friend class ITER_CTRL; private: CONTROL_TABLE * _pctrltable; // Generic control attributes word. By convention, BLT controls // lower 16 bits, users have upper 16 bits. DWORD _dwAttributes ; // This is called by the constructor of CONTROL_WINDOW // BOOL AddControl( CONTROL_WINDOW * pctrlwin ); protected: CONTROL_WINDOW * CidToCtrlPtr( CID cid ) const; // Provide for custom drawn ("owner-draw" in Win parlance) controls. // INT OnCDMessages( UINT nMsg, WPARAM wParam, LPARAM lParam ); static INT OnLBIMessages( UINT nMsg, WPARAM wParam, LPARAM lParam ); static BOOL CalcFixedCDMeasure( HWND hwnd, MEASUREITEMSTRUCT * pmis ); virtual BOOL OnUserMessage( const EVENT & ); public: OWNER_WINDOW(); OWNER_WINDOW( const TCHAR * pszClassName, ULONG flStyle, const WINDOW * pwndOwner ); ~OWNER_WINDOW(); // QueryRobustHwnd returns the hwnd of the window if it locks down the // parent window. Otherwise, it returns the hwnd of the parent // window. // This method is used (especially) by the MsgPopup API, which // may be called before a window has locked down its parent. If // QueryHwnd is called instead of this method, the MsgPopup may // accidentally become modeless if called before the window locks // down its parent. // virtual HWND QueryRobustHwnd() const = 0; VOID SetFocus( CID cid ); VOID SetDialogFocus( CONTROL_WINDOW & ctrlwin ); // Return the entire attributes DWORD DWORD QueryAttributeFlags () { return _dwAttributes ; } // Set the entire attributes DWORD VOID SetAttributeFlags ( DWORD dwAttributes ) { _dwAttributes = dwAttributes ; } // Set a single attribute VOID SetAttribute ( DWORD dwAttribute, BOOL fOn = TRUE ) { if ( fOn ) _dwAttributes |= dwAttribute ; else _dwAttributes &= ~ dwAttribute ; } // Test a single attribute BOOL QueryAttribute ( DWORD dwAttribute ) { return (_dwAttributes & dwAttribute) > 0 ; } }; /************************************************************************* NAME: ASSOCHWNDTHIS SYNOPSIS: Keeps a this-pointer in a window's properties INTERFACE: ASSOCHWNDTHIS() - ctor, associating the tuple ~ASSOCHWNDTHIS() - dtor, removing the wndprops HwndToThis() - given a hwnd, locates the corresponding this-pointer PARENT: BASE HISTORY: beng 30-Sep-1991 Created **************************************************************************/ DLL_CLASS ASSOCHWNDTHIS: public BASE { private: static const TCHAR * _pszPropThisLo; static const TCHAR * _pszPropThisHi; HWND _hwnd; public: ASSOCHWNDTHIS( HWND hwnd, const VOID * pwnd ); ~ASSOCHWNDTHIS(); static VOID * HwndToThis( HWND hwnd ); }; /********************************************************************** NAME: PROC_INSTANCE SYNOPSIS: Procedure instance class INTERFACE: PROC_INSTANCE() - constructor ~PROC_INSTANCE() - destructor QueryProc() - return the procedure instance address PARENT: BASE NOTES: This is a simple wrapper around MakeProcInstance. MakeProcInstance is a no-op on Win32. HISTORY: RustanL 21-Nov-1990 Created beng 30-Sep-1991 Changed op() to QueryProc, inlined beng 17-Oct-1991 Made conditional on not-Win32 **********************************************************************/ DLL_CLASS PROC_INSTANCE : public BASE { private: MFARPROC _fpInstance; public: PROC_INSTANCE( MFARPROC fp ); ~PROC_INSTANCE(); MFARPROC QueryProc() const { return _fpInstance; } }; /************************************************************************* NAME: ITER_CTRL SYNOPSIS: Iterate over each control within an owner window INTERFACE: ITER_CTRL() - ctor, taking owner window as argument Reset() - resets iterator to its initial state Next() - gets the next element in the sequence operator()() - synonym for "Next" USES: CONTROL_WINDOW, OWNBER_WINDOW, CONTROL_TABLE NOTES: The iterator returns controls in the order which they were constructed. CAVEATS: This is a pretty lightweight little iterator. It performs no locking or other checking in the case of overlapping control add/deletes in the window. Should you elect to add or remove a control, however, a Reset will correct the iterator. HISTORY: beng 30-Oct-1991 Created **************************************************************************/ DLL_CLASS ITER_CTRL { private: const OWNER_WINDOW * _pwndOwning; const CONTROL_TABLE * _pctrltable; UINT _ictrl; UINT _cctrl; public: ITER_CTRL( const OWNER_WINDOW * pwnd ); VOID Reset(); CONTROL_WINDOW * Next(); CONTROL_WINDOW * operator()() { return Next(); } }; #endif // _BLTWIN_HXX_ - end of file