본문 바로가기
C & C++/MFC 컨트롤

[Edit] Edit & ComboBox 글자수 제한

by izen8 2011. 5. 4.
반응형

Edit Change 이벤트가 발생할때 (즉 사용자가 Control 에 입력을 시도 하였을때) 글자 수를 체크해서 강제로 입력을 제한해야되죠.
모르겠습니다. 다른 방법이 있는지는... 뭐 코딩이라는게 효율적인것이 아무리 좋다 한들, 퍼포먼스면에 크게 지장도 없는데 효율찾다가 수십수시간수일 날리는 것보단 아는 방법 선 내에서 처리하는게 좋다고 생각합니다.

물론 더 좋은 방법을 어쩌다 찾게되면 그게 바로 Lucky~~ ^_^ 아닐까요...

아래 소스를 보실때 유심히 봐야될 것이 바로 API 함수인 WideCharToMultiByte 입니다.
해당 함수는 유니코드(WideChar)를 아스키코드(MultiByte[AnsiString])으로 변환 시켜주는 함수인데요,
왜 사용하느냐 하면 CString 은 기본적으로 wchar_t 입니다.

본래 알파벳은 1byte, 한글을 2byte인데 모든 문자열을 2byte 취급하고 있는중이죠. 즉 GetLength를 했을때 '과자A' 라는 문자열의 글자 수는 3으로 나오게됩니다. 5가 나오면 좋겠는데 3이 나오면 난감하죠...

여기서는 WideCharToMultiByte 를 단지 글자 수를 원하는 결과로 받아오기 위해서 사용했지만, 실상은 Converting 하는데 있습니다 :) 참고해두세요~

아래는 예제 약식 소스입니다. (복사해서 써봐야 답안나와요~ 참고만 하세요)

TestDialog.h
  1. class CTestDialog : public CDialog   
  2. {   
  3.     DECLARE_DYNAMIC(CTestDialog)   
  4. public:   
  5.     ...   
  6.   
  7. protected:   
  8.     virtual void DoDataExchange(CDataExchange* pDX);   
  9.   
  10.     DECLARE_MESSAGE_MAP()   
  11.   
  12. public:   
  13.     CEdit m_editTest;   
  14.     CComboBox m_cbTest;   
  15.   
  16.     afx_msg void OnEnChangeEditTest();   
  17.     // EditControl Event Function   
  18.     afx_msg void OnCbnEditchangeComboTest();   
  19.     // ComboBox Event Function   
  20. }  


TestDialog.cpp
  1. #include "TestDialog.h"   
  2.   
  3. void CTestDialog::DoDataExchange(CDataExchange* pDX)   
  4. {   
  5.     CDialog::DoDataExchange(pDX);   
  6.     DDX_Control(pDX, IDC_EDIT_TEST, m_editTest);   
  7.     DDX_Control(pDX, IDC_COMBO_TESt, m_cbTest);   
  8. }   
  9.   
  10. BEGIN_MESSAGE_MAP(CTestDialog, CDialog)   
  11.     ON_EN_CHANGE(IDC_EDIT_TEST, &CTestDialog::OnEnChangeEditTest)   
  12.     // EditControl Event 연결   
  13.     ON_CBN_EDITCHANGE(IDC_COMBO_TEST, &CTestDialog::OnCbnEditchangeComboTest)   
  14.     // ComboBox Event 연결   
  15. END_MESSAGE_MAP()   
  16.   
  17. void CTestDialog::OnEnChangeEditTest()   
  18. {   
  19.     CString strText;   
  20.     m_editTest.GetWindowText(strText);   
  21.   
  22.     int nLength = WideCharToMultiByte(CP_ACP, 0, strText.GetBuffer(), strText.GetLength(), NULL, 0, NULL, NULL);   
  23.   
  24.     if(nLength > 10) // 10글자로 제한할 경우   
  25.     {   
  26.         // 초과 되었기 때문에 마지막에 입력한 글자를 제외해야 한다.   
  27.         CString strOutText = strText.Left(strText.GetLength() - 1);   
  28.         m_editTest.SetWindowText(strOutText);   
  29.         m_editTest.SetSel(strOutText.GetLength(), strOutText.GetLength());   
  30.     }   
  31.   
  32. }   
  33.   
  34. void CTestDialog::OnCbnEditchangeComboTest()   
  35. {   
  36.     CString strText;   
  37.     m_cbTest.GetWindowText(strText);   
  38.   
  39.     int nLength = WideCharToMultiByte(CP_ACP, 0, strText.GetBuffer(), strText.GetLength(), NULL, 0, NULL, NULL);   
  40.   
  41.     if(nLength > 10) // 10글자로 제한할 경우   
  42.     {   
  43.         // 초과 되었기 때문에 마지막에 입력한 글자를 제외해야 한다.   
  44.         CString strOutText = strText.Left(strText.GetLength() - 1);   
  45.         m_cbTest.SetWindowText(strOutText);   
  46.         m_cbTest.SetEditSel(strOutText.GetLength(), strOutText.GetLength());           
  47.     }   
  48. }  




수정 : 2009 09 04

있습니다....
SetLimitText 라는 함수가 있군요..

문제는 이 함수의 경우 유니코드 기반으로 글 수를 체크하다보니... 영문이나 숫자 5글자랑 한글 5글자랑 같은 취급합니다.

위 포스팅 내용은 AnsiString 기반으로 되어있구요.
뭐... AnsiString 기반으로 설정하는 함수도 있으려나요???
반응형

댓글