Программирование и комп-ры

Создать меню без файла описания ресурсов с помощью функций 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,
                                                 ; являющейся именем
   операции, объявляющей
                                                 ; следующий за ней операнд
   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  L IDM_QUIT
91.   push  0
92.   push  eax
93.         call AppendMenuA

94.   push  offset item3
95.   push  L IDM_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    L SW_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    offset msg
117. call    GetMessageA
118. cmp     ax, 0
119. je      end_loop

120. push    offset msg
121. call    TranslateMessage

122. push    offset msg
123. call    DispatchMessageA

124. jmp     msg_loop

125. end_loop:
126. push    [msg.msWPARAM]
127. call    ExitProcess



128. ;----Оконная процедура----
129. WndProc proc uses 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,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


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    offset lppaint
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. end start                             ;  конец программы



      [pic]
                            рис1. Окно программы



                                 Заключение


      Моя задача состояла в создании программы без файла описания ресурсов с
помощью функций CreateMenu и CreatePopupMenu. Это  приложение  не  выполняет
никакой полезной работы и служит  для  демонстрации  некоторых  возможностей
системы в организации интерфейса пользователя.



                          Библиографический список


1. Зубков С.В. Assembler. Для DOS Windows и Unix. М.: ДМК, 1999
2.  Пустоваров  В.И.  АССЕМБЛЕР.  Программирование  и  анализ   корректности
   машинных программ.
3.  Применение  TURBO  ASSEMBLER  для  программирования   ПЭВМ.   Часть1,2.:
   Методические  указания  к  лабораторному  практикуму  по   дисциплине   :
   «Системное   программное   обеспечение»   /   Составитель    В.П.Кулюкин.
   Екатеринбург: изд. ИПК УГТУ, 2000.





смотреть на рефераты похожие на "Создать меню без файла описания ресурсов с помощью функций CreateMenu и CreatePopupMenu"