.
Overview
First, thanks to Joseph
M. Newcomer for the initial leg work (see his article on CodeProject for more details).
Second, Updating the documentation is becoming a major chore. The first time I posted this control (which
I made a boob of & sent in an incorrect version of the control with several errors) I had done a lot
of work on the documentation but since it was relevant to the old version, I had to do lots of updating.
Hence, I have removed all implementation detail and included it as a download. I have improved a lot of
stuff and removed the bugs I knew of.
CVisValidEdit is an edit control with a difference – there is visual cues & validation (both built in & customisable). The edit control offers additional support for displaying & converting several numeric types.
- double < — > Binary < — > long
- double < — > Hexadecimal < — > long
- double < — > Octal < — > long
- double < — > Float < — > long
The visual cues are by way of different colour brushes to indicate the error type.
There are numerous options that make this control a
synch to use!
CVisValidEdit Usage…
#include the header “VisValEdit.h” where required.
Add a standard edit control to your dialog.
Using the class wizard, attach a member variable select ‘Control’ from the category combo & select CVisValidEdit as the variable type (if CvisValidEdit is not in the list, just choose CEdit & change the type in your class definition)
Set any options required before displaying your dialog.
Add functions to handle UWM_VVE_DO_CUSTOMVALIDATION & UWM_VVE_VALIDITY_CHANGED UWM_VVE_CONTENT_CHANGED (follow links for example)
CVisValidEdit Functions…
Status requests
BOOL IsValid(); BOOL IsValidLength(); BOOL IsValidSyntax();
Validation requests
void DoValidation(BOOL bRedraw = TRUE);
Set & Get Functions
int CheckRange();
int CheckRange(LPCSTR lpszVal);
static int CheckRange(VVEset vveset, LPCSTR lpszVal);
static int CheckRange(VVEset vveset, double dVal);
void DisplayMoreInfo(BOOL bAddOnExtraInfo = TRUE);
void GetMoreInfoString(VVEset vveset, CString &sInfoString, BOOL bAddOnExtraInfo = TRUE );
void SetMoreInfoString(VVEset vveset, LPCTSTR sNewInfoString = NULL );//NULL = reset to default
void SetContextInfo(VVEbrush ErrBrush, LPCSTR sErrMesg);
void GetContextInfo(VVEbrush ErrBrush, CString &sErrMesg);
void GetCurContextInfo(CString &sErrMesg);
void SetEnableContextInfo(BOOL bEnable = TRUE);
BOOL GetEnableContextInfo();
void SetEnableRangeChecking(BOOL bEnable = TRUE);
BOOL GetEnableRangeChecking();
void SetCustomErrorIsValid(int iCustomWhich, BOOL bSetIsValid = TRUE);
BOOL GetCustomErrorIsValid(int iCustomWhich, BOOL &bCustomIsValid );
void DoValidation(BOOL bRedraw = TRUE);//explicit request
void SetEnableLengthCheck(BOOL bEnable = TRUE);
BOOL GetEnableLengthCheck();
BOOL SetBrushColour(VVEbrush brWhich, COLORREF NewColour);
COLORREF GetBrushColour(VVEbrush brWhich);
BOOL SetWindowValue(double fSetVal);
BOOL SetWindowValue(long lSetVal);
BOOL SetWindowValue(unsigned long lSetVal);
BOOL GetWindowValue(double &fVal);//returns FALSE if string is too large for double
BOOL GetWindowValue(long &lVal);//returns FALSE if string is too small/large for long
BOOL GetWindowValue(unsigned long &lVal);//returns FALSE if string is too large for ulong
BOOL GetAllCharEntry();
void SetAllCharEntry(BOOL bAllowAllCharsIn = TRUE);
BOOL GetEmptyValid();
void SetEmptyValid(BOOL bEmptyOK = TRUE);
void SetDisableValidation(BOOL bNoValidation = TRUE);
BOOL GetDisableValidation();
void SetCustomValidation(BOOL bUseCustom = TRUE);
BOOL GetCustomValidation();
void SetValidCharSet(VVEset vveset, LPCTSTR cstrCustomChar = NULL);//NULL = reset to default
void SetValidSet(VVEset vveset);
VVEset GetValidSet();
void SetValidChars(LPCTSTR cstrCustomChar);
void GetValidChars(CString & strValidChars);
void SetTextLenMinMax(int iMin = VVE_DEF_MINLEN, int iMax = VVE_DEF_MAXLEN);
int GetTextMinLen();
int GetTextMaxLen();
Public Enumerations
enum VVEbrush {BR_ERROR,
BR_EMPTY,
BR_VALID,
BR_INVALIDSYNTAX,
BR_INCOMPLETE,
BR_SHORT,
BR_LONG,
BR_RANGEERR,
BR_CUSTOM_ERR1,
BR_CUSTOM_ERR2};
//return constants – each has a matching brush
//(BR_INCOMPLETE, BR_SHORT, BR_LONG, BR_RANGEERR are same brush only context info changes).enum VVEset {SET_CUSTOM,
SET_ALLCHAR,
SET_ALPHANUM,
SET_ALPHA,
SET_DECIMAL,
SET_SDECIMAL, //Signed
SET_HEXADECIMAL,
SET_OCTAL,
SET_BINARY,
SET_FLOAT };
Notification Messages
UWM_VVE_DO_CUSTOMVALIDATION
- wParam – pointer to a notification message structure MNHDR (code contains enumerated value of current error brush see VVEbrush)
- lParam – const pointer to the widow text
- Return – Expected return is a constant of the VVEbrush enumeration
This message is sent to the parent when custom validation option is set & validation of the input is required. UWM_VVE_DO_CUSTOMVALIDATION can be intercepted by the inclusion of a MESSAGEMAP entry e.g. In your MESSAGEMAP
ON_MESSAGE(UWM_VVE_DO_CUSTOMVALIDATION, OnDoValidation)
In your *.h file
//}}AFX_MSG //below here
afx_msg LRESULT OnDoValidation(WPARAM wParam, LPARAM lParam);//add declaration here
DECLARE_MESSAGE_MAP() //above here
In your *.cpp file
LRESULT CValidatorDlg:: OnDoValidation(WPARAM wParam, LPARAM lParam)
{
//pointer to an NMHDR structure
LPNMHDR nm = (LPNMHDR) wParam;//pointer to const string (text in control)
CString s((LPCSTR) lParam);//regardless of idfrom, this routine says empty is empty
if(s. GetLength() == 0)
return (LRESULT) CVisValidEdit::BR_EMPTY”;//nm contains the idfrom & hwnd from of the control
// requesting validation.
switch(nm-> idFrom)
{
case IDC_SWEAR_WORD_INHIBITING_EDIT_BOX:
if(s.Find(“SHIT”))//Word not tolerated – return custom error 1
return CVisValidEdit::BR_CUSTOM_ERR1; //return error
case IDC_A_NAME_EDIT_BOX:
if(s.Find(“0123456789”) == -1)//No numbers in your name
return CVisValidEdit::BR_CUSTOM_ERR1; //return error
};
}
UWM_VVE_VALIDITY_CHANGED
- wParam – pointer to a notification message structure MNHDR (code contains enumerated value of current error brush see VVEbrush)
- lParam – The new valid state. 0 = Invalid, other = Valid
- Return – void (0)
This message is sent to the parent when the validity of the input changes state. This message is intended mainly for GUI updates, the new state can be used or retrieved & used to make changes in your application (Enable / disable data input buttons). You can make use of this notification by intercepting it in a MESSAGEMAP E.g.
In your MESSAGEMAP
ON_MESSAGE(UWM_VVE_VALIDITY_CHANGED, OnValidChanged)
In your *.h file
//}}AFX_MSG //below here
afx_msg LRESULT OnValidChanged(WPARAM wParam, LPARAM lParam);//add declaration here ok
DECLARE_MESSAGE_MAP() //above here
In your *.cpp file
afx_msg LRESULT OnValidChanged(WPARAM wParam, LPARAM lParam)
{
if(((LPNMHDR)wParam)->idfrom == IDOK )
OkButton.EnableWindow(lParam);
}
UWM_VVE_CONTENT_CHANGED
- wParam – pointer to a notification message structure MNHDR (code contains enumerated value of current error seeVVEbrush)
- lParam – The valid state. 0 = Invalid, other = Valid
- Return – void (0)
This message is posted to the parent when the contents of the control change. You can make use of this notification by intercepting it in a MESSAGEMAP E.g.
In your MESSAGEMAP
ON_MESSAGE(UWM_VVE_CONTENT_CHANGED, OnContentChanged)
In your *.h file
//}}AFX_MSG //below here
afx_msg LRESULT OnContentChanged(WPARAM wParam, LPARAM lParam);//add declaration here ok
DECLARE_MESSAGE_MAP() //above here
In your *.cpp file
afx_msg LRESULT OnContentChanged(WPARAM wParam, LPARAM lParam)
{
LPNMHDR pNM = (LPNMHDR)wParam;
if( pNM ->idfrom == IDC_NAME && pNM->code == CVisValidEdit::BR_EMPTY)
MessageBox(“You must enter your name”);
}
Downloads
Download source – 13 Kb
Download demo project – 28 Kb
Download complete documentation – 47 Kb
Date Posted : March 13 2001
Date Updated: April 2, 2001