Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ch-09.doc
Скачиваний:
0
Добавлен:
23.01.2020
Размер:
258.05 Кб
Скачать

Символьные строки

Наличие ресурса для символьных строк может вначале показаться странным. Тем более, что не было никаких проблем при использовании привычных символьных строк, определенных в качестве переменных непосредственно в теле исходного текста нашей программы.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]