반응형
Edit Change 이벤트가 발생할때 (즉 사용자가 Control 에 입력을 시도 하였을때) 글자 수를 체크해서 강제로 입력을 제한해야되죠.
모르겠습니다. 다른 방법이 있는지는... 뭐 코딩이라는게 효율적인것이 아무리 좋다 한들, 퍼포먼스면에 크게 지장도 없는데 효율찾다가 수십수시간수일 날리는 것보단 아는 방법 선 내에서 처리하는게 좋다고 생각합니다.
물론 더 좋은 방법을 어쩌다 찾게되면 그게 바로 Lucky~~ ^_^ 아닐까요...
아래 소스를 보실때 유심히 봐야될 것이 바로 API 함수인 WideCharToMultiByte 입니다.
해당 함수는 유니코드(WideChar)를 아스키코드(MultiByte[AnsiString])으로 변환 시켜주는 함수인데요,
왜 사용하느냐 하면 CString 은 기본적으로 wchar_t 입니다.
본래 알파벳은 1byte, 한글을 2byte인데 모든 문자열을 2byte 취급하고 있는중이죠. 즉 GetLength를 했을때 '과자A' 라는 문자열의 글자 수는 3으로 나오게됩니다. 5가 나오면 좋겠는데 3이 나오면 난감하죠...
여기서는 WideCharToMultiByte 를 단지 글자 수를 원하는 결과로 받아오기 위해서 사용했지만, 실상은 Converting 하는데 있습니다 :) 참고해두세요~
아래는 예제 약식 소스입니다. (복사해서 써봐야 답안나와요~ 참고만 하세요)
TestDialog.h
- class CTestDialog : public CDialog
- {
- DECLARE_DYNAMIC(CTestDialog)
- public:
- ...
- protected:
- virtual void DoDataExchange(CDataExchange* pDX);
- DECLARE_MESSAGE_MAP()
- public:
- CEdit m_editTest;
- CComboBox m_cbTest;
- afx_msg void OnEnChangeEditTest();
- // EditControl Event Function
- afx_msg void OnCbnEditchangeComboTest();
- // ComboBox Event Function
- }
TestDialog.cpp
- #include "TestDialog.h"
- void CTestDialog::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- DDX_Control(pDX, IDC_EDIT_TEST, m_editTest);
- DDX_Control(pDX, IDC_COMBO_TESt, m_cbTest);
- }
- BEGIN_MESSAGE_MAP(CTestDialog, CDialog)
- ON_EN_CHANGE(IDC_EDIT_TEST, &CTestDialog::OnEnChangeEditTest)
- // EditControl Event 연결
- ON_CBN_EDITCHANGE(IDC_COMBO_TEST, &CTestDialog::OnCbnEditchangeComboTest)
- // ComboBox Event 연결
- END_MESSAGE_MAP()
- void CTestDialog::OnEnChangeEditTest()
- {
- CString strText;
- m_editTest.GetWindowText(strText);
- int nLength = WideCharToMultiByte(CP_ACP, 0, strText.GetBuffer(), strText.GetLength(), NULL, 0, NULL, NULL);
- if(nLength > 10) // 10글자로 제한할 경우
- {
- // 초과 되었기 때문에 마지막에 입력한 글자를 제외해야 한다.
- CString strOutText = strText.Left(strText.GetLength() - 1);
- m_editTest.SetWindowText(strOutText);
- m_editTest.SetSel(strOutText.GetLength(), strOutText.GetLength());
- }
- }
- void CTestDialog::OnCbnEditchangeComboTest()
- {
- CString strText;
- m_cbTest.GetWindowText(strText);
- int nLength = WideCharToMultiByte(CP_ACP, 0, strText.GetBuffer(), strText.GetLength(), NULL, 0, NULL, NULL);
- if(nLength > 10) // 10글자로 제한할 경우
- {
- // 초과 되었기 때문에 마지막에 입력한 글자를 제외해야 한다.
- CString strOutText = strText.Left(strText.GetLength() - 1);
- m_cbTest.SetWindowText(strOutText);
- m_cbTest.SetEditSel(strOutText.GetLength(), strOutText.GetLength());
- }
- }
수정 : 2009 09 04
있습니다....
SetLimitText 라는 함수가 있군요..
문제는 이 함수의 경우 유니코드 기반으로 글 수를 체크하다보니... 영문이나 숫자 5글자랑 한글 5글자랑 같은 취급합니다.
위 포스팅 내용은 AnsiString 기반으로 되어있구요.
뭐... AnsiString 기반으로 설정하는 함수도 있으려나요???
반응형
'C & C++ > MFC 컨트롤' 카테고리의 다른 글
[ToolTip] 동적 툴팁 (0) | 2011.05.21 |
---|---|
[Ctrl] Checkbox 사용법 (0) | 2011.05.20 |
[List] List 컨트롤 원하는 항목 수정 (0) | 2011.05.04 |
[List] List 컨트롤에 비트맵 이미지 셋팅 (0) | 2011.05.04 |
[List] List 컨트롤에 ComboBox 사용하기 (0) | 2011.05.04 |
댓글