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


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



Заключение

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


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

 

1.   Зубков С.В. Assembler. Для DOS Windows и Unix. М.: ДМК, 1999

2.   Пустоваров В.И. АССЕМБЛЕР. Программирование и анализ корректности машинных программ.

3.   Применение TURBO ASSEMBLER для программирования ПЭВМ. Часть1,2.: Методические указания к лабораторному практикуму по дисциплине :  «Системное программное обеспечение» / Составитель В.П.Кулюкин. Екатеринбург: изд. ИПК УГТУ, 2000.



Еще из раздела Информатика, программирование:


 Это интересно
 Реклама
 Поиск рефератов
 
 Афоризм
У Лёши было одно яблоко, а у Лёвы — четыре. Определите национальность каждого мальчика.
 Гороскоп
Гороскопы
 Счётчики
bigmir)net TOP 100