Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора 130стр.doc
Скачиваний:
93
Добавлен:
15.06.2014
Размер:
2.49 Mб
Скачать

28 Ресурсы Windows. Способы задания ресурсов Windows-приложения и их использования.

Файлы ресурсов приложения.

Файлы ресурсов представляют собой одну из самых характерных особенностей программирования в Windows.

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

Создание: Файлы ресурсов (rc-файлы) создаются в виде текстового файла (этот файл можно создать как текстовым редактором, так и специальным редактором ресурсов) и компилируются компилятором ресурсов.

Полученный в результате двоичный файл (res-файл):

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

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

Компоненты файла ресурсов

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

Оператор может состоять

  • из одной строки – однострочный, определяющий растровые изображения (BITMAP), курсоры (CURSOR), шрифты (FONT), пиктограммы (ICON), язык ресурсов (LANGUGE).

состоит из следующих частей:

Идентификатор Тип_ресурса [Характеристика_загрузки] Имя_файла_ресурса

  • из многих строк - многострочный, определяющие диалоговые окна (DIALOG), таблицы строк (STRINGTABLE), таблицы акселераторов (ACCELERATORS), меню (MENU), пользовательские данные (RCDATA) и ресурсы информации о версии.

состоит из следующих частей:

Идентификатор ОПЕРАТОР [Необязательные_параметры]

[Необязательные_инструкции]

BEGIN

[Инструкции]

END

Значки (пиктограммы).

Значок (icon) - это графическое изображение небольшого размера, состоящее из отдельных пикселов (32x32).

Использование: для обозначения свернутого окна приложения, они отображаются в левом верхнем углу заголовка окна (размером 16х16, из “большого” изображения исключается каждый второй столбец и строка).

Создание: с помощью редактора изображений можно нарисовать значки и использовать их в приложениях. Хранятся в файлах с расширением имени *.ico

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

MyIcon ICON iconfile.ico

Получение дескриптора: используется функция LoadIcon.

Способы загрузки значков, определенных в ресурсах приложения:

  • связь между именем пиктограммы в описании ресурсов и в вызове функции LoadIcon:

Описание ресурсов: MyIcon ICON iconfile.ico

Текст программы: HICON hIcon=LoadIcon(hInst,”MyIcon”);

  • вместо имени можно также использовать число– это идентификатор значка:

Описание ресурсов: 125 ICON iconfile.ico

Текст программы: HICON hIcon=LoadIcon(hInst, MAKEINTRESOURCE(125));

  • использование предопределённых значков:

Заголовочный файл: #define IDI_APPLICATION MAKEINTRESOURCE (32512)

Текст программы: HICON hIcon=LoadIcon(NULL, IDI_APPLICATION);

  • комбинация метода, использующего текстовую строку, и метода, использующего число

Описание ресурсов: 125 ICON iconfile.ico

Текст программы: HICON hIcon=LoadIcon(hInst,”#125”);

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

Заголовочный файл: #define MyIcon 125

Описание ресурсов: MyIcon ICON iconfile.ico

Текст программы: HICON hIcon=LoadIcon(hInst, MAKEINTRESOURCE(MyIcon));

!Использование идентификаторов вместо имен значков уменьшает размер exe-файла, и вероятно, немного ускоряет работу функции LoadIcon.

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

wndclass.hIcon=LoadIcon(hInst,”MyIcon”);

Замена действующего значка значком "myicon":

SetClassLong(hWnd,GCL_HICON,LoadIcon(hInst,”AnotherIcon”));

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

DrawIcon (hdc, x, y, hIcon);

Удаление значка: функцию DestroyIcon.

Курсоры.

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

Использование: выводит на экран собственный курсор, когда мышь оказывается в рабочей области окна программы.

Создание: с помощью редактора изображений можно нарисовать значки и использовать их в приложениях. Хранятся в файлах с расширением имени *.cur

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

MyCursor CURSOR cursfile.cur

Получение дескриптора: используется функция LoadCursor.

Способы загрузки курсоров, определенных в ресурсах приложения:

аналогично, как и для значков:

Описание ресурсов: MyCursor CURSOR cursfile.cur

Текст программы: HCURSOR hCursor=LoadCursor(hInst,”MyCursor”);

Другие способы, показанные для значков (использование идентификаторов и MAKEINTRESOURCE), также работают и для курсоров. В заголовочные файлы Windows включается определение typedef HCURSOR, которое используется для хранения описателя курсора.

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

wndclass.hCursor= LoadCursor(hInst,"MyCursor”);

Заменена действующего курсора другим курсором:

SetClassLong(hWnd,GCL_HCURSOR,LoadCursor(hInst,”AnotherCursor”));

!Для динамического изменения формы курсора следует использовать функцию SetCursor, используя в качестве параметра дескриптор нового курсора, подготовленный при помощи функции LoadCursor.

Выключение\включение изображение курсора - используются функция ShowCursor.

Операционная оболочка Windows содержит несколько встроенных курсоров. Их идентификаторы описаны в файле windows.h и начинаются с префикса IDC_.

  • Для загрузки встроенных курсоров также используется функция LoadCursor, но в качестве первого параметра ей передается NULL:

LoadCursor(NULL,IDC_ARROW);

Удаление курсора: при помощи функции DestroyCursor. Битовые образы

Битовые образы(bitmap)- это произвольные графические изображения.

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

Создание: с помощью графических редакторов можно нарисовать графическое изображение типа bitmap. Изображение записывается в файл с расширением имени *.bmp.

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

MyBmp BITMAP bmpfile.bmp

Получение дескриптора: используется функция LoadBitmap.

Способы загрузки битовых образов, определенных в ресурсах приложения:

аналогично, как и для значков:

Описание ресурсов: MyBmp BITMAP bmpfile.bmp

Текст программы: HBITMAP hBitmap=LoadBitmap(hInst,”MyBmp”);

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

Кисть. Этот описатель используется для создания шаблонной кисти (pattern brush). Основой кисти является битовый образ:

hBrush = CreatePatternBrush (hBitmap);

Когда Windows закрашивает этой кистью ои спабласть экрана, битовый образ повторяется по горизонтали и вертикали через каждые восемь пикселей.

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

wndclass.hbrBackground = hBrush;

! Битовые образы являются объектами GDI.

Удаление битового образа: при помощи функции DestroyObject.

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

Использование: предназначены для облегчения перевода приложения на другие языки.

Включение в файл описания ресурсов: с помощью ключевого слова STRINGTABLE:

STRINGTABLE

{

id1, "character string 1"

id2, "character string 2"

[определения остальных строк]}

Идентификаторы строк, которые предшествуют каждой строке, должны быть или числами, или идентификаторами макроопределений, которые задаются в заголовочном файле. В описании ресурсов может быть только одна таблица строк. Максимальный размер каждой строки – 255 символов.

!Символьные строки могут содержать восьмеричные константы- управляющие символы, распознаваемые, функциями DrawText и MessageBox.

# define IDS_HELLO 1

#define IDS_BYE 2

STRINGTABLE

{

IDS_HELLO “Hello”

IDS_BYE “Good bye”

}

Копирование строки из ресурсов приложения в буфер в сегменте данных приложения: используется функция LoadString, затем этот буфер используется как обычная строка:

char szBuffer[256];

LoadString(hInst,id,szBuffer,iMaxLength);

MessageBox(hWnd, szBuffer,”Text from stringtable”,MB_OK);

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

Ресурсы, определяемые пользователем (user-defined resource) - это пользовательские типы ресурсов.

Использование: для включения самых разнообразных данных в загрузочный файл и для получения доступа в приложении к этим данным. Данные могут содержаться в любом формате – текстовом или бинарном.

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

  • однострочные - используются для указания пользовательских ресурсов, которые хранятся в отдельных файлах;

MyData TEXT filedata.dat

  • многострочные - используются для внедрения определений пользовательских ресурсов в файл ресурсов;

имя тип [опции]

BEGIN

[Неструктурированные данные] // 8/16-тиричные значения или строки

END

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

Получение дескриптора: используется функция LoadResource:

HGLOBAL hResource=LoadResource(hInst,FindResource(hInst,”TEXT”,”MyData”));

LoadResource не загружает ресурс сразу в оперативную память.

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

ТИП *ptr=(ТИП *)LockResource(hResource);

Окончание работы с ресурсом и освобождение оперативной памяти: вызов функции FreeResource.

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

Акселераторы(ACCELERATORS) – сочетание клавиш, представляющие быстрые клавиши для определенной задачи и генерирующие сообщения WM_COMMAND (в некоторых случаях WM_SYSCOMMAND).

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

Включение в файл описания ресурсов: при помощи таблицы ACCELERATORS или нескольких таблиц ACCELERATORS, они идентифицируются или строковым именем, или числовым идентификатором:

Идентификатор или Имя ACCELERATORS

BEGIN

[определения быстрых клавиш]

END

Для каждой определяемой быстрой клавиши необходима отдельная строка таблицы.

Пример таблицы акселераторов

MyAccel ACCELERATORS

BEGIN

VK_F1, ID_HELP, VIRTKEY, SHIFT

"I", ID_INFO,

VK_F6, ID_ITEM1, VIRTKEY, CONTROL

END

Получение дескриптора: используется функция LoadAccelerators:

HACCEL hAccel=LoadAccelerators(hInst,"MyAccel");

Вместо имени таблицы быстрых клавиш можно использовать число (идентификатор таблицы), которое затем будет использоваться в инструкции, содержащейся функцию LoadAccelerators и макрос MAKEINTRESOURCE:

HACCEL hAccel=LoadAccelerators(hInst,MAKEINTRESOURCE(IDR_ACCEL1));

Удаление таблицы акселераторов: загруженная таблица акселераторов автоматически уничтожается при завершении работы приложения.

Меню. Создание:

  • описание шаблона меню в файле ресурсов приложения:

  • создать меню “с нуля” при помощи специальных функций Windows

  • подготовить шаблон меню непосредственно в оперативной памяти и создать меню на базе этого шаблона при помощи LoadMenuIndirect.

Включение в файл описания ресурсов (первый способ создание меню):

MyMenu MENU

BEGIN

[список элементов меню (пунктов или всплывающих меню)]

END

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

Подключение меню:

  • ссылка на меню при определении структуры класса окна перед регистрацией этого класса:

wndclass.lpszMenuName=”MyMenu”;

или

wndclass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU);

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

Получение дескриптора: используя функцию LoadMenu:

HMENU hMenu=LoadMenu(hInst,”MyMenu”);

или

HMENU hMenu=LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU));

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

hWnd = CreateWindow("MyClass","Caption", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, NULL,hMenu,hInst,NULL);

  • динамическое подключение меню:

HMENU hMenu=LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU));

. . .

SetMenu(hWnd,hMenu);

Вызов GetMenu - можно узнать дескриптор меню, присоединенного в текущий момент:

HMENU hMenu=GetMenu(hWnd);

Динамическое создание меню (второй способ создания меню):

Создание меню:

  • Создание пустого меню верхнего уровня следует - функция CreateMenu:

static HMENU hMenu;

. . .

hMenu=CreateMenu();

  • Создания всплывающего меню (подменю) - функция CreatePopupMenu:

static HMENU hMenuPopup;

. . .

hMenuPopup=CreatePopupMenu();

Подключение меню верхнего уровня к созданному ранее окну hWnd - функция SetMenu

Отображение новое меню окна - функция DrawMenuBar.

SetMenu(hWnd,hMenu);

DrawMenuBar(hWnd);

Удаление меню: при помощи функции DestroyMenu.

Диалоговые окна.

Диалоговое окно – это окно, содержащее множество элементов управления (они являются его дочерними окнами), через которые проходит обмен данными между пользователем и приложением.

Создание диалогового окна:

  • Создать шаблон диалога.

  • Определить функцию диалога.

  • Вызвать одну из функций создания диалога.

Шаблон диалоговой панели:

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

Имя или Идентификатор DIALOG x, y, ширина, высота // левый верхний угол

[необязательные операторы, определяющие свойства диалога]

BEGIN

[операторы, определяющие элементы управления]

END

Операторы, определяющие элементы управления:

  • оператор определения конкретного элемента управления – содержит параметры типа элемента управления (edittext, combobox, listbox, scrollbar и т.д.), текста, идентификатора элемента управления (текстового или числового), его расположения, стиля и расширенного стиля:

оператор_элемента_управления "text", id, x, y, width, height [, style] 

  • оператора CONTROL - содержит параметры класс окна для данного элемента управления(edit, combobox, listbox, scrollbar, static, button и т.д.), идентификаторы стиля окна, идентификаторы посылки сообщений дочерними окнами родительскому окну, его расположения.

CONTROL "text", id, classname, style, x, y, width, height

Типы диалоговых окон:

  • модальные окна – диалоговые окна, при выводе на кран которых работа приложения приостанавливается, т.е. функции главного окна приложения и всех дочерних окон перестают получать сообщения от мыши и клавиатуры – они попадают в окно диалоговой панели.

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

Создание: при помощи функции DialogBox и отображает это окно как модальное диалоговое окно.

int iCode=DialogBox(hInst,MAKEINTRESOURCE(IDR_DIALOG1),hWnd,DlgProc);

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

Приложение, вызывающее функцию DialogBox, передает адрес функции обратного вызова; DialogBox не возвращает управления, пока диалоговое окно не закроется посредством вызова функции EndDialog.

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

SendMessage(GetParent(hDlg),. . .);

  • немодальные окна – диалоговые окна, при выводе на экран которых работа приложения не приостанавливается, делая при этом недоступным владельца диалогового окна.

Однако немодальные диалоговые окна остаются над поверхностью своих окон-владельцев, даже если это окно-владелец получает фокус.

Создание: с помощью функции CreateDialog, сразу возвращает управление, а ее возвращаемым значением является дескриптор окна диалога. Немодальные окна не возвращают значения своему владельцу.

 

HWND hDlgModaless=NULL; // глобальная переменная, дескриптор окна диалога

. . .

hDlgModaless=CreateDialog(hInst,MAKEINTRESOURCE(IDR_DIALOG2),hWnd, DlgModalessP roc);

 

Однако немодальные диалоговые окна и их владельцы могут обмениваться через вызовы SendMessage. Для этого необходимо изменить цикл обработки сообщений

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