
- •Уп. 2. Органы управления в приложениях Win32
- •2.1. Кнопки
- •2.1.1. Создание кнопок
- •2.1.2. Кнопки и сообщения
- •2.1.3. Флажки и переключатели
- •2.2. Статический орган управления
- •2.3. Полоса прокрутки
- •2.3.1. Общие сведения
- •2.3.2. Создание полосы прокрутки
- •2.3.3. Простейшие полосы прокрутки
- •2.3.4. Сообщения от полосы прокрутки
- •2.3.5. Управление полосой прокрутки
- •2.3.6. Пример обработки сообщений от полос прокрутки
- •2.3.7. Новые функции управления полосами прокрутки
- •2.3.8. Пример окна приложения с полосой просмотра
- •2.4. Редактор текста
- •2.4.1. Создание редактора
- •2.4.2. Сообщения для редактора текста
- •2.4.3. Сообщения от редактора текста
- •2.4.4. Пример работы с однострочным редактором
- •2.5. Списки строк
- •2.5.1. Создание списка
- •2.5.2. Сообщения от списка
- •2.5.3. Сообщения для списка
- •2.5.4. Пример работы со списком
- •2.6. Комбинированный список
- •2.6.1. Создание комбинированного списка
- •2.6.2. Коды извещения
- •2.6.3. Сообщения для комбинированного списка
- •2.6.4. Пример работы с комбинированным списком
- •Контрольные вопросы
- •Упражнения
- •Приложение 2
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); }