Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
System programming / Конспект лекций / Лекция 7 Ресурсы часть1.doc
Скачиваний:
48
Добавлен:
08.05.2015
Размер:
79.87 Кб
Скачать

Idl, "character string 1" id2, "character string 2" [определения остальных строк] }

В описании ресурсов может содержаться только одна таблица строк. Мак­симальный размер каждой строки — 255 символов. В строке не может быть управляющих символов языка С, за исключением \t (табуляция). Однако, символьные строки могут содержать восьмеричные константы:

Табуляция (Tab) \011

Перевод строки (Linefeed) \012

Возврат каретки (Carriage return) \015

Эти управляющие символы распознаются функциями DrawText и MessageBox.

Вы можете использовать функцию LoadString для копирования строки из ресурса в буфер в сегменте данных вашей программы:

LoadString (hinstance, id, szBuffer, iMaxLength);

Параметр id соответствует идентификатору, который предшествует каждой строке в файле описания ресурсов; szBuffer — это указатель на символьный массив, в который заносится символьная строка; iMaxLength — это макси­мальное число передаваемых в siBuffer символов. Идентификаторы строк, которые предшествуют каждой строке, обычно являются идентификаторами макроопределений, которые задаются в заголовочном файле. Многие про­граммисты, программирующие под Windows, для идентификаторов строк используют префикс IDS_.

Ресурсы, определяемые пользователем

Ресурсы, определяемые пользователем (user-defined resourse) удобны для включения самых разнообразных данных в ваш файл с расширением *.ЕХЕ и получения доступа в программе к этим данным. Данные могут содержаться в любом выбранном вами формате — текстовом или бинарном. При загрузке данных в оперативную память возвращаемым значением функций Windows, которые используются для доступа к определяемым пользователем ресурсам, является указатель на данные. С этими данными вы можете делать все, что угодно. Вы вероятно решите, что этот способ хранения и доступа к разнооб­разным данным удобнее, чем альтернативный, при котором данные хранят­ся в других файлах и доступ к ним осуществляется через функции файло­вого ввода.

Например, предположим, что у вас есть файл PROGHELP.TXT, в котором содержится текст "подсказок" для вашей программы. Такой файл не дол­жен быть в чистом виде ASCII-файлом: в нем также могут содержаться бинарные данные, например, указатели, которые могли бы помочь при ссылках на различные части этого файла. Следующим образом опишите ссылку на этот файл в вашем файле описания ресурсов:

helptext TEXT proghelp.txt

Имена helptext (имя ресурса) и TEXT (тип ресурса) в этом выражении могут быть любыми. Слово TEXT написано прописными буквами просто, чтобы сделать его похожим на слова ICON, CURSOR и BITMAP. To, что мы здесь делаем, является созданием ресурса вашего собственного типа, который называется TEXT.

В процессе инициализации программы (например, при обработке сообще­ния WM_CREATE), можно получить описатель этого ресурса:

hResource = LoadResource (hinstance, FindResource (hinstan.ce, "TEXT", "helptext")) ;

Переменная hResource определяется как имеющая тип HGLOBAL. Несмотря на свое имя, функция LoadResource фактически не загружает сразу ресурс в оперативную память. Используемые вместе, так как это было показано, функции LoadResource и FindResource по существу эквивалентны функциям Loadlcon и LoadCursor. Фактически, функции Loadlcon и LoadCursor исполь­зуют функции LoadResource и FindResource.

Вместо имен и типов ресурсов можно использовать числа. Числа могут быть преобразованы в дальние указатели при вызове функции FindResource с ис­пользованием MAKEINTRESOURCE. Числа, используемые в качестве типа ресурса, должны быть больше 255. (Числа от 1 до 9 при вызове функции FindResource используются в Windows для существующих типов ресурсов.)

Когда вам необходимо получить доступ к тексту, вызывайте функцию LockResource:

pHelpText = LockResource (hResource) ;

Функция LockResource загружает ресурс в память (если он еще не был загру­жен), и возвращает указатель на него. После окончания работы с этим ресурсом, вы можете освободить оперативную память, вызвав функцию FreeResource:

FreeResource (hResource);

Даже если вы не вызовите функцию FreeResource, после завершения работы программы оперативная память все равно будет освобождена.