Реферат: Создать меню без файла описания ресурсов с помощью функций CreateMenu и CreatePopupMenu
Министерство образования Российской Федерации
Институтпереподготовки кадров
Уральскогогосударственного технического
университета
Кафедрамикропроцессорной техникиКурсоваяработаТЕМА: Создать меню без файла описания ресурсов с помощьюфункций 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.
Текст программы
1. p386 ; эта директива разрешает транслятору обрабатыватькоманды
; процессора i386
2. jumps ; транслятор автоматически преобразует команду
; условной
; передачи управления вкомбинацию условной ибезусловной
; команд если условная команда всилу ограниченности
; области своего действия; необеспечивает передачу
; управления по нужному адресу
3. model flat, STDCALL ; выбирается модель памяти для 32- разрядного
; программирования и правилапередачи
; параметров функциям STDCALL, далее
; действующие по умолчанию
4. include win32.inc ; файл описания структур и констант
5. L equ <LARGE> ; последовательности символов LARGE,
; являющейся именем операции,объявляющей
; следующий за ней операнд32-разрядным,
; присваивается имя 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
; Функции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
31. .data ;переопределенное имя, означающее начало сегмента
; данных
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 'Привет!',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
47. .code ; переопределенное имя, означающее начало
;сегмента кода
48. start:
49. push L 0
50. call GetModuleHandleA
51. mov [hInst], eax
; инициализация структуры WndClass
52. mov [wc.clsStyle], CS_HREDRAW +CS_VREDRAW +
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
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
85. call CreateWindowExA
86. mov [newhwnd], eax
87. call CreatePopupMenu
88. mov [hsubmenu],eax
89. push offset item2
90. push LIDM_QUIT
91. push 0
92. push eax
93. call AppendMenuA
94. push offsetitem3
95. push LIDM_ABOUT
96. push 0
97. push [hsubmenu] ;eax
98. call AppendMenuA
99. push offset item1
100. push [hsubmenu]
101. push MF_POPUP
102. push [hMenu]
103. call AppendMenuA
104. nop
105. push LSW_SHOWNORMAL
106. push [newhwnd]
107. call ShowWindow
108. push [newhwnd]
109. call UpdateWindow
110. push [newhwnd]
111. call DrawMenuBar
112. msg_loop:
113. push L 0
114. push L 0
115. push L 0
116. push offsetmsg
117. call GetMessageA
118. cmp ax, 0
119. je end_loop
120. push offsetmsg
121. call TranslateMessage
122. push offsetmsg
123. call DispatchMessageA
124. jmp msg_loop
125. end_loop:
126. push [msg.msWPARAM]
127. call ExitProcess
128. ;----Оконнаяпроцедура----
129. WndProc procuses ebx edi esi, hwnd:DWORD, wmsg:DWORD,\
130. wparam:DWORD,lparam:DWORD
131. LOCAL hDC:DWORD
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
140. ;**************************************
141. cmp [wmsg],WM_COMMAND
142. je wmcommand
143. ;**************************************
144. jmp defwndproc
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,offsetszHello,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
160. wmcreate:
161. mov eax, 0
162. jmp finish
163. defwndproc:
164. push [lparam]
165. push [wparam]
166. push [wmsg]
167. push [hwnd]
168. call DefWindowProcA
169. jmp finish
170. wmdestroy:
171. push L 0
172. call PostQuitMessage
173. mov eax, 0
174. jmp finish
175. wmsize:
176. mov eax, 0
177. jmp finish
178. wmpaint:
179. push offset lppaint
180. push [hwnd]
181. call BeginPaint
182. mov [hDC],eax
183. push offsetlppaint
184. push [hwnd]
185. call EndPaint
186. mov eax,0
187. jmp finish
188. finish:
189. ret
190. WndProc endp
191. ;---------------------------------
192. public WndProc
193. endstart ; конец программы
/>
рис1. Окнопрограммы
/>Заключение
Моя задача состояла всоздании программыбез файла описания ресурсов с помощьюфункций CreateMenu и CreatePopupMenu. Это приложение не выполняет никакойполезной работы и служит для демонстрации некоторых возможностей системы ворганизации интерфейса пользователя.
/>Библиографическийсписок
1. Зубков С.В. Assembler. Для DOS Windows и Unix.М.: ДМК, 1999
2. Пустоваров В.И. АССЕМБЛЕР. Программирование и анализ корректности машинныхпрограмм.
3. Применение TURBO ASSEMBLER для программирования ПЭВМ.Часть1,2.: Методические указания к лабораторному практикуму по дисциплине : «Системное программное обеспечение» / Составитель В.П.Кулюкин. Екатеринбург:изд. ИПКУГТУ, 2000.