Міністерство освіти Російської Федерації p>
Інститут перепідготовки кадрів p>
Уральського державного технічного p>
університету p>
Кафедра мікропроцесорної техніки p>
Курсова робота
ТЕМА: Створення меню без файла опису ресурсів на основі функції b> LoadMenuIndirect b> . b> p>
Керівник доц., к.т.н. В. П. Кулюкін p>
Слухач гр. СП-923 І.Г. b> p>
г.Нягань p>
2001р. b> p>
Введення. p>
Відомо, що до програмування на мові асемблера звертаються тоді, коли від програми
потрібна максимальна швидкість виконання, коли необхідно забезпечити взаємодію з нестандартними зовнішніми пристроями, коли необхідно
повністю використовувати p>
можливості процесора і операційної системи. На мові асемблера можна запрограмувати все, на що
здатна відповідна обчислювальна машина, то є асемблер є машинно-орієнтованою мовою програмування. Програмуючи на асемблері
іноді в силу звички, іноді в силу необхідності, особливо при організації інтерфейсу користувача, доводиться багато разів програмувати одні й ті ж
елементарні завдання. У мовах високого рівня ця проблема вирішена застосуванням стандартних функцій і процедур. В асемблері ця проблема могла б бути вирішена
за рахунок бібліотек стандартних функцій як на рівні вихідних текстів, так і об'єктних кодів, але такі бібліотеки не стандартизовані і не поширюються
разом з компіляторами. З появою Windows 95 ситуація дещо змінилася. Створення додатків на мові асемблера
являє собою досить складне завдання у зв'язку з високим рівнем інтеграції прикладної програми і операційної системи, але тепер немає необхідності
багаторазово вирішувати проблеми призначеного для користувача інтерфейсу і управління виконанням команд на рівні машинних команд [I]. Вони вирішуються тепер за допомогою операційної системи
за рахунок звернення до функцій інтерфейсу програмування - Application Programming Interface (API). p>
Програмування інтерфейсу користувача з застосуванням функцій Win32 API засноване на
використанні так званих ресурсів. Ресурсами є відповідним чином оформлені дані, які використовуються операційною системою для створення
зовнішнього відображення органів управління програмою, і кошти, що забезпечують введення даних в процесі виконання програми в режимі діалогу. Ресурси
описуються в текстовому файлі з розширенням p>
rc. Файл ресурсів після обробки компілятора ресурсів та отримання виконуваного файлу з розширенням res за допомогою компонувальника об'єднується з виконуваним
файлом. p>
Загальна частина. b> p>
Найбільш очевидним засобом управління додатком є меню. Строкан меню виводиться на екран
безпосередньо під рядком заголовка. Це меню називається головним. Вибір елемента меню тягне за собою видачу програми повідомлення WD_COMMAND,
містить ідентифікатор пункту меню. Ідентифікатори аналізуються в віконної процедури програми, що забезпечує відповідну реакцію на отримане
повідомлення. Кожен пунк меню визначається трьома характеристиками. Перша визначає те, що буде відображатися в
даному пункті меню - це або рядок тексту, або картинка. Друга характеристика визначає або константу, посилаємо віконної процедури
повідомленні WM_COMMAND, або спливаюче меню, який виводиться на екран, коли користувач вибирає даний пункт меню. Третя характеристика вказує,
чи є даний пункт меню дозволеним (enabled), запрешенним (disabled), недоступним (grayed) або поміченим (checked). Ця характеристика пункту меню не є
обов'язковою. p>
Для того, щоб включити меню в додаток, необхідно реалізувати таку послідовність кроків: p>
розробити сценарій меню. Перед тим як приступити до процесу включення меню в конкретне
додаток, розробимо логічну схему. Цей крок необхідний для того, щоб вже на стадії проектування забезпечити ергономічні властивості програми.
Адже меню - це один з небагатьох елементів інтерфейсу, з яким користувач постійно буде мати справу. Тому схема меню повинна мати наочну
ієрархічну структуру, з логічно пов'язані між собою пунктами цієї ієрархії, що допоможе
користувачеві ефективно використовувати всі можливості програми. Для того, щоб вести предметну розмову, поставимо собі завдання розробити для вікна
нашого застосування головне меню. При цьому ми досліджуємо можливості виводу у вікно додатка тексту та графіки, а також покажемо способи вирішення загальних проблем,
пов'язаних з розробкою програми. Наше меню досить проста і складається з трьох елементів: "Текст", "Графіка", "Про програму". Ієрархічна структура меню
представлена. p>
DrawText
Примітиви
Ефекти
Павич
Текст
Графіка
Про програму
TextOut
Мереживо
p>
описати схему меню в файлі ресурсів. Для виконання цього опису використовуються спеціальні
оператори. p>
скласти текст включається файлу, необхідного для компіляції ресурсного файлу p>
компілювати ресурсний файл. p>
підключити меню на стадії реєстрації того вікна додатка, для роботи з яким воно буде
використовуватися. p>
Меню можна створити трьома способами. Можна визначити меню у файлі опису ресурсів, створити меню без
файлу опису ресурсів безпосередньо в програмі за допомогою функцій CreatMenu, AppendMenu і InsertMenu або за допомогою функції LoadMenuIndirect, створивши попередньо структуру MENUITEMPLATE. Найбільш простим і зрозумілим при програмуванні під
Windows95 мовою асемблера є визначення меню у файлі опису ресурсів за допомогою будь-якого текстового редактора. P>
Основна частина. b> p>
Моє завдання полягає в тому, щоб написати програму на тему: "Створити меню без файла опису ресурсів на
основі функцій LoadMenuIndirect ". p>
Одним із засобів створення меню без використання файлу опису ресурсів є функція LoadMenuIndirect. Для застосування цієї функції необхідно створити
шаблон меню, який визначається структурами p>
MENUITEMTEMPLATEHEADER і MENUITEMTEMPLATE. p>
Повний шаблон меню складається з заголовка і хоча б одного опису пункту меню. Заголовок - структура MENUITEMTEMPLATEHEADER - Відбудеться з двох
полів розміром в слово. У першому слові міститься номер версії функції. Для Windows NT і Win16 це 0, для Windows95-1. У другому слові міститься зсув до першого
структури MENUITEMTEMPLATE. Якщо між заголовком і описом першого пункту меню немає додаткової інформації, це
поле містить 0. p>
Описи пунктів меню, наступні за заголовком, повинні бути вирівняні на кордоні подвійного слова.
Структура MENUITEMTEMPLATE має, як правило, п'ять полів. Шосте поле має сенс для пункту меню, що вказує на
спливаюче меню. p>
Як приклад наводиться вікно з головними і спливаючими меню, створеними за
допомогою функції LoadMenuIndirect. p>
p>
Програма b> . b>
p386 p>
jumps p>
model flat, STDCALL p>
include win32.inc; файл опису структур і констант p>
L equ p>
IDM_QUIT equ 100 p>
IDM_ABOUT equ 101 p>
MF_ENABLED equ 0 p>
MF_POPUP equ 1h p>
; Опції Win32 API, які використовуються програмою p>
extrn BeginPaint: PROC p>
extrn CreateWindowExA: PROC p>
extrn DefWindowProcA: PROC p>
extrn DispatchMessageA: PROC p>
extrn EndPaint: PROC p>
extrn ExitProcess: PROC p>
extrn GetMessageA: PROC p>
extrn GetModuleHandleA: PROC p>
extrn LoadCursorA: PROC p>
extrn LoadIconA: PROC p>
extrn RegisterClassA: PROC p>
extrn PostQuitMessage: PROC p>
extrn ShowWindow: PROC p>
extrn TranslateMessage: PROC p>
extrn UpdateWindow: PROC p>
extrn LoadMenuIndirectA: PROC p>
extrn MessageBoxA: PROC p>
. data p>
newhwnd dd 0 p>
lppaint PAINTSTRUCT p>
msg MSGSTRUCT p>
wc WNDCLASS p>
hInst dd 0 p>
fl dw 0 p>
szTitleName db 'Це наше вікно', 0 p>
szClassName db 'ASMCLASS32', 0 p>
szHello db 'Hello!', 0 p>
szAppName db 'Повідомлення', 0 p>
hMenu dd 0 p>
align 4 p>
MenuTemplate dw 1,0; Заголовок меню. 1 - ознака p>
; структури для функції Windows95 p>
align 4 p>
dd 0; тип пункту p>
dd 0, MF_ENABLED, 0; IDM_ABOUT; p>
dw 81h p>
dw'&',' M ',' e ',' n ',' u ', '1', 0 p>
align 4 p>
dd 0,0,0, IDM_QUIT p>
dw 0 p>
dw 'E','&',' x', 'i', 't', 0,0 p>
align 4 p>
dd 0,0, IDM_ABOUT p>
dw 0 p>
dw'&',' Q ',' u ',' i ',' t ', '1', 0 p>
align 4 p>
dd 0,0,0; IDM_QUIT p>
dw 81h; Ознака вспл. меню p>
dw 'Q', 'u', 'i', 't', '2 ', 0,0,0 p>
align 4 p>
dd 0,0, IDM_ABOUT p>
dw 0 p>
dw 'Q', 'u', 'i', 't', '3 ', 0,0 p>
align 4 p>
dd 0,0, IDM_QUIT p>
dw 80h p>
dw 'E','&',' x', 'i', 't', 0,0 p>
. code p>
start: p>
push L 0 p>
call GetModuleHandleA p>
mov [hInst], eax p>
; ініціалізація структури WndClass p>
mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS p>
mov [wc.clsLpfnWndProc], offset WndProc p>
mov [wc.clsCbClsExtra], 0 p>
mov [wc.clsCbWndExtra], 0 p>
mov eax, [hInst] p>
mov [wc.clsHInstance], eax p>
push L IDI_APPLICATION p>
push L 0 p>
call LoadIconA p>
mov [wc.clsHIcon], eax p>
push L IDC_ARROW p>
push L 0 p>
call LoadCursorA p>
mov [wc.clsHCursor], eax p>
mov [wc.clsHbrBackground], COLOR_WINDOW + 1 p>
mov dword ptr [wc.clsLpszMenuName], 0 p>
mov dword ptr [wc.clsLpszClassName], offset szClassName p>
push offset wc p>
call RegisterClassA p>
push offset MenuTemplate p>
call LoadMenuIndirectA p>
mov [hMenu], eax p>
push L 0; lpParam p>
push [hInst]; hInstance p>
push [hMenu]; menu p>
push L 0; parent hwnd p>
push L CW_USEDEFAULT; height p>
push L CW_USEDEFAULT; width p>
push L CW_USEDEFAULT; y p>
push L CW_USEDEFAULT; x p>
push L WS_OVERLAPPEDWINDOW; Style p>
push offset szTitleName; Title string p>
push offset szClassName; Class name p>
push L 0; extra style p>
call CreateWindowExA p>
mov [newhwnd], eax p>
push L SW_SHOWNORMAL p>
push [newhwnd] p>
call ShowWindow p>
push [newhwnd] p>
call UpdateWindow p>
msg_loop: p>
push L 0 p>
push L 0 p>
push L 0 p>
push offset msg p>
call GetMessageA p>
cmp ax, 0 p>
je end_loop p>
push offset msg p>
call TranslateMessage p>
push offset msg p>
call DispatchMessageA p>
jmp msg_loop p>
end_loop: p>
push [msg.msWPARAM] p>
call ExitProcess p>
; we never get to here p>
;---- Віконна процедура ---- p>
WndProc proc uses ebx edi esi, hwnd: DWORD, wmsg: DWORD, p>
wparam: DWORD, lparam: DWORD p>
LOCAL hDC: DWORD p>
cmp [wmsg], WM_DESTROY p>
je wmdestroy p>
cmp [wmsg], WM_SIZE p>
je wmsize p>
cmp [wmsg], WM_CREATE p>
je wmcreate p>
cmp [wmsg], WM_PAINT p>
je wmpaint p>
p>
;************************************** p>
cmp [wmsg], WM_COMMAND p>
je wmcommand p>
;************************************** p>
jmp defwndproc p>
wmcommand: p>
mov eax, lparam p>
cmp ax, 0 p>
jne m1 p>
mov eax, wparam p>
cmp ax, IDM_ABOUT p>
jne m2 p>
call MessageBoxA, 0, offset szHello, offset szAppName, MB_OK p>
jmp m1 p>
m2: cmp ax, IDM_QUIT p>
jne m1 p>
push 0 p>
call PostQuitMessage p>
m1: mov eax, 0 p>
jmp finish p>
wmcreate: p>
mov eax, 0 p>
jmp finish p>
defwndproc: p>
push [lparam] p>
push [wparam] p>
push [wmsg] p>
push [hwnd] p>
call DefWindowProcA p>
jmp finish p>
wmdestroy: p>
push L 0 p>
call PostQuitMessage p>
mov eax, 0 p>
jmp finish p>
wmsize: p>
mov eax, 0 p>
jmp finish p>
wmpaint: p>
push offset lppaint p>
push [hwnd] p>
call BeginPaint p>
mov [hDC], eax p>
push offset lppaint p>
push [hwnd] p>
call EndPaint p>
mov eax, 0 p>
jmp finish p>
p>
finish: p>
ret p>
WndProc endp p>
;--------------------------------- p>
public WndProc p>
end start p>