
- •Глава 8 Дочерние окна управления
- •Класс кнопок
- •Создание дочерних окон
- •Сообщения дочерних окон родительскому окну
- •Сообщения родительского окна дочерним окнам
- •Нажимаемые кнопки
- •Переключатели
- •Окна группы
- •Изменение текста кнопки
- •Видимые и доступные кнопки
- •Кнопки и фокус ввода
- •Дочерние окна управления и цвета
- •Системные цвета
- •Цвета кнопок
- •Сообщение wm_ctlcolorbtn
- •Кнопки, определяемые пользователем
- •Класс статических дочерних окон
- •Класс полос прокрутки
- •Программа colors1
- •Интерфейс клавиатуры, поддерживаемый автоматически
- •Введение новой оконной процедуры
- •Закрашивание фона
- •Окрашивание полос прокрутки и статического текста
- •Класс редактирования
- •Стили класса редактирования
- •Коды уведомления управляющих окон редактирования
- •Использование управляющих окон редактирования
- •Сообщения управляющему окну редактирования
- •Класс окна списка
- •Стили окна списка
- •Добавление строк в окно списка
- •Выбор и извлечение элементов списка
- •Получение сообщений от окон списка
- •Простое приложение, использующее окно списка
- •Список файлов
- •Использование атрибутов файлов
- •Упорядочивание списков файлов
- •Утилита Head для Windows
Класс редактирования
Класс редактирования (edit) является, в некотором смысле, простейшим из предопределенных в Windows классов окна, хотя с других точек зрения он оказывается и более сложным. Когда вы создаете дочернее окно, используя имя класса "edit", вы определяете прямоугольник на основе параметров положения х и у, ширины и высоты функции CreateWindow. В этом прямоугольнике содержится редактируемый текст. Когда дочернее окно управления имеет фокус ввода, вы можете набирать текст, двигать курсор, выбирать группы символов, используя либо мышь, либо клавишу <Shift> и клавиши управления курсором, удалять выбранный текст в папку обмена нажимая комбинацию клавиш <Ctrl>+<X>, копировать текст нажимая комбинацию клавиш <Ctrl>+<С>, и вставлять текст из папки обмена используя комбинацию клавиш <Ctrl>+<V>.
Одним из простейших применений окон редактирования — элементов управления (или управляющих окон редактирования, edit controls) является простое однострочное окно ввода данных. Но окна редактирования не ограничены только одной строкой, что иллюстрируется в программе POPPAD1, представленной на рис. 8.7. Как программы, с которыми мы уже сталкивались в этой книге, программа POPPAD будет модернизироваться с целью использования окон меню, диалога (для открытия и сохранения файлов) и принтеров. Последней версией программы будет простой, но полноценный текстовый редактор с небольшими добавлениями, которые потребуется сделать для его реализации в тексте нашей программы.
POPPAD1.MAK
#-----------------------
# POPPAD1.MAK make file
#-----------------------
poppad1.exe : poppad1.obj
$(LINKER) $(GUIFLAGS) -OUT:poppad1.exe poppad1.obj $(GUILIBS)
poppad1.obj : poppad1.c
$(CC) $(CFLAGS) poppad1.c
POPPAD1.C
/*-------------------------------------------------------
POPPAD1.C -- Popup Editor using child window edit box
(c) Charles Petzold, 1996
-------------------------------------------------------*/
#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
char szAppName[] = "PopPad1" ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
HWND hwnd ;
MSG msg ;
WNDCLASSEX wndclass ;
wndclass.cbSize = sizeof (wndclass) ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION) ;
RegisterClassEx (&wndclass) ;
hwnd = CreateWindow (szAppName, szAppName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
static HWND hwndEdit ;
switch (iMsg)
{
case WM_CREATE :
hwndEdit = CreateWindow ("edit", NULL,
WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |
WS_BORDER | ES_LEFT | ES_MULTILINE |
ES_AUTOHSCROLL | ES_AUTOVSCROLL,
0, 0, 0, 0,
hwnd, (HMENU) 1,
((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;
return 0 ;
case WM_SETFOCUS :
SetFocus (hwndEdit) ;
return 0 ;
case WM_SIZE :
MoveWindow (hwndEdit, 0, 0, LOWORD (lParam),
HIWORD (lParam), TRUE) ;
return 0 ;
case WM_COMMAND :
if (LOWORD (wParam) == 1)
if (HIWORD (wParam) == EN_ERRSPACE ||
HIWORD (wParam) == EN_MAXTEXT)
MessageBox (hwnd, "Edit control out of space.",
szAppName, MB_OK | MB_ICONSTOP) ;
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
}
Рис. 8.7. Программа POPPAD1
Программа POPPAD1 — это многострочный текстовый редактор (хотя пока еще и без возможности ввода/вывода файлов), который уместился в менее чем 100 строках текста на языке С. (Один недостаток, тем не менее, имеется. Он состоит в том, что предопределенное многострочное окно редактирования не позволяет редактировать текст размером более 32 килобайт.) Как видите, сама программа POPPAD1 делает немного. Предопределенное окно редактирования делает достаточно много. По этой причине программа позволяет вам узнать о потенциальных возможностях управляющего окна редактирования как такового, без помощи вашей программы.