Environment: Developed and tested on Win2000 using VC6
Recently, I needed to present a user interface incorporating a large number of buttons. Each button caused an activity to start and would run for an indeterminate length of time. I wanted to indicate this activity and associate it with the button that started it.
I came up with CbuttonList, a list box populated with buttons containing a flashing LED to show activity (an example of Monte Variakojis’ excellent CLed class). CbuttonListBox is a simple example of sub classing of CButton and ClistBox. It is easy to implement; just follow these steps:
- Copy the LED bitmap into the res directory of your project.
- Copy CLed.cpp and .h, CbuttonListBox.cpp and .h, CledButton.cpp and .h files into your project directory and add them to your project through the IDE.
- Add a Bitmap resource to the project and name it IDB_LEDS.
- Place a list box on your dialog and alter its properties as below:
- Selection – Single
- Owner Draw – Fixed
- Check Notify
- Check Vertical Scroll Bar
- Check No Integral Height
- Add a member variable for the ListBox and change its type to CbuttonListBox in the header (having added the #include “ButtonListBox.h” in your Dialog header).
- In the OnInitDialog method of the dialog, you can add your buttons to the list, passing a String to be the buttons text.
m_ButtonListBox.AddItem("Test 1");
There is a #define in CbuttonListBox.h that controls the number of buttons placed in the ListBox. This may need to be altered based on the size of your ListBox on your dialog.
#define NUMBER_OF_BUTTONS_IN_LIST_VIEW 10 // 10 buttons
When a button is clicked, a message is posted to the CbuttonListBox class with the Buttons this pointer as an lParam. This allows the click to be associated with a particular button. Code must be added to the PreTranslateMessage(MSG* pMsg) method in the CbuttonListBox class to handle these events.
Thats It! I hope this is of some use to you. Feel free to use these classes any way you like. Any comments or improvements would be appreciated.