466 lines
15 KiB
C++
466 lines
15 KiB
C++
|
/**********************************************************************/
|
||
|
/** 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
|