Міністерство освіти Російської Федерації p>
Інститут перепідготовки кадрів p>
Уральського державного технічного університету p>
Кафедра мікропроцесорної техніки p>
Курсова робота p >
ТЕМА: Створити меню без файла опису ресурсів за допомогою функцій CreateMenu і CreatePopupMenu. p>
Пояснювальна записка p>
Керівник В. П. Кулюкін p>
Слухач гр. СП-923 Г.Г. p>
2001р. P>
Зміст p>
Вступ 3
Постановка задачі 5
Створення меню без опису ресурсів за допомогою функцій CreateMenu і
CreatePopupMenu 6
Текст програми 7
Висновок 13
Бібліографічний список 14 p>
Введення p>
Асемблер-один з найстаріших з існуючих сьогодні мовпрограммірованія.Когда-то це був самий основна мова, без якого не можнабуло змусити комп'ютер зробити що-небудь корисне. p>
Поступово ситуація змінювалася. З'явилися більш зручні засоби спілкуванняз комп'ютером. Але на відміну від інших мов асемблер не вмирав, більштого він немогу цього зробити в принципі. p>
Якщо коротко, то асемблер-це символічне подання машинногомови. Всі процеси в машині на найнижчому, апаратному рівні приводятьсяв дію тільки командами машінногшо мови. p>
Звідси зрозуміло, що незважаючи на загальну назву, мова Асемблера длякожного типу комп'ютера свій. Це стосується і зовнішнього вигляду програм,написаних на Асемблері, і ідей, відображенням яких ця мова є. p>
Відомо, що до програмування на мові асемблера звертаються тоді,коли від програми потрібна максимальна швидкість виконання, колинеобхідно забезпечити взаємодію з нестандартними зовнішнімипристроями, коли необхідно повністю використовувати можливостіпроцесора і операційної системи. На мові асемблера можназапрограмувати все, на що здатна відповідна обчислювальнамашина, то є асемблер є машинно-орієнтованою мовоюпрограмування. Програмуючи на асемблері іноді в силу звички, інодів силу необхідності, особливо при організації інтерфейсу користувача,доводиться багато разів програмувати одні й ті ж елементарні завдання. Умовах високого рівня ця проблема вирішена застосуванням стандартних функційі процедур. В асемблері ця проблема могла б бути вирішена за рахунокбібліотек стандартних функцій як на рівні вихідних текстів, так іоб'єктних кодів, але такі бібліотеки не стандартизовані і нерозповсюджуються разом з компіляторами. З появою Windows 95 ситуаціядещо змінилася. Створення додатків на мові асемблера представляєсобою досить складне завдання у зв'язку з високим рівнем інтеграції прикладноїпрограми та операційної системи, але тепер немає необхідності багаторазововирішувати проблеми призначеного для користувача інтерфейсу і управління виконаннямкоманд на рівні машинних команд [I]. Вони вирішуються тепер за допомогоюопераційної системи за рахунок звернення до функцій інтерфейсупрограмування - Application Programming Interface (API). p>
Програмування інтерфейсу користувача з застосуванням функцій
Win32 API засноване на використанні так званих ресурсів. Ресурсамиє відповідним чином оформлені дані, які використовуютьсяопераційною системою для створення зовнішнього відображення органів управліннядодатком, і кошти, що забезпечують введення даних в процесі виконанняпрограми в режимі діалогу. Ресурси описуються в текстовому файлі зрозширенням 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 і p>
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>
1. p386; ця директива дозволяє транслятору обробляти команди p>
; процесора i386
2. jumps; транслятор автоматично перетворить команду p>
; умовної p>
; передачі управління в комбінацію умовною ібезумовної p>
; команд якщо умовна команда в силуобмеженості p>
; області своєї дії; не забезпечуєпередачу p>
; управління за потрібною адресою
3. model flat, STDCALL; вибирається модель пам'яті для 32 - розрядного p>
; програмування таправила передачі p>
; параметрів функцій
STDCALL, далі p>
; що діють зазамовчуванням
4. include win32.inc; файл опису структур і констант
5. L equ; послідовності символів LARGE, p>
; що є ім'ям операції, що оголошує p>
; наступний за нею операнд p>
32-розрядних, p>
; присвоюється ім'я L
6. IDM_QUIT equ 100
7. IDM_ABOUT equ 101
8. MF_ENABLED equ 0
9. MF_POPUP equ 10h
10. MF_OWNERDRAW equ 100h p>
; Опції Win32 API, які використовуються програмою
11. extrn BeginPaint: PROC
12. extrn CreateWindowExA: PROC
13. extrn DefWindowProcA: PROC
14. extrn DispatchMessageA: PROC
15. extrn EndPaint: PROC
16. extrn ExitProcess: PROC
17. extrn GetMessageA: PROC
18. extrn GetModuleHandleA: PROC
19. extrn LoadCursorA: PROC
20. extrn LoadIconA: PROC
21. extrn RegisterClassA: PROC
22. extrn PostQuitMessage: PROC
23. extrn ShowWindow: PROC
24. extrn TranslateMessage: PROC
25. extrn UpdateWindow: PROC
26. extrn CreateMenu: PROC
27. extrn MessageBoxA: PROC
28. extrn AppendMenuA: PROC
29. extrn DrawMenuBar: PROC
30. extrn CreatePopupMenu: PROC p>
31. . data; перевизначених ім'я, що означає початок сегмента p>
; даних
32. newhwnd dd 0
33. lppaint PAINTSTRUCT
34. msg MSGSTRUCT
35. wc WNDCLASS
36. hInst dd 0
37. fl dw 0
38. szTitleName db 'Це наше вікно', 0
39. szClassName db 'ASMCLASS32', 0
40. szHello db 'Hello!', 0
41. szAppName db 'Повідомлення', 0
42. hMenu dd 0
43. hsubmenu dd 0
44. item1 db 'Меню', 0
45. item2 db 'Вихід', 0
46. item3 db 'Повернення', 0 p>
47. . code; перевизначених ім'я, що означає початок p>
; сегменту коду
48. start:
49. push L 0
50. call GetModuleHandleA
51. mov [hInst], eax p>
; ініціалізація структури WndClass p>
52. mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + p>
CS_GLOBALCLASS
53. mov [wc.clsLpfnWndProc], offset WndProc
54. mov [wc.clsCbClsExtra], 0
55. mov [wc.clsCbWndExtra], 0
56. mov eax, [hInst]
57. mov [wc.clsHInstance], eax
58. push L IDI_APPLICATION
59. push L 0
60. call LoadIconA
61. mov [wc.clsHIcon], eax
62. push L IDC_ARROW
63. push L 0
64. call LoadCursorA
65. mov [wc.clsHCursor], eax
66. mov [wc.clsHbrBackground], COLOR_WINDOW + 1
67. mov dword ptr [wc.clsLpszMenuName], 0
68. mov dword ptr [wc.clsLpszClassName], offset szClassName
69. push offset wc
70. call RegisterClassA p>
71. call CreateMenu
72. mov [hMenu], eax
73. push L 0; lpParam
74. push [hInst]; hInstance
75. push [hMenu]; menu
76. push L 0; parent hwnd
77. push L CW_USEDEFAULT; height
78. push L CW_USEDEFAULT; width
79. push L CW_USEDEFAULT; y
80. push L CW_USEDEFAULT; x
81. push L WS_OVERLAPPEDWINDOW; Style
82. push offset szTitleName; Title string
83. push offset szClassName; Class name
84. push L 0; extra style p>
85. call CreateWindowExA
86. mov [newhwnd], eax p>
87. call CreatePopupMenu
88. mov [hsubmenu], eax
89. push offset item2
90. push L IDM_QUIT
91. push 0
92. push eax
93. call AppendMenuA p>
94. push offset item3
95. push L IDM_ABOUT
96. push 0
97. push [hsubmenu]; eax
98. call AppendMenuA p>
99. push offset item1
100. push [hsubmenu]
101. push MF_POPUP
102. push [hMenu]
103. call AppendMenuA
104. nop p>
105. push L SW_SHOWNORMAL
106. push [newhwnd]
107. call ShowWindow p>
108. push [newhwnd]
109. call UpdateWindow p>
110. push [newhwnd]
111. call DrawMenuBar
112. msg_loop:
113. push L 0
114. push L 0
115. push L 0
116. push offset msg
117. call GetMessageA
118. cmp ax, 0
119. je end_loop p>
120. push offset msg
121. call TranslateMessage p>
122. push offset msg
123. call DispatchMessageA p>
124. jmp msg_loop p>
125. end_loop:
126. push [msg.msWPARAM]
127. call ExitProcess p>
128. ;---- Віконна процедура ----
129. WndProc proc uses ebx edi esi, hwnd: DWORD, wmsg: DWORD,
130. wparam: DWORD, lparam: DWORD
131. LOCAL hDC: DWORD p>
132. cmp [wmsg], WM_DESTROY
133. je wmdestroy
134. cmp [wmsg], WM_SIZE
135. je wmsize
136. cmp [wmsg], WM_CREATE
137. je wmcreate
138. cmp [wmsg], WM_PAINT
139. je wmpaint p>
140. ;**************************************< br>141. cmp [wmsg], WM_COMMAND
142. je wmcommand
143. ;**************************************< br>144. jmp defwndproc p>
145. wmcommand:
146. mov eax, lparam
147. cmp ax, 0
148. jne m1
149. mov eax, wparam
150. cmp ax, IDM_ABOUT
151. jne m2
152. call MessageBoxA, 0, offset szHello, offset szAppName, MB_OK
153. jmp m1
154. m2: cmp ax, IDM_QUIT
155. jne m1
156. push 0
157. call PostQuitMessage
158. m1: mov eax, 0
159. jmp finish p>
160. wmcreate:
161. mov eax, 0
162. jmp finish p>
163. defwndproc:
164. push [lparam]
165. push [wparam]
166. push [wmsg]
167. push [hwnd]
168. call DefWindowProcA
169. jmp finish p>
170. wmdestroy:
171. push L 0
172. call PostQuitMessage
173. mov eax, 0
174. jmp finish p>
175. wmsize:
176. mov eax, 0
177. jmp finish p>
178. wmpaint:
179. push offset lppaint
180. push [hwnd]
181. call BeginPaint
182. mov [hDC], eax
183. push offset lppaint
184. push [hwnd]
185. call EndPaint
186. mov eax, 0
187. jmp finish p>
188. finish:
189. ret
190. WndProc endp
191. ;---------------------------------< br>192. public WndProc
193. end start; кінець програми p>
Рис1. Вікно програми p>
Висновок p>
Моя задача полягала в створенні програми без файлу опису ресурсів здопомогою функцій CreateMenu і CreatePopupMenu. Ця програма не виконуєніякої корисної роботи і служить для демонстрації деяких можливостейсистеми в організації інтерфейсу користувача. p>
Бібліографічний список p>
1. Зубков С.В. Assembler. Для DOS Windows і Unix. М.: ДМК, 1999
2. Пустоваров В.І. Асемблер. Програмування та аналіз коректності машинних програм.
3. Застосування TURBO ASSEMBLER для програмування ПЕОМ. Частина 1, 2.: P>
Методичні вказівки до лабораторного практикуму з дисципліни: p>
«Системне програмне забезпечення»/Укладач В. П. Кулюкін. P>
Екатеринбург: изд . ІПК УГТУ, 2000. P>
p>