【VC++】エディットボックスに半角英数のみ入力できるようにする
<機能>
(1)入力は半角英数のみ、文字数の上限チェックをクラスで実装する
(2)OnEnChangeで半角英数チェックを行う
(3)OnKeyDownで入力文字数の上限チェックを行う
(4)入力制限クラスを複数のエディットボックスに適用する
<実行イメージ>
半角英数チェックと文字数の上限チェックを行う
<動作検証&開発環境>
Visual Studio Community 2017
<使い方>
1.ダイアログベースでMFCApplication1プロジェクトを作成します
2.クラスウィザードでMFCクラスを追加します
基底クラスに「CEdit」を選択
クラス名を「CEditTest」とします
3.クラスウィザードでCEditTestクラスに下記イベントを追加します
OnEnChange : このイベントで半角英数チェックを行います
OnKeyDown : このイベントで上限文字数チェックを行います
4.IDD_MFCAPPLICATION1_DIALOGにエディットボックスを2つ追加します
5.追加したエディットボックスにそれぞれメンバ変数を追加します
・コントロール変数にチェック
・カテゴリ:Control
・変数の種類:CEditTest(CEditTestクラスの変数とする)
・変数名はそれぞれm_Edit1 、 m_Edit2 とします
6.ソースを追加してください
CEditTest.h
class CEditTest : public CEdit
{
DECLARE_DYNAMIC(CEditTest)
{
DECLARE_DYNAMIC(CEditTest)
public:
CEditTest();
virtual ~CEditTest();
CEditTest();
virtual ~CEditTest();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnEnChange();
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
};
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()
ON_CONTROL_REFLECT(EN_CHANGE, &CEditTest::OnEnChange)
ON_WM_KEYDOWN()
END_MESSAGE_MAP()
/***********************************************************
OnEnChange
エディットコントロールの内容を変更したイベントハンドラ
半角英数以外の入力があった場合は文字を削除する
***********************************************************/
void CEditTest::OnEnChange()
{
CString cs;
this->GetWindowText(cs);
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);
}
}
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());
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;
if (cs.GetLength() == iLimit) return;
CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}
}
MFCApplication1Dlg.h
#pragma once
#include "CEditTest.h"
#include "CEditTest.h"
class CMFCApplication1Dlg : public CDialog
{
//〜〜省略〜〜
{
//〜〜省略〜〜
private:
CEditTest m_Edit1;
CEditTest m_Edit2;
};
CEditTest m_Edit1;
CEditTest m_Edit2;
};
MFCApplication1Dlg.cpp
BOOL CMFCApplication1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
{
CDialog::OnInitDialog();
//〜〜省略〜〜
// このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、
// Framework は、この設定を自動的に行います。
SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定
SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定
// Framework は、この設定を自動的に行います。
SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定
SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定
//リミットを設定
m_Edit1.SetLimitText(10);
m_Edit2.SetLimitText(5);
m_Edit1.SetLimitText(10);
m_Edit2.SetLimitText(5);
return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}
}
よろしければポチッと押してください