Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Simple Developer
Simple Developer
압력 컨트롤에서 허용하는 문자를 제한하려면
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))
}