如何建立多行編輯控制件
本主題示範如何將多行編輯控件新增至視窗工作區,以實作簡單的文字處理器。 藉由使用多行編輯控件,用戶可以從功能表選取編輯命令。 這些命令可讓使用者執行簡單的編輯作業,例如復原先前的動作、剪下或複製選取範圍至剪貼簿、貼上剪貼簿中的文字,以及刪除目前的選取範圍。
您需要知道的事項
技術
必要條件
- 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;
}
相關主題