Создание меню без описания ресурсов с помощью функций CreateMenu и CreatePopupMenu — КиберПедия 

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

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

2020-04-01 90
Создание меню без описания ресурсов с помощью функций CreateMenu и CreatePopupMenu 0.00 из 5.00 0 оценок
Заказать работу

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, используемые программой

Extrn       BeginPaint          :PROC

Extrn       CreateWindowExA:PROC

Extrn       DefWindowProcA:PROC

Extrn       DispatchMessageA:PROC

Extrn       EndPaint             :PROC

Extrn         ExitProcess         :PROC

Extrn       GetMessageA      :PROC

Extrn       GetModuleHandleA:PROC

Extrn       LoadCursorA      :PROC

Extrn       LoadIconA           :PROC    

Extrn       RegisterClassA    :PROC

Extrn       PostQuitMessage :PROC

Extrn       ShowWindow       :PROC

Extrn       TranslateMessage:PROC

Extrn          UpdateWindow    :PROC

Extrn        CreateMenu          :PROC

Extrn        MessageBoxA       :PROC

Extrn       AppendMenuA      :PROC

Extrn        DrawMenuBar       :PROC

Extrn        CreatePopupMenu:PROC

31..data          ; переопределенное имя, означающее начало сегмента

                                 ; данных

Newhwnd     dd 0

33.        lppaint     PAINTSTRUCT <?>

34.        msg         MSGSTRUCT <?>

35.        wc          WNDCLASS <?>

HInst        dd    0

Fl                dw 0

SzTitleName       db ' Это наше окно ',0

SzClassName    db 'ASMCLASS32',0

40.        szHello                  db 'Привет!',0

SzAppName db 'Сообщение',0

HMenu                  dd 0

Hsubmenu    dd 0

Item1         db ' Меню ',0

Item2         db ' Выход ',0

Item3         db 'Возврат',0

47.       .code             ; переопределенное имя, означающее начало

                                             ; сегмента кода

48.        start:

Push L 0

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

Push L 0

Call LoadIconA

61.        mov [wc.clsHIcon], eax

62.        push L IDC_ARROW

Push L 0

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

Push offset wc

Call RegisterClassA

Call CreateMenu

72.        mov [hMenu],eax

Push L 0                ; lpParam

74.        push [hInst]            ; hInstance

75.        push [hMenu]             ; menu

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

Push offset szTitleName ; Title string

Push offset szClassName ; Class name

Push L 0                ; extra style

Call CreateWindowExA

86.        mov [newhwnd], eax

Call CreatePopupMenu

88.        mov [hsubmenu], eax

Push offset item2

90.        push L IDM_QUIT

Push 0

Push eax

Call AppendMenuA

Push offset item3

95.        push L IDM_ABOUT

Push 0

97.        push [hsubmenu];eax

Call AppendMenuA

Push     offset item1

100. push [hsubmenu]

101. push MF_POPUP

102. push [hMenu]

Call AppendMenuA

Nop

105. push L SW_SHOWNORMAL

106. push [newhwnd]

Call ShowWindow

108. push [newhwnd]

Call UpdateWindow

110. push [newhwnd]

Call DrawMenuBar

112. msg_loop:

Push L 0

Push L 0

Push L 0

Push offset msg

Call GetMessageA

Cmp ax, 0

119. je     end_loop

Push offset msg

Call TranslateMessage

Push offset msg

Call DispatchMessageA

124. jmp msg_loop

125. end_loop:

126. push [msg.msWPARAM]

Call ExitProcess

128.;---- Оконная процедура ----

129. WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD,\

Wparam:DWORD, lparam:DWORD

LOCAL hDC:DWORD

132. cmp [wmsg], WM_DESTROY

Je wmdestroy

134. cmp [wmsg], WM_SIZE

Je wmsize

136. cmp [wmsg], WM_CREATE

Je wmcreate

138. cmp [wmsg],WM_PAINT

Je wmpaint

140.;**************************************

141. cmp [wmsg],WM_COMMAND

Je    wmcommand

143.;**************************************

Jmp defwndproc

145. wmcommand:

Mov eax,lparam

Cmp ax,0

Jne  m1

Mov eax,wparam

150. cmp ax,IDM_ABOUT

Jne  m2

152. call MessageBoxA,0,offset szHello,offset szAppName,MB_OK

Jmp m1

154. m2: cmp ax,IDM_QUIT

Jne  m1

Push 0

Call PostQuitMessage

M1: mov eax,0

Jmp finish

160. wmcreate:

Mov eax, 0

Jmp finish

163. defwndproc:

164. push [lparam]

165. push [wparam]

166. push [wmsg]

167. push [hwnd]

Call DefWindowProcA

Jmp finish

170. wmdestroy:

Push L    0

Call PostQuitMessage

Mov eax, 0

Jmp finish

175. wmsize:

Mov eax, 0

Jmp finish

178. wmpaint:

Push offset lppaint

180. push [hwnd]

Call BeginPaint

182. mov [hDC],eax

Push offset lppaint

184. push [hwnd]

Call EndPaint

Mov eax,0

Jmp finish

188. finish:

Ret

WndProc     endp

191.;---------------------------------

Public WndProc

193. end start                       ; конец программы

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


Заключение

 

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

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

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

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

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

 

 


Поделиться с друзьями:

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.068 с.