Реферат: Создать меню без файла описания ресурсов с помощью функций 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.


еще рефераты
Еще работы по информатике, программированию