Создать меню без файла описи ресурсів з допомогою функцій CreateMenu і CreatePopupMenu
Рис1. Вікно программы Заключение Моя завдання полягало у створенні программы без файла описи ресурсів з допомогою функцій CreateMenu і CreatePopupMenu. Це додаток не виконує ніякої корисною праці та служить підтвердження деяких можливостей системи у створенні інтерфейсу пользователя. Моя завдання залежить від створення меню без файла описи ресурсів з допомогою функцій CreateMenu і… Читати ще >
Создать меню без файла описи ресурсів з допомогою функцій CreateMenu і CreatePopupMenu (реферат, курсова, диплом, контрольна)
Министерство освіти Російської Федерации Институт перепідготовки кадров Уральского державного технического университета Кафедра мікропроцесорної техники Курсовая работа.
ТЕМА: Створити меню без файла описи ресурсів з допомогою функцій CreateMenu і CreatePopupMenu..
Руководитель В. П. Кулюкин Слушатель грн. СП-923 Г. Г.
2001 г.
Введение
3.
Постановка завдання 5.
Создание меню без описи ресурсів з допомогою функцій CreateMenu і CreatePopupMenu 6.
Текст програми 7.
Заключение
13.
Библиографический список 14.
Введение
Ассемблеродне із найбільш старих з сьогодні мов программирования. Когда-то це був основний мову, якого не міг змусити комп’ютер зробити щось полезное.
Постепенно ситуація змінювалася. З’явилися кращі кошти спілкування з комп’ютером. Однак у відмінність з інших мов асемблер не помирав, більше він немог цього в принципе.
Если коротко, то асемблерце символічне уявлення машинного мови. Усі в машині на низькому, апаратній рівні наводяться на дію лише командами машинногшо языка.
Отсюда зрозуміло, що попри під назвою, мову Ассемблера кожному за типу комп’ютера свій. Це стосується й зовнішнього вигляду програм, написаних на Ассемблері, й ідей, відбитком яких цю мову является.
Известно, що програмування мовою ассемблера звертаються тоді, як від програми потрібно максимальна швидкість виконання, коли необхідно забезпечити взаємодію Космосу з нестандартними зовнішніми пристроями, коли необхідно повністю скористатися наявними можливостями процесора і ОС. Мовою ассемблера можна запрограмувати усі що здатна відповідна обчислювальну машину, тобто асемблер є машинно-ориентированным мовою програмування. Програмуючи на ассемблері іноді у силу звички, іноді у силу необхідності, особливо в організації інтерфейсу користувача, доводиться багаторазово програмувати одні й самі елементарні завдання. У мовами високого рівня цю проблему розв’язано застосуванням стандартних функцій і процедур. У ассемблері цю проблему міг би стати вирішеною з допомогою бібліотек стандартних функцій на рівні вихідних текстів, і об'єктних кодів, але такі бібліотеки не стандартизовані і поширюються разом із компиляторами. З появою Windows 95 ситуація трохи змінилася. Створення додатків мовою ассемблера є дуже складне завдання у зв’язку з високий рівень інтеграції прикладної програми розвитку й ОС, але нині немає необхідності багаторазово розв’язувати проблеми користувальницького інтерфейсу та управління виконанням команд лише на рівні машинних команд [I]. Так вони вирішуються нині за допомогою ОС з допомогою звернення функцій інтерфейсу прикладного програмування — Application Programming Interface (API).
Программирование користувальницького інтерфейсу із застосуванням функцій Win32 АПІ грунтується на використанні про ресурсів. Ресурсами є відповідним чином оформлені дані, використовувані операційній системою до створення зовнішнього відображення органів управління додатком, і кошти, щоб забезпечити введення даних у процесі виконання програми як діалогу. Ресурси описуються в текстовому файлі з розширенням.
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 функцій АПІ. Параметри цим функцій передаються через стік, результат повертається у регістрі ЕАХ.
Директива mode1 задає пласку модель пам’яті (flat) і стиль передачі параметрів біля входу до процедури програми розвитку й виході їх (stdcall). Модель пам’яті flat позначає пласку модель пам’яті. Відповідно до пласкою моделлю пам’яті компілятор створює програму, що містить 32-битовый сегмент для даних, і коду програми. Вказівка цієї моделі пам’яті змушує компоновщик створити виконуваний файл з розширенням .exe.
Параметр stdcall визначає порядок передачі параметрів через стік справа налево.
Директива include включае у програмі файл win32.inc.
Функции Win32 АПІ, використовувані у програмі мають оголошені з допомогою директиви 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 АПІ, використовувані программой.
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.