Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programming_Windows_95_Part_I.pdf
Скачиваний:
96
Добавлен:
05.06.2014
Размер:
4.61 Mб
Скачать

278

Окрашивание полос прокрутки и статического текста

Впрограмме COLORS1 внутренние участки трех полос прокрутки и текст шести текстовых полей окрашиваются красным, зеленым и голубым цветами. Окрашивание полос прокрутки осуществляется путем обработки сообщений WM_CTLCOLORSCROLLBAR.

ВWndProc мы для кистей определяем статический массив трех описателей:

static HBRUSH hBrush[3];

При обработке сообщения WM_CREATE мы создаем три кисти:

for(i = 0; i < 3; i++)

hBrush[i] = CreateSolidBrush(crPrim[i]);

где в массиве crPrim хранятся RGB-значения трех первичных цветов. При обработке сообщений WM_CTLCOLORSCROLLBAR, возвращаемым значением оконной процедуры является одна из этих трех кистей:

case WM_CTLCOLORSCROLLBAR:

i = GetWindowLong((HWND) lParam, GWW_ID); return(LRESULT) hBrush[i];

При обработке сообщения WM_DESTROY эти три кисти должны быть удалены:

for(i = 0; i < 3; DeleteObject(hBrush[i++]));

Аналогичным образом, путем обработки сообщения WM_CTLCOLORSTATIC и вызова функции SetTextColor, окрашивается текст в статических текстовых полях. Фон текста устанавливается функцией SetBkColor с системным цветом COLOR_BTNHIGHLIGHT. Это приводит к тому, что фон текста становится таким же, как цвет статического прямоугольника окна управления, который находится позади полос прокрутки и текста. Для статических дочерних текстовых окон управления этот цвет фона относится только к прямоугольнику позади каждого символа строки, а не ко всей ширине окна управления. Для того, чтобы это реализовать, оконная процедура должна также возвращать описатель кисти цвета COLOR_BTNHIGHLIGHT. Эта кисть называется hBrushStatic и создается при обработке сообщения WM_CREATE, а удаляется при обработке сообщения

WM_DESTROY.

Создав, при обработке сообщения WM_CREATE, кисть на основе цвета COLOR_BTNHIGHLIGHT, и пользуясь ею на протяжении работы программы, мы создали себе маленькую проблему. Если во время работы программы цвет COLOR_BTNHIGHLIGHT изменяется, то изменится и цвет статического прямоугольника, а также цвет его текстового фона, однако весь фон текстового окна управления останется прежним — COLOR_BTNHIGHLIGHT.

Для решения этой проблемы в программе COLORS1 обрабатывается сообщение WM_SYSCOLORCHANGE путем простого повторного создания кисти hBrushStatic, использующей новый цвет.

Класс редактирования

Класс редактирования (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

279

$(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 |

280

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 делает немного. Предопределенное окно редактирования делает достаточно много. По этой причине программа позволяет вам узнать о потенциальных возможностях управляющего окна редактирования как такового, без помощи вашей программы.

Стили класса редактирования

Как уже говорилось, вы создаете управляющее окно редактирования, используя в качестве имени класса окна "edit" при вызове функции CreateWindow. Стилем окна является WS_CHILD и еще несколько опций. Как и в статических дочерних окнах управления, текст в управляющих окнах редактирования может быть выравнен либо по левому краю, либо по правому, либо по центру. Формат можно задать с помощью стилей окна ES_LEFT, ES_RIGHT и ES_CENTER.

По умолчанию в управляющем окне редактирования имеется одна строка. Вы можете создать многострочное управляющее окно редактирования, используя стиль окна ES_MULTILINE. Для однострочного управляющего окна редактирования обычно можно вводить текст только в конце прямоугольника редактирования. Для создания управляющего окна редактирования с автоматической горизонтальной прокруткой используйте стиль ES_AUTOHSCROOL. Для многострочного управляющего окна редактирования, если не задан стиль ES_AUTOHSCROOL, то текст автоматически переносится на новую строку. При задании этого стиля для перехода на новую строку нужно нажимать клавишу <Enter>. Используя стиль окна ES_AUTOVSCROOL, в многострочное управляющее окно редактирования можно включить полосу вертикальной прокрутки.

Если вы включите эти стили прокрутки в многострочные управляющие окна редактирования, то вы можете добавить полосы прокрутки к управляющему окну редактирования. Это делается путем использования тех же идентификаторов стиля окна, что и для недочерних окон: WS_HSCROLL и WS_VSCROLL.

По умолчанию в управляющем окне редактирования отсутствует рамка окна. Добавить ее можно, используя стиль

WS_BORDER.

Когда вы выделяете текст в управляющем окне редактирования, Windows отображает его на экране в инвертированном виде. Однако, при потере управляющим окном редактирования фокуса ввода, выбранный текст

281

больше не выделяется. Если вы хотите, чтобы выделенный текст подсвечивался даже в том случае, если управляющее окно редактирования не имеет фокуса ввода, вы можете использовать стиль ES_NOHIDESEL.

Когда в программе POPPAD1 создается управляющее окно редактирования, его стиль при вызове функции CreateWindow задается равным:

WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | WS_BORDER | ES_LEFT | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL

Далее в программе POPPAD1 определяются размеры управляющего окна редактирования, это делается путем вызова функции MoveWindow при получении оконной процедурой WndProc сообщения WM_SIZE. Размер управляющего окна просто устанавливается равным размеру главного окна:

MoveWindow(hwndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);

Для однострочного управляющего окна редактирования высота окна должна соответствовать высоте символа. Если управляющее окно редактирования имеет рамку (как чаще и бывает), используйте полуторную высоту символа (включая межстрочное пространство).

Коды уведомления управляющих окон редактирования

Окна редактирования посылают оконной процедуре родительского окна сообщения WM_COMMAND. Значения переменных lParam и wParam, являющихся параметрами этих сообщений такие же, как и для кнопок управления:

Параметр

Описание

LOWORD (wParam)

Идентификатор дочернего окна

HIWORD (wParam)

Код уведомления

lParam

Описатель дочернего окна

Ниже представлены коды уведомления управляющих окон редактирования:

EN_SETFOCUS

Окно получило фокус ввода

EN_KILLFOCUS

Окно потеряло фокус ввода

EN_CHANGE

Содержимое окна будет меняться

EN_UPDATE

Содержимое окна изменилось

EN_ERRSPACE

Произошло переполнение буфера редактирования

EN_MAXTEXT

Произошло переполнение буфера редактирования при вставке

EN_HSCROLL

На горизонтальной полосе прокрутки был щелчок мышью

EN_VSCROLL

На вертикальной полосе прокрутки был щелчок мышью

В программе POPPAD1 обрабатываются только коды уведомления EN_ERRSPACE и EN_MAXTEXT. При получении этих уведомлений на экран выводится окно сообщений.

Управляющие окна редактирования хранят текст в области памяти программы их родительского окна. Как уже отмечалось ранее, содержимое управляющего окна редактирования ограничено примерно 32 килобайтами.

Использование управляющих окон редактирования

Если вы используете несколько однострочных управляющих окон редактирования на поверхности вашего главного окна, то для передачи фокуса ввода от окна к окну вам понадобится вводить новую оконную процедуру. Вы можете это сделать также, как это делается в программе COLORS1, перехватывая нажатия клавиш <Tab> и <Shift>+<Tab>. (Другой пример введения новой оконной процедуры показан далее в этой главе в программе HEAD.) То как использовать клавишу <Enter> — дело ваше. Вы можете управлять ею также, как клавишей <Tab> или использовать ее как сигнал для программы, что все поля редактирования готовы.

Если вы хотите поместить в редактируемое поле текст, вы можете воспользоваться функцией SetWindowText. Для получения текста из окна редактирования используются функции GetWindowTextLength и GetWindowText. Мы рассмотрим примеры таких возможностей в более поздних версиях программы POPPAD.

Сообщения управляющему окну редактирования

Мы не станем обсуждать все сообщения, которые мы можем послать управляющему окну редактирования с помощью функции SendMessage, поскольку их достаточно много, а некоторые будут использоваться в следующих версиях программы POPPAD. Здесь дан общий обзор.

Соседние файлы в предмете Операционные системы