대부분의 컨트롤을 다룰 때 초기에는 별 필요성이 없다가, 이것 저것 기능을 처리할려다 보면 꼭 필요한
것들이 바로 이벤트를 핸들링 하는 일이다.
정확한 개념 이해를 위해서 MSDN의 원문을 첨가한다. 물론 딸려오는 한글 설명은 번역한 내용을 기술하는 것이 아니고, 그냥 정리된 개념을 서술하는 것이다.

에디트 컨트롤에 특화되어 제공되는 이벤트는 다음과 같이 8개가 있다.

1. EN_CHANGE
The EN_CHANGE notification message is sent when the user has taken an action that may have altered text in an edit control. Unlike the EN_UPDATE notification message, this notification message is sent after the system updates the screen. The parent window of the edit control receives this notification message through a WM_COMMAND message.

위 이벤트는 에디트 박스에서 데이터를 입력하거나 수정, 제거 등의 행동을 취하면 발생하는 이벤트이다.
이런걸 사용하는 이유는 방금 입력되거나 수정된 데이터가 올바른지, 혹은 어떤 정해논 범위의 캐릭터가 들어오는지, 아니면 범위를 초과하는지 등등등.. 변화에 민감하게 바로 바로 처리할 수 있도록 할 때 사용한다.

예를 들면 입력을 16진수로만 받아 들인다고 가정했을 때 입력 받을 수 있는 범위는
012345678ABCDEFX이다. 방금 입력된 값이 저 범위에 들어가지 않는다면 삑 소리를 내주거나 메시지 박스등을 뛰워 사용자로 부터 잘못된 입력이 있음을 경고해 줄 수도 있다.

2. EN_ERRSPACE
The EN_ERRSPACE notification message is sent when an edit control cannot allocate enough memory to meet a specific request. The parent window of the edit control receives this notification message through a WM_COMMAND message.

개발하면서 사실상 한번도 써본적이 없는 메시지이다. 에디트에 어떤 입력이 있을 경우 당연히 그것을 저장할 공간이 할당되어야 한다. 그런데 너무 많이 데이터를 넣어서 더이상 처리될 공간이 없을 때 발생하는 메시지이다. 요즘 윈도우에선 사실상 걸어놔도 걸릴지 의문이다 -_-;

3. EN_HSCROLL, EN_VSCROLL
The EN_HSCROLL notification message is sent when the user clicks an edit control's horizontal scroll bar. The parent window of the edit control receives this notification message through a WM_COMMAND message. The parent window is notified before the screen is updated.

데이터를 입력하면서 수평/수직 스크롤바에 크기 변경이 생기거나, 사용자가 에디트 박스의 수평/수직 스크롤바를 이동시키면 발생하는 이벤트이다. 이 이벤트 또한 사용자가 에디트 내부를 직접 건드리거나 하지 않는 이상 자주 사용되지 않는다. 샘플을 기준으로 간단하게 어떻게 저 정보를 이용하는지 코드를 적어본다.

void CSssDlg::OnHscrollEdit1()
{
    SCROLLINFO info;
    GetDlgItem(IDC_EDIT1)->GetScrollInfo(

SB_HORZorSB_VERTorSB_BOTH

, &info);
}
위와 같이 현재 에디트 컨트롤의 포인터를 얻어와서 GetScrollInfo에 인자를 채운후 호출하게 되면 info라는 구조체에 현재 스크롤바의 모든 정보가 들어오게 된다.

4. EN_SETFOCUS, EN_KILLFOCUS
The EN_SETFOCUS notification message is sent when an edit control receives the keyboard focus. The parent window of the edit control receives this notification message through a WM_COMMAND message.

사용자가 마우스나 TAB버튼을 이용하여, 에디트 컨트롤에 포커스가 갔을 경우나, 혹은 포커스가 있는 상태에서 다른 컨트롤등으로 포커스가 이동할 경우에 발생하는 이벤트이다. 요런걸 어떨 때 사용하냐면..
검색창등에 있는 에디트 컨트롤을 보면..
<검색어를 입력하세요> 라고 써있어서, 마우스로 콕 찍으면 저 문자열이 사라지고 글자를 입력할 수 있는 상태가 되는걸 본적이 있을 것이다. 기타 등등의 이유가 많겠지만..

5. EN_MAXTEXT
The EN_MAXTEXT notification message is sent when the current text insertion has exceeded the specified number of characters for the edit control. The text insertion has been truncated.

에디트 컨트롤을 변수로 연결할 하고 나서, 클래스 위저드를 열 은 후에..


IDC_EDIT1 을 m_data라고 하는 CString 변수에 연결 한 후.. Memver Variable 라는 탭을 열어 보면 현재 다얄로그 폼에 존재하는 컨트롤과 어떤 변수가 연결되어 있는지 쭈욱 항목이 나온다.
거기서 Maximum Characters : 라는 곳에 5라고 넣었다.
의미는 현재 에디트 IDC_EDIT1에는 최대 5개까지의 문자를 입력 받을 수 있도록 제한을 걸었다는 것이다.

저렇게 제한을 걸어 놓았을 경우 6번째 문자가 입력되면 EN_MAXTEXT이벤트가 발생하게 된다.
void CSssDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CSssDlg)
    DDX_Text(pDX, IDC_EDIT1, m_data);

    DDV_MaxChars(pDX, m_data, 5);


    //}}AFX_DATA_MAP
}
라고 추가되는 것이 보일 것이다.
개념을 다시 되 집어 보면, 저걸 직접 손으로 코딩해도 하등 문제가 없다는 이야기이다.
DoDataExchange 에 변수와 컨트롤을 연결하는 DDX_ , DDV_ 계열의 매크로는 상당히 다양하지만 현재 그렇게 까지 자세하게 설명하진 않을 것이다. [궁금하면 콕 찍은 다음 F12를 눌러 보아라]

6. EN_UPDATE
The EN_UPDATE notification message is sent when an edit control is about to redraw itself. This notification message is sent after the control has formatted the text, but before it displays the text. This makes it possible to resize the edit control window, if necessary. The parent window of the edit control receives this notification message through a WM_COMMAND message.

이 이벤트는 에디트 컨트롤을 다시 그려야할 필요가 있는 모든 경우에 발생하는 이벤트이다. EN_CHANGE는 문자열에 대한 변과하 있을 때만 발생하지만, 컨트롤의 크기가 변경된다던가 스타일을 바꾼다던가.. 외관상 및 내부 데이터가 바뀔 때 모두 발생한다는 점이 다르다..

아래 그림은 예제 샘플의 화면이다. 위에 나온 내용중에 몇가지를 구현하여 보았다.

16.zip
0.04MB

+ Recent posts