Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Кафедра АСУ
Методичка №1
З курсу програмування в асемблері
Лабораторна робота №5
Тема ( Компіляція ресурсних даних.
Мета ( Оволодіти правилами компіляції ресурсних даних.
Львів 2010
ТЕОРЕТИЧНІ ПОЛОЖЕННЯ
Іноді для якісної роботи програми потрібно використати іконки, меню, малюнки, курсори чи звукові файли. Тримати всі фали окремо в одній директорії з програмою не доцільно дещо може загубитися. Для вирішення цієї проблеми використовується так звані ресурсні дані.
Ресурсні дані (надалі, ресурси) – це ділянка в програмі в якій збережено дані певного формату. В них можуть зберігатися будь які дані. Ресурси не завантажуються в пам'ять з стартом програми. Щоб скористатися ресурсами їх потрібно завантажити у пам'ять, за допомогою АРІ функцій, про них ми поговоримо пізніше. Для створення ресурсу потрібно зробити наступні кроки:
Створити файл з розширенням *.RC
Записати у створений файл специфічний запис (про це поговоримо нижче)
Скомпілювати *.RC файл за допомогою утиліти RC.EXE в файл *.RES
Прописати в директиву компіляції приєднання ресурсу і вказати файл який потрібно приєднати (*.RES)
Приклад компіляції ресурсу:
"с:\masm\bin\RC.EXE /v my.rc". В результаті програма має створити my.res файл, котрий потрібно прописати в стрічку "лінкування" програми.
1.1 Створення ресурсів методом ручної компіляції
Розглянемо приклад фалу з ресурсними даними. В Таблиці 1 приведено стандартні позначення (типи) ресурсу.
Таблиця 1
Ключове слово
в файлі .rc
Тип ресурсних даних
ICON
Файл з малюнком типу “Іконка”
AVI
Анімована іконка (AVI-файл)
ACCELERATORS
Таблиця гарячих клавіш
STRINGTABLE
Таблиця рядків
STRING
Текстовий рядок
DIALOG
Опис діалогового вікна
CONTROL
Вікно стандартного класу
MENU
Опис горизонтального меню вікна
POPUP
Опис спадаючого меню
MENUITEM
Опис одного пункту меню
CURSOR
Файл, що містить зображення курсору
BITMAP
Файл типу “.BMP”
RCDATA
Опис бінарних даних
WAVE
Звуковий файл типу “.WAV”
HTML
Файл типу “.HTM”
ANICURSOR
Файл анімованого курсору
FONT
Файл шрифту
VXD
Файл драйвера пристрою
IMAGE
Малюнок будь якого типу
MANIFEST
Тип для додання спеціальних скриптів написаних на мові XML
MESSAGETABLE
Таблиця повідомлень
Наведемо приклад RC файлу (це приклад має показати вам, як виглядає структура RC файлу):
// константи
#define IDR_MENU 10000 // константа об’єкту меню
// константи елементів меню
#define IDM_File 10001
#define IDM_Open 10002
#define IDM_Save 10003
#define IDM_Close 10005
#define IDM_1 10006
#define IDM_About 10007
#define IDM_Report 10008
#define IDM_Mail 10009
#define IDM_Host 10010
// константи діалог
#define IDD_DLG1 1000
#define b1 1001
#define IDC_EDT1 1002
// оголошення меню
IDR_MENU MENU // початок меню
BEGIN
POPUP "File" // горизонт. меню назва "File"
BEGIN // в ньому випадне меню
MENUITEM "Open",IDM_Open // підменю "Open" ідентифікатор IDM_Open -10002
MENUITEM "Save",IDM_Save // і тд.
MENUITEM SEPARATOR // роздільник
MENUITEM "Close",IDM_Close
END
POPUP "?" // наступне горизонт. меню назва "?"
BEGIN // в ньому випадне меню
MENUITEM "About",IDM_About //…
POPUP "Report" // підменю, яке має своє випадне підменю
BEGIN // опис випадного меню
MENUITEM "To Mail",IDM_Mail
MENUITEM "To Host",IDM_Host
END
END
END
1001 BITMAP "D:/ASM/Masm/Projects/ Help_API/Res/phoenity_radasm.bmp"
// малюнок типу "BMP" ідиф. 1001
1002 IMAGE "D:/Pogggg/_prog/avarat.gif"
// малюнок типу "JPG, GIF,…" ідиф. 1002
1004 CURSOR "D://ASM/Masm/Projects/Films/Res/SplitV.cur"
// курсор "CUR" ідиф. 1004
IDD_DLG1 DIALOGEX 6,6,249,139 // початок опису діалогового вікна, про нього проговоримо пізніше
CAPTION "IDD_DLG" // заголовок
FONT 8,"MS Sans Serif",0,0 // шрифт
STYLE OVERLAPPEDWINDOW// стиль вікна
BEGIN
CONTROL "Кнопка 1",b1,"Button",WS_OVERLAPPEDWINDOW ,30,18,108,19
// елемент типу кнопка з надписом "Кнопка 1"
CONTROL "",IDC_EDT1,"Edit",ES_LEFT or WS_CHILD or WS_TABSTOP or WS_VISIBLE ,30 ,48 ,168 ,70 ,0
// стрічка редагування
END
1.2 Детальний опис наведеного прикладу.
1.2.1 Меню
Кожен ресурс у файлі треба якось позначити, що б його при потребі знайти і завантажити у пам’ять. Напевно потрібно нагадати, що комп’ютер розуміє тільки числа, а слова інтерпретує як числові послідовності. Отже для позначення ресурсів краще використовувати числові значення (позначки) а не символьні імена. Програма швидше працює і не потребує використання додаткових перетворень.
Ну наприклад, перша стрічка "#define IDR_MENU 10000" розшифровується як оголошення константи IDR_MENU значення якої рівно 10000. Нижче у тексті ви знайдете таку стрічку: "IDR_MENU MENU". Ми оголосили ресурс-меню ідентифікатор якого рівний 10000. В принципі могли написати і так "10000 MENU". Тут програміст вирішує як писати. Різниці не має, просто стиль програмування.
"BEGIN" та "END" означають початок та кінець внутрішнього блоку, як в мові Паскаль (Pascal). "POPUP" означає що оголошуємо елемент меню що має випадне меню. Оголошення пункту меню здійснюється за допомогою елементу MENUITEM. Формат:
MENUITEM "Open", IDM_Open
Де:
"Open" – надпис елементу
IDM_Open - ідентифікатор елементу. Див. опис IDR_MENU
Якщо замість назви та ідентифікатора стоїть назва SEPARATOR це означає, що цей пункт меню є роздільником. (горизонтальна лінія). Це можна побачити на мал.1 по між пунктами "Save" і "Close".
На мал1. показано випадне меню "File". На мал. 2. показано приклад багаторівневе випадне меню, тобто хоча елемент "report" є підменю він має властивість випадного меню.
Мал. 1. Випадне меню.
Мал. 2. Багаторівневі випадне меню.
1.2.2. Приєднання ресурсу типу файл.
Розглянемо стрічку :
1001 BITMAP "D:/ASM/Masm/Projects/ Help_API/Res/phoenity_radasm.bmp".
Як в попередньому прикладі з меню будова ідентична. 1001 – ідентифікатор певного ресурсу. BITMAP - тип ресурсу (про типи можна прочитати у Таблиці1, що знаходиться вище). " D:/ASM/Masm/Projects/ Help_API/Res/phoenity_radasm.bmp " – шлях до файлу. Щоб використати даний ресурс у програмі використовуються спеціальні АРІ функції, про них поговоримо пізніше.
1.2.3. Діалогові вікна
Ідея динамічних вікон є надзвичайно потужним інструментом для написання програм. Але в цьому методі є один маленький недолік, габаритність коду програми. Щоб створити програму з "потужним графічним інтерфейсом" потрібно затратити багато часу. Мається на увазі на створення дочірніх вікон. Кожне вікно потрібно створити та налаштувати. Для програмістів це великий недолік, оскільки у бізнесі час - це гроші, чим швидше виконається замовлення тим дорожче проект. Тому компанія Мікрософт видумала новий підхід для створення вікон, який економив час побудови графічного інтерфейсу. Він полягав у тому щоб описати вікно як структуру даних та розмістити її у ресурсах на подобі меню. Такий метод дозволяє створити повноцінне вікно за допомогою лише однієї функції (про функції поговоримо пізніше).
Приклад опису структури діалогового вікна приведене вище, а результат зображено на малюнках мал.1 та мал.2.
Подібно до інших ресурсних даних діалогове вікно має подібну будову:
IDD_DLG1 DIALOGEX 6,6,249,139, де IDD_DLG1 – константа що містить ідентифікатор ресурсу; DIALOGEX - тип "діалогове вікно з розширеними параметрами"; 6,6,249,139 – фізичні розміри вікна.
Дочірні вікна називаються "контролами" (CONTROL). Синтаксис поля котрола:
Зареєстроване слово " CONTROL "
Надпис у вікні (якщо є така потреба). Вказується в лапках.
Числовий ідентифікатор, щоб відрізнити в програмі цей "контрол" поміж інших.
Клас вікна (див. поперед. лабораторну)
Стиль вікна (див. поперед. лабораторну)
Фізичний розмір
Розширений стиль вікна (див. поперед. лабораторну)
В коді програми до них можна доступитися через їх ідентифікатори, або визначити хендл за допомогою спеціальних функцій.
2. Програмні засоби для створення ресурсних даних
2.1 Програма ResEd.exe
В практиці на сьогоднішній день, рідко хто в ручну створює ресурсні файли. Для створення ресурсного файлу можна використати програму ResEd.exe, яка входить в пакет RadASM.
Приведемо приклад побудови ресурсу. Створимо діалогове вікно з кнопкою, приєднаємо малюнок і додамо меню.
Першим ділом потрібно запустити програму ResEd.exe. Вона знаходиться у папці RadAsm.
2.1.1. Діалогове вікно.
2.1.1.1 Створення діалогового вікна
створимо новий проект. File->NewProject. Виберемо шлях та назву файлу нашого ресурсу.
Тепер додамо об’єкт "діалогове вікно". Пункт меню Project->Add Dialog. Всі об’єкти знаходять у меню проекту. Зображено на мал.3.
а) б)
Мал. 3. а – меню проекту; б – результат створення діалогу.
Як показано на мал.3. у вікні редактора з'явиться вікно. Квадратики по периметру вікна, це точки дотику для зміни розміру об’єкта (вікна). Якщо на них натиснути і не відпускаючи рухати мишкою вікно почне міняти розмір. Показано на мал.4.
Щоб поставити об’єкт (кнопку) на діалогове вікно, потрібно виконати наступні дії:
У лівій частині вікна (у панелі компонентів) вибрати (клікнути) об’єкт кнопка. На Мал.3.(б) позначено червоним еліпсом.
Мишкою виділяємо область існування кнопки (по принципу дії, це як виділяти групу файлів за допомогою мишки)
Відпустити клавішу мішки
При виборі будь-якого об’єкту в правій частині (у нижньому сегменті) появиться таблиця властивостей об’єкту (стиль, заголовок, ідентифікатор і т.д.). Показано на мал.4. (обведено червоною рамкою).
Мал.4. Таблиця властивостей
В цій табличці можна міняти всі властивості вікна, починаючи від назви та ідентифікатора закінчуючи стилями вікна. На зміні стулю, зупинимось детальніше.
2.1.1.2 Редагування значення стилю вікна.
Щоб змінити значення стилю, потрібно на проти його значення натиснути кнопку "…", показано на мал. 5(А). Відкривається вікно вибору констант стилю Мал. 5(Б). Якщо вибрати (клікнути) по якомусь полі з певною назвою, поле стане "сірим" (мал.5(В), ознака вибору стилю або спец. властивості вікна, наприклад, вирівнювання по правій стороні тексту) і зміниться числове значення стилю (мал.5(В), виділено червоним еліпсом). Ця дія означає що ми добавляємо(забираємо) певну властивість вікна, якого редагуємо. Після натиснення "Close" зміни вступлять в дію.
А) Б) В)
Мал.5. Редакція стилів вікна
2.1.2. Приєднуємо малюнок.
Для цього потрібно приєднати таблицю файлових ресурсів, показано на мал.6(а). Відкриється вікно редакції ресурсу файлів, мал. 6(Б). Щоб додати новий елемент ресурсу потрібно натиснути кнопку "ADD". Добавиться новий елемент таблиці. Показано на мал.7а.
А) Б)
Мал.6. Перехід в режим редагування файлових ресурсів
Мал.7. Додання файлових ресурсів
У створеному рядку є 4 поля.
1. Type – тип ресурсного файлу. Може приймати одне значення. Всі значення описані в Таблиця №1.
2. Name – ім‘я ресурсного запису. Параметр не обов‘язковий, якщо вказуємо його ідентифікатор.
3. ID – ідентифікатор ресурсного запису. Є не обов‘язковим, якщо вказане ім‘я запису.
4. FileName – шлях та ім‘я файлу.
Після заповнення всіх полів, натискаємо "ОК".
2.1.3. Створення меню
2.1.3.1 Додання до проекту меню
Здійснюється наступною послідовностю дій. Викликати пункт меню Project->AddMenu. Відкриється вікно редакції меню. Мал. 8(а,б)
А) Б)
Мал. 8. Створення меню.
2.1.3.2 Опис кнопок і полів
Розглянемо поля вікна.
Menu – блок, основні настройки меню
Name – ім‘я меню
MenuID – ідентифікатор меню
ItemStartID – стартове значення ідентифікатора, з якого почнуться позначення полів меню. Навіщо це потрібно, наприклад, у вас є вже елементи ресурсу з ідентифікатором 10000, якщо ви створите ще один елемент з таким же ідентифікатором то програма не буде знати який потрібно елемент використати.
MenuEx type – якщо помітити цей елемент, меню отримує додаткові можливості, про можливості описано нижче.
Menu Items – блок, опис пункту меню
Caption – заголовок пункту меню
Namе – ім‘я пункту
Shortcut – вибір гарячої клавіші. Це не означає, що тепер в програмі по певній комбінації клавіш буде виконуватися цей пункт меню, це всього на всього надпис.
ItemID – ідентифікатор пункту меню. Бажано, ім’я та ідентифікатор вказувати.
HelpID – ідентифікатор допомоги, в основному рівний 0.
Розширені можливості меню
Checked – поле меню буде поміченим, тобто буде мати встановлену галочку.
Grayed – поле меню буде "сірим", неактивним.
Right aling – вирівнювання тексту по правій стороні
Radio – цей запис буде виступати як об‘єкт RadioButton
OwerDraw – ця опція визначає поточний запис як графічне зображення. Використовується коли треба намалювати власне меню, не стандартне.
Опис кнопок
Add – додати новий пункт меню.
Insert – Вставити новий пункт поміж інших
Delete – знищити пункт
Language – вибір мови. Цю кнопку не варто рухати.
Стрілки управління
"→" – поточний елемент стає елементам під меню попереднього елемента
"←" – обернено до попереднього пункту
"↑" – пересунути елемент меню вверх
"↓" – пересунути елемент меню в низ.
2.1.3.3 Приклад створення меню.
Для наочного прикладу створено меню з одного випадного меню і двох полів у ньому.
Створюємо нове поле меню. Воно у нас буде випадним. Потрібно вказати і заголовок і бажано ім’я поля. Назвемо "File". Мал.9(А). Натискаємо "ADD".
Створюємо наступне поле, назвемо "Open". Відповідно до попереднього пункту меню також потрібно ввести значення в поля ім‘я та заголовок. Щоб зробити цей запис меню елементом підменю "File", потрібно натиснути 1 раз на кнопку "→". Мал.9(Б).
Створюємо наступне поле, назвемо "Exit". Відповідно до попереднього пункту меню також потрібно ввести значення в поля ім‘я та заголовок. Щоб зробити цей запис меню елементом підменю "File", потрібно натиснути 1 раз на кнопку "→". Мал.9(B).
A) Б) В)
Мал.9. Додання нових елементів в меню.
Після закінчення сіх операцій натискаємо "ОК".
Коли проект готовий, його потрібно зберегти та відкопілювати. Зкомпілювати проект можна двома способами, або через командну стрічку "RC.exe /v name.rc”, де name.rc - це файл в котрий зберегли наш проект ресурсів. Або за допомогою вбудованої компоненти компіляції. Натиснувши кнопку компіляції. Мал..10.(А,Б)
А) Б)
Мал.10 збереження та компіляція ресурсів за допомогою програми ResEd.exe
А) Збереження проекту
Б) Компіляція ресурсу (1- пункт меню, 2 – результат компіляції )
В результаті в каталозі де знаходиться *.rc файл бкде створено скомпільований ресурсній файл *.RES.
2.2 Програма RADAsm.exe
2.2.1. Створення проекту з ресурсами
З попередніх лабораторних ми знаємо що це інструментарій для створення програм на мові асемблер. В склад якої входить під програма ResEditor. Вона ідентична програмі ResEd.exe, тому ми на ній зупинятися детально не будемо. Розглянемо послідовність кроків створення програми з ресурсами.
запускаємо RADAsm.exe
створюємо новий проект
встановлюємо тип програми "Win32 App"
ім‘я та опис вводимо ідентично до поперед лабораторних. Натискаємо NEXT. Мал.11.(А)
у цьому вікні ми вибираємо по якому шаблону створити програму. На мал.11(Б) виділено 2 пункті. 1 – це діалогове вікно, тобто створюється вікно готовим, статичним. 2 – це вікно створене динамічним способом. Див. лабораторну 4. Як приклад візьмемо 1-й варіант. Натискаємо NEXT.
В цьому пункті вказуємо які папки мають бути в проекті. Залишаємо без змін. Натискаємо NEXT.
В поточному вікні налаштовується директиви компіляції. Залишаємо без змін. Натискаємо NEXT.
A) Б)
Мал.11 Етапи створення проекту в RADAsm
2.2.2. Файли проекту
на мал.12.(А) показані файли проекту.
п.1 та п.2 вам знайомий, це файли коду та заголовку програми.
п.3. це форма.., тобто діалогове вікно. Клацніть 2 рази по цьому файлі, відкриється редактор вікна. Мал.12(Б). Ну детально зупинятися на цьому пункті не будемо, оскільки ми це розглянули у попередніх пунктах. Вони працюють ідентично, тільки не потрібно створювати *.res файл і приєднувати до проекту "руками". Це робить за Вас RADASM.
п4. це файл ресурсу, в редакторі RADASM немає потреби його редагувати, всі заповнення файлу *.RC здійснюється за допомогою програмної оболонки.
А) Б)
Мал.12. Нові файли проекту.
Додання меню.
Для цього потрібно додати файл меню. Здійснюється це за допомогою команд Проект->Додати новий ->Меню. Показано на мал.13(А). Після виконання команди з‘явиться вікно збереження файлу, задаємо ім‘я і тиснемо "ок". Мал.13(Б).
А) Б)
Мал.13. додання меню.
З‘явиться знайоме вікно редакції меню, описане у попередніх підпунктах.
У дереві проекту, з‘явиться новий елемент (файл) меню, до якого ви може завжди звернутися і під коректувати.
Додання файлових ресурсів.
Здійснюється за допомогою пунктів меню Проект-> Ресурс. Показано на мал. 14(А). Відкриється вікно редакції файлових ресурсів. Мал.14(Б). Опис роботи з цим вікном знаходиться у попередніх пунктах. Бажано, після закінчення редагування ресурсів натиснути кнопку "Експорт" а потім "ОК".
А) Б)
Мал.14 Додання файлових ресурсів.
Окрім цього можна в ресурс додати таблицю гарячих клавіш, таблицю стрічок, інформацію о версії програми. Все це знаходиться у пункті "Проект".
Робота з ресурсами за допомогою WINAPI функцій
Як попередньо згадувалося ресурси не завантажуються у пам'ять автоматично при старті програми, їх потрібно завантажити самому. Відповідно до задачі, ми можемо просто завантажити контекст ресурсу у пам'ять (аналог завантаження файлу у пам‘ять), або по специфікації для подальшого використання (наприклад, завантаження та створення з нього об’єкту "Іконка"). Тому спочатку розглянемо загальний випадок, просте завантаження ресурсу в пам‘ять.
3.1. Завантаження ресурсів у пам‘ять.
Розглянемо приклад, елементом ресурсу є програма, ми хочемо її зберегти і виконати через оболонку (Windows). Відповідно першим кроком нам потрібно знайти потрібний нам ресурс. Для цого можна використати 2 функції:
FindResource
hModule, // хендл модуля програми.
Визначається за допомогою функції GetModuleHandle
lpName, // адреса рядка, що містить назву елемента ресурсу. Цей параметр може
бути числом, якщо характеризує ідентифікатор ресурсу.
lpType // адреса рядка, що містить назву типу шуканого ресурсу, так як тип ви
можете створити власний. Цей параметр може бути числом, якщо
характеризує тип ресурсу (одна з констант "RT_", дивися хенл).
FindResourceEx
Має ідентично структуру параметрів з одним додатковим параметром wLanguage. Вказує в якому кодуванні (мові/мовному розділі) шукати.
Функції повертають хендл ресурсу.
Наступним кроком потрібно завантажити ресурс у віртуальну пам'ять.
LoadResource
hModule // хендл модуля програми.
Визначається за допомогою функції GetModuleHandle
hResInfo // хендл ресурсу
Функція повертає хендл ресурсу в віртуальній пам‘яті.
Залишається тільки зафіксувати пам'ять.
LockResource
hResData // хендл ресурсу в віртуальній пам‘яті
Функція повертає адресу пам‘яті де розташовано вміст шуканого ресурсу.
Для того щоб зберегти дані на диск, нам потрібно знати скільки займає певний елемент ресурсу.
SizeofResource
hModule // хендл модуля програми.
Визначається за допомогою функції GetModuleHandle
hResInfo // хендл ресурсу
Функція повертає розбір елемента ресурсу.
Знаючи адресу де знаходиться дані ресурсу і розмір, можна зберегти файл (WriteFile) і виконати (ShellExecute).
Завантаження графічних зображень.
Операційна система Windows має можливість окрім прямого завантаження у пам'ять даних ресурсу, також автоматично перетворювати їх у об’єкти певного типу. Наприклад, як іконки, малюнки та курсори. Для цього використовують 3 функції.
LoadIcon
hInstance // хендл модуля програми.
lpIconName // адреса рядка, що містить назву елемента ресурсу. Цей параметр може
бути числом, якщо характеризує ідентифікатор ресурсу.
Функція повертає хендл завантажено іконки.
LoadBitmap
hInstance // хендл модуля програми.
lpBitmapName // адреса рядка, що містить назву елемента ресурсу. Цей параметр
може бути числом, якщо характеризує ідентифікатор ресурсу.
Функція повертає хендл завантажено малюнка.
LoadCursor
hInstance // хендл модуля програми.
lpCursorName // адреса рядка, що містить назву елемента ресурсу. Цей параметр
може бути числом, якщо характеризує ідентифікатор ресурсу.
Функція повертає хендл завантажено курсора.
Робота з меню
Для підвищення функціоналу програми та зменшення її "фізичних" габаритів в програму добавляється об‘єкт меню. Для завантаження меню у пам'ять використовується функція LoadMenu
LoadMenu
hInstance // хендл модуля програми.
lpMenuName // адреса рядка, що містить назву елемента ресурсу. Цей параметр
може бути числом, якщо характеризує ідентифікатор ресурсу.
Функція повертає хендл завантажено меню.
Для становлення меню в вікно потрібно використати функцію SetMenu.
SetMenu
hWnd, // хендл вікна.
hMenu // хендл мменю.
Завантажене меню можна удосконалювати додаючи нові підменю.
Якщо ми хочемо додати новий пункт меню потрібно викликати функцію AppendMenu.
AppendMenu.
hMenu // хендл меню до якого додаємо новий елемент
uFlags // Одна або комбінація наступних констант MF: mf_Bitmap,
mf_Checked, mf_Disabled, mf_Enabled, mf_Grayed, mf_MenuBarBreak mf_MenuBreak, mf_OwnerDraw, mf_Popup, mf_Separator, mf_String, mf_UnChecked. Див "Прапорці меню mf_".
uIDNewItem // ідентифікатор нового пункту меню
lpNewItem // вказівник на стрічку з іменем
Функції створення, видалення, визначеня і тп див. у довіднику (зайдіть на будь яку функції роботи з меню, наприклад, AppendMenu і натисніть на "Group").
Для виконання дії при натисненні пункту меню, подібно як з вікнами-кнопками, потрібно обробити повідомлення WM_COMMAND. Для ідентифікації пункту меню, перевіряється вміст wparam. Пам’ятайте що коли створюєте меню ідентифікатори не можуть повторюватися.
Приклад, обробки меню.
Файл (*.inc)
IDM_OPEN = 100001
IDM_SAVE = 100003
…………….
Файл (*.asm)
……………
mov eax,uMsg
.if eax==WM_COMMAND
.if wParam==IDM_OPEN
…..
.elseif wParam==100002
…..
.elseif wParam==IDM_SAVE
……
.endif
…..
.elseif eax
Можна порівнювати wParam з числом так з константою. Асемблер розуміє один і другий метод. Перевірки. В кінцевому випадку, всі константі перетворюються в числові значення.
3.4 Перебирання записів ресурсу.
Іноді стоїть задача знайти певний ресурс, тільки по його імені, типу або мовному кодуванню. Такий обємо інформації є замалим для функції FindResource. В такому випадки можна використати функції перебору(перерахування) елементів ресурсу. Перерахуємо їх.
EnumResourceLanguages
EnumResourceNames
EnumResourceTypes
Розглянемо синтаксис однієї з трьох функції.
EnumResourceTypes
hModule // модуль програми
lpEnumFunc, // вказівник на функ. обробки (callback function), тип EnumResTypeProc
lParam // параметр який передасться в функ. обробки як додатковий параметр
Приклад оголошення EnumResTypeProc в асемблері.
EnumResTypeProc proc hModule, lpszType, lParam :DWORD
Код програми………..
Ret
EnumResTypeProc endp
hModule – хендл модуля меню що знайши
lpszType – вказівник на стрічку що містить назву "типа" знайденого ресурсу.
lParam – параметр який ми передали у функ. обробки . Див. EnumResourceTypes.
Рашта функції працюють по аналогії, але мають інші вхідні дані та інший вигляд функ. обробки.
3.5 Діалогові вікна.
Для створення проекту з діалоговим вікном потрібно виконати наступні дії.
Запустити RadAsm.exe
Вибра
Завдання:
В ресурсні дані занести 10 об‘єктів. Написати програму яка виявляє всі ресурси, та заносить у вікно списку.
В ресурсні дані занести 20 об‘єктів різного типу. Написати програму яка виявляє всі ресурси, та заносить у вікно дерева. Вузли дерева мають характеризувати типи ресурсу.