여러 줄 편집 컨트롤을 만드는 방법
이 항목에서는 창의 클라이언트 영역에 여러 줄 편집 컨트롤을 추가하여 간단한 워드 프로세서를 구현하는 방법을 보여 줍니다. 여러 줄 편집 컨트롤을 사용하여 사용자는 메뉴에서 편집 명령을 선택할 수 있습니다. 이러한 명령을 통해 사용자는 이전 작업 실행 취소, 클립보드로 선택 항목 잘라내기 또는 복사, 클립보드에서 텍스트 붙여넣기, 현재 선택 항목 삭제와 같은 간단한 편집 작업을 수행할 수 있습니다.
알아야 하는 작업
기술
필수 구성 요소
- C/C++
- Windows 사용자 인터페이스 프로그래밍
지침
애플리케이션은 여러 줄 편집 컨트롤의 인스턴스를 만들고 초기화한 다음 사용자 편집 명령을 처리하는 코드를 포함해야 합니다.
다음 C++ 코드 예는 창의 클라이언트 영역에 여러 줄 편집 컨트롤을 추가하여 간단한 워드 프로세서의 많은 기능을 구현합니다. 시스템은 자동으로 편집 컨트롤에 대한 줄 바꿈 작업을 수행하고 세로 스크롤 막대에 대한 처리도 처리합니다(CreateWindow 함수 호출에서 ES_AUTOVSCROLL을 지정하여 만들어짐).
사용자 편집 명령은 WM_COMMAND 알림 메시지를 통해 창 프로세스로 전송됩니다.
참고
창에 Windows 리본이 포함되어 있으면 리본 높이에 맞게 편집 컨트롤의 크기를 조정해야 합니다. 자세한 내용은 Windows 리본 프레임워크를 참조하세요.
#define ID_EDITCHILD 100
LRESULT CALLBACK MainWndProc(HWND hwnd, // window handle
UINT message, // type of message
WPARAM wParam, // additional information
LPARAM lParam) // additional information
{
static HWND hwndEdit;
TCHAR lpszLatin[] = L"Lorem ipsum dolor sit amet, consectetur "
L"adipisicing elit, sed do eiusmod tempor "
L"incididunt ut labore et dolore magna "
L"aliqua. Ut enim ad minim veniam, quis "
L"nostrud exercitation ullamco laboris nisi "
L"ut aliquip ex ea commodo consequat. Duis "
L"aute irure dolor in reprehenderit in "
L"voluptate velit esse cillum dolore eu "
L"fugiat nulla pariatur. Excepteur sint "
L"occaecat cupidatat non proident, sunt "
L"in culpa qui officia deserunt mollit "
L"anim id est laborum.";
switch (message)
{
case WM_CREATE:
hwndEdit = CreateWindowEx(
0, L"EDIT", // predefined class
NULL, // no window title
WS_CHILD | WS_VISIBLE | WS_VSCROLL |
ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,
0, 0, 0, 0, // set size in WM_SIZE message
hwnd, // parent window
(HMENU) ID_EDITCHILD, // edit control ID
(HINSTANCE) GetWindowLongPtr(hwnd, GWLP_HINSTANCE),
NULL); // pointer not needed
// Add text to the window.
SendMessage(hwndEdit, WM_SETTEXT, 0, (LPARAM) lpszLatin);
return 0;
case WM_COMMAND:
switch (wParam)
{
case IDM_EDUNDO:
// Send WM_UNDO only if there is something to be undone.
if (SendMessage(hwndEdit, EM_CANUNDO, 0, 0))
SendMessage(hwndEdit, WM_UNDO, 0, 0);
else
{
MessageBox(hwndEdit,
L"Nothing to undo.",
L"Undo notification",
MB_OK);
}
break;
case IDM_EDCUT:
SendMessage(hwndEdit, WM_CUT, 0, 0);
break;
case IDM_EDCOPY:
SendMessage(hwndEdit, WM_COPY, 0, 0);
break;
case IDM_EDPASTE:
SendMessage(hwndEdit, WM_PASTE, 0, 0);
break;
case IDM_EDDEL:
SendMessage(hwndEdit, WM_CLEAR, 0, 0);
break;
case IDM_ABOUT:
DialogBox(hInst, // current instance
L"AboutBox", // resource to use
hwnd, // parent handle
(DLGPROC) About);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
break;
case WM_SETFOCUS:
SetFocus(hwndEdit);
return 0;
case WM_SIZE:
// Make the edit control the size of the window's client area.
MoveWindow(hwndEdit,
0, 0, // starting x- and y-coordinates
LOWORD(lParam), // width of client area
HIWORD(lParam), // height of client area
TRUE); // repaint window
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return NULL;
}
관련 항목