Download demo project - 372 KbDownload source files - 14 Kb
This article presents a
CStatic derived class for displaying numbers or text
like a LED Display. This control does not use bitmaps. Everything is drawn with
lines and Bezier curves. First I made some classes to draw a character, which consists
of segments that can be any closed shape, by only giving some points. The points can be
connected by lines or by Bezier curves to make nice smoothened characters. The theory of
fitting Bezier curves can be found in bezdist.pdf, created by Jim Fitzsimmons, in my demo
project cabinet. The
CDigiStatic resizes itself automatically, which can be
experienced with the demo app, wherefore I used the resizing dialog code from Hans Bühler.
To design the characters I looked around for different styles. The best inspiration came
out of my car. I used characters from the date/time/temperature display and from my RDS-radio.
14- and 7-segment displays in straight and smooth style are supported and one common character
for displaying a decimal point or a colon. I changed the designs a lot to get aesthetically
best results, but I didn't go crazy by changing all the points every time because I do
some nifty mirroring for most of the segments. For example I only specified 5 segments for
the 14 segment display.
The demo application shows all possibilities of this control.
Overview of possible Characters
These are normalized characters with all segments turned on in all styles.
The coordinates of these pictures were used to find the corners and Bezier points. You can
adjust the coordinates or dimensions if you like. Then you can take them over to the source the same way as I did.
The height of every design is the same only the width may be different, necessary for easy scaling.
void SetText(LPCTSTR lpszText);
Call this function to set the text of the control. For more info see
void Format(LPCTSTR lpszFormat, ...);<br>
void Format( UINT nFormatID, ... );
Call this member function to write formatted data to a
CDigiStatic in the same way that
data into a C-style character array. This function formats and stores a series of characters and values
CDigiStatic. Each optional argument (if any) is converted and output according to the corresponding
format specification in
lpszFormat or from the string resource identified by
void SetColor(COLORREF OffColor, COLORREF OnColor);
Sets the on and off color of the segments of the
Segments that are off will not be painted when the
DS_NO_OFF style is used.
COLORREF GetOnColor() const
Call this member function to retrieve the color that is used to indicate the segment is on
COLORREF GetOffColor() const
Call this member function to retrieve the color that is used to indicate the segment is off
void SetDrawImmediately(BOOL Enable = TRUE);
Enable set to
TRUE a call to
Format() will redraw the window before the function returns.
Enable set to
FALSE (the default of
CDigiStatic) the client area is marked for painting
when the next
WM_PAINT message occurs.
COLORREF SetBkColor(COLORREF BackColor = BLACK);
Sets the current background color to the specified color and returns the previous
background color. The value of the background color will be ignored when Transparency mode is enabled.
void SetTransparent(BOOL bSet = TRUE);
TRUE only the segments will be drawn and the background will be
transparent and show the window underneath it. Nice if you use a skinned window.
FALSE will fill the background with the current background color.
BOOL ModifyDigiStyle(DWORD dwRemove, DWORD dwAdd);
ModifyDigiStyle function you can add or remove specific
CDigiStatic styles. The styles, which can be combined by using the bitwise
OR ( | ) operator, are:
CDigiStatic::DS_SMOOTH // Smooth kind of characters
CDigiStatic::DS_STYLE14 // use always 14 segment display.
CDigiStatic::DS_SZ_PROP // size proportional(default)
CDigiStatic::DS_NO_OFF // Don't draw the off segments
CDigiStatic::DS_SOFT // ambient bleeding to background
How to use (in a dialog):
- Add digistatic.h, digistatic.cpp, memdc.h, curvefit.h, curvefit.cpp and
rgbcolor.h to your
- Add a static control to your dialog resource.
- Change its ID to something like
IDC_LEDTEXT, open class-wizard and assign a member
variable, type control (
CStatic) to it (
m_LedText for example).
- Open your dialog class's header file. Add
Find the line
CStatic m_LedText and replace the
OnInitDialog() you can give it some text with
change the colors with
SetColor() or for the background
Or, you can set the right style with
- Compile and run.
- Hans Bühler -
For using his resizing software for the demo application.
- Keith Rule -
For creating the memdc class for flickerfree drawing. Modified for support of transparent background
- Massimo Colurcio - HMX controls for making a skinned demo application easy.
- Daniel DeGeest - For helping me with transparency, testing and suggestions.
|1.0 February 2000||First release version. Finally I could say goodbye
to my old class with bitmaps and enjoy the new quality.
This nice control just had to be shared|
|1.1 April 2001||Use Caption as default text.
Changed from STL to Afx templates.
After a suggestion I changed |
I apologize for keeping this baby for myself because I wanted to add and change more
|1.2 May 2002||Added option to draw immediately.
CDigiStatic because it is a derived from a Static control.
After giving no problems for long time it was ready to be released again
|1.3 October 2002||Added transparency option with help of Daniel.
Introduction of 5 new characters /\' (suggested by daniel for using in his great Winamp plugin).
Added new |
DS_SOFT styles to
respectively not to show segments that
are "off" and to remove the soft edge of a segment.
Improved demo app with skin was created to show all the options.
This will be the third release and I call it the "feature update"