A smart edit and linked slider control






3.80/5 (3 votes)
Feb 3, 2000

139757

2845
An edit control for entering text, numbers, hexadecimal or floating point values, and which can be linked to a slider control
The code included here implements what I call a Smart Edit control. This
began life in a sample from the MSDN called CTRLTEST. This control was
originally called CParsedEdit
and it allows one to specify types of allowable
characters that can be entered into an edit box. I have changed its name to
CSmartEdit
and added more functionality to it. It now supports more character
types including numbers, characters, hexadecimal, floating point (with exponents),
underscores, and negative signs. The biggest enhancement in functionality is
that one can associate or link an edit box with a slider to provide what I call
coordinated updates. This means that if you drag the slider around you will see
a corresponding change in the number displayed in the edit box and vice-versa.
I call the derived slider control class CLinkSlider
.
As an added bonus, I have included some bitmapped button images that came with the original sample and some that I drew myself. The bitmaps I drew are for the disabled states of ok and cancel and for all four states of the apply and help buttons. The four button states are up, down, focused, and disabled. The names of bitmaps end in U, D, F, and X for the four states.
It is very easy to use the CSmartEdit
control. These are the steps :
- Declare a member variable of type
CSmartEdit
in theAFX_DATA
section of the dialog. - Add a
DDX_Control
statement in theAFX_DATA_MAP
to associate the resource to the member. - In
OnInitDialog
set the type of the control withSetParseType
.
As you probably know, the class wizard can do the first two steps for you. Note that the resource style of the edit box does NOT have to be anything special.
It is also very easy to use the CLinkSlider control. These are the steps :
- Add a
CSmartEdit
control as in steps 1 and 2 above. - Add a
CLinkSlider
control similar to steps 1 and 2 above. - In
OnInitDialog
link the slider and edit box by callingSetSlideLink
and pass the resource id of the slider. - Also in
OnInitDialog
, set the minimum and maximum values and the number of ticks for the slider with SetParams There are two versions of this function, one for integers and one for floating point doubles. The floating point version also takes a format string that specifies how the value will be displayed.
Here is a code snippet that illustrates using a smart edit box and two linked slider-edit boxes, one integer and one floating point.
// Dialog Data in dialog class declaration //{{AFX_DATA(CTestSlidersDlg) enum { IDD = IDD_SLIDE_DLG }; CSmartEdit m_Edit1; CSmartEdit m_Edit2; CSmartEdit m_Edit3; CLinkSlider m_Slider1; CLinkSlider m_Slider2; //}}AFX_DATA ... // in dialog's DoDataExchange function CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTestSlidersDlg) DDX_Control(pDX, IDC_EDIT1, m_Edit1); DDX_Control(pDX, IDC_EDIT2, m_Edit2); DDX_Control(pDX, IDC_EDIT3, m_Edit3); DDX_Control(pDX, IDC_SLIDER1, m_Slider1); DDX_Control(pDX, IDC_SLIDER2, m_Slider2); //}}AFX_DATA_MAP ... // in dialog's OnInitDialog function CDialog::OnInitDialog(); // setup first slider-edit box - integer m_Edit1.SetSlideLink( this, IDC_SLIDER1 ); m_Edit1.SetParams( -100, 100, 10 ); m_Edit1.SetValue( 0 ); // setup second slider-edit box - floating point m_Edit2.SetSlideLink( this, IDC_SLIDER2 ); m_Edit2.SetParams( 0.0, 10.0, 10, "%6.3f" ); m_Edit2.SetValue( 2.0 ); // setup third edit box - it is not linked and accepts only letters m_Edit3.SetParseType( SES_LETTERS );
Lastly, I will briefly describe how to use the bitmapped buttons.
- Define a button resource in the dialog that has Owner Draw style enabled.
- Declare a variable in the dialog of type
CBitmapButton
. - In
OnInitDialog
callButton.AutoLoad( ButtonId, this )
That's all there is to it. The one gotcha to using AutoLoad
is that the text
of the button must match the name of the bitmap. This means that for the cancel
button, its text MUST be Cancel and for the apply button, its text MUST be
Apply. Note that case does not matter for the text of the button. See the
documentation on CBitmapButton
for more details.
A note about Unicode: first of all, I have attempted to make this compatable with Unicode but I have not tested it with a MBCS. The principle area where it matters use Unicode-compatable functions for checking each character entered into the edit box. Please let me know of any problems encountered (and successes :)
The demo project is a dialog app having four dialogs. One is the choser dialog and the others are for testing just the edit boxes, just the buttons, and one that shows all of the controls together as depicted in the image.