Creating and Using A Dynamic LED Control

Environment: Compiled using VC6.0 Sp3 and tested using Win95/98 WinNT4.0 and Win 2000

Introduction

I saw the article "Static LED Control" by Monte Variakojis at http://www.codeguru.com/controls/StaticLed.shtml and I had a look at the questions asked there. This class enables the user to have a blinking effect with control over the blinking rate per second. They can set the timer of the control. Sometimes, it would be better to show the status of an ongoing operation or if there is any warning; it would be better to display it using an LED control. I faced this situation when developing for a client whose end users were security guards who had no knowledge of computers. So, the interface for them was designed like a TV remote control and I had to incorporate a lot of controls like this to make them feel at ease. I would like to tell the people who are going to use this class that it's best suited for small controls rather than making it bigger where the effect is lost. It looks more like an ellipse than a LED at bigger proportions.

Implementation

To use the CDynamicLED class, you can follow the guidelines stated below.

  1. Insert a new static frame where you want the LED. Setting the client edge property or the modal frame property for it looks better.
  2. Rename the static frame to something other than IDC_STATIC. Name it something like IDC_DYN_LED.
  3. Using the MFC ClassWizard, add a new member variable for IDC__DYN_LED. The category should be a control and the Variable Type should be CDynamicLED. If the CDynamicLED type does not show up in the Variable type dropdown combo, you need to re-create the .clw file. Delete the .clw file and run the class wizard again.
  4. Remember to add "DynamicLED.h" to your dialog's header file.

Operations

The various features in the CDynamicLED Class are outlined below.

  1. Use the following command:
    SetLED( CWnd *pWnd, 
            UINT nIDColor,
            UINT nIDShape, 
            int nTimerInterval)
    
    where pWnd is your static window where you want the LED. nIDColor can be any of the following values:
      ID_LED_RED
      ID_LED_GREEN
      ID_LED_BLUE
      ID_LED_YELLOW
    
    NIDShape can be any of the following values:

      ID_SHAPE_ROUND
      ID_SHAPE_SQUARE
    
    Here, the nIDShape value determines whether the shape of the LED will be round or square.

    And the nTimerInterval parameter denotes the number of milliseconds. The LED would flash once in every period denoted by this parameter. You can either have a rapidly blinking LED by setting this parameter to 100 or have a normally blinking LED which blinks once per second by setting this value to 1000.

    This is the ONLY function that you need to know to use this class.
  2. In case you need more functionality to switch on or switch off the LED, you have two functions named:

      SwitchOn();
    
    and
      SwitchOff();
    
    These two functions don't need any parameters.

Now, let's go to the implementation of this control in your dialog-based application. I have assumed that you have named your dialog class CMyDialog.

Remember that you have created a variable for this static frame. If you have forgotten about that, please refer to the implementation section above. Assuming that you have named your variable m_dynLEDRed for a LED control which is round in shape, it is going to blink once every half second and which is red in colour.

You have to add the following lines in your OnInitDialog function. I have also assumed that you have named your static frame IDC_STATIC_LED_RED.

CWnd *pWndRed = (CWnd *)GetDlgItem(IDC_STATIC_LED_RED);
m_dynLEDRed.SetLED(pWndRed,ID_LED_RED,
                   ID_SHAPE_ROUND,500);

In case you want to change the blinking interval of the LED at runtime from half a second to a full second, you can use the following code.

// Change the time interval of the LED to 1000
CWnd *pWndRed = (CWnd *)GetDlgItem(IDC_STATIC_LED_RED);
m_dynLEDRed.SetLED(pWndBlue,ID_LED_BLUE, 
                   ID_SHAPE_ROUND,1000);

To change the shape of the LED from round to square or vice versa , you can follow this piece of code.

// Change the shape of the Blue LED from round to square
CWnd *pWndRed  = (CWnd *)GetDlgItem(IDC_STATIC_LED_RED);
m_dynLEDRed.SetLED(pWndBlue,ID_LED_BLUE, 
                   ID_SHAPE_SQUARE,1000);

If you want to turn off the LED (I mean switching it off), you can use this.

// Switch OFF the Red LED
CWnd *pWndRed = (CWnd *)GetDlgItem(IDC_STATIC_LED_RED);
m_dynLEDRed.SwitchOff();

and to switch it on again, use

// Switch ON the Red LED
CWnd *pWndRed = (CWnd *)GetDlgItem(IDC_STATIC_LED_RED);
m_dynLEDRed.SwitchOn();

That's all, folks. All luck and have a great time.

With warm regards,
V.Girish

Downloads

Download demo project - 48KB
Download source - 4KB


Comments

  • Nice LED but must it blink?

    Posted by Legacy on 05/05/2003 12:00am

    Originally posted by: George Fredal

    I like your LED but would like to eliminate the TIMER and display it in a constate BRIGHT state. Can you suggest how I might accomplish this?
    Thanks in advance for any advice.
    Regards George

    Reply
  • I'll update the code asap

    Posted by Legacy on 08/10/2002 12:00am

    Originally posted by: VGirish

    Dear All,
    
    

    I'm terribly sorry about the code that has been posted. It DOES contain resource leaks. I had posted the WRONG code and i noticed it the moment i saw dterr's comments.

    The code that has been posted contains some more typos like i select the red led but i have used the blue led's variable name instead !!!!!

    Infact, i had used Feng Yuan's GDI resource leak detector on my final version and checked if there are any leaks. But i made a mistake of posting the wrong version in a haste. :(

    I'm terribly sorry and please accept my apologies.

    I WILL MAKE SURE THAT I POST THE RIGHT CODE AS SOON AS POSSIBLE.

    p.s. Incase you want to use this code before i fix up the bugs, then all that you have to do is to store the state of the previous brushes and pens and restore it after you have completed the drawing.

    With warm regards,
    V.Girish

    Reply
  • Why so much redundant code?

    Posted by Legacy on 08/09/2002 12:00am

    Originally posted by: Joe Sonderegger

    Most of the code seems to be redundant.
    Why is this?

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: November 20, 2014 @ 2:00 p.m. ET / 11:00 a.m. PT Are you wanting to target two or more platforms such as iOS, Android, and/or Windows? You are not alone. 90% of enterprises today are targeting two or more platforms. Attend this eSeminar to discover how mobile app developers can rely on one IDE to create applications across platforms and approaches (web, native, and/or hybrid), saving time, money, and effort and introducing apps to market faster. You'll learn the trade-offs for gaining long …

  • Live Event Date: October 29, 2014 @ 11:00 a.m. ET / 8:00 a.m. PT Are you interested in building a cognitive application using the power of IBM Watson? Need a platform that provides speed and ease for rapidly deploying this application? Join Chris Madison, Watson Solution Architect, as he walks through the process of building a Watson powered application on IBM Bluemix. Chris will talk about the new Watson Services just released on IBM bluemix, but more importantly he will do a step by step cognitive …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds