18111

Ресурсы. Приложение Windows

Доклад

Информатика, кибернетика и программирование

Ресурсы Приложение Windows может хранить в виде ресурсов текстовые строки пиктограммы курсоры различной формы произвольные матричные графические изображения меню диалоговые панели произвольные массивы данных и т. д. Физически ресурсы находятся внутри exeфайла при...

Русский

2013-07-06

146.5 KB

4 чел.

Ресурсы

Приложение Windows может хранить в виде ресурсов текстовые строки, пиктограммы, курсоры различной формы, произвольные матричные графические изображения, меню, диалоговые панели, произвольные массивы данных и т. д.

Физически ресурсы находятся внутри exe-файла приложения. Они могут загружаться в оперативную память автоматически при запуске приложения или по запросу приложения (явному или неявному). Такой механизм обеспечивает экономное использование оперативной памяти, так как все редко используемые данные можно хранить на диске и загружать в память только при необходимости.

Ресурсы можно редактировать без повторной трансляции программного проекта. Это означает, что вы сможете легко перевести все сообщения и тексты меню вашего (и не только вашего!) приложения на другой национальный язык, отредактировать графические изображения или любые другие ресурсы, даже не имея в своем распоряжении исходные тексты приложения.

Для создания и редактирования ресурсов предназначены специальные приложения. Мы будем использовать приложение Resource Workshop, которое входит в состав системы разработки программного обеспечения Borland C++ for Windows. С помощью этого средства можно создавать новые ресурсы или редактировать уже имеющиеся. В частности, можно отредактировать ресурсы, расположенные внутри загрузочного модуля приложения Windows или внутри библиотеки динамической загрузки DLL.

Включение ресурсов

Для использования ресурсов необходимо создать проект приложения, выбрав для этого из меню File ->New->Project.  Проект должен содержать исходный текст программы – файл с расширением .cpp, файл определения модуля *.def, и файл ресурсов.  Все файлы должны иметь одинаковое имя (с различными расширениями).

Для включения ресурсов в загрузочный модуль приложения вам надо создать текстовый файл описания ресурсов. Этот файл может быть создан либо текстовым редактором (например, встроенным в Borland C++ for Windows), либо при помощи приложения Resource Workshop.

Файл описания ресурсов имеет расширение имени .rc. Его необходимо включить в проект приложения наряду с файлами исходных текстов и файлом определения модуля.

В процессе сборки загрузочного модуля файл описания ресурсов компилируется специальным компилятором ресурсов rc.exe. Компилятор ресурсов поставляется вместе с системой разработки приложений Windows. Он преобразует входной текстовый файл описания ресурсов в двоичный файл с расширением имени .res (вы можете указывать в проекте либо текстовый, либо двоичный вариант файла описания ресурсов, однако лучше использовать текстовый вариант, так как его можно редактировать). Перед запуском компилятора ресурсов система разработки приложений Windows запускает препроцессор текстового описания ресурсов rcpp.exe, который обрабатывает разделители комментариев и директивы препроцессора Си.

На финальном этапе сборки загрузочного модуля компилятор ресурсов rc.exe вызывается еще раз для записи ресурсов в загрузочный модуль. Дополнительно компилятор ресурсов формирует специальную таблицу ресурсов, расположенную в заголовке exe-файла. Таблица ресурсов используется Windows для поиска и загрузки ресурсов в оперативную память.

Далее редактор связей, входящий в систему разработки приложений Windows, собирает из объектных модулей промежуточный вариант загрузочного модуля, не содержащий ресурсов. При этом используется файл определения модуля *.def. Файл описания ресурсов *.rc компилируется утилитой rc.exe в двоичный файл *.res. На последней стадии формирования загрузочного модуля промежуточный вариант exe-файла комбинируется с файлом ресурсов для получения окончательного варианта загрузочного модуля.

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

Таблица строк содержит текстовые строки, закрытые двоичным нулем, на которые можно ссылаться по идентификатору. Идентификатор представляет собой обыкновенное целое число. Вместо чисел обычно используют символические имена, определенные с помощью директивы #define.

Создание таблицы

Для создания таблицы строк текстовый файл описания ресурсов должен содержать оператор STRINGTABLE:

STRINGTABLE [параметры загрузки][тип памяти]

BEGIN

StringID, строка

...

...

...

END

В качестве параметров загрузки можно указывать значения PRELOAD или LOADONCALL (используется по умолчанию). Ресурс с параметром загрузки LOADONCALL загружается в память при обращении к нему со стороны приложения. Ресурс типа PRELOAD загружается сразу после запуска приложения.

Тип памяти, выделяемой при загрузки ресурса, может быть FIXED или MOVABLE. Дополнительно для ресурсов типа можно указать MOVABLE тип DISCARDABLE. Если указан тип FIXED, ресурс будет находиться в памяти по постоянному адресу. Ресурс типа MOVABLE может перемещаться Windows при необходимости уплотнения памяти. Если для перемещаемого ресурса указан тип DISCARDABLE, Windows может забрать у приложения память, выделенную для ресурса. Если ресурс потребуется приложению, Windows загрузит его повторно из exe-файла приложения.

Операторы BEGIN и END определяют границы таблицы строк в файле описания ресурсов. Между ними находятся строки с идентификаторами StringID:

Пример:

STRINGTABLE

{

STRINGTABLE_101, "Строки"

STRINGTABLE_102, "Приложение Строка"

STRINGTABLE_103, "%s Пример лабораторной работы   №%d"

}

Загрузка строки из таблицы

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

int WINAPI LoadString(

 HINSTANCE hInst,      // идентификатор приложения

 UINT idResource,      // идентификатор ресурса

 LPSTR lpszBuffer,     // адрес буфера

 int cbBuffer);        // размер буфера в байтах

 Пример: cb = LoadString(hInstance, IDS_APPNAME,  szAppName, sizeof(szAppName));

Параметр hInst определяет идентификатор запущенного приложения, из загрузочного файла которого необходимо извлечь текстовую строку.

Параметр idResource указывает идентификатор нужной строки. Вы должны использовать одно из значений, заданных в файле описания ресурсов.

Указатель lpszBuffer определяет адрес буфера, в который будет загружена строка. Размер буфера должен быть задан через параметр cbBuffer. Если размер строки окажется больше указанного размера буфера, строка будет обрезана.

Функция LoadString возвращает количество символов, записанных в буфер, или 0, если файл загрузочного модуля не содержит строки с указанным идентификатором (или если в этом файле вообще нет таблицы строк).

Функции для работы с текстовыми строками

Для работы с текстовыми строками приложения Windows могут вызывать стандартные функции библиотеки компилятора, такие как strcat или strcopy. Однако лучше использовать функции для работы с текстовыми строками, определенные в программном интерфейсе Windows. Эти функции используют дальние указатели на строки и учитывают специфику национальных алфавитов. Кроме того, указанные функции находятся в ядре Windows, поэтому при их использовании не происходит увеличения размера файла загрузочного модуля приложения.

Функция lstrcmp сравнивает строки, заданные параметрами:

int WINAPI lstrcmp(LPCSTR lpszString1, LPCSTR lpszString2);

Функция возвращает отрицательное значение, если строка lpszString1 меньше чем строка lpszString2, положительное в противоположном случае, и равное нулю при равенстве сравниваемых строк. При сравнении учитываются особенности национального алфавита для указанной при помощи приложения Control Panel страны. Функция способна сравнивать строки с двухбайтовыми кодами символов. Учитываются также заглавные и прописные буквы. Размер сравниваемых строк не может превышать 64 Кбайт.

Функция lstrcmpi предназначена для сравнения двух строк, но без учета заглавных и прописных букв:

int WINAPI lstrcmpi(LPCSTR lpszString1, LPCSTR lpszString2);

В остальном она полностью аналогична функции lstrcmp.

Учтите, что известные вам функции strcmp и strcmpi не учитывают особенности национальных алфавитов и поэтому их не следует использовать в приложениях Windows.

Для копирования текстовых строк вы должны пользоваться функцией lstrcpy:

LPSTR WINAPI lstrcpy(LPSTR lpszString1, LPCSTR lpszString2);

Эта функция копирует строку lpszString2 в строку lpszString1, возвращая указатель на первую строку или NULL при ошибке. В отличие от своего аналога из библиотеки функций MS-DOS (функции strcpy) эта функция способна работать со строками, содержащими двухбайтовые коды символов. Размер копируемой строки не должен превышать 64 Кбайт.

В программном интерфейсе Windows появилась еще одна функция, предназначенная для копирования заданного количества символов из одной строки в другую. Эта функция имеет имя lstrcpyn:

LPSTR WINAPI lstrcpyn(LPSTR lpszString1, LPCSTR lpszString2,

  int cChars);

Она копирует cChars символов из строки lpszString2 в строку lpszString1.

Для объединения двух строк в приложениях Windows следует применять функцию lstrcat:

LPSTR WINAPI lstrcat(LPSTR lpszString1, LPCSTR lpszString2);

Функция lstrcat добавляет строку lpszString2 к строке lpszString1. Размер строки, получившейся в результате объединения, не должен превышать 64 Кбайт. Функция возвращает указатель на строку lpszString1.

Длину текстовой строки (без учета закрывающего строку двоичного нуля) можно получить при помощи функции lstrlen, аналогичной известной вам функции strlen:

int WINAPI lstrlen(LPCSTR lpszString);

Для классификации символов на строчные, прописные, буквенные или цифровые приложения должны использовать специально предназначенные для этого функции из программного интерфейса Windows.

Функция IsCharAlpha возвращает значение TRUE, если символ, заданный параметром chTest, является буквой:

BOOL WINAPI IsCharAlpha(char chTest);

Функция IsCharAlphaNumeric возвращает значение TRUE, если символ, заданный параметром chTest, является буквой или цифрой:

BOOL WINAPI IsCharAlphaNumeric(char chTest);

Функция IsCharUpper возвращает значение TRUE, если символ, заданный параметром chTest, является прописным (заглавным):

BOOL WINAPI IsCharUpper(char chTest);

Функция IsCharLower возвращает значение TRUE, если символ, заданный параметром chTest, является строчным:

BOOL WINAPI IsCharLower(char chTest);

Приложения Windows обычно работают с наборами в стандарте ANSI, программы MS-DOS - в стандарте OEM. Для перекодировки строки символов, закрытой двоичным нулем, из набора ANSI в набор OEM предназначена функция AnsiToOem:

void WINAPI AnsiToOem(const char _huge* hpszWindowsStr,

   char _huge* hpszOemStr);

Параметр hpszWindowsStr представляет собой указатель типа _huge на преобразуемую строку, параметр hpszOemStr - указатель на буфер для записи результата преобразования.

Похожая по назначению функция AnsiToOemBuff выполняет преобразование массива заданного размера:

void WINAPI AnsiToOemBuff(LPCSTR lpszWindowsStr,

  LPSTR lpszOemStr, UINT cbWindowsStr);

Первый параметр этой функции (lpszWindowsStr) является дальним указателем на массив, содержащий преобразуемые данные, второй (lpszOemStr) - на буфер для записи результата. Третий параметр (cbWindowsStr) определяет размер входного массива, причем нулевой размер соответствует 64 Кбайт (65536 байт).

Обратное преобразование выполняется функциями OemToAnsi и OemToAnsiBuff:

void WINAPI OemToAnsi(const char _huge* hpszOemStr,

  char _huge* lpszWindowsStr);

void WINAPI OemToAnsiBuff(LPCSTR lpszOemStr,

  LPSTR lpszWindowsStr, UINT cbOemStr);

Назначение параметров этих функций аналогично назначению параметров функций AnsiToOem и AnsiToOemBuff.

Для преобразований символов в строчные или прописные приложение Windows должно пользоваться функциями AnsiLower, AnsiLowerBuff, AnsiUpper, AnsiUpperBuff.

Функция AnsiLower преобразует закрытую двоичным нулем текстовую строку в строчные (маленькие) буквы:

LPSTR WINAPI AnsiLower(LPSTR lpszString);

Единственный параметр функции - дальний указатель на преобразуемую строку.

Функция AnsiUpper преобразует закрытую двоичным нулем текстовую строку в прописные (большие) буквы:

LPSTR WINAPI AnsiLower(LPSTR lpszString);

Параметр функции lpszString - дальний указатель на преобразуемую строку.

Функция AnsiLowerBuff позволяет преобразовать в строчные (маленькие) буквы заданное количество символов:

UINT WINAPI AnsiLowerBuff(LPSTR lpszString, UINT cbString);

Первый параметр функции (lpszString) является указателем на буфер, содержащий преобразуемые символы, второй (cbString) определяет количество преобразуемых символов (размер буфера). Нулевой размер соответствует буферу длиной 64 Кбайт (65536 байт).

Функция возвращает количество преобразованных символов.

Функция AnsiUpperBuff позволяет преобразовать в прописные (большие) буквы заданное количество символов:

UINT WINAPI AnsiUpperBuff(LPSTR lpszString, UINT cbString);

Первый параметр функции lpszString(lpszString) является указателем на буфер, содержащий преобразуемые символы, второй (cbString) определяет количество преобразуемых символов (размер буфера). Нулевой размер соответствует буферу длиной 64 Кбайт (65536 байт).

Эта функция, как и предыдущая, возвращает количество преобразованных символов.

Функция AnsiNext возвращает новое значение для указателя, передвинутое вперед по строке на одни символ:

LPSTR WINAPI AnsiNext(LPCSTR lpchCurrentChar);

Параметр функции указывает на текущий символ. Возвращаемое значение является указателем на следующий символ в строке или на закрывающий строку двоичный ноль.

Функция AnsiPrev выполняет передвижение указателя в направлении к началу строки:

LPSTR WINAPI AnsiPrev(LPCSTR lpchStart,

  LPCSTR lpchCurrentChar);

Первый параметр функции указывает на начало строки (на первый символ строки). Второй параметр - указатель на текущий символ. Функция возвращает значение указателя, соответствующее предыдущему символу или первому символу в строке, если при продвижении достигнуто начало строки.

Пиктограмма

В загрузочный модуль приложения Windows можно добавить ресурс, который называется пиктограмма (Icon).

Пиктограмма - это графическое изображение небольшого размера, состоящее из отдельных пикселов. Пиктограммы обычно используются для обозначения свернутого окна приложения. Окна групп приложения Program Manager содержат пиктограммы других приложений.

С помощью приложения Resource Workshop вы можете нарисовать свои собственные пиктограммы и использовать их для представления главного окна приложения в свернутом состоянии, для оформления внешнего вида окон приложения или для решения других задач.

Операционная система Windows содержит ряд встроенных пиктограмм, которые доступны приложениям.

Приложения Windows активно работают с графическими изображениями, состоящими из отдельных пикселов и имеющих прямоугольную или квадратную форму. Такие изображения называются bitmap (битовый образ). Для представления цвета отдельного пиксела в изображении может быть использовано различное количество бит памяти. Например, цвет пиксела черно-белого изображения может быть представлен одним битом, для представления цвета 16-цветного изображения нужно 4 бита. Цвет одного пиксела изображения в режиме TrueColor представляется 24 битами памяти.

Можно считать, что пиктограмма является упрощенным вариантом изображения bitmap. Пиктограммы хранятся в файлах с расширением имени *.ico или *.bmp (хотя можно использовать любое расширение). В одном файле обычно находится несколько вариантов пиктограмм. Когда Windows рисует пиктограмму, он выбирает из файла наиболее подходящий для текущего режима работы видеоадаптера.

Создание пиктограммы

Приложение Resource Workshop позволяет вам создать пиктограммы размером 32х16 пикселов (для отображения на мониторах CGA), 32х32 пиксела (для отображения в стандартном режиме VGA) и 64х64 пиксела (для режимов SVGA с большим разрешением). Вы можете создать монохромную или цветную пиктограмму. Цветная пиктограмма содержит 8, 16 или 256 цветов (Windows версии 3.0 не умеет работать с пиктограммами, содержащими 256 цветов).

Включение пиктограммы в файл описания ресурсов

Для включения пиктограммы в файл описания ресурсов используется оператор ICON (для включения пиктограмм в диалоговые панели используется другой формат, который мы сейчас не будем рассматривать):

IconID ICON [параметры загрузки] [тип памяти] имя файла

Параметры загрузки и тип памяти указывается так же, как и для описанной нами ранее таблицы строк STRINGTABLE. В качестве имени файла необходимо указать имя файла, содержащего пиктограмму, например:

AppIcon ICON myicon.ico

Идентификатор пиктограммы IconID можно указывать как символическое имя (см. предыдущую строку) или как целое число - идентификатор ресурса:

456 ICON great.ico

После сборки проекта файл пиктограммы будет вставлен в исполняемый файл приложения Windows.

Пример:

AppIcon ICON ico.ico

IDI_ICON3 ICON

{

'00 00 01 00 01 00 20 20 10 00 00 00 00 00 E8 02'

}

Использование пиктограммы при регистрации класса окна

Во всех приложениях для класса главного окна приложения мы определяли встроенную в Windows пиктограмму с идентификатором IDI_APPLICATION. Для этого мы вызывали функцию LoadIcon:

wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);

Эта функция имеет следующий прототип:

HICON WINAPI LoadIcon(HINSTANCE hInst, LPCSTR lpszIcon);

Пример:

     hIcon = LoadIcon(0, IDI_APPLICATION);

     hIcon = LoadIcon(hInst,” IDI_ICON3”);

Параметр hInst является идентификатором текущей копии приложения.

Параметр lpszIcon - идентификатор ресурса или дальний указатель на строку, идентифицирующую ресурс.

Функция LoadIcon возвращает идентификатор загруженной пиктограммы или NULL при ошибке.

Если в файле описания ресурсов идентификатор пиктограммы представлен в виде текстовой строки, в качестве второго параметра функции LoadIcon следует передать указатель на эту строку.

Следующая строка задает для класса главного окна приложения пиктограмму, определенную в файле описания ресурсов под именем AppIcon:

wc.hIcon = LoadIcon(hInstance, "AppIcon");

Если же для идентификатора пиктограммы используется целое число, второй параметр следует определить с использованием макрокоманды MAKEINTRESOURCE, определенной в файле windows.h:

#define MAKELP(sel, off) ((void FAR*)MAKELONG((off), (sel)))

#define MAKEINTRESOURCE(i) ((LPCSTR)MAKELP(0, (i)))

Например, пусть в файле описания ресурсов определена пиктограмма с целым числом в качестве идентификатора:

456 ICON great.ico

В этом случае загрузка пиктограммы должна выполняться следующим образом:

wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(456));

Возможен еще один вариант:

wc.hIcon = LoadIcon(hInstance, "#456");

Для Windows символ "#" означает, что значение 456 является текстовой строкой.

Если пиктограмма, загруженная с помощью функции LoadIcon, вам больше не нужна, вы можете освободить занимаемую ей память, вызвав функцию DestroyIcon:

BOOL WINAPI DestroyIcon(HICON hIcon);

Пример: DestroyIcon(hIcon);

Функция DestroyIcon уничтожает пиктограмму, идентификатор которой задан параметром hIcon и освобождает ранее занимаемую этой пиктограммой память.

Встроенные пиктограммы

Операционная система Windows содержит пять встроенных пиктограмм, которые вы можете использовать при необходимости в своих приложениях. Приведем список идентификаторов встроенных пиктограмм.

Пиктограмма

Идентификатор

Применение

IDI_APPLICATION

Пиктограмма, назначаемая главному окну приложения по умолчанию

IDI_ASTERISK

Используется в информирующих сообщениях

IDI_EXCLAMATION

Используется в предупреждающих сообщениях

IDI_HAND

Используется в критических предупреждающих сообщениях

IDI_QUESTION

Означает вопрос или запрос дополнительных данных

С идентификатором IDI_APPLICATION вы уже встречались при регистрации класса окна:

wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);

При загрузке встроенных пиктограмм их идентификатор должен указываться в качестве второго параметра функции LoadIcon, как в приведенном выше примере.

Идентификаторы встроенных пиктограмм определены в файле windows.h следующим образом:

#define IDI_APPLICATION  MAKEINTRESOURCE(32512)

#define IDI_HAND         MAKEINTRESOURCE(32513)

#define IDI_QUESTION     MAKEINTRESOURCE(32514)

#define IDI_EXCLAMATION  MAKEINTRESOURCE(32515)

#define IDI_ASTERISK     MAKEINTRESOURCE(32516)

Изображение пиктограммы в окне приложения

После того как вы загрузили пиктограмму функцией LoadIcon, вы можете нарисовать ее в любом месте окна. Для этого вам достаточно вызвать функцию DrawIcon:

BOOL WINAPI DrawIcon(HDC hDC, int x, int y, HICON hIcon);

Пример: DrawIcon(hDC,20,40,hIcon);

Параметр hDC - идентификатор контекста отображения, полученный для рисования.

Пиктограмма с идентификатором hIcon будет нарисована в точке с координатами (x,y), определяемыми параметрами x и y.

Функция DrawIcon возвращает значение TRUE при успешном завершении и FALSE при ошибке.

Курсор мыши

Курсор мыши представляет собой ни что иное, как упрощенный вариант битового изображения (bitmap), аналогичного пиктограмме. Вы можете выбрать один из встроенных курсоров, либо создать свой собственный. Для создания своего курсора его надо нарисовать, пользуясь приложением Resource Workshop, и записать в файл с расширением имени cur. Далее на файл с курсором следует сделать ссылку в файле описания ресурсов. После этого приложение может загрузить курсор в память и использовать его либо при регистрации класса окна, либо для изменения формы курсора в произвольный момент времени.

Создание курсора

Для создания файла, содержащего курсор, запустите приложение Resource Workshop. В появившейся диалоговой панели включите переключатель ".CURSOR" и нажмите кнопку "OK".

После того как курсор будет нарисован, его следует сохранить в файле с расширением имени cur. Для этого выберите из меню "File" строку "Save file as...".

Включение курсора в файл описания ресурсов

Для включения курсора в файл описания ресурсов используется оператор CURSOR, аналогичный оператору ICON:

CursorID CURSOR [параметры загрузки] [тип памяти] имя файла

Пример: IDC_CURSOR1 CURSOR

{

'00 00 02 00 01 00 20 20 00 00 00 00 00 00 30 01'

}

В качестве параметров загрузки можно указывать значения PRELOAD или LOADONCALL (используется по умолчанию). Ресурс с параметром загрузки LOADONCALL загружается в память при обращении к нему со стороны приложения. Ресурс типа PRELOAD загружается сразу после запуска приложения.

Тип памяти, выделяемой при загрузки ресурса, может быть FIXED или MOVEABLE. Дополнительно для ресурсов типа можно указать MOVEABLE тип DISCARDABLE. Если указан тип FIXED, ресурс будет находиться в памяти по постоянному адресу. Ресурс типа MOVEABLE может перемещаться Windows при необходимости уплотнения памяти. Если для перемещаемого ресурса указан тип DISCARDABLE, Windows может забрать у приложения память, выделенную для ресурса. Если ресурс потребуется приложению, Windows загрузит его повторно из exe-файла приложения.

В качестве имени файла необходимо указать имя файла, подготовленного с помощью приложения Resource Workshop или аналогичного и содержащего курсор, например:

AppCursor CURSOR mycursor.cur

Идентификатор курсора CursorID можно указывать как символическое имя (см. предыдущую строку) или как целое число - идентификатор ресурса:

789 CURSOR custom.cur

После сборки проекта файл курсора будет вставлен в исполняемый файл приложения Windows.

Для загрузки курсора следует использовать функцию LoadCursor:

HCURSOR WINAPI LoadCursor(HINSTANCE hInst,

     LPCSTR lpszCursor);

Пример: hCur=LoadCursor(hInstance,”IDC_CURSOR1”);

Для загрузки нового курсора из ресурсов приложения в качестве параметра hInst необходимо указать идентификатор приложения, полученный через параметр hInstance функции WinMain. Параметр lpszCursor должен при этом указывать на идентификатор ресурса.

Если в файле описания ресурсов идентификатор ресурса представлен символьной строкой, адрес этой строки необходимо указать в параметре lpszCursor:

HCURSOR hCustomCursor;

hCustomCursor = LoadCursor(hInstance, "AppCursor");

Если же в качестве идентификатора ресурса-курсора использовано целое число, следует использовать макрокоманду MAKEINTRESOURCE:

HCURSOR hCustomCursor;

hCustomCursor = LoadCursor(hInstance, MAKEINTRESOURCE(789));

Встроенные курсоры

Приложение Windows может использовать несколько встроенных курсоров. Приведем список идентификаторов встроенных курсоров.

Курсор

Идентификатор

Применение

IDC_ARROW

Стандартный курсор в виде стрелки

IDC_IBEAM

Текстовый курсор

IDC_WAIT

Курсор в виде песочных часов. Используется при выполнении длительных операций

IDC_CROSS

Курсор в виде перекрестия

IDC_UPARROW

Курсор в виде вертикальной стрелки

IDC_SIZE

Индикация изменения размера

IDC_ICON

Пустая пиктограмма

IDC_SIZENWSE

Индикация изменения размера

IDC_SIZENESW

Индикация изменения размера

IDC_SIZEWE

Индикация изменения размера

IDC_SIZENS

Индикация изменения размера

Идентификаторы встроенных курсоров описаны в файле windows.h:

#define IDC_ARROW      MAKEINTRESOURCE(32512)

#define IDC_IBEAM      MAKEINTRESOURCE(32513)

#define IDC_WAIT       MAKEINTRESOURCE(32514)

#define IDC_CROSS      MAKEINTRESOURCE(32515)

#define IDC_UPARROW    MAKEINTRESOURCE(32516)

#define IDC_SIZE       MAKEINTRESOURCE(32640)

#define IDC_ICON       MAKEINTRESOURCE(32641)

#define IDC_SIZENWSE   MAKEINTRESOURCE(32642)

#define IDC_SIZENESW   MAKEINTRESOURCE(32643)

#define IDC_SIZEWE     MAKEINTRESOURCE(32644)

#define IDC_SIZENS     MAKEINTRESOURCE(32645)

Обратите внимание, что для встроенных пиктограмм и встроенных курсоров используются идентификаторы с одинаковым значением. Например, идентификатор курсора IDC_ARROW и идентификатор пиктограммы IDI_APPLICATION определены одинаково:

#define IDC_ARROW        MAKEINTRESOURCE(32512)

#define IDI_APPLICATION  MAKEINTRESOURCE(32512)

Здесь нет никакой ошибки. Так как для загрузки курсора используется функция LoadCursor, а для загрузки пиктограммы - LoadIcon, после загрузки вы получаете идентификатор того ресурса, который вам нужен.

Изменение формы курсора

При регистрации класса окна мы задавали форму курсора следующим способом:

wc.hCursor = LoadCursor(NULL, IDC_ARROW);

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

wc.hCursor = LoadCursor(hInstance,  "AppCursor");

Для динамического изменения формы курсора (например, во время обработки сообщения) следует использовать функцию SetCursor:

HCURSOR WINAPI SetCursor(HCURSOR hcur);

Пример: hCur= SetCursor(HCURSOR hcur);

Параметр hcur функции SetCursor должен указывать идентификатор нового курсора, подготовленный при помощи функции LoadCursor. Если указать параметр как NULL, изображение курсора исчезнет с экрана.

Для того чтобы выключить изображение курсора мыши или вновь включить его используют функцию ShowCursor:

int WINAPI ShowCursor(BOOL fShow);

Пример: с= ShowCursor(TRUE);

Функция управляет содержимым счетчика, который используется для определения момента включения или выключения изображения курсора мыши. Первоначально содержимое счетчика равно нулю. Этот счетчик увеличивается, когда необходимо включить курсор, и уменьшается при выключении курсора. Если счетчик больше или равен нулю, курсор мыши находится во включенном (видимом) состоянии.

Для включения курсора в качестве параметра fShow функции следует передать значение TRUE, для выключения - FALSE.

Возвращаемое функцией ShowCursor значение равно новому содержимому счетчика.

Графическое изображение типа bitmap

В ресурсы приложения вы можете включить произвольное графическое изображение в виде битового образа (в дальнейшем мы будем называть такое изображение изображением типа bitmap или просто изображением bitmap).

С помощью графического редактора, входящего в состав Resource Workshop, или с помощью стандартного приложения Paint Brush вы можете нарисовать прямоугольное графическое изображение типа bitmap. При этом для представления цвета одного пикселя может использоваться разное количество бит. Изображение записывается в файл с расширением имени bmp.

Мы уже сталкивались с изображениями bitmap, когда выводили в окно пиктограмму и курсор. Эти объекты являются частными случаями изображения bitmap.

Изображения bitmap удобно использовать для оформления внешнего вида окон приложения. С помощью таких изображений вы можете, например, создать органы управления любой формы (например, круглые кнопки с картинками), нарисовать фотографию, введенную сканером, заставку или эмблему фирмы. Изображения bitmap открывают широкие возможности для разработки дизайна приложения Windows.

Создание изображения типа bitmap

Для создания изображения bitmap запустите Resource Workshop и из меню "File" выберите строку "New Project". В появившейся диалоговой панели включите переключатель ".BITMAP" и нажмите кнопку "OK".

При создании изображения bitmap используются те же инструменты, что и при создании пиктограммы или курсора. Вы можете выбрать в окне "Colors" любой доступный цвет, однако нельзя сделать прозрачные участки пиктограммы или участки, инвертирующие цвет фона.

Включение изображения bitmap в файл описания ресурсов

Для включения изображения типа bitmap в файл описания ресурсов используется такой же способ, как и для включения пиктограмм. Файл описания ресурсов должен содержать оператор BITMAP:

BitmapID BITMAP [параметры загрузки] [тип памяти] имя файла

Пример:

IDB_BITMAP1 BITMAP

{

 '42 4D 76 08 00 00 00 00 00 00 76 00 00 00 28 00'

}

Параметры загрузки и тип памяти указывается так же, как и для описанной нами ранее таблицы строк STRINGTABLE, пиктограммы и курсора. В качестве имени файла необходимо указать имя файла, содержащего изображение bitmap, например:

AppBitmap BITMAP mybrush.bmp

Идентификатор изображения bitmap BitmapID можно указывать как символическое имя или как целое число - идентификатор ресурса.

Загрузка изображения bitmap

Для загрузки изображения bitmap вы должны использовать функцию LoadBitmap:

HBITMAP WINAPI LoadBitmap(HINSTANCE hInst,LPCSTR lpszBitmap);

Пример:

hBmp= LoadBitmap(hInst,"IDB_BITMAP1");

Назначение параметров этой функции аналогично назначению параметров функций LoadIcon и LoadCursor. Параметр hInst указывает идентификатор текущей копии приложения, параметр lpszBitmap - идентификатор bitmap в файле описания ресурсов.

Функция возвращает идентификатор изображения, который следует использовать для рисования bitmap.

Перед завершением работы приложение должно удалить загруженное изображение, вызвав функцию DeleteObject:

BOOL WINAPI DeleteObject(HGDIOBJ hGDIObj);

Пример:

DeleteObject(hBmp);

В качестве параметра этой функции следует передать идентификатор изображения, полученный от функции LoadBitmap.

Создание кисти для закрашивания окна

Одно из простых применений изображений bitmap - раскрашивание фона окна. С этой целью вы можете использовать изображения размером 8х8 точек, созданные при помощи Resource Workshop.

Изображение, которое будет использовано для закрашивания внутренней области окна, должно быть определено в файле описания ресурсов при помощи оператора BITMAP.

После загрузки изображения функцией LoadBitmap приложение должно создать из этого изображения кисть, вызвав функцию CreatePatternBrush:

HBRUSH WINAPI CreatePatternBrush(HBITMAP hBmp);

Пример:

hBrush = CreatePatternBrush(hBmp);

В качестве параметра функции необходимо передать идентификатор изображения bitmap, полученный от функции LoadBitmap.

Функция CreatePatternBrush возвращает идентификатор кисти, который можно использовать при регистрации класса окна. Значение этого идентификатора следует записать в поле hbrBackground структуры wndclass, используемой для регистрации класса окна.

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

DeleteObject(hBrush);

Произвольные данные

Ресурсы приложения Windows могут включать в себя произвольные данные, такие как таблицы перекодировки, звуковые данные и т. п. При необходимости приложение может загрузить эти данные в память и делать с ними все что угодно.

Включение произвольных данных в ресурсы приложения

Для включения произвольных данных в ресурсы приложения файл описания ресурсов должен содержать один или несколько операторов следующего вида:

RId [тип ресурса] [параметры загрузки] [тип памяти] имя файла

RId является идентификатором ресурса. Можно использовать любое имя или число.

Для типа ресурса вы можете выбрать любое обозначение. Разумеется, не следует выбирать названия предопределенных ресурсов, такие как ICON или CURSOR.

Параметры загрузки и тип памяти указывается так же, как и для других описанной нами ранее ресурсов. В качестве имени файла необходимо указать имя файла, содержащего данные, например:

Hello SOUND hello.wav

Вся работа по подготовке файла с данными выполняется программистом перед сборкой проекта.

Загрузка произвольных данных из ресурсов приложения

Получение идентификатора произвольных данных из ресурсов приложения - трехступенчатый процесс. Вначале с помощью функции FindResource необходимо определить расположение ресурса в файле приложения:

HRSRC WINAPI FindResource(HINSTANCE hInst,

  LPCSTR lpszName, LPCSTR lpszType);

Параметр hInst является идентификатором модуля, содержащего ресурс. Для извлечения ресурса из приложения вы должны указать его идентификатор, передаваемый функции WinMain через параметр hInstance.

Параметр lpszName должен содержать адрес имени ресурса. Для загрузки произвольных данных в качестве этого параметра следует передать указатель на строку, содержащую идентификатор ресурса. В приведенном выше примере используется идентификатор "Hello".

Параметр lpszType - адрес строки, содержащий тип ресурса. Для нашего примера это должна быть строка "SOUND".

Таким образом, поиск ресурса, описанного как

Hello SOUND hello.wav

должен выполняться следующим образом:

HRSRC hRsrc;

hRsrc = FindResource(hInstance, "Hello", "SOUND");

Функции FindResource в качестве третьего параметра можно передавать идентификаторы предопределенных типов ресурсов, список которых приведен ниже.

Идентификатор ресурса

Название ресурса

RT_ACCELERATOR

Таблица акселераторов

RT_BITMAP

Изображение bitmap

RT_CURSOR

Курсор

RT_DIALOG

Диалоговая панель

RT_FONT

Шрифт

RT_FONTDIR

Каталог шрифтов 

RT_ICON

Пиктограмма

RT_MENU

Меню

RT_RCDATA

Произвольные данные

RT_STRING

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

Вы можете использовать функцию FindResource для загрузки таких ресурсов, как пиктограммы или курсоры, указав ей тип ресурса, соответственно, RT_ICON или RT_CURSOR. Однако в документации к SDK сказано, что загрузку предопределенных ресурсов, таких как пиктограммы и курсоры, следует выполнять специально предназначенными для этого функциями (LoadIcon, LoadCursor и т. д.).

На втором этапе, после того как ресурс найден, его следует загрузить, вызвав функцию LoadResource:

HGLOBAL WINAPI LoadResource(HINSTANCE hinst, HRSRC hrsrc);

Параметр hinst представляет собой идентификатор модуля, из файла которого загружается ресурс. Если ресурс загружается из файла вашего приложения, используйте значение hInstance, полученное через соответствующий параметр функции WinMain.

В качестве второго параметра этой функции следует передать значение, полученное от функции FindResource.

Третий этап заключается в фиксировании ресурса в оперативной памяти функцией LockResource:

void FAR* WINAPI LockResource(HGLOBAL hGlb);

В качестве параметра hGlb функции LockResource следует передать идентификатор ресурса, полученный от функции LoadResource.

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

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

BOOL WINAPI GlobalUnlock(HGLOBAL hGlb);

#define UnlockResource(h) GlobalUnlock(h)

Эти, а так же другие функции управления памятью мы рассмотрим позже, в отдельной главе, посвященной управлению памятью в операционной системе Windows.

Перед завершением работы приложения следует освободить полученный ресурс, вызвав функцию FreeResource:

BOOL WINAPI FreeResource(HGLOBAL hGlb);

В качестве параметра hGlb следует передать идентификатор ресурса, полученный от функции LoadResource.


 

А также другие работы, которые могут Вас заинтересовать

22379. АНАЛОГО-ЦИФРОВЫЕ И ЦИФРО-АНАЛОГОВЫЕ ПРЕОБРАЗОВАТЕЛИ (ЦАП И АЦП) 315 KB
  ЦАП с двоичновзвешенными резисторами. ЦАП с резистивной матрицей R2R.АНАЛОГОЦИФРОВЫЕ И ЦИФРОАНАЛОГОВЫЕ ПРЕОБРАЗОВАТЕЛИ ЦАП И АЦП 15.
22380. СТАБИЛИЗАТОРЫ И ПРЕОБРАЗОВАТЕЛИ НАПРЯЖЕНИЯ 132 KB
  Общие сведения Стабилизатором напряжения СН называется устройство поддерживающее с требуемой точностью напряжение на нагрузке при изменении дестабилизирующих факторов в определенных пределах. Это различие зависит от места включения СН: между источником напряжения и выпрямителем переменного тока; между выпрямителем и нагрузкой постоянного тока. Компенсационные СН КСН это системы автоматического регулирования выходного напряжения в которых используются также стабилитроны варисторы и т.
22381. Усилительные устройства (УУ) 104 KB
  Эквивалентная схема усилителя. Коэффициент полезного действия усилителя. Диапазон усиливаемых частот f = f0 fн разность между верхней и нижней граничными частотами усиления полоса пропускания усилителя.Эквивалентная схема усилителя Эквивалентная схема усилителя приведена на рис.
22382. Искажения, вносимые в усилителе 229.5 KB
  Искажения импульсных сигналов. Искажения вносимые в усилителе 8. Линейные искажения К линейным относят искажения: частотные вызваны неодинаковостью усиления различных частотных составляющих входного сигнала рис.
22383. Обратная связь (ОС) в усилителях 154 KB
  Влияние ОС на стабильность Ку Однако уменьшая Ку ООС увеличивает его стабильность. стабильность коэффициент усиления в усилителе с ООС в 1 раз выше чем в усилителе без ООС. Пример Пусть усилитель имеет Ку=100 и охвачен ООС причем коэффициент передачи цепи ОС . Стабилизация коэффициента усиления при введении ООС объясняется тем что увеличение усиления за счет любых причин вызывает возрастание напряжения ОС что вызывает уменьшение входного напряжения т.
22384. ОСНОВЫ ПРОЕКТИРОВАНИЯ ПРОМЫШЛЕННЫХ ЗДАНИЙ. ОБЪЕМНО-ПЛАНИРОВОЧНЫЕ И КОНСТРУКТИВНЫЕ РЕШЕНИЯ. ТИПИЗАЦИЯ СБОРНЫХ ЭЛЕМЕНТОВ 17.73 KB
  Так например элементы перекрытий и покрытий должны быть прочными и достаточно жесткими чтобы их прогиб не нарушал эксплуатационного режима здания: стены и колонны поддерживающие покрытия должны быть прочными и устойчивыми. Все здания в целом должны обладать пространственной жесткостью т. Здания бывают каркасными и бескаркасными. В бескаркасных зданиях пространственная жесткость создаётся благодаря совместной работе продольных и поперечных стен соединенных покрытиями в единую пространственную систему.
22385. СТАДИИ НАПРЯЖЕННО-ДЕФОРМИРОВАННОГО СОСТОЯНИЯ ЖЕЛЕЗОБЕТОННЫХ ЭЛЕМЕНТОВ 360.47 KB
  2: стадия I до появления трещин в бетоне растянутой зоны когда напряжения в бетоне меньше временного сопротивления растяжению и растягивающие усилия воспринимаются арматурой и бетоном совместно; стадия II после появления трещин в бетоне растянутой зоны когда растягивающие усилия в местах где образовались трещины воспринимаются apматypoй и участком бетона над трещиной а на участках между трещинами арматурой и бетоном совместно; стадия III стадия разрушения характеризующаяся относительно коротким периодом работы элемента когда...
22386. МЕТОД РАСЧЕТА КОНСТРУКЦИЙ ПО ПРЕДЕЛЬНЫМ СОСТОЯНИЯМ. СУЩНОСТЬ МЕТОДА. ДВЕ ГРУППЫ ПРЕДЕЛЬНЫХ СОСТОЯНИЙ. КЛАССИФИКАЦИЯ НАГРУЗОК. ОСНОВНЫЕ ПОЛОЖЕНИЯ РАСЧЕТА 17.19 KB
  Конструкция может потерять необходимые эксплуатационные качества по одной из двух причин: 1 в результате исчерпания несущей способности разрушения материала в наиболее нагруженных сечениях потери устойчивости некоторых элементов или всей конструкции в целом; 2 вследствие чрезмерных деформаций прогибов колебаний осадок а также изза образования трещин или чрезмерного их раскрытия. Строительные конструкции рассчитывают по методу предельных состояний который дает возможность гарантировать сохранение...
22387. ИЗГИБАЕМЫЕ ЭЛЕМЕНТЫ. РАСЧЕТЫ ПРОЧНОСТИ ПО НОРМАЛЬНЫМ И НАКЛОННЫМ СЕЧЕНИЯМ ЭЛЕМЕНТОВ ПРЯМОУГОЛЬНОГО И ТАВРОВОГО ПРОФИЛЯ. РАСЧЕТ ПОПЕРЕЧНЫХ СТЕРЖНЕЙ 866.99 KB
  РАСЧЕТЫ ПРОЧНОСТИ ПО НОРМАЛЬНЫМ И НАКЛОННЫМ СЕЧЕНИЯМ ЭЛЕМЕНТОВ ПРЯМОУГОЛЬНОГО И ТАВРОВОГО ПРОФИЛЯ. Поперечные стержни сеток распределительная арматура принимают меньших диаметров общим сечением не менее 10 сечения рабочей арматуры поставленной в месте наибольшего изгибающего момента; располагают их с шагом 250 300 мм но не реже чем через 350 мм. Железобетонные балки могут иметь прямоугольные тавровые двутавровые трапецеидальные поперечные сечения рисунок 7.2 – Формы поперечного сечения балок и схемы их армирования а прямоугольная;б...