Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

codingfarm

7-4. 컨트롤 - 에디트 본문

Windows/윈도우즈 API

7-4. 컨트롤 - 에디트

scarecrow1992 2021. 12. 27. 14:45

0. 개요

문자열을 입력받을때 쓰이는 에디트

"edit" 윈도우 클래스를 사용하며 아래의 스타일들을 지정 가능하다.

스타일 설명
ES_AUTOHSCROLL 수평 스크롤을 지원한다.
ES_AUTOVSCROLL 여러줄 편집시 수직 스크롤을 지원한다.
ES_LEFT 왼쪽 정렬한다.
ES_CENTER 중앙 정렬한다.
ES_RIGHT 오른쪽 정렬한다.
ES_LOWERCASE 소문자로 변환하여 표시한다.
ES_UPPERCASE 대문자로 변환하여 표시한다.
ES_MULTILINE 여러줄을 편집할 수 있도록 한다.
ES_NOHIDESEL 포커스를 잃더라도 선택된 영역을 표시한다.
ES_READONLY 읽기전용으로 만들어 편집을 금지한다.

자세한 설명은 14장에서 진행

 

에디트는 자신에게 발생한 변화에 대해 부모 윈도우에게 아래와 같은 통보 메시지를 전달한다.

메시지 설명
EN_CHANGE 문자열이 변경되었다. 문자열 변경 후 화면에 출력되기 전 발생하는 메시지
EN_ERRSPACE 메모리가 부족하다.
EN_HSCROLL 사용자가 수평 스크롤 바를 클릭하였다.
EN_VSCROLL 사용자가 수직 스크롤 바를 클릭하였다.
EN_KILLFOCUS 포커스를 잃었다.
EN_SETFOCUS 포커스를 얻었다.
EN_MAXTEXT 지정한 문자열 길이를 초과하였다.
EN_UPDATE 문자열이 변경되기 직전이다. 문자열 변경 후 화면에 출력된 후 발생하는 메시지

EN_CHANGE와 EN_UPDATE의 차이에 주목

 

1. 사용 예

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <windows.h>
#include <tchar.h>
 
#define ID_EDIT 100
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("Menu");
 
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance
    , LPSTR lpszCmdParam, int nCmdShow)
{
    HWND hWnd;
    MSG Message;
    WNDCLASS WndClass;
    g_hInst = hInstance;
 
    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
    WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    WndClass.hInstance = hInstance;
    WndClass.lpfnWndProc = (WNDPROC)WndProc;
    WndClass.lpszClassName = lpszClass;
    WndClass.lpszMenuName = NULL;
    WndClass.style = CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&WndClass);
 
    hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, (HMENU)NULL, hInstance, NULL);
    ShowWindow(hWnd, nCmdShow);
    
    while (GetMessage(&Message, 000)) {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }
    return Message.wParam;
}
 
HWND hEdit;
char str[128];
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    switch(iMessage) {
    case WM_CREATE:
        hEdit=CreateWindow("edit",NULL,WS_CHILD | WS_VISIBLE | WS_BORDER | 
        ES_AUTOHSCROLL,10,10,200,25,hWnd,(HMENU)ID_EDIT,g_hInst,NULL);
        return 0;
    case WM_COMMAND:
        switch (LOWORD(wParam)) {
        case ID_EDIT:
            switch (HIWORD(wParam)) {
            case EN_CHANGE:
                GetWindowText(hEdit,str,128);
                SetWindowText(hWnd,str);
            }
        }
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
cs

사용법 자체는 크게 별것없다.

WM_CREATE 메시지 발생시 edit 컨트롤을 생성한다.

edit에서 문자열의 변경이 감지되면 ID_EDIT 통보 메시지가 발생한다.

여기서 GetWindowText를 통해 에디트(hEdit)에 입력된 문자열을 str에 저장한다.

그리고 SetWindowText를 통해 윈도우(hWnd)의 텍스트를 변경한다.

edit에 입력한 문자열이 윈도우의 이름에 그대로 반영되었음이 확인된다.

 

14장에서 보다 자세한 관리 방법에 대해 알아본다.

'Windows > 윈도우즈 API' 카테고리의 다른 글

7-7. 콤보 박스  (0) 2021.12.28
7-6. 컨트롤 - 리스트 박스  (0) 2021.12.27
7-3. 컨트롤 - 라디오 버튼  (0) 2021.12.27
7-2. 컨트롤 - 체크박스 버튼  (0) 2021.12.26
7-1. 컨트롤 - 버튼  (0) 2021.12.26
Comments