
Introduction
The main idea of this project is creation of a digital segment indicator. In the first version I had developed one segment indicator. After this I grouped some segment indicators and colon indicator and made the DigitalClock class. The next step was creation of an Active X control, based on DigitalClock class.
The base class is CDigit. This class draws segments of a digit with given brush, pen and width. The common function of this class is drawDigit(HDC dc, const int iDigit). This function gives the device context for painting and the number.
void CDigit::drawDigit( HDC dc, const int iDigit )
{
switch( iDigit )
{
case 0:
drawSegment(dc, UET, true );
drawSegment( dc, RUET, true );
drawSegment( dc, RDET, true );
drawSegment( dc, DET, true );
drawSegment( dc, LDET, true );
drawSegment( dc, LUET, true );
drawSegment( dc, MET, false );
break;
case 1:
drawSegment( dc, UET, false ); drawSegment( dc, RUET, true );
drawSegment( dc, RDET, true ); drawSegment( dc, DET, false );
drawSegment( dc, LDET, false ); drawSegment( dc, LUET, false );
drawSegment( dc, MET, false );
break;
.........In same manner draw segments for other digits...............
The digit enumeration:
enum DEType
{
UET = 0,
RUET = 1,
RDET = 2,
DET = 3,
LDET = 4,
LUET = 5,
MET = 6
};
The function drawSegment is used for painting of one segment:
void CDigit::drawSegment( HDC dc, const DEType segType,
const bool bState ) const
{
HBRUSH oldBrush = (HBRUSH) SelectObject( dc,
(bState) ? m_activeBrush : m_inactiveBrush );
HPEN oldPen = (HPEN) SelectObject( dc, (bState) ? m_hActPen : m_hInactPen );
Polygon( dc, m_ptDG[ segType ], 6 );
SelectObject( dc, oldPen );
SelectObject( dc, oldBrush );
}
drawSegment selects the correspond brush and pen and calls Poligon API function, which draws a segment.
In this project, I had some difficulties with persisting of control's properties. After some experiments I did following:
void CDigitalClockCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
long lSOffset = GetLSOffset();
long lSWidth = GetLSWidth();
long lXOffset = GetLXOffset();
long lYOffset = GetLYOffset();
OLE_COLOR clrActive = GetClrActive();
OLE_COLOR clrBkgnd = GetClrBkgnd();
OLE_COLOR clrInactive = GetClrInactive();
PX_Long( pPX, _T("lSOffset"), lSOffset );
PX_Long( pPX, _T("lSWidth"), lSWidth );
PX_Long( pPX, _T("lXOffset"), lXOffset );
PX_Long( pPX, _T("lYOffset"), lYOffset );
PX_Color( pPX, _T("clrActive"), clrActive );
PX_Color( pPX, _T("clrBkgnd"), clrBkgnd );
PX_Color( pPX, _T("clrInactive"), clrInactive );
SetLSOffset( lSOffset );
SetLSWidth( lSWidth );
SetLXOffset( lXOffset );
SetLYOffset( lYOffset );
SetClrActive( clrActive );
SetClrBkgnd( clrBkgnd );
SetClrInactive( clrInactive );
}
First I get control's properties by invoking control's Getxxx functions, after that call macros and call Setxxx functions to set new properties' values.
Using the component
- Register component by using: regsvr32 <path\to installed\axtivex>
- Add component to projects
- The component icon will appear on controls toolbar
- Using drag-and-drop operation, put the component into dialogs.
- Set appropriate settings