【VC++】エディットボックスに半角英数のみ入力できるようにする

0

    <機能>

    (1)入力は半角英数のみ、文字数の上限チェックをクラスで実装する

    (2)OnEnChangeで半角英数チェックを行う

    (3)OnKeyDownで入力文字数の上限チェックを行う

    (4)入力制限クラスを複数のエディットボックスに適用する

     

    <実行イメージ>

    半角英数チェックと文字数の上限チェックを行う

    VisualStudio,MFC,VC++,半角英数,入力チェック,クラス,
     

    <動作検証&開発環境>

    Visual Studio Community 2017

     

    <使い方>

    1.ダイアログベースでMFCApplication1プロジェクトを作成します

    VisualStudio,MFC,VC++,アプリケーションの種類,

    2.クラスウィザードでMFCクラスを追加します

    VisualStudio,MFC,VC++,クラスウィザード,
     

    基底クラスに「CEdit」を選択

    クラス名を「CEditTest」とします

    VisualStudio,MFC,VC++,クラスウィザード,クラス追加,
     

    3.クラスウィザードでCEditTestクラスに下記イベントを追加します

    OnEnChange : このイベントで半角英数チェックを行います

    OnKeyDown : このイベントで上限文字数チェックを行います

    VisualStudio,MFC,VC++,イベント,OnEnChange,OnKeyDown,
     

    4.IDD_MFCAPPLICATION1_DIALOGにエディットボックスを2つ追加します

    VisualStudio,MFC,VC++,Edit,
     

    5.追加したエディットボックスにそれぞれメンバ変数を追加します

    ・コントロール変数にチェック

    ・カテゴリ:Control

    ・変数の種類:CEditTest(CEditTestクラスの変数とする)

    ・変数名はそれぞれm_Edit1 、 m_Edit2 とします

    VisualStudio,MFC,VC++,メンバ変数の追加ウィザード,

     

    6.ソースを追加してください

     

    CEditTest.h

    class CEditTest : public CEdit
    {
        DECLARE_DYNAMIC(CEditTest)
    public:
        CEditTest();
        virtual ~CEditTest();
    protected:
        DECLARE_MESSAGE_MAP()
    public:
        afx_msg void OnEnChange();
        afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
    };

     

    CEditTest.cpp

    BEGIN_MESSAGE_MAP(CEditTest, CEdit)
        ON_CONTROL_REFLECT(EN_CHANGE, &CEditTest::OnEnChange)
        ON_WM_KEYDOWN()
    END_MESSAGE_MAP()

    /***********************************************************
    OnEnChange
    エディットコントロールの内容を変更したイベントハンドラ
    半角英数以外の入力があった場合は文字を削除する
    ***********************************************************/

    void CEditTest::OnEnChange()
    {
        CString cs;
        this->GetWindowText(cs);
        //数値チェックを行う
        CString csChk = cs.SpanIncluding(_T("abcdefghujklmnopqrstuvwxyz ¥
                                            ABCDEFGHIJKLMNOPQRSTUVWXYZ ¥
                                            0123456789"));
        //半角英数以外が混ざっていたら取り除いて設定する
        if (csChk != cs) {
            TRACE(L"<<Error>> 半角英数以外が混ざっていました [%s]¥r¥n", cs);
            //半角英数以外の文字を取り除く
            int ichi = csChk.GetLength();
            cs.Replace(cs.Mid(ichi,1),L"");
            this->SetWindowText(cs);
        }
    }

    /***********************************************************
    OnKeyDown
    システムキー以外のキーが押下されたイベントハンドラ
    入力文字数が入力条件を超えていないかチェック
    ***********************************************************/

    void CEditTest::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
        CString cs;
        //入力上限バイト数を取得
        int iLimit = this->GetLimitText();
        //入力済み文字列を取得
        this->GetWindowText(cs);
        TRACE(L"text=[%s] limit/nowlength=%d/%d¥r¥n",cs,iLimit,cs.GetLength());
        //既に入力上限に達しているときは何もしない
        if (cs.GetLength() == iLimit) return;
        CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
    }

     

    MFCApplication1Dlg.h

    #pragma once
    #include "CEditTest.h"
    class CMFCApplication1Dlg : public CDialog
    {
        //〜〜省略〜〜
    private:
        CEditTest m_Edit1;
        CEditTest m_Edit2;
    };

     

    MFCApplication1Dlg.cpp

    BOOL CMFCApplication1Dlg::OnInitDialog()
    {
        CDialog::OnInitDialog();
        //〜〜省略〜〜

        // このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、
        //  Framework は、この設定を自動的に行います。
        SetIcon(m_hIcon, TRUE);   // 大きいアイコンの設定
        SetIcon(m_hIcon, FALSE);  // 小さいアイコンの設定
        //リミットを設定
        m_Edit1.SetLimitText(10);
        m_Edit2.SetLimitText(5);
        return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
    }

    よろしければポチッと押してください

    プログラマー ブログランキングへ



    selected entries

    categories

    calendar

    S M T W T F S
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
    << December 2018 >>

    profile

    others

    archives