МЕНЮ


Фестивали и конкурсы
Семинары
Издания
О МОДНТ
Приглашения
Поздравляем

НАУЧНЫЕ РАБОТЫ


  • Инновационный менеджмент
  • Инвестиции
  • ИГП
  • Земельное право
  • Журналистика
  • Жилищное право
  • Радиоэлектроника
  • Психология
  • Программирование и комп-ры
  • Предпринимательство
  • Право
  • Политология
  • Полиграфия
  • Педагогика
  • Оккультизм и уфология
  • Начертательная геометрия
  • Бухучет управленчучет
  • Биология
  • Бизнес-план
  • Безопасность жизнедеятельности
  • Банковское дело
  • АХД экпред финансы предприятий
  • Аудит
  • Ветеринария
  • Валютные отношения
  • Бухгалтерский учет и аудит
  • Ботаника и сельское хозяйство
  • Биржевое дело
  • Банковское дело
  • Астрономия
  • Архитектура
  • Арбитражный процесс
  • Безопасность жизнедеятельности
  • Административное право
  • Авиация и космонавтика
  • Кулинария
  • Наука и техника
  • Криминология
  • Криминалистика
  • Косметология
  • Коммуникации и связь
  • Кибернетика
  • Исторические личности
  • Информатика
  • Инвестиции
  • по Зоология
  • Журналистика
  • Карта сайта
  • Создать меню без файла описания ресурсов с помощью функций CreateMenu и CreatePopupMenu

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


    Приглашения

    09.12.2013 - 16.12.2013

    Международный конкурс хореографического искусства в рамках Международного фестиваля искусств «РОЖДЕСТВЕНСКАЯ АНДОРРА»

    09.12.2013 - 16.12.2013

    Международный конкурс хорового искусства в АНДОРРЕ «РОЖДЕСТВЕНСКАЯ АНДОРРА»




    Copyright © 2012 г.
    При использовании материалов - ссылка на сайт обязательна.