Создание меню без файла описи ресурсів з урахуванням функції LoadMenuIndirect
Тому схема меню повинен мати наочну ієрархічну структуру, з логічно ув’язаними між собою пунктами цієї ієрархії, що дозволить користувачеві ефективно використовувати всі можливості докладання. А, щоб вести предметну розмову, поставимо перед собою завдання розробити для вікна нашого докладання головне меню. А досліджуємо можливості виведення у вікно докладання тексту та графіки, і навіть покажемо… Читати ще >
Создание меню без файла описи ресурсів з урахуванням функції LoadMenuIndirect (реферат, курсова, диплом, контрольна)
року міністерство освіти Російської Федерации.
Інститут перепідготовки кадров.
Уральського державного технічного университета.
Кафедра мікропроцесорної техники.
Курсова работа.
ТЕМА: Створення меню без файла описи ресурсів з урахуванням функции.
LoadMenuIndirect.
Пояснювальна записка Руководитель доц., к.т.н. В. П. Кулюкин Слушатель грн. СП-923 И.Г.
г. Нягань.
2001 г.
Известно, що програмування мовою ассемблера звертаються тоді, як від програми потрібно максимальна швидкість виконання, коли необхідно забезпечити взаємодію Космосу з нестандартними зовнішніми пристроями, коли що потрібно повністю використовувати можливості процесора і ОС. Мовою ассемблера можна запрограмувати усі що здатна відповідна обчислювальна машина, тобто асемблер є машинно-ориентированным мовою програмування. Програмуючи на ассемблері іноді у силу звички, іноді необхідність, особливо в організації інтерфейсу користувача, доводиться багаторазово програмувати одні й самі елементарні завдання. У мовами високого рівня цю проблему розв’язано застосуванням стандартних функцій і процедур. У ассемблері цю проблему міг би стати вирішеною з допомогою бібліотек стандартних функцій на рівні вихідних текстів, і об'єктних кодів, але такі бібліотеки не стандартизовані і поширюються разом із компиляторами. З появою Windows 95 ситуація трохи змінилася. Створення додатків мовою ассемблера представляє собою вельми складне завдання у зв’язку з високий рівень інтеграції прикладної програми розвитку й ОС, але нині немає необхідності багаторазово розв’язувати проблеми користувальницького інтерфейсу та управління виконанням команд лише на рівні машинних команд [I]. Так вони вирішуються нині за допомогою ОС з допомогою звернення функцій інтерфейсу прикладного програмування — Application Programming Interface (АПІ). Програмування користувальницького інтерфейсу із застосуванням функцій Win32 АПІ грунтується на використанні про ресурсів. Ресурсами є відповідним чином оформлені дані, використовувані операційній системою до створення зовнішнього відображення органів управління додатком, і кошти, щоб забезпечити введення даних у процесі виконання програми в режимі діалогу. Ресурси описуються в текстовому файлі з розширенням rc. Файл ресурсів після обробки компілятора ресурсів немає і отримання двоичного файла з розширенням res з допомогою компоновщика об'єднується з виконуваним файлом.
Загальна часть.
Найочевиднішим засобом управління додатком є меню. Строкаа меню виводиться на екран безпосередньо під рядком заголовка. Це меню називається головним. Вибір елемента меню тягне у себе видачу докладання повідомлення WD_COMMAND, що містить ідентифікатор пункту меню. Ідентифікатори аналізуються в віконній процедурі докладання, що забезпечує відповідну реакцію на отримане повідомлення. Кожен пунк меню визначається трьома характеристиками. Перша визначає що буде відображатись у пункті меню — або рядок тексту, або картинка. Друга характеристика визначає або константу, посылаемую віконній процедурі повідомленні WM_COMMAND, або всплывающее меню, яке виводиться на екран, коли користувач вибирає даний пункт меню. Третя характеристика вказує, чи є даний пункт меню дозволеним (enabled), запрешенным (disabled), недоступним (grayed) чи позначеним (checked). Ця характеристика пункту меню перестав бути обов’язкової. А, аби включити меню в додаток, необхідно реалізувати таку послідовність кроків:. розробити сценарій меню. Перш ніж розпочати процесу включення меню в конкретне додаток, розробимо логічний схему. Цей крок пояснюють необхідний здобуття права на стадії проектування забезпечити эргономические властивості докладання. Адже меню — це з небагатьох елементів інтерфейсу, з яким користувач постійно матиме дело.
Тому схема меню повинен мати наочну ієрархічну структуру, з логічно ув’язаними між собою пунктами цієї ієрархії, що дозволить користувачеві ефективно використовувати всі можливості докладання. А, щоб вести предметну розмову, поставимо перед собою завдання розробити для вікна нашого докладання головне меню. А досліджуємо можливості виведення у вікно докладання тексту та графіки, і навіть покажемо шляхи вирішення загальних проблем, пов’язаних із розробкою докладання. Наше меню досить просте та складається з трьох елементів: «Текст»,"Графика","О додатку". Ієрархічна структура меню представлена.
. описати схему меню в файлі ресурсів. На виконання цього описи використовуються спеціальні оператори.. скласти текст включаемого файла, який буде необхідний компіляції ресурсного файла. компілювати ресурсний файл.. підключити меню на стадії реєстрації того вікна докладання, до роботи з яким вона використовуватиметься. Меню можна створити трьома способами. Можна визначити меню в файлі описи ресурсів, створити меню без файла описи ресурсів у програмі з допомогою функцій CreatMenu, AppendMenu і InsertMenu чи з допомогою функції LoadMenuIndirect, створивши попередньо структуру MENUITEMPLATE. Найпростішим та зрозумілим при програмуванні під Windows95 мовою ассемблера є визначення меню в файлі описи ресурсів з допомогою будь-якого текстового редактора.
Основна часть.
Моя завдання у тому, щоб написати програму на задану тему: «Створити меню без файла описи ресурсів з урахуванням функцій LoadMenuIndirect». Однією з коштів створення меню без використання файла описи ресурсів є функція LoadMenuIndirect. Для застосування цієї функції необхідно створити шаблон меню, визначається структурами MENUITEMTEMPLATEHEADER і MENUITEMTEMPLATE. Повний шаблон меню складається з заголовка хоча б одного описи пункту меню. Заголовок — структура MENUITEMTEMPLATEHEADER — cостоит з цих двох полів площею слово. У першому слові міститься номер версії функції. Для Windows NT і Win16 це 0, для Windows95−1. У другому слові міститься усунення до першої структури MENUITEMTEMPLATE. Якщо між заголовком і описом першого пункту меню немає додаткової інформації, це полі містить 0. Описание пунктів меню, следущие за заголовком, мали бути зацікавленими вирівняні на кордоні подвійного слова. Структура MENUITEMTEMPLATE має, зазвичай, п’ять полів. Шосте полі можна буде для пункту меню, яке зазначає на всплывающее меню. Як приклад наводиться вікно із головними і спливаючими меню, що за допомогою функції LoadMenuIndirect.
Программа.
p386 jumps model flat, STDCALL include win32. inc ;файл описи структур і констант L equ IDM_QUIT equ 100 IDM_ABOUT equ 101 MF_ENABLED equ 0 MF_POPUP equ 1h ;Функції 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 LoadMenuIndirectA: PROC extrn MessageBoxA: 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 align 4 MenuTemplate dw 1,0 ;Заголовок меню. 1 — признак.
;структури для функції Windows95 align 4 dd 0 ;тип пункту dd 0, MF_ENABLED, 0;IDM_ABOUT; dw 81h dw «& «, «M », «e », «n », «u », «1 », 0.
align 4 dd 0,0,0,IDM_QUIT dw 0 dw «E », «& «, «x », «і «, «t », 0,0.
align 4 dd 0,0,IDM_ABOUT dw 0 dw «& «, «Q », «u », «і «, «t », «1 », 0.
align 4 dd 0,0,0;IDM_QUIT dw 81h ;Ознака вспл. меню dw «Q », «u », «і «, «t », «2 », 0,0,0.
align 4 dd 0,0,IDM_ABOUT dw 0 dw «Q », «u », «і «, «t », «3 », 0,0.
align 4 dd 0,0,IDM_QUIT dw 80h dw «E », «& «, «x », «і «, «t », 0,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 push offset MenuTemplate call LoadMenuIndirectA 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 push L SW_SHOWNORMAL push [newhwnd] call ShowWindow.
push [newhwnd] call UpdateWindow.
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.
; we never get to here.
;——Оконная процедура—— 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.
———————————- Текст.
[pic].
DrawText.
TextOut.
Примитивы Графика Отрезок Прямоугольник Павлин Кружева Эффекты О приложении.