04-26 06:21
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[C/C++] MFC / Edit Control에서 알파벳과 숫자만 허용하기 본문

Programming/C&C++

[C/C++] MFC / Edit Control에서 알파벳과 숫자만 허용하기

cinema4dr12 2014. 7. 10. 13:58

이번 글에서는 Edit Control에서 알파벳과 숫자만 허용되도록 하는 방법에 대하여 알아보도록 하겠다.

만약 Edit Control에 특수문자 혹은 한글이 입력될 경우 관련 메시지를 출력하고 해당 문자를 삭제하도록 기능을 구현하였다.

다이얼로그를 하나 만들고 Edit Control을 가져오고 이에 대해 다음과 같이 CString형 변수와 컨트롤 변수를 추가하였다:


CString m_strTmp;
CEdit m_editCtrl;



[방법 1.] IsCharAlphaNumeric 함수 활용하기

Edit Control에 대하여 EN_UPDATE에 대한 이벤트 처리 함수를 다음과 같이 구현한다:

// Edit Control 박스로부터 데이터 가져옴
UpdateData( TRUE );

TCHAR* tchr;
CString str = _T("");
int i;

// 현재 Edit Control 박스에 입력된 문자에 대하여
for(i = 0 ; i < m_strTmp.GetLength() ; i++) {
	// Edit Control의 멤버변수인 CString 문자열 m_strTmp의 i번째 문자열 추출
	str = m_strTmp.Mid(i,1);
	// 문자열을 문자로 변환
	tchr = (TCHAR*)(LPCTSTR)str;

	if(!IsCharAlphaNumericA(*tchr)) { // 만약 m_strTmp의 i번째 문자열이 숫자나 알파벳이 아니라면
		// 숫자나 문자만 허용된다는 메시지 출력
		AfxMessageBox(_T("Only alphabet or number"));
		// m_strTmp로부터 해당 문자열 삭제
		m_strTmp.Remove(*tchr);
	}
}

// 업데이트 된 m_strTmp 변수를 Edit Control로 전송
UpdateData( FALSE );
// 문자열의 문자를 모두 선택하고
m_editCtrl.SetSel(0,-1);
// 커서를 마지막 문자열 다음으로 이동
m_editCtrl.SetSel(-1, -1);



[방법 2.] ASCII 값 활용하기

Edit Control에 대하여 EN_UPDATE에 대한 이벤트 처리 함수를 다음과 같이 구현한다:

// Edit Control 박스로부터 데이터 가져옴
UpdateData( TRUE );

TCHAR* tchr;
CString str = _T("");
int i;


// 현재 Edit Control 박스에 입력된 문자에 대하여
for(i = 0 ; i < m_strTmp.GetLength() ; i++) {
	// Edit Control의 멤버변수인 CString 문자열 m_strTmp의 i번째 문자열 추출
	str = m_strTmp.Mid(i,1);
	// 문자열을 문자로 변환
	tchr = (TCHAR*)(LPCTSTR)str;

	int asc = 0;

	// 문자를 ASCII 값으로 변환
	asc = __toascii(*tchr);
	// 해당 문자가 알파벳이나 숫자가 아닌 경우
	if(!( (asc > 47 & asc < 58) | (asc > 64 & asc < 91) | (asc > 96 & asc < 123) )) {
		// 숫자나 문자만 허용된다는 메시지 출력
		// m_strTmp로부터 해당 문자열 삭제
		AfxMessageBox(_T("Not Allowed"));
		m_strTmp.Remove(*tchr);
	}
}

// 업데이트 된 m_strTmp 변수를 Edit Control로 전송
UpdateData( FALSE );
// 문자열의 문자를 모두 선택하고
m_editCtrl.SetSel(0,-1);
// 커서를 마지막 문자열 다음으로 이동
m_editCtrl.SetSel(-1, -1);



[방법 1-1.] IsCharAlphaNumeric 함수 활용하기

[방법 1.]과 유사하지만 CString형 변수없이 CEdit 컨트롤 변수만을 활용하여 Edit Control 박스의 데이터를 가져오거나 업데이트 한다.

우선 Edit Control의 컨트롤 변수인 CEdit형 변수 m_editCtrl에 대하여 다음과 같이 DoDataExchange 함수에 맵핑되어 있다:


DDX_Control(pDX, IDC_EDIT1, m_editCtrl);


OnEnUpdateEdit1 함수에 다음과 같이 코드를 작성한다:

UpdateData( TRUE );

TCHAR* tchr;
CString str = _T("");
int i;

CString strTest;
m_aa.GetWindowText(strTest);

for(i = 0 ; i < strTest.GetLength() ; i++) {
	str = strTest.Mid(i,1);
	tchr = (TCHAR*)(LPCTSTR)str;

	if(!IsCharAlphaNumericA(*tchr)) {
		AfxMessageBox(_T("Either alphabet or number"));
		strTest.Remove(*tchr);
		m_aa.SetWindowTextW(strTest);
	}
}

UpdateData( FALSE );

m_aa.SetSel(0,-1);
m_aa.SetSel(-1, -1);



[참고] ASCII 테이블



Comments