Понятие ресурса. Примеры использования ресурсов

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    444,66 Кб
  • Опубликовано:
    2014-04-15
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Понятие ресурса. Примеры использования ресурсов

Оглавление

1. Вариант задания и цель работы

. Введение

. Используемые функции

CreateWindowExA

UpdateWindow

GetMessage_CLOSE_DESTROYе_COMMAND_SETICON_COMMAND

4. Результат работы программы

Вывод

1. Вариант задания и цель работы

Понятие ресурса. Редакторы и трансляторы ресурсов.

Примеры использования ресурсов.

Самостоятельное изучение 32-х битного программирования на ассемблере и разработка выбранной темы по варианту.

программирование ассемблер ресурс транслятор

2. Введение


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

Ресурсы загружаются в память лишь при обращении к ним, тем самым достигается экономия памяти.

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

Описание ресурсов хранится отдельно от программы в текстовом файле с расширением RC и компилируется (получается файл с расширением RES) специальным транслятором ресурсов. В исполняемый файл ресурсы включаются компоновщиком.

Транслятором ресурсов в пакете MASM32 является RC.EXE, в пакете TASM32 - BRCC32.EXE. В данном курсовом использовался пакет MASM32.

Наиболее употребляемые ресурсы.

1.      Иконки.

2.      Курсоры.

.        Битовая картинка.

.        Строка.

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

.        Меню.

.        Акселераторы.

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

1.      Иконки.

Могут быть описаны в самом файле ресурсов, либо храниться в отдельном файле *.ico. Рассмотрим последний случай. Вот файл ресурсов resu.rc:

#define IDI_ICON1 100

IDI_ICON1 ICON "ico01.ico"

Файл содержит две значимых строки. Одна строка определяет идентификатор иконки, вторая - ассоциирует идентификатор с файлом "ico01.ico". Оператор define является Си-оператором препроцессора.

Вот фрагмент программы для установки иконки, указанной в файле ресурсов:

INVOKE LoadIconA,[HINST],100; идентификатор иконки (см. файл *.rc)и идентификатор процесса

MOV [WC.CLSHICON],EAX

Без использования INVOKE:

PUSH 100   ; идентификатор иконки (см. файл resu.rc)[HINST] ; идентификатор процесса

CALL LoadIconA

MOV [WC.CLSHICON], EAX

2.      Курсоры

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

#define IDI_ICON1 1

#define IDI_CUR1 2_ICON1 ICON "Cdrom01.ico"_CUR1 CURSOR "4way01.cur"

А вот фрагмент программы, вызывающей иконку и курсор.

;иконка окнаLoadIconA,[HINST],100; идентификатор иконки (см. файл *.rc) и идентификатор процесса[WC.CLSHICON],EAX

;курсор окна

INVOKE LoadCursorA,[HINST],202[WC.CLSHCURSOR],EAX

Без использования INVOKE:

;----------иконка окна1 ; идентификатор иконки

PUSH [HINST]LoadIconA@8[WC.CLSHICON], EAX

; ----------курсор окна

PUSH 2 ; идентификатор курсора

PUSH [HINST]LoadCursorA@8[WC.CLSHCURSOR], EAX

Как и для иконки, программа brcc32.exe обрабатывает определение курсора в тексте файла ресурсов.

3.      Битовые картинки (*.BMP).

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

//битовая картинка

#defineIDI_BIT1 500_BIT1 BITMAP "bit.bmp"

Для загрузки битовой картинки используется API-функция LoadBitmapА, которая имеет два параметра:

·        идентификатор картинки из файла ресурсов (в нашем случае это значение IDI_BIT1, эквивалентное 500);

·        дескриптор процесса (приложения).

PUSH 500[HINST]LoadBitmapABTM,EAX

4.      Строки.

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

#define str1 1001

#define str2 2000

#define str3 3000

#define str4 4000

#define str5 5000

#define str6 6000

#define str7 7000

#define str8 8000

//определение строк

{,"ВЫХОДИЗПРОГРАММЫ"2,"ВЕРСИЯ 1.СОЗДАТЕЛЬ ПОЛТАНОВА ЕЛЕНА"

str3,"ВЫВОД СООБЩЕНИЯ"

str4,"АКСЕЛЕРАТОРЫ"

str5,"СТРОКИ"

str6,"ДИАЛОГОВЫЕ ОКНА"

str7,"ЭТОТ КУРСОР ЗАГРУЖЕН ИЗ ФАЙЛА РЕСУРСОВ"

str8,"ВЫ УЖЕ ЗАГРУЗИЛИ БИТОВУЮ КАРТИНКУ"

}

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

INVOKE LoadStringA, [HINST],1001,OFFSET BUF1,40;загрузитьстрокуLoadStringA, [HINST],2000,OFFSET BUF2,40LoadStringA, [HINST],3000,OFFSET BUF3,40LoadStringA, [HINST],4000,OFFSET BUF4,40LoadStringA, [HINST],5000,OFFSET BUF5,40LoadStringA, [HINST],6000,OFFSET BUF6,40LoadStringA, [HINST],7000,OFFSET BUF10,40LoadStringA, [HINST],8000,OFFSET BUF7,40

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

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

#define WS_CAPTION 0x00C00000L

#define WS_SYSMENU       0x00080000L

#define WS_MINIMIZEBOX   0x00020000L

#define WS_MAXIMIZEBOX   0x00010000L

DIAL1 DIALOG 0, 0, 240, 120WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX

CAPTION "Пример диалогового окна"8, "Arial"

{

}

Определение диалога начинается со строки, содержащей ключевое слово DIALOG. В этой же строке далее указывается положение и размер диалогового окна. Далее идут строки, содержащие другие свойства окна. Наконец идут фигурные скобки. В данном случае они пусты. Это означает, что на окне нет никаких управляющих элементов. Тип окна, а также других элементов определяется константами, которые мы поместили в начале файла. Эти константы стандартны, и для языка Си хранятся в файле RESOURCE.H. Мы, как и раньше, все константы будем определять непосредственно в файле ресурсов. Обращаю ваше внимание, что константы определяются согласно нотации языка Си.

Диалоговое окно очень похоже на обычное окно. Так же как обычное окно, оно имеет свою процедуру. Процедура диалогового окна имеет те же параметры, что и процедура обычного окна. Сообщений, которые приходят на процедуру диалогового окна, гораздо меньше. Но те, которые у диалогового окна имеются, в основном совпадают с аналогичными сообщениями для обычного окна. Только вместо сообщения WM_CREATE приходит сообщение WM_INITDIALOG. Процедура диалогового окна может возвращать либо нулевое, либо ненулевое значение. Ненулевое значение должно возвращаться в том случае, если процедура обрабатывает (берет на себя обработку) данное сообщение, и ноль - если предоставляет обработку системе.

Отличия в поведении диалогового окна от обычного окна легко объяснить. Действительно, если Вы создаете обычное окно, то все его свойства определяются тремя факторами: свойствами класса, свойствами, определяемыми при создании окна, реакцией процедуры окна на определенные сообщения. При создании диалогового окна все свойства заданы в ресурсах. Часть этих свойств задается, когда при вызове функции создания диалогового окна (DialogBox, DialogBoxParam и др.) неявно вызывается функция CreateWindow. Остальная же часть свойств определяется поведением внутренней функции, которую создает система при создании диалогового окна. Если с диалоговым окном что-то происходит, то сообщение сначала приходит на внутреннюю процедуру, а затем вызывается процедура диалогового окна, которую мы создаем в программе. Если процедура возвращает 0, то внутренняя процедура продолжает обработку данного сообщения, если же возвращается ненулевое значение, внутренняя процедура не обрабатывает сообщение.

6.      Меню.

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

MOV DWORD PTR [WC.CLMENNAME],0

на

MOV DWORD PTR [WC.CLMENNAME], OFFSET MENS

Здесь MENS - имя, под которым меню располагается в файле ресурсов. Меню на диалоговое окно устанавливается другим способом, который, разумеется, подходит и для обычного окна. В начале меню загружается при помощи функции LoadMenu, а затем устанавливается функцией SetMenu.

загрузить менюLoadMenuA,[HINST],OFFSET PMENU;установить меню

INVOKE SetMenu,DWORD PTR [EBP+08H],EAX

Меню в файле ресурсов:

MENUP MENU

{"&Иконки и курсоры"

{SEPARATOR "И&конки "

{

MENUITEM "Ик&онка 1 F1",1

MENUITEM "Ико&нка 2 F2",2"Икон&ка 3 F3",3

}"К&урсоры F4",4

}"&Еще ресурсы"

{

MENUITEM " Б&итовые картинки F7",7"Акселе&раторы F8",8

MENUITEM "Стро&ки F9",9

MENUITEM "Диалоговые ок&на F10",10

}"Выход F11",11

}

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

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

7.      Акселераторы.

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

Это очень удобно и быстро. Таблица акселераторов является ресурсом, имя которого должно совпадать с именем того меню (ресурса), пункты которого она определяет.

Вот пример такой таблицы. Определяется один акселератор на пункт меню MENUP, имеющий идентификаторы.

#define VK_F1 0x70

#define VK_F2 0x71

#define VK_F3 0x72

#define VK_F4 0x73

#define VK_F5 0x74

#define VK_F6 0x75

#define VK_F7 0x76

#define VK_F8 0x77

#define VK_F9 0x78

#define VK_F10 0x79

#define VK_F11 0x7A

MENUP ACCELERATORS

{_F1, 1, VIRTKEY_F2, 2, VIRTKEY_F3, 3, VIRTKEY_F4, 4, VIRTKEY_F5, 5, VIRTKEY_F6, 6, VIRTKEY_F7, 7, VIRTKEY_F8, 8, VIRTKEY_F9, 9, VIRTKEY_F10,10, VIRTKEY_F11, 11, VIRTKEY

}

А вот общий вид таблицы акселераторов.

Имя ACCELERATORS

{

Клавиша 1, Идентификатор пункта меню (1) [,тип] [,параметр]

Клавиша 2, Идентификатор пункта меню (2) [,тип] [,параметр]

Клавиша 3, Идентификатор пункта меню (3) [,тип] [,параметр]

...

Клавиша N, Идентификатор пункта меню (N) [,тип] [,параметр]

}

Клавиша - это либо символ в кавычках, либо код ASCII символа, либо виртуальная клавиша. Если вначале стоит код символа, то тип задается как ASCII. Если используется виртуальная клавиша, то тип определяется как VIRTUAL.

Параметр может принимать одно из следующих значений: NOINVERT, ALT, CONTROL, SHIFT. Значение NOINVERT означает, что не подсвечивается выбранный при помощи акселератора пункт меню. Значения ALT, SHIFT, CONTROL означают, что, кроме клавиши, определенной в акселераторе, должна быть нажата одна из управляющих клавиш.

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

1.      Должна быть загружена таблица акселераторов. Для этого используется функция LoadAccelerators.

2.      Сообщения, пришедшие от акселератора, следует преобразовать в сообщение WM_COMMAND. Здесь нам пригодится функция TranslateAccelerator.

Остановимся подробнее на втором пункте. Функция TranslateAccelerator преобразует сообщения WM_KEYDOWN и WM_SYSKEYDOWN в сообщения WM_COMMAND и WM_SYSCOMMAND соответственно. При этом в старшем слове параметра WPARAM помещается 1, как отличие для акселератора. В младшем слове содержится идентификатор пункта меню.

Функция TranslateAccelerator возвращает ненулевое значение, если было произведено преобразование сообщения акселератора, в противном случае возвращается 0. Естественно включить вызов этой функции в кольцо сообщений. Вот этот фрагмент.

MSG_LOOP:GetMessageA,OFFSET MSG,0,0,0 EAX, 0 END_LOOP

; транслировать сообщение акселератора

INVOKE TranslateAcceleratorA,[NEWHWND], [ACC], OFFSET MSGEAX,0MSG_LOOPTranslateMessage,OFFSET MSGDispatchMessageA,OFFSET MSGMSG_LOOP_LOOP:

Функция TranslateAccelerator. Первым параметром этой функции идет дескриптор приложения, вторым параметром идет дескриптор таблицы акселераторов ([ACC]), получаемый при загрузке таблицы с помощью функции LoadAccelerators. Третий параметр - адрес, где содержится сообщение, полученное функцией GetMessage.

3. Используемые функции

 

CreateWindowExA.

Каждое окно имеет также свою внутреннюю структуру CREATESTRUCT, которая заполняется во время создания окна с помощью функции CreateWindowExA

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

Рассмотрим функцию CreateWindowExA подробнее. Эта функция из модуля User32.dll принимает целых 12 параметров, которые должны быть размещены в стеке в следующем порядке:

·        адрес переменной, в которой находится дополнительное значение для передачи некоторым типам окон. Если окну не требуется дополнительное значение, этот параметр равен нулю;

·        описатель экземпляра приложения, которому принадлежит окно. Это значение может быть получено с помощью функции GetModuleHandleA из модуля Kernel32.dll;

·        в зависимости от стиля окна, этот параметр является либо идентификатором дочернего окна, либо описателем меню. Если создаваемое окно - дочернее, это идентификатор окна; если нет - описатель меню окна (при отсутствии меню параметр равен нулю);

·        описатель родительского окна или окна-владельца (если окно самостоятельное, параметр равен нулю);

·        высота окна в пикселах;

·        ширина окна в пикселах;

·        начальная вертикальная координата окна. Если окно дочернее, вертикальное положение отсчитывается от левого верхнего угла клиентской области родительского окна; если окно самостоятельное - от левого верхнего угла экрана;

·        начальная горизонтальная координата окна. Аналогично вертикальной координате, за точку отсчета для дочерних окон принимается левый верхний угол клиентской области родительского окна, для самостоятельных окон - левый верхний угол экрана;

·        флаги, указывающие стиль окна;

·        адрес строки с именем окна;

·        адрес строки с именем класса окна;

·        флаги, указывающие расширенный стиль окна.

При успешном создании окна в регистре EAX возвращается его описатель. Если произошла ошибка, EAX будет содержать 0. Постепенно мы разберем каждый параметр этой функции более подробно. Сейчас же попробуем создать приложение с использованием этой функции.

ShowWindow

Функция ShowWindow устанавливает состояние показа определяемого окна.

BOOL ShowWindow

(hWnd,       // дескриптор окнаnCmdShow      // состояние показа окна

);

Параметры hWnd

Идентифицирует окно.

Определяет, как окно должно быть показано. Этот параметр первоначально игнорируется, когда прикладная программа вызывает ShowWindow, если программа, которая запустила прикладную программу, обеспечивает структуру STARTUPINFO. Иначе, при первом вызове функции ShowWindow, это значение должно быть значением, полученным функцией WinMain в ее параметре nCmdShow. В последующих обращениях, этот параметр может быть одним из следующих значений:_HIDE - Скрывает окно и активизирует другое окно._MAXIMIZE - Развертывает определяемое окно._MINIMIZE - Свертывает определяемое окно и активизирует следующее окно верхнего уровня в Z-последовательности._RESTORE - Активизирует и отображает окно. Если окно свернуто или развернуто, Windows восстанавливает в его первоначальных размерах и позиции. Прикладная программа должна установить этот флажок при восстановлении свернутого окна._SHOW - Активизирует окно и отображает его текущие размеры и позицию._SHOWDEFAULT - Устанавливает состояние показа, основанное на флажке SW_, определенном в структуре STARTUPINFO, переданной в функцию CreateProcess программой, которая запустила прикладную программу._SHOWMAXIMIZED - Активизирует окно и отображает его как развернутое окно._SHOWMINIMIZED - Активизирует окно и отображает его как свернутое окно._SHOWMINNOACTIVE - Отображает окно как свернутое окно. Активное окно остается активным._SHOWNA - Отображает окно в его текущем состоянии. Активное окно остается активным._SHOWNOACTIVATE - Отображает окно в его самом современном размере и позиции. Активное окно остается активным._SHOWNORMAL - Активизирует и отображает окно. Если окно свернуто или развернуто, Windows восстанавливает его в первоначальном размере и позиции. Прикладная программа должна установить этот флажок при отображении окна впервые.

Возвращаемые значения

Если функция завершилась успешно, возвращается значение отличное от нуля. Если функция потерпела неудачу, возвращаемое значение - ноль.

UpdateWindow

Функция UpdateWindow() обновляет клиентскую область указанного окна, посылая WM_PAINT сообщение к окну. Функция посылает WM_PAINT сообщение непосредственно процедуре указанного окна, обходя прикладную очередь.

BOOL UpdateWindow

(hWnd        // указатель на окно

);

GetMessage

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

BOOL GetMessage

(lpMsg, // указатель на структуруhWnd, // указатель окна чьи сообщения нужно обрабатыватьwMsgFilterMin, // номер мимимального сообщения для выборкиwMsgFilterMax // номер максимального сообщения для выборки

);

С помощью переменной hWnd есть возможность указать конкретное окно, от которого будет принято сообщение. Если установить это значение в NULL, то будут приниматься все сообщения. Возврат этой функции будет отличен от нуля пока не будет получено сообщение WM_QUIT.

WM_CLOSE

Это сообщение посылается когда окно должно быть закрыто. Это сообщение не имеет параметров. Использование этого сообщения:

case WM_CLOSE:(hwndMain);;

WM_DESTROY

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

case WM_DESTROY:( 0 );;

В ответ на это сообщение мы должны поместить в очередь сообщение WM_QUIT. Это и делает функция PostQuitMessage() посылая в очередь это сообщение и говоря, что процесс должен быть завершен.

PostQuitMessagе

VOID PostQuitMessage

(nExitCode           // кодвозврата

);

LoadMenu

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

HMENU LoadMenu

(hInstance,  // модульlpMenuName            // имя ресурса меню

);

Если результат работы функции неудачный, то вернется NULL. Давайте добавим поддержку меню к обычной программе на C, которую мы создавали в "Шаг 4 - Окно Windows на С". Для этого нам нужно добавить файл ресурсов и поместить в него меню.

WM_COMMAND

Сообщение WM_COMMAND посылается когда:

·        производится выбор пункта меню

·        элемент управления посылает уведомительное сообщение родительскому окну

·        происходит нажатие клавиши акселератора.

Обработка этого сообщения производится в главной функции окна.- определяет источник сообщения: элемент управления или акселератор.- идентификатор элемента, если это не акселератор.

После обработки этого сообщения необходимо вернуть 0.

Эта функция пересылает сообщение оконной процедуре.

DispatchMessage

LRESULT DispatchMessage

(MSG *lpmsg       // указатель на структуру с сообщением

);

Возвращаемое значение является тем, которое вернет оконная процедура. Но обычно это значение игнорируется. Откуда берется оконная процедура ??? Она есть в параметрах, то есть не сама процедура, а указатель на окно (HWND). Если указатель HWND_TOPMOST, то сообщение будет переслано всем окнам верхнего уровня. А если NULL, то вообще ничего не будет делаться. Эта функция нужна только один раз, даже если у вас в приложении много окон, она будет рассылать сообщения по окнам в соответствии со структурой MSG. Теперь мы можем нарисовать общую схему прохождения сообщений:

Итак, мы получаем сообщение. Проверяем не конец ли это работы, т.е. WM_QUIT. Если нет, то отдаем сообщение в TranslateMessage(), чтобы получить сообщения от клавиатуры более высокого уровня. После этого перенаправляем сообщение в оконную процедуру на основе HWND указанного в самом сообщении DispatchMessage. Цикл должен быть один для одного потока.

LoadCursor

Функция LoadCursor загружает заданный ресурс курсора из (.EXE) файла выполняемой программы, связанной с экземпляром прикладной программы.

Синтаксис

HCURSOR LoadCursor

(hInstance,  // дескриптор экземпляра приложенияlpCursorName       // идентификатор названия строки или ресурса курсора

);

Параметры

hInstance

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

lpCursorName

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

Чтобы использовать предопределенный курсор Win32, прикладная программа должна установить параметр hInstance в значение ПУСТО (NULL), а параметр lpCursorName в одно из следующих значений:_APPSTARTING - Стандартная стрелка и маленькие песочные часы_ARROW - Стандартная стрелка_CROSS - Перекрестие_IBEAM - I-прямая вертикальная линия для текста_ICON - Только для Windows NT: Пустая иконка_NO - Перечеркнутый круг_SIZE - Только для Windows NT: Четырех направленная стрелка_SIZEALL - Подобно IDC_SIZE_SIZENESW - Двунаправленная стрелка, указывающая северо-восток и юго-запад_SIZENS - Двунаправленная стрелка, указывающая север и юг_SIZENWSE - Двунаправленная стрелка, указывающая северо-запад и юго-восток_SIZEWE - Двунаправленная стрелка, указывающая запад и восток_UPARROW - Вертикальная стрелка_WAIT - Песочные часы

Возвращаемые значения

Если функция завершается успешно, возвращаемое значение - дескриптор недавно загруженного курсора.

Если функция не выполняет задачу, возвращаемое значение ПУСТО (NULL). Чтобы получать расширенные данные об ошибках, вызовите GetLastError

Замечаниязагружает только ресурс курсора, если он не был загружен; иначе, функция извлекает дескриптор существующего ресурса. Эта функция возвращает допустимое значение дескриптора курсора только тогда, если параметр lpCursorName указывает на ресурс курсора. Если lpCursorName указывает на какой-либо тип ресурса отличающегося от курсора (например, пиктограммы), возвращаемое значение не ПУСТО (NULL), даже притом, что это не правильный дескриптор курсора.

Функция LoadCursor ищет ресурс курсора наиболее соответствующий курсору для текущего устройства отображения. Ресурс курсора может быть цветной или одноцветный точечный рисунок.

Функция LoadIcon загружает определяемый ресурс пиктограммы из исполняемого (.EXE) файла, связанного с экземпляром прикладной программы.

LoadIcon

Синтаксис

HICON LoadIcon

(hInstance,           // дескриптор экземпляра приложенияlpIconName           // строка с именем или идентификатор ресурса пиктограммы

);

Параметры

hInstance

Идентифицирует экземпляр модуля, исполняемый файл которого содержит пиктограмму, которая будет загружена. Этот параметр должен иметь значение ПУСТО (NULL), когда загружается стандартная пиктограмма.

lpIconName

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

Чтобы использовать одну из предопределенных пиктограмм Windows, установите параметр hInstance в значение ПУСТО (NULL), а параметр lpIconName в одно из следующих значений:_APPLICATION - Пиктограмма приложения по умолчанию._ASTERISK - Звездочка (используется в информационных сообщениях)._EXCLAMATION - Восклицательный знак (используется в предупреждающих сообщениях)._HAND - Пиктограмма, имеющая форму руки (используется в серьезных предупреждающих сообщениях)._QUESTION - Вопросительный знак (используется в подсказках)._WINLOGO - Логотип Windows.

Возвращаемые значения

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

Если функция не выполняет задачу, величина возвращаемого значения - ПУСТО (NULL). Чтобы получать расширенные данные об ошибках, вызовите GetLastError.

Замечаниязагружает ресурс пиктограммы, только в том случае, если он не был загружен; иначе, функция получает дескриптор существующего ресурса. Функция ищет ресурс пиктограммы, которая наиболее соответствует для текущего дисплея. Ресурс пиктограммы может быть цветной или одноцветный точечный рисунок.может загрузить только пиктограмму, размер которой соответствует метрическим значениям системы SM_CXICON и SM_CYICON. Используйте функцию LoadImage, чтобы загружать пиктограммы, которые другого размера.

LoadAccelerators

Функция LoadAccelerators загружает заданную таблицу клавиш-ускорителей.

Синтаксис

HACCEL LoadAccelerators

(hInstance,  // дескриптор экземпляра приложенияlpTableName         // адрес строки с названием таблицы

);

Параметры

hInstance

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

lpTableName

Указывает на строку с символом нуля в конце, которая именует таблицу клавиш-ускорителей для загрузки. Альтернативно, этот параметр может определять, что идентификатор ресурса таблицы клавиш-ускорителей в младшем слове и нуль в старшем слове. Может быть использована макрокоманда MAKEINTRESOURCE, чтобы создать это значение.

Возвращаемые значения

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

Если функция не выполняет задачу, величина возвращаемого значения - ПУСТО (NULL).

Замечания

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

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

ShowWindow

Функция ShowWindow устанавливает состояние показа определяемого окна.

Синтаксис

BOOL ShowWindow

(hWnd,       // дескриптор окнаnCmdShow      // состояние показа окна

);

Параметры hWnd

Идентифицирует окно.

nCmdShow

Определяет, как окно должно быть показано. Этот параметр первоначально игнорируется, когда прикладная программа вызывает ShowWindow, если программа, которая запустила прикладную программу, обеспечивает структуру STARTUPINFO. Иначе, при первом вызове функции ShowWindow, это значение должно быть значением, полученным функцией WinMain в ее параметре nCmdShow. В последующих обращениях, этот параметр может быть одним из следующих значений:_HIDE - Скрывает окно и активизирует другое окно._MAXIMIZE - Развертывает определяемое окно._MINIMIZE - Свертывает определяемое окно и активизирует следующее окно верхнего уровня в Z-последовательности._RESTORE - Активизирует и отображает окно. Если окно свернуто или развернуто, Windows восстанавливает в его первоначальных размерах и позиции. Прикладная программа должна установить этот флажок при восстановлении свернутого окна._SHOW - Активизирует окно и отображает его текущие размеры и позицию._SHOWDEFAULT - Устанавливает состояние показа, основанное на флажке SW_, определенном в структуре STARTUPINFO, переданной в функцию CreateProcess программой, которая запустила прикладную программу._SHOWMAXIMIZED - Активизирует окно и отображает его как развернутое окно._SHOWMINIMIZED - Активизирует окно и отображает его как свернутое окно._SHOWMINNOACTIVE - Отображает окно как свернутое окно. Активное окно остается активным._SHOWNA - Отображает окно в его текущем состоянии. Активное окно остается активным._SHOWNOACTIVATE - Отображает окно в его самом современном размере и позиции. Активное окно остается активным._SHOWNORMAL - Активизирует и отображает окно. Если окно свернуто или развернуто, Windows восстанавливает его в первоначальном размере и позиции. Прикладная программа должна установить этот флажок при отображении окна впервые.

Возвращаемые значения

Если функция завершилась успешно, возвращается значение отличное от нуля. Если функция потерпела неудачу, возвращаемое значение - ноль.

WM_SETICON

Прикладная программа посылает сообщение WM_SETICON, чтобы сопоставить новую большую или маленькую пиктограмму с окном. Windows выводит большую пиктограмму, когда окно свер-нуто (минимизировано) и маленькую пиктограмму в области заголовка окна.

Синтаксис

WM_SETICON= (WPARAM) fType;          // тип пиктограммы= (LPARAM) (HICON) hicon;  // дескриптор пиктограммы

Параметры fType

Значение wParam. Определяет устанавливаемый тип пиктограммы. Этот параметр может быть одним из следующих значений:

Значение             Что оно означает_BIG          Установку большой пиктограммы для окна._SMALL     Установку маленькой пиктограммы для окна.

Значение lParam. Идентифицирует новую большую или маленькую пиктограмму. Если этот параметр - ПУСТО (NULL), пиктограмма, обозначенная в параметре fType, удаляется.

Возвращаемые значения

Возвращаемое значение - дескриптор предыдущей большой или маленькой пиктограммы, в зависимости от значения fType. Оно - ПУСТО (NULL), если окно предварительно не имело никакой пиктограммы типа, обозначенного fType.

Действия по умолчанию

Функция DefWindowProc возвращает значение дескриптора предыдущей большой или маленькой пиктограммы, связанной с окном, в зависимости от значения fType.

TranslateAccelerator

Функция TranslateAccelerator обрабатывает клавиши - ускорители для команд меню. Функция транслирует сообщение WM_KEYDOWN или WM_SYSKEYDOWN в сообщение WM_COMMAND или WM_SYSCOMMAND (если имеется элемент для клавиши в заданной таблице клавиш-ускорителей), а затем передает сообщение WM_COMMAND или WM_SYSCOMMAND непосредственно соответствующей оконной процедуре. TranslateAccelerator не возвращает значения до тех пор, пока оконная процедура не обработает сообщение.

Синтаксис

int TranslateAccelerator

(hWnd,       // дескриптор окна назначенияhAccTable,       // дескриптор таблицы клавиш-ускорителейlpMsg    // адрес структуры с сообщением

);

Параметры

hWnd

Идентифицирует окно, сообщения которого должны быть оттранслированы.

hAccTable

Идентифицирует таблицу клавиш-ускорителей. Таблица должна быть загружена при помощи вызова функции LoadAccelerators или создана вызовом функции CreateAcceleratorTable.

lpMsg

Указывает на структуру MSG, которая содержит информацию сообщения, извлеченного из очереди сообщений вызывающего потока при помощи использования функции GetMessage или PeekMessage.

Возвращаемые значения

Если функция завершается успешно, величина возвращаемого значения - ИСТИНА (TRUE).

Если функция не выполняет задачу, величина возвращаемого значения - ЛОЖЬ(FALSE). Чтобы получить дополнительные данные об ошибках, вызовите GetLastError.

Замечания

Чтобы отличить сообщение, которые эта функция посылает, от сообщений, отправленных меню или элементами управления, старшее слово параметра wParam сообщения WM_COMMAND или WM_SYSCOMMAND, содержит значение 1.

Комбинации клавиш - ускорителей, используемые для выбра пунктов из меню окна, транслируются в сообщение WM_SYSCOMMAND; все другие комбинации клавиш - ускорителей транслируются в сообщения WM_COMMAND.

Когда TranslateAccelerator возвращает значение отличное от нуля, а сообщение оттранслировано, прикладная программа не должна использовать функцию TranslateMessage для того, чтобы обработать сообщение снова.

Клавише - ускорителю не обязательно надо соответствовать команде меню.

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

Окно заблокировано.

Пункт меню заблокирован.

Комбинация клавиши - ускорителя не соответствует элементу в меню окна и окно свернуто.

Фактически был произведен захват мыши. За информацией о захвате мыши, обратитесь в функцию SetCapture.

Если определяемое окно - активное окно, и никакое другое окно не имеет фокус клавиатуры (это обычно является случаем, если окно свернуто), TranslateAccelerator транслирует сообщения WM_SYSKEYUP и WM_SYSKEYDOWN вместо сообщений WM_KEYDOWN и WM_KEYUP.

Если происходит нажатие клавиши - ускорителя, которое соответствует пункту меню, когда окно, которое владеет меню, свернуто, TranslateAccelerator не отправляет сообщение WM_COMMAND. Однако, если происходит нажатие клавиши - ускорителя, которое не соответствует никакому из пунктов меню или меню окна, функция отправляет сообщение WM_COMMAND, даже если окно свернуто.

WM_COMMAND

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

Синтаксис

WM_COMMAND= HIWORD(wParam);  // код уведомления= LOWORD(wParam);                   // идентификатор элемента меню, управления или

// клавиши ускорителя= (HWND) lParam;                 // дескриптор элемента управления

Параметры

wNotifyCode

Значение старшего слова wParam. Определяет код уведомления, если сообщение из органа управления. Если сообщение от клавиши - ускорителя, этот параметр равен 1. Если сообщение от меню, этот параметр - 0.

wID

Значение младшего слова wParam. Определяет идентификатор пункта меню, органа управления или клавиши - ускорителя.

hwndCtl

Значение lParam. Идентифицирует орган управления, отправляющий сообщение, если сообщение от элемента управления. Иначе, этот параметр имеет значение ПУСТО (NULL).

Возвращаемые значения

Если приложение обрабатывает это сообщение, оно должно возвратить нуль.

;файл menu1.asm

.386P

.MODEL FLAT, stdcall          ; определяем, что у нас сплошная("плоская") модель памяти,а stdcall говорит, что нужно уровнять стэк, после того как ф-ия будет прервана

;==========================menu1.incp:\masm32\lib\user32.lib  ;директивы компоновщику для подключения библиотек

includelib p:\masm32\lib\kernel32.libp:\masm32\lib\gdi32.lib

;==========================

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'; сегментданных DD 0     MSGSTRUCT <?>       WNDCLASS <?>PAINTSTR <?>   DD 0                 ; дескрипторприложенияDB 'Курсовая работа Полтановой Елены',0          DB 'CLASS32',0DWORD ?DWORD ?DWORD ?DWORD 0 ;дескрипторкартинки      DD 30DD 30DB "MENUP",0DB 40 dup(0)DB 40 dup(0)DB 40 dup(0)DB 40 dup(0)DB 40 dup(0)DB 40 dup(0)DB 40 dup(0)DB 40 dup(0)     DWORD ?

_DATA ENDS

;=============================

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'                   ; сегменткода:,0; получить дескриптор приложения [HINST], EAXLoadStringA, [HINST],1001,OFFSET BUF1,40;загрузитьстрокуLoadStringA, [HINST],2000,OFFSET BUF2,40LoadStringA, [HINST],3000,OFFSET BUF3,40LoadStringA, [HINST],4000,OFFSET BUF4,40LoadStringA, [HINST],5000,OFFSET BUF5,40LoadStringA, [HINST],6000,OFFSET BUF6,40LoadStringA, [HINST],7000,OFFSET BUF10,40LoadStringA, [HINST],8000,OFFSET BUF7,40

; загрузитьакселераторыLoadAcceleratorsA, [HINST], OFFSET PMENU

MOV ACC, EAX ; запомнить дескриптор таблицы

;========================================_CLASS:

;заполнить структуру окна

;стиль

;Стиль.[WC.CLSSTYLE],stylcl[WC.CLSLPFNWNDPROC],OFFSET WNDPROC         ;Процедура обработки сообщений.

MOV   [WC.CLSCBCLSEXTRA], 0  [WC.CLSCBWNDEXTRA], 0  EAX, [HINST]  [WC.CLSHINSTANCE], EAX

 

;иконка окнаLoadIconA,[HINST],100; идентификатор иконки (см. файл *.rc) и идентификатор процесса[WC.CLSHICON],EAX

;курсор окна

INVOKE LoadCursorA,[HINST],202[WC.CLSHCURSOR],EAX

;битовая картинка

PUSH 500

CALL LoadBitmapABTM,EAX

;====================================[WC.CLSHBRBACKGROUND],17DWORD PTR [WC.MENNAME],0DWORD PTR [WC.CLSNAME],OFFSET NAM

INVOKE RegisterClassA, OFFSET WC

;создать окно зарегестрированного класса

;DY0 высота окна

;DX0 ширина окна

;100 координата y

;100 координата x

;TITLENAME имя окна

;NAMимяклассаCreateWindowExA,0,OFFSET NAM, OFFSET TITLENAME,WS_OVERLAPPEDWINDOW,100,100,DX0,DY0,0,0,[HINST],0

;проверка на ошибкуEAX,0_ERR[NEWHWND],EAX;дескриптор окнаShowWindow,[NEWHWND],SW_SHOWNORMAL;показать созданное окноUpdateWindow,[NEWHWND]; перерисовать видимую часть окна

;================================

; кольцо обработки сообщений_LOOP:

INVOKE GetMessageA,OFFSET MSG,0,0,0EAX, 0

JE  END_LOOP

; транслировать сообщение акселератора

INVOKE TranslateAcceleratorA,[NEWHWND], [ACC], OFFSET MSGEAX,0MSG_LOOPTranslateMessage,OFFSET MSGDispatchMessageA,OFFSET MSGMSG_LOOP_LOOP:

;выход из программы(закрыть процесс)

INVOKE ExitProcess,[MSG.MSWPARAM]

_ERR:

JMP END_LOOP

;==================================

; процедура окна

; расположение параметров в стеке

; [EBP+014Н]  LPARAM

; [EBP+10H]   WAPARAM

; [EBP+0CH]   MES

; [EBP+8]    HWND

;==================================    PROCEBPEBP,ESPEBXESIEDI

DWORD PTR [EBP+0CH],WM_DESTROYWMDESTROYDWORD PTR [EBP+0CH],WM_CREATEWMCREATEDWORD PTR [EBP+0CH],WM_COMMANDWMCOMMANDDWORD PTR [EBP+0CH],WM_PAINTWMPAINTDEFWNDPROC

;=================================:BeginPaint, DWORD PTR [EBP+08H],OFFSET PNTHDC,EAXCreateCompatibleDC,HDCMEMDC,EAXSelectObject,MEMDC,BTMBitBLt,HDC,20,20,400,600,MEMDC,0,0,0CC0020hDeleteDC,MEMDCEndPaint,DWORD PTR [EBP+08H],OFFSET PNTEAX,0FINISH

;======================================:

;загрузитьменюLoadMenuA,[HINST],OFFSET PMENU;установитьменюSetMenu,DWORD PTR [EBP+08H],EAXEAX, 0FINISH

;========================================:

;здесь определяем идентификатор, в данном случае это

;это идентификатор пункта меню сообщение

;иконка 1

L7:WORD PTR [EBP+10H],1L8

;загрузитьиконкуLoadIconA,[HINST],100

; установитьиконкуSendMessageA,DWORD PTR [EBP+08H],WM_SETICON,0,EAXFINISH

 

;иконка 2:WORD PTR [EBP+10H],2L9

;загрузитьиконкуLoadIconA,[HINST],101

; установитьиконкуSendMessageA,DWORD PTR [EBP+08H],WM_SETICON,0,EAXFINISH

 

;иконка 3:WORD PTR [EBP+10H],3L10

;загрузитьиконкуLoadIconA,[HINST],102

; установитьиконкуSendMessageA,DWORD PTR [EBP+08H],WM_SETICON,0,EAXFINISH

 

;курсор 1:WORD PTR [EBP+10H],4L11MessageBoxA,0,OFFSET BUF10,OFFSET BUF3,0 FINISH

 

;битовая картинка

 

L11:

CMP WORD PTR [EBP+10H],7

JNE L14

;вывод сообщения о том что загружена картинка

INVOKE MessageBoxA,0,OFFSET BUF7,OFFSET BUF3,0FINISH

:WORD PTR [EBP+10H], 8L15MessageBoxA,0,OFFSET BUF4,OFFSET BUF3,0FINISH

:WORD PTR [EBP+10H], 9L16MessageBoxA,0,OFFSET BUF5,OFFSET BUF3,0FINISH

:WORD PTR [EBP+10H], 10L4MessageBoxA,0,OFFSET BUF6,OFFSET BUF3,0FINISH

:WORD PTR [EBP+10H],11FINISHMessageBoxA,0,OFFSET BUF1,OFFSET BUF3,0WMDESTROYEAX,0FINISH

 

;==================================:DefWindowProcA,DWORD PTR [EBP+08H],DWORD PTR [EBP+0CH],DWORD PTR [EBP+10H],DWORD PTR [EBP +14H]FINISH

;=================================:PostQuitMessage,0EAX,0

;==================================:EDIESIEBXEBP16ENDP

_TEXT ENDSSTART

; файл menu1.inc

; константы

; сообщение приходит при закрытии окна

WM_CLOSEequ 10h;сообщение приходит при закрытии окна

WM_SETICON     equ 80h_COMMAND     equ 111h_SETCURSOR     equ 20h_DESTROY    equ 2;сообщение при закрытии окна_CREATEequ 1;сообщение при создании окна

WM_PAINTequ 0Fh;при перерисовке окна

;свойства окна

CS_VREDRAWequ 1h

CS_HREDRAW equ 2h

CS_GLOBALCLASS equ 4000h_OVERLAPPEDWINDOW equ 000CF0000Hequ CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS0                 equ 600

DY0                 equ 400

;компоненты цветов

RGBW equ (50 or (50 shl 8)) or (255 shl 16) ;цвет окна 150;цвет региона

RGBLequ 0;цвет линии

RGBPequ 255 or (100 shl 8) ;цвет точки

;режим показа окна - нормальный

SW_SHOWNORMALequ 1

; прототипы внешних процедур

CreateWindowExA PROTO : DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD

DefWindowProcA PROTO: DWORD,:DWORD,:DWORD,:DWORDPROTO: DWORD, :DWORDPROTO:DWORD,:DWORD,:DWORD,:DWORDPROTO:DWORDPROTO:DWORDPROTO:DWORD,:DWORD,:DWORD,:DWORDPROTO:DWORD,:DWORDPROTO:DWORD,:DWORDPROTO:DWORD,:DWORDPROTO :DWORD,:DWORDPROTO:DWORDPROTO:DWORD,:DWORD,:DWORD,:DWORDPROTO:DWORD,:DWORDPROTO:DWORD,:DWORDPROTO:DWORD,:DWORD,:DWORDPROTO:DWORD,:DWORD,:DWORD,:DWORDPROTO:DWORDPROTO:DWORDPROTO:DWORD,:DWORDPROTO :DWORD,:DWORDPROTO:DWORDPROTO:DWORD,:DWORDPROTO:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORDPROTO:DWORDPROTO:DWORD,:DWORD,:DWORD,:DWORD,:DWORDPROTO:DWORDPROTO:DWORDPROTO :DWORD

WNDPROC PROTO

; структуры

; структура сообщения

MSGSTRUCTSTRUC

MSHWNDDD ? ;Идентификатор окна, получающего сообщение.

MSMESSAGEDD ? ;Идентификатор сообщения.

MSWPARAMDD ? ;Доп. информация о сообщении.

MSLPARAMDD ? ;Доп. информация о сообщении.

MSTIMEDD ? ;Время посылки сообщения.

MSPTDD ? ;Положение курсора во время посылки сообщения.

MSGSTRUCT ENDS

WNDCLASS  STRUC    DD ?;Стиль окна. ? ;Указатель на процедуру окна.

CLSCBCLSEXTRADD ? ;Информация о доп. байтах для данной структуры.

CLSCBWNDEXTRADD ? ;Информация о доп. байтах для окна.

CLSHINSTANCE     DD ?;Дескриптор приложения.

CLSHICON     DD ?;Идентификатор иконки окна.

CLSHCURSORDD ? ;Идентификатор курсора окна.

CLSHBRBACKGROUNDDD ? ;Идентификатор кисти окна.

MENNAMEDD ? ;Имя-идентификатор меню.

CLSNAMEDD ? ;Специфицирует имя класса окон.

WNDCLASS  ENDS

PAINTSTR STRUCDWORD 0DWORD 0DWORD 0DWORD 0DWORD 0DWORD 0DWORD 0DWORD 0DB 32 dup (0)ENDS

// menu1.rc

#define WS_CAPTION 0x00C00000L

#define IDI_ICON1 100

#define IDI_ICON2 101

#define IDI_ICON3 102_ICON1 ICON "ico1.ico"_ICON2 ICON "ico2.ico"_ICON3 ICON "ico3.ico"

#define IDI_CUR1 200

#define IDI_CUR2 201

#define IDI_CUR3 202

IDI_CUR1 CURSOR "aero_ew_l.cur"_CUR2 CURSOR "aero_helpsel_l.cur"_CUR3 CURSOR "aero_link_l.cur"

//ñòðîêè

#define str1 1001

#define str2 2000

#define str3 3000

#define str4 4000

#define str5 5000

#define str6 6000

#define str7 7000

#define str8 8000

{

str1,"ВЫХОД ИЗ ПРОГРАММЫ"

str2,"ВЕРСИЯ 1. СОЗДАТЕЛЬ ПОЛТАНОВА ЕЛЕНА"

str3,"ВЫВОД СООБЩЕНИЯ"

str4,"АКСЕЛЕРАТОРЫ"

str5,"СТРОКИ"

str6,"ДИАЛОГОВЫЕ ОКНА"

str7,"ЭТОТ КУРСОР ЗАГРУЖЕН ИЗ ФАЙЛА РЕСУРСОВ"

str8,"ВЫ УЖЕ ЗАГРУЗИЛИ БИТОВУЮ КАРТИНКУ"

}

MENUP MENU

{

POPUP "&Иконки и курсоры"

{SEPARATOR"И&конки "

{"Ик&онка 1 F1",1"Ико&нка 2 F2",2"Икон&ка 3 F3",3

}"К&урсоры F4",4

}

POPUP "&Еще ресурсы"

{

MENUITEM " Б&итовые картинки F7",7"Акселе&раторы F8",8

MENUITEM "Стро&ки F9",9

MENUITEM "Диалоговые ок&на F10",10

}"Выход F11",11

}

//акселераторы

#define VK_F1 0x70

#define VK_F2 0x71

#define VK_F3 0x72

#define VK_F4 0x73

#define VK_F5 0x74

#define VK_F6 0x75

#define VK_F7 0x76

#define VK_F8 0x77

#define VK_F9 0x78

#define VK_F10 0x79

#define VK_F11 0x7A

MENUP ACCELERATORS

{_F1, 1, VIRTKEY_F2, 2, VIRTKEY_F3, 3, VIRTKEY_F4, 4, VIRTKEY_F5, 5, VIRTKEY_F6, 6, VIRTKEY_F7, 7, VIRTKEY_F8, 8, VIRTKEY_F9, 9, VIRTKEY_F10,10, VIRTKEY_F11, 11, VIRTKEY

}

#define IDI_BIT1 500_BIT1 BITMAP "bit.bmp"

 

. Результат работы программы


      

Вывод

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

Использование ресурсов дает две вполне определенные выгоды:

1.      Ресурсы загружаются в память лишь при обращении к ним, т.е. реализуется экономия памяти.

2.      Свойства ресурсов поддерживаются системой автоматически, не требуя от программиста написания дополнительного кода.

Похожие работы на - Понятие ресурса. Примеры использования ресурсов

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!