
- •Глава 9 Значки, курсоры, битовые образы и строки
- •Компиляция ресурсов
- •Значки и курсоры
- •Редактор изображений
- •Получение описателя значков
- •Использование значков в вашей программе
- •Использование альтернативных курсоров
- •Битовые образы: картинки в пикселях
- •Использование битовых образов и кистей
- •Символьные строки
- •Использование ресурсов-символьных строк
- •Использование ресурсов-строк в функции MessageBox
- •Ресурсы, определяемые пользователем
Символьные строки
Наличие ресурса для символьных строк может вначале показаться странным. Тем более, что не было никаких проблем при использовании привычных символьных строк, определенных в качестве переменных непосредственно в теле исходного текста нашей программы.
Ресурсы-символьные строки предназначены главным образом для облегчения перевода вашей программы на другие языки. Как будет рассказано в следующих двух главах, меню и окна диалога также являются частью описания ресурсов. Если вместо непосредственного использования строк в исходном тексте вашей программы, вы используете ресурсы-символьные строки, то весь текст вашей программы, окажется в одном файле — файле описания ресурсов. Если текст в файле описания ресурсов переводится, то все, что вам нужно сделать для иноязычной версии вашей программы, это перекомпоновать программу и добавить переведенные ресурсы в файл с расширением .EXE. Этот способ намного безопасней, чем возня с исходными кодами вашей программы. (Конечно, можно определить все символьные строки в качестве макросов и хранить их в заголовочном файле. Такой способ также позволяет избежать изменения исходного кода программы при переводе на другие языки.)
Использование ресурсов-символьных строк
Ресурсы-символьные строки определяются в описании ресурсов с помощью ключевого слова STRINGTABLE:
STRINGTABLE
{
id1, "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 — это максимальное число передаваемых в szBuffer символов. Идентификаторы строк, которые предшествуют каждой строке, обычно являются идентификаторами макроопределений, которые задаются в заголовочном файле. Многие программисты, программирующие под Windows, для идентификаторов строк используют префикс IDS_. Иногда, при выводе на экран имени файла или другой информации, она должна быть помещена в строку. В этом случае вы помещаете в строку символы форматирования языка С и используете эту строку в качестве форматирующей в функциях sprintf или wsprintf.
Использование ресурсов-строк в функции MessageBox
Давайте рассмотрим пример программы, в которой для вывода на экран трех сообщений об ошибках в окне сообщений используются три символьные строки. В заголовочном файле, который мы назовем PROGRAM.H, для этих сообщений определяются три идентификатора:
#define IDS_FILENOTFOUND 1
#define IDS_FILETOOBIG 2
#define IDS_FILEREADONLY 3
Файл описания ресурсов выглядит следующим образом:
#include "program.h"
[описание других ресурсов]
STRINGTABLE
{
IDS_FILENOTFOUND, "File %s not found."
IDS_FILETOOBIG, "File %s too large to edit."
IDS_FILEREADONLY, "File %s is read-only."
}
Файл с исходным кодом на С также включает этот заголовочный файл и определяет функцию для вывода на экран окна сообщений. (Предполагается, что szAppName — это глобальная переменная, в которой содержится имя программы, а hInst — это глобальная переменная, в которой содержится описатель экземпляра вашей программы.)
#include "program.h"
[другие строки программы]
OkMessage (HWND hwnd, int iErrorNumber, char *szFileName)
{
char szFormat[40];
char szBuffer[60];
LoadString(hInst, iErrorNumber, szFormat, 40);
sprintf (szBuffer, szFormat, szFileName);
return MessageBox (hwnd, szBuffer, szAppName,
MB_OK | MB_ICONEXCLAMATION);
}
Для вывода на экран окна сообщений с сообщением "File not found." программа вызывает функцию:
OkMessage (hwnd, IDS_FILENOTFOUND, szFileName);