Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УП02_Органы управления.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
576 Кб
Скачать

2.4.3. Сообщения от редактора текста

Функция окна редактора текста посылает функции родительского окна сообщение WM_COMMAND. При этом младшее слово параметра wParam содержит идентификатор, а параметр lParam – дескриптор окна редактора текста. Старшее слово параметра wParam содержит код извещения о совершенном действии. В следующей таблице перечислены коды извещений:

Код

Пояснение

EN_CHANGE

Текст в окне редактирования изменился

EN_ERRSPACE

Недостаточно памяти для выполнения действия

EN_HSCROLL

Нажата горизонтальная полоса просмотра редактора, но свертка текста еще не произошла

EN_KILLFOCUS

Текстовый редактор потерял фокус ввода

EN_MAXTEXT

Превышен заданный для редактора размер текста

EN_SETFOCUS

Текстовый редактор получил фокус ввода

EN_UPDATE

Последняя операция редактирования выполнена, но еще не отразилась на содержимом редактора. За этим извещением после отображения изменений придет извещение с кодом EN_CHANGE

EN_VSCROLL

Нажата вертикальная полоса просмотра редактора, но свертка текста еще не произошла

Приложения обрабатывают, по крайней мере, извещение с кодом EN_ERRSPACE.

2.4.4. Пример работы с однострочным редактором

Задача. Создать однострочный редактор текста и кнопку. При нажатии на кнопку вывести окно сообщений с текстом, который содержится в окне редактора.

Ниже приводится листинг приложения, которое решает данную задачу.

Листинг 2.6. Получение содержимого однострочного редактора.

#include <windows.h>

#include <tchar.h>

#define ID_EDIT 1001

#define ID_BUTTON 1002

BOOL RegClass(WNDPROC, LPCTSTR, UINT);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

HINSTANCE hInstance;

TCHAR szClassName[] = TEXT("EditClass");

TCHAR szTitle[] = TEXT("Однострочный редактор");

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)

{

MSG msg;

HWND hwnd;

hInstance = hInst;

if (!RegClass(WndProc, szClassName, COLOR_WINDOW))

return FALSE;

if (!(hwnd = CreateWindow(szClassName, szTitle, WS_OVERLAPPEDWINDOW | WS_VISIBLE,

100, 50, 364, 150, 0, 0, hInstance, NULL)))

return FALSE;

while(GetMessage(&msg, 0, 0, 0))

{ TranslateMessage(&msg); DispatchMessage(&msg); }

return msg.wParam;

}

BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground)

{

WNDCLASS wc;

wc.style=wc.cbClsExtra=wc.cbWndExtra=0;

wc.lpfnWndProc = Proc;

wc.hInstance = hInstance;

wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);

wc.hCursor = LoadCursor(NULL, IDC_ARROW);

wc.hbrBackground = (HBRUSH)(brBackground + 1);

wc.lpszMenuName = (LPCTSTR)NULL;

wc.lpszClassName = szName;

return (RegisterClass(&wc) != 0);

}

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

static HWND hEdit, hButton, hStatic;

TCHAR chBuff[80]={0};

switch (msg)

{

case WM_CREATE:

{

hStatic = CreateWindow(TEXT("static"), TEXT("Введите строку и нажмите кнопку 'OK'"),

WS_CHILD | WS_VISIBLE | SS_CENTER, 30, 10, 300, 20,

hwnd, (HMENU)0, hInstance, NULL);

hEdit = CreateWindow(TEXT("edit"), NULL,

WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT, 30, 40, 300, 30,

hwnd, (HMENU)ID_EDIT, hInstance, NULL);

hButton = CreateWindow(TEXT("button"), TEXT("OK"),

WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 130, 85, 100, 30,

hwnd, (HMENU)ID_BUTTON, hInstance, NULL);

SetFocus(hEdit);

return 0;

}

case WM_COMMAND:

{

switch (LOWORD(wParam))

{

case ID_EDIT:

{

if ((HIWORD(wParam)) == EN_ERRSPACE)

MessageBox(hwnd, TEXT("Мало памяти"), szTitle, MB_OK);

return 0;

}

case ID_BUTTON:

{

SendMessage(hEdit, WM_GETTEXT, 80, (LPARAM)chBuff);

MessageBox(hwnd, chBuff, szTitle, MB_OK);

SetWindowText(hEdit, TEXT("\0"));

SetFocus(hEdit);

return 0;

}

}

return 0;

}

case WM_DESTROY: { PostQuitMessage(0); return 0; }

}

return DefWindowProc(hwnd, msg, wParam, lParam);

}

Это приложение в своем главном окне создает статический орган (который представляет собой центрированный по горизонтали текст "Введите строку и нажмите кнопку 'ОК'"), под ним – однострочный редактор текста и, еще ниже, кнопку с надписью ОК (рис. 2.4).

Если ввести текст и нажать кнопку ОК, на экране появится сообщение, состоящее из введенного текста. Например, в случае рис. 2.4 окно сообщения будет содержать строку "Удачной самостоятельной работы!!!!".

Рис. 2.4. Работа с однострочным редактором

После нажатия на кнопку ОК функции окна редактора посылается сообщение с кодом EM_GETLINE:

SendMessage( hEdit, WM_GETTEXT, 80, (LPARAM)chBuff);

Последний аргумент функции SendMessage указывает на буфер, куда следует записать содержимое редактора – chBuff.

Затем содержимое этого буфера отображается в окне сообщений:

MessageBox(hwnd, chBuff, szTitle, МВ_ОК);

В примере появилась новая функция:

BOOL SetWindowText(HWND hwnd, LPCTSTR lpString);

Она устанавливает новый текст заголовка окна или текст органа управления. Параметр lpzString указывает на устанавливаемую строку. В случае успешной установки возвращаемое значение отлично от нуля. В данном примере функция SetWindowText используется для очистки окна ввода.

Функция WinMain приложения имеет одну особенность. Так как текстовый редактор работает с символьными сообщениями, в цикле обработки сообщений вызывается функция TranslateMessage:

while(GetMessage(&msg, 0, 0, 0))

{ TranslateMessage(&msg); DispatchMessage(&msg); }