압력 컨트롤에서 허용하는 문자를 제한하려면
CEdit에서 클래스를 파생해 WM_CHAR 메시지를 처리하면 입력 컨트롤에서 특정 문자만 입력받을 수
있습니다. 우선 클래스위저드를 사용해 CEdit에서 파생된 클래스를 생성한 후 대화상자의 클래스에서
멤버 변수를 정의합니다. 그리고 OnInitDialog에서 CWnd::SubclassDlgItem을 호출해 입력 컨트롤을
서브 클래싱하면 됩니다.
//대화상자 클래스 선언문
Private :
CMyEdit m_wndEdit; //새로운 입력 컨트롤의 인스턴스
//대화상자 클래스 구현인 .CPP 파일
BOOL CSampleDialog::OnInitDialog(){
....
//입력 컨트롤을 서브 클래싱한다.
m_wndEdit.SubclassDlgItem(IDC_EDIT, this);
...
}
이젠 클래스위저드를 사용해 WM_CHAR 메시지를 처리하면 됩니다. 먼저 nChar 인수를 평가해 어떤
동작을 수행할 것인지 지정해야 하는데 선택에 따라 문자가 출력되지 않게, 또는 문자를 그대로
전달하거나 문자를 변경해 전달할 수 있습니다.
질문처럼 nChar를 숫자로 제한하고 싶다면 CWnd::OnChar에 전달하고, 그렇지 않다면
CWnd::OnChar를 호출하지 않으면 됩니다.
//숫자만 출력한다.
void CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {
//nChar가 숫자인지 확인한다.
if(IsCharAlphaNumeric(TCHAR)nChar) && !IsCharAlpha((TCHAR)nChar))
CEdit::OnChar(nChar, nRepCnt, nFlags);
더 나아가 문자를 변경하려면 변경된 nChar 인수만을 전달하면 되는데, 이때 절대 CEdite::OnChar를
호출해서는 안됩니다. 왜냐하면 CEdite::OnChar에서 wParam과 lParam을 처음 값으로 채우는
CWnd::Default를 부르기 때문입니다. 따라서 nChar를 변경하고 CWnd::DefWindowProc를
호출합니다. 방법은 다음과 같습니다.
//모든 문자를 대문자로 만든다.
void CMyedit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags){
//문자를 그대로 변환한다.
if (IsCharAlpha((TCHAR)nChar))
nChar = toupper(nChar);
//기본적인 OnChar 함수를 무시하고, 윈도우 기본 프로시저를 호출한다.
DefWindowProc(WM_CHAR, nChar, MAKEPARAM(nRepCnt,nFlags))
}