МЕХАНИЗМЫ ВЗАИМОДЕЙСТВИЯ ПРИЛОЖЕНИЯ С
ПОЛЬЗОВАТЕЛЕМ
План
Файл ресурсов
Меню приложения
Акселераторы
Ресурсами называются некоторые данные, которые определяются еще до начала работы программы, особым образом добавляются в выполняемый файл и используются при работе программы. Яркими примерами таких данных являются:
иконки
курсоры мыши.
используемые в программе изображения;
строки символов;
меню;
ускорители клавиатуры;
диалоговые окна;
шрифты;
ресурсы, определяемые пользователем.
Помимо того, что ресурсы определяются до начала работы программы и добавляются в исполняемый файл, у них есть еще одна характерная черта. При загрузке bin-файла в память, РЕСУРСЫ В ПАМЯТЬ НЕ ЗАГРУЖАЮТСЯ. Только в случае, если тот или иной ресурс требуется для работы программы, программа сама загружает ресурс в память.
Возможность использования того или иного атрибута в качестве ресурса не означает, что программист не может создавать эти атрибуты в программе.
Все ресурсы, заранее определенные в Win32 API, называются стандартными.
Существует пять типов однострочного описания ресурса:
BITMAP.
CURSOR.
ICON.
FONT.
MESSAGETABLE.
Каждый из этих операторов загружает файл данных указанного типа в данные ресурса. После включения этих данных в данные ресурса могут применяться функции LoadBitmap (), LoadCursor () и LoadIcon () для непосредственного доступа к соответствующим данным в программе.
1. Функция LoadBitmap () загружает ресурс растрового изображения из файла ресурсов. В файле описания ресурсов приложения необходимо указать растровое изображение с помощью оператора BITMAP. Формат оператора имеет следующий вид:
BITMAPNAMEBITMAP "BITMAPFILE. BMP"
По окончании использования растрового изображения, приложение должно вызвать функцию DeleteObject () для освобождения памяти, занимаемой изображением. Синтаксис функций следующий:
HBITMAP LoadBitmap (HINSTANCE hInst, LPCTSTR lpszBitmap)
Параметры:
hInst - хэндл приложения, в которое загружается растровое изображение;
lpsz Bitmap - указатель на строку с нулевым символом в конце, которая содержит имя ресурса растрового изображения, подлежащего загрузке.
Возвращаемое значение: при успешном выполнении - хендл загруженного растрового изображения, иначе - NULL.
Функция DeleteObject () удаляет логический объект, для создания которых применяется достаточно много функций. Синтаксис функции следующий.
BOOL DeleteObject (HGDIOBJ hGdiObject)
Параметры:
hGdiObject - хэндл объекта GDI. Этот параметр должен указывать хендл пера, растрового изображения, кисти, области, палитры или шрифта.
Возвращаемое значение: при успешном выполнении - TRUE, иначе - FALSE.
2. Функция LoadCursor () загружает ресурс курсора из файла ресурсов. Если курсор загружен в составе определения класса окна, то курсор мыши, находясь в пределах клиентской области окна, будет принимать форму загруженного курсора. В файле описания ресурсов приложения необходимо указать пиктограмму с помощью оператора CURSOR. Формат оператора имеет следующий вид:
CURSORNAMECURSOR"CURSORFILE. CUR"
Если требуется в разное время иметь разные формы курсора в клиентской области окна, то форма курсора класса окна должна быть установлена в NULL, а курсор должен быть указан путем вызова функции SetCursor () при получении каждого сообщения WM_SETCURSOR. Синтаксис функций следующий:
HCURSOR LoadCursor (HINSTANCE hInst, LPCTSTR lpszCursor)
Параметры:
hInst - хэндл приложения, в которое загружается курсор. Для загрузки системного курсора параметр hInst должен быть равным NULL;
lpszCursor - указатель на строку с нулевым символом в конце, которая содержит имя ресурса курсора, подлежащего загрузке. Если задан системный курсор, то параметр должен принимать одно из значений идентификаторов IDC_.
Возвращаемое значение: при успешном выполнении - хендл загруженного курсора, иначе - NULL.
3. Функция LoadIcon () загружает пиктограмму из файла ресурсов. В файле описания ресурсов приложения необходимо указать пиктограмму с помощью оператора ICON. Формат оператора имеет следующий вид:
ICONNAMEICON "ICONFILE. ICO"
Эта функция также позволяет получить пиктограммы, определенные в системе. Для загрузки системных пиктограмм параметр hInst должен быть равным нулю. Синтаксис функций следующий:
HICON LoadIcon (HINSTANCE hInst, LPCTSTR lpszIcon)
Параметры:
hInst - хэндл приложения, в которое загружается растровое изображение;
lpszIcon - указатель на строку с нулевым символом в конце, которая содержит имя ресурса пиктограммы, подлежащей загрузке. Если задан системная пиктограмма, то параметр должен принимать одно из значений идентификаторов IDI_.
Возвращаемое значение: при успешном выполнении - хендл загруженной пиктограммы, иначе - NULL.
4. Функция AddFontResource () обычно используется для ввод ресурса шрифта из файла в таблицу шрифтов Windows. Таблица шрифтов содержит данные о шрифтах, доступных для приложения Windows. В качестве имен файлов шрифтов может быть указано:
файл. FON ресурса шрифта;
файл. FNT первичного растрового шрифта;
файл. TTF первичного шрифта TrueType;
файл. TTC коллекции шрифтов TrueType;
файл. FOT ресураса TrueType;
файл. OTF шрифта OpenType PostScript;
файл. MMM ресурса шрифта Type 1 с несколькими базовыми шрифтами;
файл. PFB двоичного представления шрифта Type 1;
файл. PFM метрики шрифта Type 1.
Синтаксис функции следующий:
int AddFontResource (LPCTSTR lpszFileName)
Параметры:
lpszFileName - указатель на строку с нулевым символом в конце, которая содержит допустимое имя файла шрифта.
Возвращаемое значение: при успешном выполнении - число добавленных шрифтов, иначе - NULL.
Если необходимо ввести шрифт, данные которого должны быть получены из нескольких файлов ресурса, в качестве параметра lpszFileName необходимо указать имена всех этих файлов, разделенные символом (|).
Окнам верхнего уровня должно быть отправлено сообщение WM_FONTCHANGE, чтобы работающие программы получили информацию об изменении состава доступных шрифтов. Удаляет из таблицы шрифтов Windows шрифты, содержащиеся в указанном файле, функция RemoveFontResource (). Обычно она применяется при обработке сообщения WM_DESTROY для удаления добавленных ресурсов шрифта. Синтаксис функции следующий:
BOOL RemoveFontResource (LPCTSTR lpszFileName)
Параметры:
lpszFileName - указатель на строку с нулевым символом в конце, которая содержит имя файла ресурса шрифта.
Возвращаемое значение: при успешном выполнении - TRUE, иначе - NULL.
Работу со шрифтами рассмотрим позже.
5. Для загрузки сообщений из файла ресурса служит функция FormatMessage (). О ней также позже.
Существует пять типов многострочного описания ресурса:
MENU.
ACCELERATORS.
DIALOG.
STRINGTABLE.
RCDATA.
Многострочные типы описания ресурсов легко распознать. В них для определения блоков данных ресурса используются операторы BEGIN и END. Наиболее простое описание ресурсов это:
В большинстве приложений в сообщениях и текстовом выводе применяются символьные строки. В системе Windows в качестве альтернативы обычному методу размещения строк в области статических данных программы предусмотрены таблицы строк. Символьные строки определяются в файле описания ресурса и приобретают идентификационное значение. Например:
STRINGTABLE
BEGIN
IDS_STRING1"Строка 1"
IDS_STRING2"Строка 2"
IDS_STRING3"Строка 3"
END
Идентификационные значения строк обычно определяются в отдельном файле заголовка, который включен в файл описания ресурса, наряду с модулем, обеспечивающим доступ к строкам.
Для использования этих данных в приложении служит функция LoadString ().
Фукнция LoadString (). Каждая строка таблицы получает свой идентификатор. Функция LoadString () копирует символьные данные из файла ресурса в буфер памяти, чтобы с ней можно было выполнить необходимые действия и отобразить. Строки в таблице могут содержать управляющие символы, такие как символы табуляции и символы новой строки. Синтаксис функции следующий:
int LoadString (HINSTANCE hInst, UINT uID, LPTSTR lpBuffer, int nBuffer)
Параметры:
hInst - хэндл приложения, в которое загружается строка;
uID - идентификационное значение для строки в таблице строк. Этот параметр обозначает позицию слева от строки в файле ресурса;
lpBuffer - указатель на буфер, который примет символьную строку. Буффер должен иметь длину не менее nBuffer символов типа TCHAR;
nBuffer - максимальное число символов, которые должны быть скопированы в буфер lpBuffer.
Возвращаемое значение: при успешном выполнении - число символов типа TCHAR, скопированных в буфер, без учета нулевого символа - конца строки, иначе - 0.
Ресурсы создаются отдельно от файлов программы и добавляются в bin-файл при линковании программы. Подавляющее большинство ресурсов содержится в файлах ресурсов, имеющих расширение. RC. Имя файла ресурсов обычно совпадает с именем bin-файла программы. Так, если имя программы MYPROG. EXE, то имя файла ресурсов - MYPROG. RC.
При создании RC-файлов программист может столкнуться с одной тонкостью. Некоторые ресурсы, такие, как иконки, курсоры, диалоговые окна, изображения (bitmap'ы) могут быть сохранены в отдельных файлах с расширениями. ico,. cur,. dig,. bmp соответственно. В этом случае в RC-файлах делаются ссылки на упомянутые файлы.
Файл ресурсов создан - теперь его нужно откомпилировать. Компилируется он специальным компилятором ресурсов. Обычно имя компилятора ресурсов заканчивается на RC. EXE. В частности, в Borland 5.02 он называется BRC. EXE
После компиляции файла ресурсов компилятором ресурсов создается новый файл, имеющий расширение. RES. Именно этот RES-файл используется линкером для добавления ресурсов в bin-файл. Следует отметить, что при необходимости RES-файлы могут создаваться и редакторами ресурсов. В каком формате создавать ресурсы и как присоединять их к исполняемому файлу, зависит от потребностей и привычек создающего ресурсы программиста.
Таким образом, последовательность создания файла ресурса можно изобразить в виде табл.1.
Таблица 1
Последовательность создания файла ресурсов
№ п/п | Действие | Используемое средство |
Создание RC-файла (при необходимости включающего ссылки на файлы с расширением. ico,. cur,. bmp, и т.д.) | Редактор ресурсов (при необходимости может быть использован текстовый и графический редакторы) | |
Редактирование RC-файла в текстовом виде | Текстовый редактор | |
Компиляция RC-файла - получение RES-файла | Компилятор ресурсов | |
Добавление ресурсов, содержащихся в RES-файлс, в bin-файл | Линкер |
Любой, кто хоть немного работал в Windows, знает, что меню располагаются сразу под заголовком окна и позволяют пользователю осуществить выбор возможностей, предоставляемых программой. Существует два вида меню: