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