Comment créer un contrôle d’édition multiligne
Cette rubrique montre comment implémenter un traitement de texte simple en ajoutant un contrôle d’édition multiligne à la zone cliente d’une fenêtre. À l’aide du contrôle d’édition multiligne, l’utilisateur peut sélectionner des commandes de modification dans un menu. Ces commandes permettent à l’utilisateur d’effectuer des opérations de modification simples telles que annuler une action précédente, couper ou copier des sélections dans le Presse-papiers, coller du texte du Presse-papiers et supprimer la sélection actuelle.
Bon à savoir
Technologies
Prérequis
- C/C++
- Programmation de l’interface utilisateur Windows
Instructions
Votre application doit inclure du code pour créer un instance d’un contrôle d’édition multiligne et l’initialiser, puis traiter les commandes de modification utilisateur.
L’exemple de code C++ suivant implémente une grande partie des fonctionnalités d’un traitement de texte simple en ajoutant un contrôle d’édition multiligne à la zone cliente d’une fenêtre. Le système effectue automatiquement des opérations wordwrap pour le contrôle d’édition et gère également le traitement de la barre de défilement verticale (créée en spécifiant ES_AUTOVSCROLL dans l’appel à la fonction CreateWindow ).
Les commandes de modification utilisateur sont envoyées au processus de fenêtre via WM_COMMAND messages de notification.
Notes
Si la fenêtre inclut le ruban Windows, la taille du contrôle d’édition doit être ajustée pour tenir compte de la hauteur du ruban. Pour plus d’informations, consultez Infrastructure du ruban 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;
}
Rubriques connexes