컨트롤 텍스트 작업 편집

시스템은 사용자가 시작한 모든 텍스트 작업을 자동으로 처리하고 작업이 완료되면 애플리케이션에 알립니다.

다음 항목에서는 사용자가 시작한 텍스트 작업 및 애플리케이션의 응답에 대해 설명합니다.

편집 컨트롤 선택

사용자는 편집 컨트롤을 마우스로 클릭하여 선택하거나 TAB 키를 눌러 이동할 수 있습니다. 탭 메서드는 시스템에서 제공하는 미리 정의된 키보드 인터페이스의 일부입니다. 이 인터페이스에 대한 자세한 설명은 대화 상자를 참조하세요. 사용자가 편집 컨트롤을 선택하면 시스템에서 키보드 포커스를 컨트롤에 제공하고(키보드 입력 정보에서 "키보드 포커스 및 활성화" 참조) 역방향 비디오를 사용하여 텍스트를 강조 표시합니다.

텍스트 설정 및 검색

애플리케이션은 SetWindowText 함수, SetDlgItemText 함수를 사용하거나 컨트롤에 WM_SETTEXT 메시지를 전송하여 편집 컨트롤의 텍스트를 설정할 수 있습니다.

편집 컨트롤에서 모든 텍스트를 검색하려면 먼저 GetWindowTextLength 함수 또는 WM_GETTEXTLENGTH 메시지를 사용하여 텍스트를 포함하는 데 필요한 버퍼 크기를 확인합니다. 다음으로 GetWindowText 함수, GetDlgItemText 함수 또는 WM_GETTEXT 메시지를 사용하여 텍스트를 검색합니다.

텍스트 선택

편집 컨트롤을 선택한 후 사용자는 마우스 또는 키보드를 사용하여 컨트롤에서 텍스트를 선택할 수 있습니다. 애플리케이션은 컨트롤에 EM_GETSEL 메시지를 전송하여 편집 컨트롤에서 현재 선택 영역의 시작 및 종료 문자 위치를 검색할 수 있습니다. 종료 위치의 반환 값은 선택 영역의 마지막 문자(즉, 마지막으로 선택한 문자 다음에 오는 첫 번째 문자의 위치)보다 큰 값입니다.

애플리케이션은 선택 영역의 시작 및 종료 문자 인덱스가 있는 EM_SETSEL 메시지를 컨트롤에 전송하여 편집 컨트롤에서 텍스트를 선택할 수도 있습니다. 예를 들어 애플리케이션은 EM_REPLACESEL과 함께 EM_SETSEL을 사용하여 편집 컨트롤에서 텍스트를 삭제할 수 있습니다.

이러한 세 메시지는 한 줄 및 여러 줄 편집 컨트롤 모두에 적용됩니다.

텍스트 바꾸기

애플리케이션은 컨트롤에 EM_REPLACESEL 메시지를 대체 텍스트에 대한 포인터로 전송하여 편집 컨트롤에서 선택한 텍스트를 바꿀 수 있습니다. 현재 선택 영역이 없는 경우 EM_REPLACESEL은 삽입 지점에 대체 텍스트를 삽입합니다. 대체 텍스트가 사용 가능한 메모리를 초과하는 경우 애플리케이션에서 EN_ERRSPACE 알림 코드를 받을 수 있습니다. 이 메시지는 한 줄 및 여러 줄 편집 컨트롤 모두에 적용됩니다.

애플리케이션은 EM_REPLACESEL을 사용하여 편집 컨트롤의 텍스트 또는 SetDlgItemText 함수의 일부를 대체하여 모든 항목을 바꿀 수 있습니다.

편집 컨트롤에서 사용하는 글꼴 변경

애플리케이션은 WM_SETFONT 메시지를 보내 편집 컨트롤에서 사용하는 글꼴을 변경할 수 있습니다. 대부분의 애플리케이션은 WM_INITDIALOG 메시지를 처리하는 동안 이 작업을 수행합니다. 글꼴을 변경해도 편집 컨트롤의 크기는 변경되지 않습니다. WM_SETFONT 메시지를 보내는 애플리케이션은 텍스트의 글꼴 메트릭을 검색하고 편집 컨트롤의 크기를 다시 계산해야 할 수 있습니다. 글꼴 및 글꼴 메트릭에 대한 자세한 내용은 글꼴 및 텍스트를 참조하세요.

잘라내기 복사 붙여넣기 및 지우기 작업

편집 컨트롤과 클립보드 간에 텍스트를 이동하기 위한 4개의 메시지가 있습니다. WM_COPY 메시지는 편집 컨트롤에서 삭제하지 않고 편집 컨트롤의 현재 선택 영역(있는 경우)을 클립보드로 복사합니다. WM_CUT 메시지는 편집 컨트롤에서 현재 선택 영역(있는 경우)을 삭제하고 삭제된 텍스트를 클립보드에 복사합니다. WM_CLEAR 메시지는 편집 컨트롤에서 현재 선택 영역(있는 경우)을 삭제하지만 사용자가 SHIFT 키를 누르지 않는 한 클립보드에 복사하지 않습니다. WM_PASTE 메시지는 클립보드의 텍스트를 삽입 지점의 편집 컨트롤로 복사합니다. 이러한 4개의 메시지는 한 줄 및 여러 줄 편집 컨트롤 모두에 적용됩니다.

Microsoft Windows NT 4.0 이상: 편집 컨트롤에는 사용자가 편집 컨트롤과 클립보드 간에 텍스트를 쉽게 이동할 수 있는 상황에 맞는 기본 메뉴가 포함되어 있습니다. 사용자가 컨트롤을 마우스 오른쪽 단추로 클릭하면 상황에 맞는 메뉴가 나타납니다. 상황에 맞는 메뉴의 명령에는 실행 취소, 잘라내기, 복사, 붙여넣기, 삭제모두 선택이 포함됩니다.

텍스트 수정

사용자는 편집 컨트롤에서 텍스트를 선택, 삭제 또는 이동할 수 있습니다. 시스템은 컨트롤의 콘텐츠가 수정되었는지 여부를 나타내는 각 편집 컨트롤에 대한 내부 플래그를 유지 관리합니다. 시스템은 컨트롤을 만들 때 이 플래그를 지우고 컨트롤의 텍스트가 수정될 때마다 플래그를 설정합니다. 애플리케이션은 컨트롤에 EM_GETMODIFY 메시지를 전송하여 수정 플래그를 검색할 수 있습니다. 그런 다음, 애플리케이션은 컨트롤에 EM_SETMODIFY 메시지를 전송하여 수정 플래그를 설정하거나 지울 수 있습니다. 이러한 메시지는 한 줄 및 여러 줄 편집 컨트롤 모두에 적용됩니다.

사용자 입력 텍스트 제한

사용자가 편집 컨트롤에 입력할 수 있는 텍스트의 양에 대한 기본 제한은 32KB입니다. 애플리케이션은 컨트롤에 EM_SETLIMITTEXT 메시지를 전송하여 기본 제한을 변경할 수 있습니다. 이 메시지는 사용자가 편집 컨트롤에 입력할 수 있는 바이트 수로 하드 제한을 설정하지만 메시지를 보낼 때 컨트롤에 이미 있는 텍스트나 SetDlgItemText 함수 또는 WM_SETTEXT 메시지에 의해 컨트롤에 복사된 텍스트에는 영향을 미치지 않습니다. 예를 들어 애플리케이션이 SetDlgItemText 함수를 사용하여 편집 컨트롤에 500바이트를 배치하고 사용자가 500바이트(총 1,000바이트)를 입력한다고 가정합니다. 애플리케이션이 사용자 입력 텍스트를 300바이트로 제한하는 EM_SETLIMITTEXT 메시지를 보내는 경우 편집 컨트롤에 이미 있는 1,000바이트가 그대로 유지되며 사용자는 더 이상 텍스트를 추가할 수 없습니다. 반면, 애플리케이션이 사용자 입력 텍스트를 1,300바이트로 제한하는 EM_SETLIMITTEXT 메시지를 보내는 경우 1,000바이트가 그대로 유지되면서 300바이트를 더 추가할 수 있습니다.

사용자가 편집 컨트롤의 문자 제한에 도달하면 시스템은 애플리케이션에 EN_MAXTEXT 알림 코드가 포함된 WM_COMMAND 메시지를 보냅니다. 이 알림 코드는 메모리가 소진되었음을 의미하지는 않지만 사용자 입력 텍스트에 대한 제한에 도달했음을 의미하며, 사용자는 더 이상 텍스트를 입력할 수 없습니다. 이 제한을 변경하려면 애플리케이션이 컨트롤에 더 높은 제한이 있는 새 EM_SETLIMITTEXT 메시지를 보내야 합니다.

EM_SETLIMITTEXTEN_MAXTEXT를 사용하는 한 예로, 애플리케이션이 편집 컨트롤에서 사용자 입력 텍스트를 4자 이하로 제한해야 한다고 가정합니다. 애플리케이션은 EM_SETLIMITTEXT를 사용하여 4자 제한을 지정합니다. 사용자가 다섯 번째 문자를 입력하려고 하면 시스템에서 애플리케이션에 EN_MAXTEXT 알림 코드를 보냅니다.

문자 및 줄 작업

편집 컨트롤의 문자 및 줄에 대한 정보를 반환하는 여러 메시지가 있습니다. 대부분의 메시지는 문자 또는 줄을 참조하기 위해 인덱스(일반적으로 0부터 시작하는 숫자)를 반환합니다. 예를 들어 n자를 포함하는 한 줄 편집 컨트롤에서 줄 인덱스는 0이고 문자는 0에서 n-1로 인덱싱됩니다. m 줄과 n자를 포함하는 여러 줄 편집 컨트롤에서 줄은 0에서 m-1로 인덱싱되고 문자는 0에서 n-1로 인덱싱됩니다. 문자 인덱싱은 줄 바꿈을 무시합니다.

애플리케이션은 편집 컨트롤에 WM_GETTEXTLENGTH 메시지를 전송하여 편집 컨트롤의 문자 수를 확인할 수 있습니다. 이 메시지는 한 줄 또는 여러 줄 편집 컨트롤에서 텍스트의 길이를 문자(종료 null 문자 포함 안 됨)로 반환합니다. EM_LINELENGTH 메시지는 줄에 있는 문자의 문자 인덱스로 지정된 줄의 길이를 문자로 반환합니다. 반환된 길이에는 선택한 문자가 포함되지 않습니다. 애플리케이션은 한 줄 또는 여러 줄 편집 컨트롤에서 이러한 메시지를 사용할 수 있습니다.

EM_GETFIRSTVISIBLELINE 메시지는 여러 줄 편집 컨트롤에서 맨 위에 표시되는 줄의 인덱스(0부터 시작)를 반환하거나 한 줄 편집 컨트롤에서 첫 번째 표시되는 문자의 인덱스(0부터 시작)를 반환합니다. 애플리케이션은 편집 컨트롤에 EM_GETLINE 메시지를 전송하여 편집 컨트롤에서 버퍼로 줄을 복사할 수 있습니다. 줄은 줄 인덱스로 지정되고 수신 버퍼의 첫 번째 단어에는 버퍼에 복사할 최대 바이트 수가 포함됩니다. 반환 값은 복사된 바이트 수입니다. 이 메시지는 한 줄 또는 여러 줄 편집 컨트롤에서도 사용할 수 있습니다.

여러 줄 편집 컨트롤에서 줄에 대한 정보를 반환하는 데 사용할 수 있는 고유한 메시지가 있습니다. EM_GETLINECOUNT 메시지는 편집 컨트롤의 줄 수를 반환합니다. EM_LINEFROMCHAR 메시지는 지정된 문자 인덱스가 포함된 줄의 인덱스를 반환합니다. EM_LINEINDEX 메시지는 지정된 줄에 있는 첫 번째 문자의 인덱스를 반환합니다.

편집 컨트롤에서 텍스트 스크롤

편집 컨트롤에서 스크롤을 구현하려면 컨트롤 형식 및 스타일 편집에서 설명하는 자동 스크롤 스타일을 사용하거나 편집 컨트롤에 스크롤 막대를 명시적으로 추가할 수 있습니다. 가로 스크롤 막대를 추가하려면 스타일 WS_HSCROLL을 사용하고 세로 스크롤 막대를 추가하려면 스타일 WS_VSCROLL을 사용합니다. 스크롤 막대가 있는 편집 컨트롤은 자체 스크롤 막대 메시지를 처리합니다. 컨트롤을 편집하기 위해 스크롤 막대를 추가하는 방법에 대한 자세한 내용은 스크롤 막대를 참조하세요.

시스템은 애플리케이션이 스크롤 막대를 사용하여 편집 컨트롤에 보낼 수 있는 세 가지 메시지를 제공합니다. EM_LINESCROLL 메시지는 여러 줄 편집 컨트롤을 세로 및 가로로 스크롤할 수 있습니다. lParam 매개 변수는 현재 줄에서 시작하여 세로로 스크롤할 줄 수를 지정하고 wParam 매개 변수는 현재 문자부터 시작하여 가로로 스크롤할 문자 수를 지정합니다. 편집 컨트롤은 ES_CENTER 또는 ES_RIGHT 스타일이 있는 경우 가로 스크롤 메시지를 승인하지 않습니다. EM_LINESCROLL 메시지는 여러 줄 편집 컨트롤에만 적용됩니다.

EM_SCROLL 메시지는 여러 줄 편집 컨트롤을 세로로 스크롤합니다. wParam 매개 변수는 스크롤 작업을 지정합니다. EM_SCROLL 메시지는 여러 줄 편집 컨트롤에만 적용됩니다. EM_SCROLLWM_VSCROLL 메시지와 동일한 효과가 있습니다.

EM_SCROLLCARET 메시지는 편집 컨트롤에서 캐럿을 보기로 스크롤합니다.

탭 정지 및 여백 설정

애플리케이션은 EM_SETTABSTOPS 메시지를 사용하여 여러 줄 편집 컨트롤에서 탭 정지를 설정할 수 있습니다. (탭 정지의 기본값은 8자입니다.) 애플리케이션이 편집 컨트롤에 텍스트를 추가하면 텍스트의 탭 문자가 자동으로 다음 탭 정지까지 공간을 생성합니다. EM_SETTABSTOPS 메시지가 자동으로 시스템에서 텍스트를 다시 그리는 것은 아닙니다. 이를 수행하기 위해 애플리케이션은 InvalidateRect 함수를 호출할 수 있습니다. EM_SETTABSTOPS 메시지는 여러 줄 편집 컨트롤에만 적용됩니다.

애플리케이션은 EM_SETMARGINS 메시지를 사용하여 편집 컨트롤의 왼쪽 및 오른쪽 여백 너비를 설정할 수 있습니다. 이 메시지를 보낸 후 시스템은 편집 컨트롤을 다시 그려 새 여백 설정을 반영합니다. 애플리케이션은 EM_GETMARGINS 메시지를 보내 왼쪽 또는 오른쪽 여백의 너비를 검색할 수 있습니다. 기본적으로 편집 컨트롤 여백은 편집 컨트롤에서 사용되는 현재 글꼴에 대해 가장 큰 문자 가로 돌출(음의 ABC 너비)을 수용할 수 있을 만큼 충분히 넓게 설정됩니다.

사용자 입력 숨기기

애플리케이션은 편집 컨트롤에서 암호 문자를 사용하여 사용자 입력을 숨길 수 있습니다. 암호 문자가 설정되면 사용자가 입력하는 각 문자 대신 표시됩니다. 암호 문자가 제거되면 컨트롤은 사용자가 입력하는 문자를 표시합니다. 애플리케이션에서 스타일 ES_PASSWORD를 사용하여 한 줄 편집 컨트롤을 만드는 경우 기본 암호 문자는 별표(*)입니다. 애플리케이션은 EM_SETPASSWORDCHAR 메시지를 사용하여 다른 암호 문자를 제거 또는 정의하거나 EM_GETPASSWORDCHAR 메시지를 사용하여 현재 암호 문자를 검색할 수 있습니다. 이러한 메시지는 한 줄 편집 컨트롤에만 적용됩니다.

정수 사용

숫자만 포함하도록 설계된 편집 컨트롤에는 두 개의 정수 변환 함수가 있습니다. SetDlgItemInt 함수는 지정된 정수(부호 있거나 부호 없는)의 문자열 표현을 만들고 문자열을 편집 컨트롤로 보냅니다. SetDlgItemInt는 값 없음을 반환합니다. GetDlgItemInt 함수는 편집 컨트롤의 문자열 표현에서 정수(부호 있음 또는 부호 없음)를 만듭니다. GetDlgItemInt는 정수(또는 오류 값)를 반환합니다.

텍스트 작업 실행 취소

모든 편집 컨트롤은 애플리케이션이 편집 컨트롤에서 가장 최근의 작업을 되돌리거나 실행 취소할 수 있는지 여부를 나타내는 실행 취소 플래그를 유지 관리합니다(예: 텍스트 삭제 실행 취소). 편집 컨트롤은 실행 취소 플래그를 설정하여 작업을 실행 취소할 수 있음을 나타내고 작업을 실행 취소할 수 없음을 나타내도록 다시 설정합니다. 애플리케이션은 컨트롤에 EM_CANUNDO 메시지를 전송하여 실행 취소 플래그의 설정을 확인할 수 있습니다.

애플리케이션은 컨트롤에 EM_UNDO 메시지를 전송하여 가장 최근의 작업을 실행 취소할 수 있습니다. 다른 편집 제어 작업이 먼저 발생하지 않으면 작업을 실행 취소할 수 있습니다. 예를 들어 사용자는 텍스트를 삭제하고 텍스트를 바꾼 다음(삭제 실행 취소) 텍스트를 다시 삭제할 수 있습니다(바꾸기 실행 취소). EM_UNDO 메시지는 한 줄 및 여러 줄 편집 컨트롤 모두에 적용되며 항상 한 줄 편집 컨트롤에 적용됩니다.

애플리케이션은 컨트롤에 EM_EMPTYUNDOBUFFER 메시지를 전송하여 편집 컨트롤의 실행 취소 플래그를 다시 설정할 수 있습니다. 편집 컨트롤이 EM_SETHANDLE 또는 WM_SETTEXT 메시지를 수신할 때마다 시스템에서 실행 취소 플래그를 자동으로 다시 설정합니다. SetDlgItemText 함수는 WM_SETTEXT 메시지를 보냅니다.

Wordwrap 및 줄 바꿈 처리

애플리케이션은 여러 줄 편집 컨트롤과 함께 Wordwrap 함수를 사용하여 다음 줄로 래핑해야 하는 단어 또는 단어 조각을 찾을 수 있습니다. 시스템에서 제공하는 기본 Wordwrap 함수를 사용하여 줄은 항상 단어 사이의 공간에서 끝납니다. 애플리케이션은 EditWordBreakProc Wordwrap 함수를 제공하고 편집 컨트롤에 EM_SETWORDBREAKPROC 메시지를 전송하여 고유한 Wordwrap 함수를 지정할 수 있습니다. 애플리케이션은 컨트롤에 EM_GETWORDBREAKPROC 메시지를 전송하여 현재 Wordwrap 함수의 주소를 검색할 수 있습니다.

애플리케이션은 줄 바꿈된 텍스트 줄의 끝에 부드러운 줄 바꿈 문자(캐리지 리턴 2개와 줄 바꿈 1개)를 자동으로 추가하거나 제거하도록 여러 줄 편집 컨트롤을 지시할 수 있습니다. 애플리케이션은 편집 컨트롤에 EM_FMTLINES 메시지를 전송하여 이 기능을 켜거나 끌 수 있습니다. 이 메시지는 여러 줄 편집 컨트롤에만 적용되며, 줄 바꿈(캐리지 리턴 1개 및 사용자가 입력한 줄 바꿈)으로 끝나는 줄에는 영향을 미치지 않습니다. 또한 여러 줄 편집 컨트롤에서 애플리케이션은 사용자가 편집 컨트롤에서 ENTER 키를 누를 때 시스템이 캐리지 리턴을 삽입하도록 요청하는 ES_WANTRETURN 스타일을 지정할 수 있습니다.

포인트 및 문자 검색

편집 컨트롤의 클라이언트 영역에서 지정된 포인트에 가장 가까운 문자를 확인하려면 컨트롤에 EM_CHARFROMPOS 메시지를 보냅니다. 메시지는 포인트에 가장 가까운 문자의 문자 인덱스 및 줄 인덱스를 반환합니다. 마찬가지로 EM_POSFROMCHAR 메시지를 보내 지정된 문자의 클라이언트 영역 좌표를 검색할 수 있습니다. 메시지는 지정된 문자의 왼쪽 위 모서리에 있는 x 및 y 좌표를 반환합니다.

문자열 자동 완성

자동 완성은 편집 컨트롤에 부분적으로 입력된 문자열을 전체 문자열로 확장합니다. 예를 들어 사용자가 Windows Internet Explorer 도구 모음에 포함된 주소 편집 컨트롤에 URL을 입력하기 시작하면 자동 완성은 문자열을 기존 부분 문자열과 일치하는 하나 이상의 전체 URL로 확장합니다. "mic"와 같은 부분 URL 문자열을 "https://www.microsoft.com" 또는 "https://www.microsoft.com/windows"로 확장할 수 있습니다. 자동 완성은 일반적으로 편집 컨트롤 또는 편집 컨트롤이 포함된 컨트롤과 함께 사용됩니다.

자세한 내용은 IAutoCompleteIAutoComplete2 인터페이스 설명서를 참조하세요.

편집 컨트롤의 복합 스크립트

복합 스크립트는 인쇄된 양식이 간단한 방식으로 배치되지 않은 언어입니다. 예를 들어 복합 스크립트는 양방향 렌더링, 문자 모양의 상황별 셰이핑 또는 문자 결합을 허용할 수 있습니다. 다국어 텍스트 및 복합 스크립트를 지원하도록 표준 편집 컨트롤이 확장되었습니다. 여기에는 입력 및 표시뿐만 아니라 문자 클러스터에 대한 올바른 커서 이동도 포함됩니다(예: 태국어 및 데바나가리 스크립트).

잘 작성된 애플리케이션은 수정 없이 해당 지원을 자동으로 받습니다. 다시 말하지만 오른쪽에서 왼쪽 읽기 순서 및 오른쪽 맞춤에 대한 지원을 추가하는 것이 좋습니다. 이 경우 다음 예제와 같이 편집 컨트롤 창의 확장 스타일 플래그를 전환하여 이러한 특성을 제어합니다.

// ID_EDITCONTROL is the control ID in the resource file.
HANDLE hWndEdit = GetDlgItem(hDlg, ID_EDITCONTROL);
LONG lAlign = GetWindowLong(hWndEdit, GWL_EXSTYLE) ;

// To toggle alignment
lAlign ^= WS_EX_RIGHT ;

// To toggle reading order
lAlign ^= WS_EX_RTLREADING ;

lAlign 값을 설정한 후 다음과 같이 편집 컨트롤 창의 확장된 스타일을 설정하여 새 디스플레이를 사용하도록 설정합니다.

// This assumes your edit control is in a dialog box. If not, 
// get the edit control handle from another source.

SetWindowLong(hWndEdit, GWL_EXSTYLE, lAlign);
InvalidateRect(hWndEdit, NULL, FALSE);

Uniscribe는 복합 스크립트를 처리하기 위한 세밀한 제어를 제공하는 또 다른 함수 집합입니다. 자세한 내용은 Uniscribe을 참조하세요.