Окт 16 2009

Таблицы строк

Ресурс таблицы строк - это список строк, связанных с уникальными численными идентификаторами. В файле описания ресурсов таблица строк имеет примерно следующий вид:
STRINGTABLC DISCARDABLE BEGIN
IDS STRING! "Открыть файл"
IDS~STRING2 "Закрыть файл"
IDS_STRING3 "Выход из программы"
END
Это так называемое многострочное описание ресурса. Многострочное описание используется также для ресурсов меню и диалоговых окон.
Необходимость или полезность использования ресурса таблицы строк для начинающих Windows-программистов не вполне очевидна. Казалось бы, использование обычных символьных строк, объявленных в виде переменных или констант в исходном тексте программы, не приносит никаких проблем. Зачем еще дополнительные строковые ресурсы? Тем не менее, в двух ситуациях использование ресурса таблицы строк дает ощутимые преимущества:
при модификации программы с целью адаптации для иноязычного пользователя;
при использовании строковых ресурсов для вывода текста в окнах подсказок (tooltip) или в строке состояния (status bar) приложения.
Ресурс таблицы строк значительно облегчает перевод программы на другие языки. Если вместо непосредственного использования символьных строк в исходном тексте программы вынести их в файл описания ресурсов, а затем извлекать строки по их идентификаторам, то вся текстовая информация окажется сосредоточенной в одном месте. Поэтому в случае разработки иноязычной версии сделанной ранее программы достаточно перевести текст в файле описания ресурсов и перекомпилировать программу.
Вторая сфера рекомендуемого использования ресурса таблицы строк связана с упрощением вывода подсказок в элементе управления Tooltip или в строке состояния приложения. Эти вопросы будут рассмотрены в главе 8.
Для добавления к приложению ресурса символьных строк при помощи редактора ресурсов выполните следующую последовательность действий: 1. В главном меню Visual Studio выполните команду меню Insert ► Resource. В появившемся диалоговом окне Insert Resource укажите тип ресурса String Table и нажмите кнопку New.


Окт 16 2009

Воспроизведение звуковых файлов

Добавление звука к приложению может сделать его более эффективным для пользователя, а в каких-то случаях и более привлекательным. Например, можно использовать специальные звуки или воспроизведение аудиоклипов, чтобы привлечь внимание пользователя при обнаружении ошибок или при завершении длительной операции. Другие очевидные сферы применения музыкальных и звуковых эффектов — это обучающие программы, а также приложения, предназначенные для презентаций или рекламы.
Win32 API поддерживает работу только со звуковыми файлами, записанными в формате WAVE (waveform audio file fomat). Файлы этого формата имеют расширение .wav. Они содержат оцифрованные с некоторой частотой 8- или 16-битовые звуковые данные. Хотя при записи WAVE-формата информация сжимается как аппаратными, так и программными средствами, она содержит все необходимые данные о реальном звуковом потоке, А потому файлы с расширением .wav, к сожалению, довольно громоздки и занимают сотни килобайтов на каждую минуту записи.
Для воспроизведения звуковых файлов вызывается функция PlaySound, которая имеет следующий прототип:
BOOL PlaySound(
LPCSTR pszSound, // строка, специфицирующая воспроизводимый звук
HMODULE hmod, // дескриптор экземпляра приложения
DWORD fdwSound // флаги воспроизведения ):
Первый параметр функции задает либо имя файла на диске, либо строку имени звукового ресурса. Если при вызове PlaySound первый параметр равен NULL, это вызывает прекращение воспроизведения любого «играемого» файла.
Второй параметр используется только при воспроизведении звука из звукового ресурса. Если же функция вызвана для воспроизведения звука из файла, то второй параметр устанавливается в NULL.


Окт 16 2009

Доступ к данным в ресурсе

Для получения доступа к данным ресурса, определенного программистом, используются функции FindResource, LoadResource и LockResource.
Функция FindResource ищет ресурс указанного типа в соответствующем модуле. Она имеет следующий прототип:
HRSRC FindResourcetHMODULE hModule. LPCTSTR IpName, LPCTSTR IpType);
Параметр hModule позволяет указывать дескриптор модуля выполняемого файла, который содержит указанный ресурс. Если hModule равен NULL, то Windows ищет ресурс в модуле, создавшем текущий процесс.
Параметр IpName содержит имя ресурса, представленное, как правило, строкой. Но если первым символом в строке является знак «#», то остальная часть представляет целое значение идентификатора ресурса. Параметр IpType задает тип ресурса.
При успешном выполнении функция возвращает дескриптор информационного блока указанного ресурса, а не дескриптор самого ресурса. Чтобы получить дескриптор ресурса, нужно передать дескриптор информационного блока функции LoadResource. В случае неудачи функция FindResource возвращает значение NULL.
Функция LoadResource загружает ресурс, найденный функцией FindResource, в глобальную область памяти. Прототип этой функции выглядит следующим образом:
HGLOBAL LoadResource(HMODULE hModule. HRSRC hResInfo):
Параметру hResInfo должен передаваться дескриптор информационного блока, возвращенный функцией FindResource.
Хотя адрес, возвращаемый функцией LoadResource, в принципе, можно использовать для доступа к данным ресурса, MSDN рекомендует получать указатель на эти данные, вызывая функцию LockResource:
LPVOIQ LockResource(HGLOBAL hResData);
Функция осуществляет блокировку указанного ресурса в памяти. Параметр hResData — это дескриптор ресурса, который должен быть заблокирован. В качестве параметра необходимо передать адрес, возвращенный функцией LoadResource.
В случае успешного выполнения функция LockResource возвращает указатель на первый байт данных ресурса, в случае неудачи — значение NULL.
После использования данных ресурса его разблокировка не требуется, так как система автоматически удаляет ресурс из памяти при закрытии приложения.
Если вернуться к примеру с файлом proghelp.txt, который был добавлен к приложению в виде определенного программистом ресурса, то доступ к данным этого ресурса можно получить при помощи следующего фрагмента кода:
HGLOBAL hResource = LoadResource(hInsLance.
MndResourceChlnstance, "HELP!EXT". "TEXT")); char pHelpfext -- (char) LockResource(hResource);


Окт 16 2009

Ресурсы, определяемые программистом

Ресурсы, определяемые программистом (user-defined resource), позволяют включать в выполняемый файл данные любого типа, после чего программа может легко получить к ним доступ во время своей работы. Эти ресурсы могут иметь любой формат: текстовый, двоичный или даже смешанный.
Предположим, что есть файл proghelp.txt, в котором содержится текст подсказок для пользователей приложения. Его можно включить в проект в качестве ресурса, если добавить в файл описания ресурсов следующую строку:
HELPTEXT TEXT DISCARDABLE proghelp.txt
Имя ресурса (HELPTEXT) и его тип (TEXT) в этом выражении могут быть любыми. Для имени ресурса стоит использовать прописные буквы, так как компилятор ресурсов в любом случае преобразует символы этого имени в символы верхнего регистра.
В процессе инициализации программы, например при обработке сообщения WM_CREATE, можно получить дескриптор этого ресурса, а через него — доступ к данным в файле proghelp.txt.
Другой пример: вы можете включить в программу в виде ресурса мультимедийный файл с записанным звуковым сопровождением. Пример такого использования ресурсов, определенных программистом, приводится в разделе «Воспроизведение звуковых файлов».
К сожалению, редактор ресурсов Visual Studio не очень удобен для добавления ресурсов, определяемых программистом. Поэтому проще будет открыть файл описания ресурсов в текстовом формате и добавить строку описания вашего ресурса в следующем формате:
имя_ресурсв тип_ресурсв DISCARDABLE имя_файла
Рассмотрим технику доступа к ресурсам, которые определены программистом. Она немного сложнее, чем для ресурсов стандартных типов.


Окт 16 2009

Растровые образы

Растровые образы чаще всего используются для решения двух классов задач. Прежде всего, с их помощью производится отображение на экране картинок. Например, файлы драйверов дисплеев в Windows содержат множество небольших битовых образов, которые используются для рисования стрелок в полосах прокрутки, галочек в раскрывающихся меню, изображений флажков, переключателей и других служебных изображений.
Также растровые образы применяются для создания кистей. Кисти являются шаблонами пикселов, которые Windows использует для закрашивания изображаемых на экране областей. Растровые образы создаются при помощи графического редактора аналогично созданию пиктограмм. На нервом шаге в диалоговом окне Insert Resource вместо типа ресурса Icon выбирается тип Bitmap. Вызванный графический редактор будет работать в режиме создания растрового ресурса. В отличие от пиктограмм, растровые образы не ограничены в размерах.
Когда вы назначаете ресурсу идентификатор (на третьем шаге), окно Bitmap Properties позволяет установить любые размеры для рисунка, а также выбрать палитру, содержащую 16 или 256 цветов.
Иногда бывает удобнее создать рисунок во внешнем графическом редакторе, обладающем более широкими возможностями, и добавить его в состав ресурсов приложения, выбрав на первом шаге режим Импорт. Ранее уже рассматривался сценарий импорта существующей пиктограммы. Импорт растрового образа осуществляется аналогично.


Окт 16 2009

Курсоры

Курсоры — это изображения размером 32 х 32 пиксела, которые отмечают положение курсора (указателя) мыши. Курсоры во многом похожи на пиктограммы. Их главное отличие заключается в наличии активной точки (hotspot). Активной точкой называется пиксел, который принадлежит изображению курсора и отмечает его точное положение на экране в любой момент времени. В стандартном курсоре, имеющем вид стрелки, активная точка расположена в левом верхнем углу курсора.
Технологию использования в приложении курсоров, определенных программистом, продемонстрируем, продолжая разработку программы Russia.
В новой редакции программа будет изменять форму курсора мыши в зависимости от того, в какой зоне клиентской области он находится. В основном курсор мыши будет иметь форму перекрестья, которая задается предопределенным курсором IDC_CR0SS. Но при приближении к верхней границе клиентской области курсор будет принимать форму стрелки, направленной вверх, а при приближении к нижней границе клиентской области — форму стрелки, направленной вниз. Кроме того, в окне программы будет отображаться информация о текущей позиции курсора, связанной с его активной точкой. Таким образом, к проекту нужно добавить два ресурса курсоров с идентификаторами IDCJJP и IDC_D0WN.
Процедура создания нового курсора в графическом редакторе очень похожа на рассмотренную выше процедуру создания пиктограммы. На первом шаге в диалоговом окне Insert Resource вместо типа ресурса Icon выбирается тип Cursor. Вызванный графический редактор будет работать в режиме создания курсора.
В отличие от окна графического редактора, работающего в режиме создания пиктограммы, в этом окне есть кнопка Set Hotspot, располагающаяся на правом краю панели инструментов. Координаты активной точки отображаются слева от этой кнопки и по умолчанию равны (0, 0). Позиция активной точки указывается всегда относительно левого верхнего угла изображения.
Чтобы назначить активную точку, нужно нажать кнопку Set Hotspot, а затем щелкнуть мышью на том пикселе изображения, который должен стать активной точкой. Для нашего курсора это будет пиксел на верхнем окончании стрелки. После указанных действий надпись слева от кнопки примет вид Hot spot: 15, 0.
Сохраните новые ресурсы в файле описания ресурсов, выполнив команду меню File ► Save. Если теперь открыть файл Russia.гс в текстовом режиме, то можно увидеть две новые строчки с определениями:
IDCJJP CURSOR DISCARDABLE "up.cur" IDC_D0WN CURSOR DISCARDABLE "down.cur"
Завершив определение ресурсов с курсорами, займемся кодом программы.
Необходимо определить дескрипторы используемых курсоров (типа HCURS0R) и загрузить ресурсы при помощи функции LoadCursor, вызов которой аналогичен вызову функции Loadlcon.
В нашей программе будут использоваться три курсора: hCursor для вывода перекрестья (предопределенный курсор IDC_CR0SS), hCursorUp для вывода стрелки вверх (IDC_UP) и hCursorDown для вывода стрелки вниз (IDC_D0WN).
Курсор hCursor должен стать основным курсором приложения. Для ,пого нужно модифицировать соответствующее поле оконного класса, вызвав следующую функцию:
SetClassLongthWnd, GCLJCURSOR. (LONG)hCursor);
Для динамического изменения формы курсора в зависимости от его местонахождения применяется функция SetCursor:
HCURSOR SetCursor(HCURSOR hCursor);
Функция делает текущим курсор, который передается ей в качестве параметра. При этом возвращается дескриптор предшествующего курсора.
Отслеживание положения курсора обычно осуществляется при обработке сообщения WM_M0USEM0VE. Параметр оконной процедуры IParam в этот момент содержит координаты текущей позиции курсора мыши х и у, которые размещаются в младшем и старшем словах параметра соответственно. Эта позиция определяется относительно левого верхнего угла клиентской области.


Окт 16 2009

Использование ресурса в приложении

Для получения дескриптора пиктограммы, относящегося к типу HIC0N, вызывается функция Loadlcon или Loadlmage.
Беглое знакомство с функцией Loadlcon у нас уже состоялось в главе 1. Но здесь она будет рассмотрена более подробно. Функция Loadlcon загружает ресурс пиктограммы из выполняемого файла (.ехе), ассоциированного с экземпляром приложения hlnstance:
HICON LoadlconCHINSTANCE hlnstance. LPCTSTR lpIconName);
В качестве второго параметра, определяющего имя ресурса, функция принимает строку с завершающим нулевым символом. Ранее говорилось, что в файле описания ресурсов, подготовленном с помощью редактора ресурсов, имя_ресурса для пиктограммы представляет собой целочисленный идентификатор. Для решения проблемы преобразования целого числа в указатель на строку ресурса необходимо использовать макрос MAKEINTRESOURCE (make an integer into resource string), определенный в файле winuser.h следующим образом:
#define MAKEINTRESOURCE(i) (LPSTR)((DWORD)((WORD)(i)))
Этот макрос преобразует число в указатель, но при этом старшие 16 разрядов устанавливаются в нулевое значение. Так Windows узнает, что второй параметр функции Loadlcon является числом, а не указателем на символьную строку.
Например, для загрузки пиктограммы в программе Russia будет использоваться следующий вызов:
Loadlconthlnstance, MAKEINTRESOURCEUDIJTRICOLOUR));
Если параметр hlnstance имеет значение NULL, то функция Loadlcon используется для загрузки предопределенных пиктограмм. Возможные значения второго аргумента для предопределенных пиктограмм приведены в табл. 1.5 (глава 1). Эта возможность использовалась во всех предыдущих приложениях, так как в классе KWnd поле hlcon оконного класса wc инициализируется при помощи вызова LoadIcon(NULI_ IDI_APPLICATION).
В случае успешного завершения функция Loadlcon возвращает дескриптор загруженной пиктограммы. В случае неудачи возвращается значение NULL. Если по каким-то причинам Loadlcon не смогла загрузить указанную пиктограмму, то она загружает пиктограмму по умолчанию IDI_WINL0G0.
Обращаем ваше внимание на то, что функция Loadlcon предназначена для загрузки только стандартных пиктограмм. Поэтому не пытайтесь загрузить с ее помощью малую пиктограмму (16 х 16). Иначе вас ждет горькое разочарование. Для загрузки пиктограмм других размеров используйте функцию Loadlmage.
Функция Loadlmage предназначена для загрузки изображений разных типов: пиктограмм, курсоров, битовых образов. Она имеет следующий прототип:
HANDLE LoadImage(HINSTANCE hinst. LPCTSTR IpszName. UINT uType. int cxDesired, int cyDesired, UINT fuLoad);
Второй параметр функции определяет загружаемое изображение. Если параметр hinst не равен NULL и параметр fuLoad не содержит флаг LR_LOADFROMFILE, то параметр IpszName интерпретируется аналогично второму параметру функции Loadlcon.
Если параметр hinst равен NULL а параметр fuLoad по-прежнему не содержит флаг LR_L0AD FROM FILE, то параметр IpszName специфицирует OEM-изображение1. Идентификаторы OEM-изображений определены в winuser.h и имеют следующие префиксы: 0ВМ_ для растров, 01С_ для пиктограмм и 0CR_ для курсоров.
Если параметр hinst равен NULL, а параметр fuLoad содержит флаг LR_LOADFROMFILE, то IpszName задает имя файла, в котором хранится изображение загружаемого ресурса.
Третий параметр, uType, определяет тип изображения и может принимать значения IMAGE_BITMAP, IMAGE_CURSOR и IMAGE_ICON.
Четвертый параметр, cxDesired, задает ширину изображения в пикселах. Если он равен нулю и параметр fuLoad содержит флаг LR_DEFAULTSIZE, то для вычисления ширины изображения функция использует значения метрики SM_CXIC0N или SM_CXCURSOR. Если же параметр равен нулю, а флаг LR_DEFAULTSI2Е не используется, то функция использует фактическую ширину изображения.
Пятый параметр, cyDesired, задает высоту изображения в пикселах. Если он равен нулю и параметр fuLoad содержит флаг LR_DEFAL)LTSIZE, то для вычисления высоты изображения функция использует значения метрик SM_CXIC0N или SM_CXCU RS0R. Если же параметр равен нулю, а флаг LR_DEFAULTSIZE не используется, то функция использует фактическую высоту изображения.


Окт 16 2009

Просмотр ресурса с вызовом соответствующего редактора

В окне Workspace перейдите на вкладку ResourceView и сделайте двойной щелчок мышью на идентификаторе интересующего вас ресурса. При этом будет открыт соответствующий редактор ресурса, и в его окне появится изображение, связанное с этим ресурсом, как, например, показано на рис. 5.8. После этого ресурс можно редактировать при помощи средств редактора. Если в определение ресурса были внесены изменения, то они должны быть сохранены при помощи команды меню File ► Save.


Окт 16 2009

Импорт существующей пиктограммы

Изложенный выше сценарий описывает создание новой пиктограммы. Но графический редактор позволяет добавлять к программе уже существующую пиктограмму, позаимствованную из другого приложения.
Предположим, что вы хотите использовать в своей программе пиктограмму, изображение которой находится в файле Anylcon.ico. Для начала требуется скопировать файл Anylcon.ico в папку вашего приложения.
После этого выполните следующую последовательность действий: В главном меню Visual Studio выполните команду Insert ► Resource. В появившемся диалоговом окне Insert Resource выберите тип ресурса Icon и нажмите кнопку Import.
В появившемся диалоговом окне Import Resource убедитесь, что открыта папка вашего приложения, и щелкните на имени файла Anylcon.ico. В результате будет открыто окно графического редактора с изображением импортируемой пиктограммы.
Назначьте идентификатор ресурсу пиктограммы в соответствии с п. 3 описанного выше сценария.
Сохраните ресурс в проекте и выполните действия по модификации состава проекта, как это показано в пп. 5 и 6 описанного выше сценария. Изложенная процедура описывает использование графического редактора
в режиме импорта. Аналогично могут импортироваться и другие графические ресурсы, например, курсоры и растровые изображения.


Окт 16 2009

Пиктограммы

Пиктограммы — это небольшие растровые изображения, применяемые Windows для визуального представления приложений, файлов и каталогов. Пиктограмма, включенная в состав приложения, выводится на экран в левом верхнем углу строки заголовка окна приложения. Кроме того, Windows выводит на экран значок пиктограммы в списке программ меню Start (Пуск), на панели задач, когда окно приложения свернуто, и в списке файлов, отображаемых программой Windows Explorer в открытой папке. Также пиктограммы отображаются на рабочем столе, предоставляя доступ к системным папкам и к ярлыкам исполняемых файлов.
Ранние версии Windows могли отображать пиктограммы размером только 32 х 32 пиксела. Начиная с Windows 95, пиктограммы могут иметь один из трех типовых размеров: 16x16 пикселов для малых пиктограмм, 32 х 32 пикселов для стандартных пиктограмм и 48 х 48 пикселов для больших пиктограмм. Обычно малые и стандартные пиктограммы являются 16-цветными, а большие пиктограммы могут использовать 256 цветов. Маленький значок используется в заголовке приложений, на панели задач и в списках программ меню Start. Пиктограммы, отображающиеся на рабочем столе, имеют стандартный размер. Для окон папок, открываемых Windows Explorer, пользователь может настроить режим показа маленьких или стандартных значков.
Большие значки (48 х 48) могут появиться вместо стандартных значков, если только изменить настройку для размера пиктограмм в системном реестре Windows. Пользователь может сделать это при помощи диалогового окна, которое отображается после выполнения команды Панель управления ► Экран ► Оформление. В диалоговом окне Свойства: Экран следует выбрать тип элемента Значок и установить нужную величину в окне Размер.
Графический редактор Visual Studio, используемый в режиме создания пиктограммы, формирует файл с расширением .ico, содержащий один или несколько значков из следующего списка:
Стандартный формат 32 х 32, 16 цветов (вариант по умолчанию). Стандартный формат 32 х 32, 256 цветов. Большой формат 48 х 48, 256 цветов. Монохромный формат 32 х 32, черно-белая пиктограмма. Маленький формат 16 х 16, 16 цветов.
Создавая приложение, разработчик может включить в него только стандартную пиктограмму. В этом случае Windows сформирует маленький значок из стандартного, просто удалив каждый второй столбец и каждую вторую строку. Но иногда качество такого значка получается неудовлетворительным. В таких случаях стоит добавить изображение малой пиктограммы и соответствующий код для ее загрузки.


Следующая страница »