Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3 семестр, WinAPI, MFC.pdf
Скачиваний:
370
Добавлен:
15.06.2014
Размер:
6.17 Mб
Скачать

Битовые образы

Битовые образы(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

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

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

“char”,

id,

[, SHIFT] [, CONTROL] [, ALT]

“^char”,

id,

[, SHIFT] [, CONTROL] [, ALT]

nCode,

id,

ASCII [, SHIFT] [, CONTROL] [, ALT]

nCode,

id,

VIRTKEY [, SHIFT] [, CONTROL] [, ALT]

Пример таблицы акселераторов, в которой определяются быстрые клавиши <Shift+F1>:

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));

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

Меню

Типы меню:

главным меню окна (main menu) или меню верхнего уровня (top-level menu)-это строка выводящаяся непосредственно под строкой заголовка меню, оно содержит отдельные элементы, расположенные в полосе меню (menu bar).

всплывающее меню (popup menu) или подменю (submenu).

плавающее меню (floating menu)-это меню в любом месте экрана, независимое всплывающее меню.

системное меню (system menu) - это всплывающее меню.

Создание:

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

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

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

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

MyMenu MENU BEGIN

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

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

Создание меню верхнего уровня: внутри блока BEGIN-END описания главного меню можно использовать либо инструкцию MENUITEM, либо POPUP.

Инструкция MENUITEM имеет следующий формат: MENUITEM текст_элемента, идентификатор [, атрибуты]

Формат инструкции всплывающего окна POPUP таков:

POPUP текст_элемента [, атрибуты] BEGIN

[список пунктов подменю] END

Создание всплывающего меню (подменю): Следующий за инструкцией POPUP блок

BEGIN-END всплывающего меню ограничивает список пунктов этого подменю.

MENUITEM текст_пункта, идентификатор [, атрибуты]

или

MENUITEM SEPARATOR

или

POPUP текст_пункта [, атрибуты]

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

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

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();

К созданному пустому всплывающему меню можно добавить элементы - пункты или всплывающие меню (вложенные):

AppendMenu(hMenuPopup,MF_STRING,ID_ITEM1,”Текст пункта 1 вспл.

Меню”);

AppendMenu(hMenuPopup,MF_STRING,ID_ITEM2,”Текст пункта 2 вспл.

Меню”);

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

static HMENU hMenuPopup;

. . .

hMenuPopup=CreatePopupMenu();

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

AppendMenu(hMenu,MF_POPUP,(UINT)hMenuPopup,”Текст заголовка вспл.

Меню”);

AppendMenu(hMenu,MF_STRING,ID_ITEM3,”Текст пункта главного меню”);

Идентификаторы добавляемых пунктов ID_ITEM1-3 должны быть заранее определены при помощи директивы #define.

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

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

SetMenu(hWnd,hMenu);

DrawMenuBar(hWnd);

!Если окно hWnd еще не создано, то указать, что у него будет меню hMenu, можно при создании окна следующим способом:

hWnd = CreateWindow("MyClass","Caption",WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT

,

NULL,hMenu,hInst,NULL);

Плавающее меню.

Создание плавающего меню:

Сначала при помощи функции CreatePopupMenu создается пустое всплывающее меню. Это меню заполняется обычным образом при помощи функции AppendMenu, но затем оно не привязывается к главному меню приложения или какому-либо другому меню.

Вместо этого создается плавающее меню. Для этого идентификатор этого меню передается функции TrackPopupMenu. Эта функция выводит на экран плавающее меню и создает свой собственный цикл обработки сообщений, завершающий работу после выбора строк. Поэтому функция TrackPopupMenu не возвращает управление до тех пор, пока работа с меню не будет завершена либо выбором строки, либо отказом от выбора.

После выбора пункта плавающего меню (или отказа от выбора) само меню исчезает, а оконной процедуре окна, к которому присоединено это меню, посылается сообщение WM_COMMAND (аналогично сообщениям обычного оконного меню).

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

AppendMenu – добавляет новый элемент в конец меню.

DeleteMenu – удаляет существующий пункт (если это всплывающее меню, то оно уничтожается).

InsertMenu – вставляет в меню новый пункт.

ModifyMenu – изменяет существующий пункт меню.

RemoveMenu – удаляет существующий пункт меню (если это всплывающее меню, то оно не уничтожается).

DrawMenuBar-перерисовка полосы меню окна.

GetSubMenu- получение дескриптор всплывающего меню, являющегося элементом другого меню hMenu, по дескриптору “родительского” меню.

CheckMenuItem, EnableMenuItem - установление или удаление метки пункта меню

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