Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1129 lines
27 KiB

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corporation, 1995 - 1998 **/
/**********************************************************************/
/*
FILE HISTORY:
*/
#ifndef _COMMON_H_
#define _COMMON_H_
#ifndef _IPADDR_H
#include "ipaddr.h"
#endif
//
// Forward declarations
//
class CObjHelper ;
class CObjectPlus ;
class CObOwnedList ;
class CObListIter ;
class CObOwnedArray ;
//
// Wrappers for the *BROKEN* C8 TRY/CATCH stuff
//
#define CATCH_MEM_EXCEPTION \
TRY
#define END_MEM_EXCEPTION(err) \
CATCH_ALL(e) { \
err = ERROR_NOT_ENOUGH_MEMORY ; \
} END_CATCH_ALL
/****************************************************************************
DEBUGAFX.H
****************************************************************************/
//
// ENUM for special debug output control tokens
//
enum ENUM_DEBUG_AFX { EDBUG_AFX_EOL = -1 } ;
#if defined(_DEBUG)
#define TRACEFMTPGM DbgFmtPgm( THIS_FILE, __LINE__ )
#define TRACEOUT(x) { afxDump << x ; }
#define TRACEEOL(x) { afxDump << x << EDBUG_AFX_EOL ; }
#define TRACEEOLID(x) { afxDump << TRACEFMTPGM << x << EDBUG_AFX_EOL ; }
#define TRACEEOLERR(err,x) { if (err) TRACEEOLID(x) }
#else
#define TRACEOUT(x) { ; }
#define TRACEEOL(x) { ; }
#define TRACEEOLID(x) { ; }
#define TRACEEOLERR(err,x) { ; }
#endif
//
// Append an EOL onto the debug output stream
//
CDumpContext & operator << ( CDumpContext & out, ENUM_DEBUG_AFX edAfx ) ;
//
// Format a program name and line number for output (removes the path info)
//
extern const char * DbgFmtPgm ( const char * szFn, int line ) ;
/****************************************************************************
OBJPLUS.H
****************************************************************************/
//
// Helper class for control of construction and API errors
//
class CObjHelper
{
protected:
LONG m_ctor_err ;
LONG m_api_err ;
DWORD m_time_created ;
BOOL m_b_dirty ;
CObjHelper () ;
public:
void AssertValid () const ;
virtual BOOL IsValid () const ;
operator BOOL()
{
return (IsValid());
}
//
// Update the Dirty flag
//
void SetDirty ( BOOL bDirty = TRUE )
{
m_b_dirty = bDirty ;
}
//
// Query the Dirty flag
//
BOOL IsDirty () const
{
return m_b_dirty ;
}
//
// Return the creation time of this object
//
DWORD QueryCreationTime() const
{
return m_time_created ;
}
//
// Return the elapsed time this object has been alive.
//
DWORD QueryAge () const ;
//
// Query/set constuction failure
//
void ReportError ( LONG errInConstruction ) ;
LONG QueryError () const
{
return m_ctor_err ;
}
//
// Reset all error conditions.
//
void ResetErrors ()
{
m_ctor_err = m_api_err = 0 ;
}
//
// Query/set API errors.
//
LONG QueryApiErr () const
{
return m_api_err ;
}
//
// SetApiErr() echoes the error to the caller.for use in expressions.
//
LONG SetApiErr ( LONG errApi = 0 ) ;
};
class CObjectPlus : public CObject, public CObjHelper
{
public:
CObjectPlus () ;
//
// Compare one object with another
//
virtual int Compare ( const CObjectPlus * pob ) const ;
//
// Define a typedef for an ordering function.
//
typedef int (CObjectPlus::*PCOBJPLUS_ORDER_FUNC) ( const CObjectPlus * pobOther ) const ;
//
// Helper function to release RPC memory from RPC API calls.
//
static void FreeRpcMemory ( void * pvRpcData ) ;
};
class CObListIter : public CObjectPlus
{
protected:
POSITION m_pos ;
const CObOwnedList & m_obList ;
public:
CObListIter ( const CObOwnedList & obList ) ;
CObject * Next () ;
void Reset () ;
POSITION QueryPosition () const
{
return m_pos ;
}
void SetPosition(POSITION pos)
{
m_pos = pos;
}
};
//
// Object pointer list which "owns" the objects pointed to.
//
class CObOwnedList : public CObList, public CObjHelper
{
protected:
BOOL m_b_owned ;
static int _cdecl SortHelper ( const void * pa, const void * pb ) ;
public:
CObOwnedList ( int nBlockSize = 10 ) ;
virtual ~ CObOwnedList () ;
BOOL SetOwnership ( BOOL bOwned = TRUE )
{
BOOL bOld = m_b_owned ;
m_b_owned = bOwned ;
return bOld ;
}
CObject * Index ( int index ) ;
CObject * RemoveIndex ( int index ) ;
BOOL Remove ( CObject * pob ) ;
void RemoveAll () ;
int FindElement ( CObject * pobSought ) const ;
//
// Set all elements to dirty or clean. Return TRUE if
// any element was dirty.
//
BOOL SetAll ( BOOL bDirty = FALSE ) ;
//
// Override of CObList::AddTail() to control exception handling.
// Returns NULL if addition fails.
//
POSITION AddTail ( CObjectPlus * pobj, BOOL bThrowException = FALSE ) ;
//
// Sort the list elements according to the
// given ordering function.
//
LONG Sort ( CObjectPlus::PCOBJPLUS_ORDER_FUNC pOrderFunc ) ;
};
//
// Object array which "owns" the objects pointed to.
//
class CObOwnedArray : public CObArray, public CObjHelper
{
protected:
BOOL m_b_owned ;
static int _cdecl SortHelper ( const void * pa, const void * pb ) ;
public:
CObOwnedArray () ;
virtual ~ CObOwnedArray () ;
BOOL SetOwnership ( BOOL bOwned = TRUE )
{
BOOL bOld = m_b_owned ;
m_b_owned = bOwned ;
return bOld ;
}
void RemoveAt( int nIndex, int nCount = 1);
void RemoveAll () ;
int FindElement ( CObject * pobSought ) const ;
//
// Set all elements to dirty or clean. Return TRUE if
// any element was dirty.
//
BOOL SetAll ( BOOL bDirty = FALSE ) ;
//
// Sort the list elements according to the
// given ordering function.
//
LONG Sort ( CObjectPlus::PCOBJPLUS_ORDER_FUNC pOrderFunc ) ;
private:
void QuickSort(
int nLow,
int nHigh,
CObjectPlus::PCOBJPLUS_ORDER_FUNC pOrderFunc
);
void Swap(
int nIndex1,
int nIndex2
);
};
/***************************************************************************
IPADDRES.H
***************************************************************************/
//
// IP Address Conversion Macros
//
/*
#ifndef MAKEIPADDRESS
#define MAKEIPADDRESS(b1,b2,b3,b4) ((LONG)(((DWORD)(b1)<<24)+((DWORD)(b2)<<16)+((DWORD)(b3)<<8)+((DWORD)(b4))))
#define GETIP_FIRST(x) ((x>>24) & 0xff)
#define GETIP_SECOND(x) ((x>>16) & 0xff)
#define GETIP_THIRD(x) ((x>> 8) & 0xff)
#define GETIP_FOURTH(x) ((x) & 0xff)
#endif // MAKEIPADDRESS
*/
/////////////////////////////////////////////////////////////////////////////
// CIpAddress class
class CIpAddress : public CObjectPlus
{
public:
// Constructors
CIpAddress()
{
m_lIpAddress = 0L;
m_fInitOk = FALSE;
}
CIpAddress (LONG l)
{
m_lIpAddress = l;
m_fInitOk = TRUE;
}
CIpAddress (BYTE b1, BYTE b2, BYTE b3, BYTE b4)
{
m_lIpAddress = MAKEIPADDRESS(b1,b2,b3,b4);
m_fInitOk = TRUE;
}
CIpAddress(const CIpAddress& ia)
{
m_lIpAddress = ia.m_lIpAddress;
m_fInitOk = ia.m_fInitOk;
}
CIpAddress (const CString & str);
//
// Assignment operators
//
const CIpAddress & operator =(const LONG l);
const CIpAddress & operator =(const CString & str);
const CIpAddress & operator =(const CIpAddress& ia)
{
m_lIpAddress = ia.m_lIpAddress;
m_fInitOk = ia.m_fInitOk;
return *this;
}
//
// Conversion operators
//
operator const LONG() const
{
return m_lIpAddress;
}
operator const CString&() const;
public:
BOOL IsValid() const
{
return m_fInitOk;
}
private:
LONG m_lIpAddress;
BOOL m_fInitOk;
};
/****************************************************************************
INTLTIME.H
****************************************************************************/
//
// CIntlTime class definition
//
class CIntlTime : public CTime
{
//
// Attributes
//
public:
enum _TIME_FORMAT_REQUESTS
{
TFRQ_TIME_ONLY,
TFRQ_DATE_ONLY,
TFRQ_TIME_AND_DATE,
TFRQ_TIME_OR_DATE,
TFRQ_MILITARY_TIME,
};
public:
// Same contructors as CTime
CIntlTime();
CIntlTime(const CTime &timeSrc);
CIntlTime(time_t time);
CIntlTime(int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec);
CIntlTime(WORD wDosDate, WORD wDosTime);
#ifdef _WIN32
CIntlTime(const SYSTEMTIME& sysTime);
CIntlTime(const FILETIME& fileTime);
#endif // _WIN32
// New for CIntlTime
CIntlTime(const CIntlTime &timeSrc);
CIntlTime(const CString &strTime, int nFormat = TFRQ_TIME_OR_DATE, time_t * ptmOldValue = NULL);
public:
virtual ~CIntlTime();
// Operations
public:
// Assignment operators
const CIntlTime& operator=(time_t tmValue);
const CIntlTime& operator=(const CString& strValue);
const CIntlTime& operator=(const CTime & time);
const CIntlTime& operator=(const CIntlTime & time);
// Conversion operators
operator const time_t() const;
operator CString() const;
operator const CString() const;
const CString IntlFormat(int nFormat) const
{
return(ConvertToString(nFormat));
}
// Validation checks
BOOL IsValid() const
{
return(m_fInitOk);
}
static BOOL IsIntlValid()
{
return(CIntlTime::m_fIntlOk);
}
public:
// ... Input and output
#ifdef _DEBUG
friend CDumpContext& AFXAPI operator<<(CDumpContext& dc, const CIntlTime& tim);
#endif // _DEBUG
friend CArchive& AFXAPI operator <<(CArchive& ar, const CIntlTime& tim);
friend CArchive& AFXAPI operator >>(CArchive& ar, CIntlTime& tim);
// Implementation
public:
static void Reset();
static void SetBadDateAndTime(CString strBadDate = "--", CString strBadTime = "--")
{
m_strBadDate = strBadDate;
m_strBadTime = strBadTime;
}
static CString& GetBadDate()
{
return(m_strBadDate);
}
static CString& GetBadTime()
{
return(m_strBadTime);
}
static time_t ConvertFromString (const CString & str, int nFormat, time_t * ptmOldValue, BOOL * pfOk);
static BOOL IsLeapYear(UINT nYear); // Complete year value
static BOOL IsValidDate(UINT nMonth, UINT nDay, UINT nYear);
static BOOL IsValidTime(UINT nHour, UINT nMinute, UINT nSecond);
private:
enum _DATE_FORMATS
{
_DFMT_MDY, // Day, month, year
_DFMT_DMY, // Month, day, year
_DFMT_YMD, // Year, month, day
};
typedef struct _INTL_TIME_SETTINGS
{
CString strDateSeperator; // String used between date fields
CString strTimeSeperator; // String used between time fields.
CString strAM; // Suffix string used for 12 hour clock AM times
CString strPM; // Suffix string used for 12 hour clock PM times
int nDateFormat; // see _DATE_FORMATS enum above.
BOOL f24HourClock; // TRUE = 24 hours, FALSE is AM/PM
BOOL fCentury; // If TRUE, uses 4 digits for the century
BOOL fLeadingTimeZero; // If TRUE, uses leading 0 in time format
BOOL fLeadingDayZero; // If TRUE, uses leading 0 in day
BOOL fLeadingMonthZero; // If TRUE, uses leading 0 in month
} INTL_TIME_SETTINGS;
static INTL_TIME_SETTINGS m_itsInternationalSettings;
static CString m_strBadTime;
static CString m_strBadDate;
private:
static BOOL SetIntlTimeSettings();
static BOOL m_fIntlOk;
private:
const CString GetDateString() const;
const CString GetTimeString() const;
const CString GetMilitaryTime() const;
const CString ConvertToString(int nFormat) const;
private:
BOOL m_fInitOk;
};
/****************************************************************************
NUMERIC.H
****************************************************************************/
class CIntlNumber : public CObjectPlus
{
public:
CIntlNumber()
{
m_lValue = 0L;
m_fInitOk = TRUE;
}
CIntlNumber(LONG lValue)
{
m_lValue = lValue;
m_fInitOk = TRUE;
}
CIntlNumber(const CString & str);
CIntlNumber(CIntlNumber const &x)
{
m_lValue = x.m_lValue;
m_fInitOk = x.m_fInitOk;
}
CIntlNumber& operator =(CIntlNumber const &x)
{
m_lValue = x.m_lValue;
m_fInitOk = x.m_fInitOk;
return(*this);
}
public:
// Assignment Operators
CIntlNumber& operator =(LONG l);
CIntlNumber& operator =(const CString &str);
// Shorthand operators.
CIntlNumber& operator +=(const CIntlNumber& num);
CIntlNumber& operator +=(const LONG l);
CIntlNumber& operator -=(const CIntlNumber& num);
CIntlNumber& operator -=(const LONG l);
CIntlNumber& operator /=(const CIntlNumber& num);
CIntlNumber& operator /=(const LONG l);
CIntlNumber& operator *=(const CIntlNumber& num);
CIntlNumber& operator *=(const LONG l);
// Conversion operators
operator const LONG() const
{
return(m_lValue);
}
operator const CString() const;
public:
virtual BOOL IsValid() const
{
return(m_fInitOk);
}
public:
static void Reset();
static void SetBadNumber(CString strBadNumber = "--")
{
m_strBadNumber = strBadNumber;
}
static CString ConvertNumberToString(const LONG l);
static LONG ConvertStringToNumber(const CString & str, BOOL * pfOk);
static CString& GetBadNumber()
{
return(m_strBadNumber);
}
private:
static CString GetThousandSeperator();
private:
static CString m_strThousandSeperator;
static CString m_strBadNumber;
private:
LONG m_lValue;
BOOL m_fInitOk;
public:
#ifdef _DEBUG
friend CDumpContext& AFXAPI operator<<(CDumpContext& dc, const CIntlNumber& num);
#endif // _DEBUG
friend CArchive& AFXAPI operator<<(CArchive& ar, const CIntlNumber& num);
friend CArchive& AFXAPI operator>>(CArchive& ar, CIntlNumber& num);
};
class CIntlLargeNumber : public CObjectPlus
{
public:
CIntlLargeNumber()
{
m_lLowValue = 0L;
m_lHighValue = 0L;
m_fInitOk = TRUE;
}
CIntlLargeNumber(LONG lHighWord, LONG lLowWord)
{
m_lLowValue = lLowWord;
m_lHighValue = lHighWord;
m_fInitOk = TRUE;
}
CIntlLargeNumber(const CString & str);
public:
// Assignment Operators
CIntlLargeNumber& operator =(const CString &str);
operator const CString() { return ConvertNumberToString(); }
operator CString() { return ConvertNumberToString(); }
public:
virtual LONG GetLowWord() const { return m_lLowValue; }
virtual LONG GetHighWord() const { return m_lHighValue; }
virtual BOOL IsValid() const { return(m_fInitOk); }
private:
static CString m_strBadNumber;
CString ConvertNumberToString();
void ConvertStringToNumber(const CString & str, BOOL * pfOk);
private:
LONG m_lLowValue;
LONG m_lHighValue;
BOOL m_fInitOk;
};
/****************************************************************************
REGISTRY.H
****************************************************************************/
//
// Forward declarations
//
//class CRegKey ;
class CRegValueIter ;
class CRegKeyIter ;
//
// Maximum size of a Registry class name
//
#define CREGKEY_MAX_CLASS_NAME MAX_PATH
//
// Wrapper for a Registry key handle.
//
/*
class CRegKey : public CObjectPlus
{
protected:
HKEY m_hKey ;
DWORD m_dwDisposition ;
// Prepare to read a value by finding the value's size.
LONG PrepareValue (
const char * pchValueName,
DWORD * pdwType,
DWORD * pcbSize,
BYTE ** ppbData
);
// Convert a CStringList to the REG_MULTI_SZ format
static LONG FlattenValue (
CStringList & strList,
DWORD * pcbSize,
BYTE ** ppbData
);
// Convert a CByteArray to a REG_BINARY block
static LONG FlattenValue (
CByteArray & abData,
DWORD * pcbSize,
BYTE ** ppbData
);
public:
//
// Key information return structure
//
typedef struct
{
char chBuff [CREGKEY_MAX_CLASS_NAME] ;
DWORD dwClassNameSize,
dwNumSubKeys,
dwMaxSubKey,
dwMaxClass,
dwMaxValues,
dwMaxValueName,
dwMaxValueData,
dwSecDesc ;
FILETIME ftKey ;
} CREGKEY_KEY_INFO ;
//
// Standard constructor for an existing key
//
CRegKey (
HKEY hKeyBase,
const char * pchSubKey = NULL,
REGSAM regSam = KEY_ALL_ACCESS,
const char * pchServerName = NULL
);
//
// Constructor creating a new key.
//
CRegKey (
const char * pchSubKey,
HKEY hKeyBase,
DWORD dwOptions = 0,
REGSAM regSam = KEY_ALL_ACCESS,
LPSECURITY_ATTRIBUTES pSecAttr = NULL,
const char * pchServerName = NULL
);
~ CRegKey () ;
//
// Allow a CRegKey to be used anywhere an HKEY is required.
//
operator HKEY ()
{
return m_hKey ;
}
//
// Fill a key information structure
//
LONG QueryKeyInfo ( CREGKEY_KEY_INFO * pRegKeyInfo ) ;
//
// Overloaded value query members; each returns ERROR_INVALID_PARAMETER
// if data exists but not in correct form to deliver into result object.
//
LONG QueryValue ( const char * pchValueName, CString & strResult ) ;
LONG QueryValue ( const char * pchValueName, CStringList & strList ) ;
LONG QueryValue ( const char * pchValueName, DWORD & dwResult ) ;
LONG QueryValue ( const char * pchValueName, CByteArray & abResult ) ;
LONG QueryValue ( const char * pchValueName, CIntlTime & itmResult ) ;
LONG QueryValue ( const char * pchValueName, CIntlNumber & inResult ) ;
LONG QueryValue ( const char * pchValueName, void * pvResult, DWORD cbSize );
// Overloaded value setting members.
LONG SetValue ( const char * pchValueName, CString & strResult ) ;
LONG SetValue ( const char * pchValueName, CString & strResult , BOOL fRegExpand) ;
LONG SetValue ( const char * pchValueName, CStringList & strList ) ;
LONG SetValue ( const char * pchValueName, DWORD & dwResult ) ;
LONG SetValue ( const char * pchValueName, CByteArray & abResult ) ;
LONG SetValue ( const char * pchValueName, CIntlTime & itmResult ) ;
LONG SetValue ( const char * pchValueName, CIntlNumber & inResult ) ;
LONG SetValue ( const char * pchValueName, void * pvResult, DWORD cbSize );
};
*/
//
// Iterate the values of a key, return the name and type
// of each.
//
class CRegValueIter : public CObjectPlus
{
protected:
//CRegKey & m_rk_iter ;
DWORD m_dw_index ;
char * m_p_buffer ;
DWORD m_cb_buffer ;
public:
//CRegValueIter ( CRegKey & regKey ) ;
~ CRegValueIter () ;
//
// Get the name (and optional last write time) of the next key.
//
LONG Next ( CString * pstrName, DWORD * pdwType ) ;
//
// Reset the iterator
//
void Reset ()
{
m_dw_index = 0 ;
}
};
//
// Iterate the sub-key names of a key.
//
class CRegKeyIter : public CObjectPlus
{
protected:
//CRegKey & m_rk_iter ;
DWORD m_dw_index ;
char * m_p_buffer ;
DWORD m_cb_buffer ;
public:
//CRegKeyIter ( CRegKey & regKey ) ;
~ CRegKeyIter () ;
// Get the name (and optional last write time) of the next key.
LONG Next ( CString * pstrName, CTime * pTime = NULL ) ;
// Reset the iterator
void Reset ()
{
m_dw_index = 0 ;
}
};
/****************************************************************************
LISTBOX.H
****************************************************************************/
class CListBoxExResources
{
public:
CListBoxExResources
(
int bmId,
int nBitmapWidth,
COLORREF crBackground = RGB(0,255,0)
);
~CListBoxExResources();
private:
COLORREF m_ColorWindow;
COLORREF m_ColorHighlight;
COLORREF m_ColorWindowText;
COLORREF m_ColorHighlightText;
COLORREF m_ColorTransparent;
CDC m_dcFinal;
HGDIOBJ m_hOldBitmap;
CBitmap m_BmpScreen;
int m_BitMapId;
int m_BitmapHeight;
int m_BitmapWidth;
int m_nBitmaps;
private:
void GetSysColors();
void PrepareBitmaps( BOOL );
void UnprepareBitmaps();
void UnloadResources();
void LoadResources();
public:
void SysColorChanged();
const CDC& DcBitMap() const
{
return m_dcFinal;
}
int BitmapHeight() const
{
return m_BitmapHeight;
}
int BitmapWidth() const
{
return m_BitmapWidth;
}
COLORREF ColorWindow() const
{
return m_ColorWindow;
}
COLORREF ColorHighlight() const
{
return m_ColorHighlight;
}
COLORREF ColorWindowText() const
{
return m_ColorWindowText;
}
COLORREF ColorHighlightText() const
{
return m_ColorHighlightText;
}
};
class CListBoxExDrawStruct
{
public:
CListBoxExDrawStruct(
CDC* pdc,
RECT* pRect,
BOOL sel,
DWORD item,
int itemIndex,
const CListBoxExResources* pres
)
{
m_pDC = pdc;
m_Sel = sel;
m_ItemData = item;
m_ItemIndex = itemIndex;
m_pResources = pres;
m_Rect.CopyRect(pRect);
}
public:
const CListBoxExResources * m_pResources;
CDC* m_pDC;
CRect m_Rect;
BOOL m_Sel;
DWORD m_ItemData;
int m_ItemIndex;
};
class CListBoxEx : public CListBox
{
protected:
int m_lfHeight;
protected:
const CListBoxExResources* m_pResources;
//
// Construction
//
public:
CListBoxEx();
void AttachResources(const CListBoxExResources* );
//
// Attributes
//
public:
short TextHeight() const
{
return m_lfHeight;
}
//
// Operations
//
public:
BOOL ChangeFont(
CFont*
);
//
// Implementation
//
public:
virtual ~CListBoxEx();
protected:
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMIS);
virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
protected:
//
// must override this to provide drawing of item
//
/* PURE */ virtual void DrawItemEx( CListBoxExDrawStruct& ) = 0;
//
// Helper function to display text in a limited rectangle
//
static BOOL ColumnText(CDC * pDC, int left, int top, int right, int bottom, const CString & str);
private:
void CalculateTextHeight(CFont*);
protected:
//{{AFX_MSG(CListBoxEx)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
DECLARE_DYNAMIC(CListBoxEx)
};
/****************************************************************************
METAL.H
****************************************************************************/
class CMetalString : public CButton
{
public:
CMetalString()
{
}
protected:
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
};
/****************************************************************************
SPINCTRL.H
****************************************************************************/
class CSpinBox; // Forward decleration;
class CSpinButton : public CButton
{
public:
CSpinButton();
//
// Associate with parent spinner control
//
void Associate(
CSpinBox * pParent
)
{
m_pParent = pParent;
}
//
// Implementation
//
protected:
void NotifyParent();
void Paint(LPDRAWITEMSTRUCT lpDIS);
virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnTimer(UINT nIDEvent);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
DECLARE_MESSAGE_MAP()
private:
typedef enum tagArrowDirection
{
enumArrowUp,
enumArrowDown
} ARROWDIRECTION;
ARROWDIRECTION m_ArrowType;
CSpinBox * m_pParent; // Point back to the edit associated edit box
BOOL m_fButton;
BOOL m_fRealButton;
CRect m_rcUp;
CRect m_rcDown;
UINT m_uScroll;
UINT m_uTimer;
BOOL m_fKeyDown;
};
class CSpinBox : public CEdit
{
public:
typedef enum tagEDITTYPE
{
enumNormal, // Perform no modification at all
enumSeconds, // Value represents the number of seconds
enumMinutes, // Value is in minutes.
enumMinutesHigh, // Value is in minutes, which is the highest unit
enumHours, // Value is in hours
enumHoursHigh, // Value is in hours, which is the highest unit
enumDays, // Value in in days
enumDaysHigh, // Value is in days, which is the highest unit
} EDITTYPE;
public:
CSpinBox(
int nMin,
int nMax,
int nButtonId,
EDITTYPE nType = enumNormal,
BOOL fLeadingZero = FALSE
);
BOOL SubclassDlgItem(UINT nID, CWnd *pParent);
BOOL EnableWindow(BOOL bEnable = TRUE);
public:
void OnScrollUp();
void OnScrollDown();
void SetValue(int nValue);
BOOL GetValue(int &nValue);
// Implementation
protected:
virtual void OnBadInput();
void IncreaseContent(int nDelta);
afx_msg void OnChar(UINT, UINT, UINT); // for character validation
DECLARE_MESSAGE_MAP()
protected:
int m_nButtonId;
int m_nMin;
int m_nMax;
EDITTYPE m_etType;
BOOL m_fLeadingZero;
CSpinButton m_button_Spin; // Associated scroll bar
};
/////////////////////////////////////////////////////////////////////////////
#endif // _COMMON_H_