Міністерство освіти Російської Федерації p>
Інститут перепідготовки кадрів p>
Уральського державного технічного p>
університету p>
Кафедра мікропроцесорної техніки p>
Курсова робота p>
ТЕМА: Створити меню без файла опису ресурсів за допомогою функцій b> CreateMenu b>
і b> CreatePopupMenu b> . b> p>
Керівник В. П. Кулюкін p>
Слухач гр. СП-923 Г.Г. p>
2001р. p>
Зміст b> p>
Вступ 3 p>
Постановка задачі 5 p>
Створення меню без опису ресурсів за допомогою функцій CreateMenu і CreatePopupMenu 6 p>
Текст програми 7 p>
Висновок 13 p>
Бібліографічний список 14 p>
Введення p>
Асемблер-один з найстаріших з існуючих сьогодні мов программірованія.Когда-то це був самий
основна мова, без якого не можна було змусити комп'ютер зробити що-небудь корисне. p>
Поступово ситуація змінювалася. З'явилися більш зручні засоби спілкування з комп'ютером. Але на відміну від інших
мов асемблер не вмирав, більше того він немогу цього зробити в принципі. p>
Якщо коротко, то асемблер-це символічне подання машинної мови. Всі процеси в машині на самому
низькому, апаратному рівні приводяться в дію тільки командами машінногшо мови. p>
Звідси зрозуміло, що незважаючи на загальну назву, мова Асемблера для кожного типу комп'ютера свій. Це
стосується і зовнішнього вигляду програм, написаних на Асемблері, і ідей, відображенням яких ця мова є. p>
Відомо, що до програмування на мові асемблера звертаються тоді, коли від програми
потрібна максимальна швидкість виконання, коли необхідно забезпечити взаємодію з нестандартними зовнішніми пристроями, коли необхідно
повністю використовувати можливості процесора і операційної системи. На мові асемблера можна запрограмувати
все, на що здатна відповідна обчислювальна машина, то є асемблер є машинно-орієнтованою мовою програмування. Програмуючи на
асемблері іноді в силу звички, іноді в силу необхідності, особливо при організації інтерфейсу користувача, доводиться багато разів програмувати
одні й ті ж елементарні завдання. У мовах високого рівня ця проблема вирішена застосуванням стандартних функцій і процедур. В асемблері ця проблема могла б
бути вирішена за рахунок бібліотек стандартних функцій як на рівні вихідних текстів, так і об'єктних кодів, але такі бібліотеки не стандартизовані і не
розповсюджуються разом з компіляторами. З появою Windows 95 ситуація дещо змінилася. Створення додатків
на мові асемблера являє собою досить складне завдання у зв'язку з високим рівнем інтеграції прикладної програми і операційної системи, але тепер немає
необхідності багаторазово вирішувати проблеми призначеного для користувача інтерфейсу і управління виконанням команд на рівні машинних команд [I]. Вони вирішуються тепер за допомогою операційної системи
за рахунок звернення до функцій інтерфейсу програмування - Application Programming Interface (API). p>
Програмування інтерфейсу користувача з застосуванням функцій Win32 API засноване на
використанні так званих ресурсів. Ресурсами є відповідним чином оформлені дані, які використовуються операційною системою для створення
зовнішнього відображення органів управління програмою, і кошти, що забезпечують введення даних в процесі виконання програми в режимі діалогу. Ресурси описуються
у текстовому файлі з розширенням p>
rc. Файл ресурсів після обробки компілятора ресурсів та отримання виконуваного файлу з розширенням res за допомогою компонувальника об'єднується з виконуваним
файлом. p>
Постановка завдання p>
Найбільш очевидним засобом управління додатком є меню. Рядок меню виводиться на екран безпосередньо під рядком
заголовка. Це меню називається головним. Вибір елемента меню тягне за собою видачу додатком повідомлення WM_COMMAND, яке містить ідентифікатор пункту меню.
Ідентифікатори аналізуються в віконної процедури програми, що забезпечує відповідну реакцію на отримане повідомлення. Кожен пункт меню визначається
трьома характеристиками. Перша визначає те, що буде відображатися в даному пункті меню - це або рядок тексту, або картинка. Друга характеристика
визначає або константу, посилаємо віконної процедури в повідомленні WM_COMMAND, або спливаюче меню, який виводиться на екран, коли користувач вибирає
даний пункт меню. Третя характеристика вказує, чи є даний пункт меню дозволеним (enabled), запрешенним (disabled), недоступним (grayed) або поміченим (checked). Ця характеристика пункту меню не є
обов'язковою. p>
Меню можна створити трьома способами. Можна визначити меню у файлі опису ресурсів, створити меню без
файлу опису ресурсів безпосередньо в програмі за допомогою функцій CreatMenu, AppendMenu і InsertMenu або за допомогою функції LoadMenuIndirect, створивши попередньо структуру MENUITEMPLATE. Найбільш простим і зрозумілим при програмуванні під
Windows95 мовою асемблера є визначення меню у файлі опису ресурсів за допомогою будь-якого текстового редактора. P>
Моє завдання полягає в створення меню без файла опису ресурсів за допомогою функцій CreateMenu і CreatePopupMenu.
Одним із засобів створення меню без використання файлу опису ресурсів є функції CreateMenu з наступним додаванням необхідного числа
пунктів за допомогою функції AppendMenu. p>
Створення меню без опису ресурсів за допомогою функцій CreateMenu і CreatePopupMenu p>
Windows-додаток на асемблері містить один сегмент даних. data і один сегмент коду. code. У
програмі використано 20 функцій API. Параметри цих функцій передаються через стек, результат повертається в регістрі ЕАХ. P>
Директива mode1 задає плоску модель пам'яті (flat) і стиль передачі параметрів при вході до процедури програми і виході з них (stdcall).
Модель пам'яті flat означає плоску модель пам'яті. Відповідно до плоскої моделлю пам'яті компілятор створює програму, яка містить 32-бітовий
сегмент для даних і коду програми. Вказівка цієї моделі пам'яті змушує компонувальник створити виконуваний файл з розширенням. Exe. P>
Параметр stdcall визначає порядок передачі параметрів через стек справа наліво. p>
Директива include включае в програму файл win32.inc. p>
Опції Win32 API, що використовуються в програмі повинні бути оголошені за допомогою директиви extrn для
того, щоб компілятор міг згенерувати правильний код. p>
При створенні вікна програми за допомогою CreateMenu отримуємо дескриптор меню і використовуємо його в
Як один з параметрів функцій CreateWindowExA. Потім за допомогою функції CreatePopupMenu отримуємо дескриптор меню, що випадає і викликом AppendMenu визначаємо всі пункти наших меню. P>
Результат роботи програми наведений на Рис.1. p>
Текст програми p>
p386 b>; ця директива дозволяє транслятору обробляти команди p>
; процесора i386 p>
jumps b>; b> транслятор автоматично перетворить команду p>
b>; умовної p>
; передачі управління в комбінацію умовною і b> безумовної p>
; команд якщо умовна команда в силу обмеженості p>
; області своєї дії; не забезпечує передачу p>
; управління за потрібною адресою p>
model flat, STDCALL b>; вибирається модель пам'яті для 32 - розрядного p>
b>; програмування та правила передачі p>
; параметрів функцій STDCALL, далі p>
; діють за замовчуванням p>
include win32.inc b>; файл опису структур і констант p>
L equ b>; послідовності символів LARGE, p>
; що є ім'ям операції, що оголошує p>
; наступний за нею операнд 32-розрядних, p>
; присвоюється ім'я L p>
IDM_QUIT equ 100 b> p>
IDM_ABOUT equ 101 b> p>
MF_ENABLED equ 0 b> p>
MF_POPUP equ 10h b> p>
MF_OWNERDRAW equ 100h b> p>
b> ; Опції Win32 API, які використовуються програмою b> p>
b> extrn BeginPaint: PROC b> p>
extrn CreateWindowExA: PROC b> p>
extrn DefWindowProcA: PROC b> p>
extrn DispatchMessageA: PROC b> p>
extrn EndPaint: PROC b> p>
extrn ExitProcess: PROC b> p>
extrn GetMessageA: PROC b> p>
extrn GetModuleHandleA: PROC b> p>
extrn LoadCursorA: PROC b> p>
extrn LoadIconA: PROC b> p>
extrn RegisterClassA: PROC b> p>
extrn PostQuitMessage: PROC b> p>
extrn ShowWindow: PROC b> p>
extrn TranslateMessage: PROC b> p>
extrn UpdateWindow: PROC b> p>
extrn CreateMenu: PROC b> p>
extrn MessageBoxA: PROC b> p>
extrn AppendMenuA: PROC b> p>
extrn DrawMenuBar: PROC b> p>
extrn CreatePopupMenu: PROC b> p>
b> . data b>; перевизначених ім'я, що означає початок сегмента p>
b>; даних p>
newhwnd dd 0 b> p>
b> lppaint PAINTSTRUCT b> p>
msg MSGSTRUCT b> p>
wc WNDCLASS b> p>
hInst dd 0 b> p>
fl dw 0 b> p>
szTitleName db ' b> Це b> b> наше b> b> вікно b > ', 0 b> p>
szClassName db 'ASMCLASS32', 0 b> p>
b> szHello db 'Hello!', 0 b> p>
szAppName db 'Повідомлення', 0 b> p>
b> hMenu dd 0 b> p>
hsubmenu dd 0 b> p>
item1 db ' b> Меню b> ', 0 b> p>
item2 db ' b> Вихід b> ', 0 b> p>
b> item3 db 'Повернення', 0 b> p>
. code b>; перевизначених ім'я, що означає початок p>
; сегменту коду p>
start: b> p>
b> push L 0 b> p>
call GetModuleHandleA b> p>
b> mov [hInst], eax b> p>
; ініціалізація структури WndClass b> p>
b> p>
b> mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + b> p>
CS_GLOBALCLASS b> p>
mov [wc.clsLpfnWndProc], offset WndProc b> p>
mov [wc.clsCbClsExtra], 0 b> p>
mov [wc.clsCbWndExtra], 0 b> p>
mov eax, [hInst] b> p>
mov [wc.clsHInstance], eax b> p>
push L IDI_APPLICATION b> p>
push L 0 b> p>
call LoadIconA b> p>
mov [wc.clsHIcon], eax b> p>
push L IDC_ARROW b> p>
push L 0 b> p>
call LoadCursorA b> p>
mov [wc.clsHCursor], eax b> p>
mov [wc.clsHbrBackground], COLOR_WINDOW + 1 b> p>
mov dword ptr [wc.clsLpszMenuName], 0 b> p>
mov dword ptr [wc.clsLpszClassName], offset szClassName b> p>
push offset wc b> p>
call RegisterClassA b> p>
call CreateMenu b> p>
mov [hMenu], eax b> p>
push L 0; lpParam b> p>
push [hInst]; hInstance b> p>
push [hMenu]; menu b> p>
push L 0; parent hwnd b> p>
push L CW_USEDEFAULT; height b> p>
push L CW_USEDEFAULT; width b> p>
push L CW_USEDEFAULT; y b> p>
push L CW_USEDEFAULT; x b> p>
push L WS_OVERLAPPEDWINDOW; Style b> p>
push offset szTitleName; Title string b> p>
push offset szClassName; Class name b> p>
push L 0; extra style b> p>
call CreateWindowExA b> p>
mov [newhwnd], eax b> p>
call CreatePopupMenu b> p>
mov [hsubmenu], eax b> p>
push offset item2 b> p>
push L IDM_QUIT b> p>
push 0 b> p>
push eax b> p>
call AppendMenuA b> p>
push offset item3 b> p>
push L IDM_ABOUT b> p>
push 0 b> p>
push [hsubmenu]; eax b> p>
call AppendMenuA b> p>
push offset item1 b> p>
push [hsubmenu] b> p>
push MF_POPUP b> p>
push [hMenu] b> p>
call AppendMenuA b> p>
nop b> p>
push L SW_SHOWNORMAL b> p>
push [newhwnd] b> p>
call ShowWindow b> p>
push [newhwnd] b> p>
call UpdateWindow b> p>
push [newhwnd] b> p>
call DrawMenuBar b> p>
msg_loop: b> p>
push L 0 b> p>
push L 0 b> p>
push L 0 b> p>
push offset msg b> p>
call GetMessageA b> p>
cmp ax, 0 b> p>
je end_loop b> p>
push offset msg b> p>
call TranslateMessage b> p>
push offset msg b> p>
call DispatchMessageA b> p>
jmp msg_loop b> p>
end_loop: b> p>
push [msg.msWPARAM] b> p>
call ExitProcess b> p>
;---- b> Віконна b> b> процедура b> ---- b>
WndProc proc uses ebx edi esi, hwnd: DWORD, wmsg: DWORD, b> p>
wparam: DWORD, lparam: DWORD b> p>
LOCAL hDC: DWORD b> p>
cmp [wmsg], WM_DESTROY b> p>
je wmdestroy b> p>
cmp [wmsg], WM_SIZE b> p>
je wmsize b> p>
cmp [wmsg], WM_CREATE b> p>
je wmcreate b> p>
cmp [wmsg], WM_PAINT b> p>
je wmpaint b> p>
;************************************** b>
cmp [wmsg], WM_COMMAND b> p>
je wmcommand b> p>
;************************************** b>
jmp defwndproc b> p>
wmcommand: b> p>
mov eax, lparam b> p>
cmp ax, 0 b> p>
jne m1 b> p>
mov eax, wparam b> p>
cmp ax, IDM_ABOUT b> p>
jne m2 b> p>
call MessageBoxA, 0, offset szHello, offset szAppName, MB_OK b> p>
jmp m1 b> p>
m2: cmp ax, IDM_QUIT b> p>
jne m1 b> p>
push 0 b> p>
call PostQuitMessage b> p>
m1: mov eax, 0 b> p>
jmp finish b> p>
wmcreate: b> p>
mov eax, 0 b> p>
jmp finish b> p>
defwndproc: b> p>
push [lparam] b> p>
push [wparam] b> p>
push [wmsg] b> p>
push [hwnd] b> p>
call DefWindowProcA b> p>
jmp finish b> p>
wmdestroy: b> p>
push L 0 b> p>
call PostQuitMessage b> p>
mov eax, 0 b> p>
jmp finish b> p>
wmsize: b> p>
mov eax, 0 b> p>
jmp finish b> p>
wmpaint: b> p>
push offset lppaint b> p>
push [hwnd] b> p>
call BeginPaint b> p>
mov [hDC], eax b> p>
push offset lppaint b> p>
push [hwnd] b> p>
call EndPaint b> p>
mov eax, 0 b> p>
jmp finish b> p>
finish: b> p>
ret b> p>
WndProc endp b> p>
;--------------------------------- b> p>
public WndProc b> p>
end start; b> кінець програми p>
p>
Рис1. Вікно програми p>
Висновок p>
Моя задача полягала в створенні програми b> без файлу опису ресурсів за допомогою функцій CreateMenu і CreatePopupMenu.
Ця програма не виконує ніякої корисної роботи і служить для демонстрації деяких можливостей системи в організації інтерфейсу користувача. P>
Бібліографічний список p>
Зубков С.В. Assembler. Для DOS Windows і Unix. М.: ДМК, 1999 p>
Пустоваров В.І. Асемблер. Програмування та аналіз коректності машинних програм. P>
Застосування TURBO ASSEMBLER для програмування ПЕОМ. Частина 1, 2.: Методичні вказівки до лабораторного
практикуму з дисципліни: "Системне програмне забезпечення»/Укладач В. П. Кулюкін. Екатеринбург: изд. ІПК УГТУ, 2000. P>