65.9K
CodeProject is changing. Read more.
Home

Masked Edit Control

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.40/5 (10 votes)

Jan 31, 2000

viewsIcon

202027

downloadIcon

7311

A masked edit control that provides restricted, formatted and cued data input and validation

  •  Download demo project - 33 Kb
  •  Download source files - 14 Kb
  •  Download self-extracting installer - 488 Kb

    Sample Image - maskededit.gif

    Introduction

    Ultimate Toolbox includes a wide array of MFC extensions that enhance various user interface controls. COXMaskedEdit is one of several Ultimate Toolbox edit controls that extend the MFC's CEdit class. We are making it freely available to developers with the same licencing terms that would apply had they purchased the toolkit.

    Overview

    The COXMaskedEdit control extends the MFC CEdit control to provide restricted data input with visual cues, formatted data output, overtype capability, and a validation framework.

    You can use COXMaskedEdit anywhere you would use a CEdit class. If no input mask is set, it will behave like a standard CEdit.

    If you define an input mask, each character position in the Masked Edit control maps to either a placeholder of a specified type or a literal character<.

    The input mask prevents you from entering invalid characters into the control. If you attempt to enter a character that conflicts with the input mask, the control generates a ValidationError beep.

    The insertion point automatically skips over literals as you enter data or move the insertion point.

    When you insert or delete a character, all nonliteral characters to the right of the insertion point are shifted, as necessary. If shifting these characters leads to a validation error, the insertion or deletion is prevented, and a ValidationError beep is triggered.

    For example, suppose the Mask property is defined as "?###", and the current value of the Text property is "A12". If you attempt to insert the letter "B" to the left of the letter "A", the "A" would shift to the right. Since the second value of the input mask requires a number, the letter "A" would cause the control to generate a ValidationError beep.

    The Masked Edit control also validates the parameter value of the SetInputText function the user passes at run time. If you use the SetInputText function so that it conflicts with the input mask, the function will return an errorcode.

    You may select text in the same way as for a standard text box control. When selected text is deleted, the control attempts to shift the remaining characters to the right of the selection. However, any remaining character that might cause a validation error during this shift is deleted, and no ValidationError beep is generated.

    Normally, when a selection in the Masked Edit control is copied onto the Clipboard, the entire selection, including literals, is transferred onto the Clipboard. You can use the SetClipMode function to define the behavior for transferring only user-entered data onto the Clipboard or not - literal characters that are part of the input mask are not copied.

    Using COXMaskedEdit

    You can attach a COXMaskedEdit to an existing edit control by subclassing the latter.

    This is remarkably simple to do in the DevStudio IDE when working with an MFC dialog.

    Place a standard edit control on the dialog using the dialog editor. Invoke the Class Wizard and select the Member Variables page. Add a member variable for the ID of the edit control, selecting a CEdit control as the type.

    Next, open the header file for the dialog. Include OXMaskedEdit.h.

    In the AFX_DATA section for the dialog you will see the declaration for the edit control as a CEdit. Change this to COXMaskedEdit (or a class derived from COXMaskedEdit) and viola!

    Typically you will call SetMask and SetPromptSymbol on the control in OnInitDialog to set up your particular mask etc.

    Note that you won't need to call Create in this scenario.

    Don't forget to include the OXMaskedEdit.cpp file in your project!

    Depending on the order of compilation you may also find if helpful to include OXMaskedEdit.h in the dialog and/or main application .cpp file of your project.

    Input Masks

    These are the characters you can use to set the mask:

      . (period)

    Decimal placeholder. The actual character used is the one specified as the decimal placeholder in your international settings. This character is treated as a literal for masking purposes.

     

      , (comma)

    Thousands separator. The actual character used is the one specified as the thousands separator in your international settings. This character is treated as a literal for masking purposes.

     

      : (colon)

    Time separator. The actual character used is the one specified as the time separator in your international settings. This character is treated as a literal for masking purposes.

     

      / (slash)

     Date separator. The actual character used is the one specified as the date separator in your international settings. This character is treated as a literal for masking purposes.

     

      #

    Digit placeholder. (0-9)

     

      A

    Alphanumeric character placeholder (0-9 and a-Z)

     

      ?

    Alphabetic placeholder (a-Z)

     

      >

    Alphabetic placeholder, but forces uppercase chars (A-Z)

     

      <

    Alphabetic placeholder, but forces them to lowercase (a-z)

     

      &

    Character placeholder. Valid values for this placeholder are ANSI characters in the following ranges: 32-126 and 128-255.

     

      \

    Literal escape. Use this to place your own literals in the mask - note that two backslashes must be used in string literals to accomodate for the fact that this is also treated as an escape character for ASNI/ISO string formatting.

    As an example, lets look at a string to mask an IP address:

    "IP \\Address: ###\\.###\\.###\\.###"

    This will appear as:

    IP Address: ___.___.___.___

    Assuming that the placeholder or 'prompt' symbol has been set to the underscore.

    Note that we needed to use the escape character to enable both the 'A' in Address and the periods to show as literals.

    To display the string 'http:// ' we would have to use the escape char for the colon and slashes:

    "http\\:\\/\\/ "

    To display a backslash as a literal, we need to escape the escape, as in "c:\\\\AAAAAAAA\\.AAA"