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

2016-07-31СтудИзба

Описание файла

Документ из архива "Создать меню без файла описания ресурсов с помощью функций CreateMenu и CreatePopupMenu", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "menu1"

Текст из документа "menu1"

Министерство образования Российской Федерации

Институт переподготовки кадров

Уральского государственного технического

университета

Кафедра микропроцессорной техники
Курсовая работа

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

  1. jumps ; транслятор автоматически преобразует команду

;условной

; передачи управления в комбинацию условной и безусловной

; команд если условная команда в силу ограниченности

; области своего действия ;не обеспечивает передачу

; управления по нужному адресу

  1. model flat, STDCALL ; выбирается модель памяти для 32- разрядного

; программирования и правила передачи

; параметров функциям STDCALL, далее

; действующие по умолчанию

  1. include win32.inc ; файл описания структур и констант

  2. L equ ; последовательности символов LARGE,

; являющейся именем операции, объявляющей

; следующий за ней операнд 32-разрядным,

; присваивается имя L

  1. IDM_QUIT equ 100

  2. IDM_ABOUT equ 101

  3. MF_ENABLED equ 0

  4. MF_POPUP equ 10h

  5. MF_OWNERDRAW equ 100h

;Функции Win32 API, используемые программой

  1. extrn BeginPaint :PROC

  2. extrn CreateWindowExA :PROC

  3. extrn DefWindowProcA :PROC

  4. extrn DispatchMessageA :PROC

  5. extrn EndPaint :PROC

  6. extrn ExitProcess :PROC

  7. extrn GetMessageA :PROC

  8. extrn GetModuleHandleA :PROC

  9. extrn LoadCursorA :PROC

  10. extrn LoadIconA :PROC

  11. extrn RegisterClassA :PROC

  12. extrn PostQuitMessage :PROC

  13. extrn ShowWindow :PROC

  14. extrn TranslateMessage :PROC

  15. extrn UpdateWindow :PROC

  16. extrn CreateMenu :PROC

  17. extrn MessageBoxA :PROC

  18. extrn AppendMenuA :PROC

  19. extrn DrawMenuBar :PROC

  20. extrn CreatePopupMenu :PROC

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

; данных

  1. newhwnd dd 0

  2. lppaint PAINTSTRUCT

  3. msg MSGSTRUCT

  4. wc WNDCLASS

  5. hInst dd 0

  6. fl dw 0

  7. szTitleName db 'Это наше окно',0

  8. szClassName db 'ASMCLASS32',0

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

  10. szAppName db 'Сообщение',0

  11. hMenu dd 0

  12. hsubmenu dd 0

  13. item1 db 'Меню',0

  14. item2 db 'Выход',0

  15. item3 db 'Возврат',0

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

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

  1. start:

  2. push L 0

  3. call GetModuleHandleA

  4. mov [hInst], eax

;инициализация структуры WndClass

  1. mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW +

CS_GLOBALCLASS

  1. mov [wc.clsLpfnWndProc], offset WndProc

  2. mov [wc.clsCbClsExtra], 0

  3. mov [wc.clsCbWndExtra], 0

  4. mov eax, [hInst]

  5. mov [wc.clsHInstance], eax

  6. push L IDI_APPLICATION

  7. push L 0

  8. call LoadIconA

  9. mov [wc.clsHIcon], eax

  10. push L IDC_ARROW

  11. push L 0

  12. call LoadCursorA

  13. mov [wc.clsHCursor], eax

  14. mov [wc.clsHbrBackground], COLOR_WINDOW + 1

  15. mov dword ptr [wc.clsLpszMenuName],0

  16. mov dword ptr [wc.clsLpszClassName], offset szClassName

  17. push offset wc

  18. call RegisterClassA

  1. call CreateMenu

  2. mov [hMenu],eax

  3. push L 0 ; lpParam

  4. push [hInst] ; hInstance

  5. push [hMenu] ; menu

  6. push L 0 ; parent hwnd

  7. push L CW_USEDEFAULT ; height

  8. push L CW_USEDEFAULT ; width

  9. push L CW_USEDEFAULT ; y

  10. push L CW_USEDEFAULT ; x

  11. push L WS_OVERLAPPEDWINDOW ; Style

  12. push offset szTitleName ; Title string

  13. push offset szClassName ; Class name

  14. push L 0 ; extra style

  1. call CreateWindowExA

  2. mov [newhwnd], eax

  1. call CreatePopupMenu

  2. mov [hsubmenu], eax

  3. push offset item2

  4. push L IDM_QUIT

  5. push 0

  6. push eax

  7. call AppendMenuA

  1. push offset item3

  2. push L IDM_ABOUT

  3. push 0

  4. push [hsubmenu] ;eax

  5. call AppendMenuA

  1. push offset item1

  2. push [hsubmenu]

  3. push MF_POPUP

  4. push [hMenu]

  5. call AppendMenuA

  6. nop

  1. push L SW_SHOWNORMAL

  2. push [newhwnd]

  3. call ShowWindow

  1. push [newhwnd]

  2. call UpdateWindow

  1. push [newhwnd]

  2. call DrawMenuBar

  3. msg_loop:

  4. push L 0

  5. push L 0

  6. push L 0

  7. push offset msg

  8. call GetMessageA

  9. cmp ax, 0

  10. je end_loop

  1. push offset msg

  2. call TranslateMessage

  1. push offset msg

  2. call DispatchMessageA

  1. jmp msg_loop

  1. end_loop:

  2. push [msg.msWPARAM]

  3. call ExitProcess

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

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

  3. wparam:DWORD, lparam:DWORD

  4. LOCAL hDC:DWORD

  1. cmp [wmsg], WM_DESTROY

  2. je wmdestroy

  3. cmp [wmsg], WM_SIZE

  4. je wmsize

  5. cmp [wmsg], WM_CREATE

  6. je wmcreate

  7. cmp [wmsg],WM_PAINT

  8. je wmpaint

  1. ;**************************************

  2. cmp [wmsg],WM_COMMAND

  3. je wmcommand

  4. ;**************************************

  5. jmp defwndproc

  1. wmcommand:

  2. mov eax,lparam

  3. cmp ax,0

  4. jne m1

  5. mov eax,wparam

  6. cmp ax,IDM_ABOUT

  7. jne m2

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

  9. jmp m1

  10. m2: cmp ax,IDM_QUIT

  11. jne m1

  12. push 0

  13. call PostQuitMessage

  14. m1: mov eax,0

  15. jmp finish

  1. wmcreate:

  2. mov eax, 0

  3. jmp finish

  1. defwndproc:

  2. push [lparam]

  3. push [wparam]

  4. push [wmsg]

  5. push [hwnd]

  6. call DefWindowProcA

  7. jmp finish

  1. wmdestroy:

  2. push L 0

  3. call PostQuitMessage

  4. mov eax, 0

  5. jmp finish

  1. wmsize:

  2. mov eax, 0

  3. jmp finish

  1. wmpaint:

  2. push offset lppaint

  3. push [hwnd]

  4. call BeginPaint

  5. mov [hDC],eax

  6. push offset lppaint

  7. push [hwnd]

  8. call EndPaint

  9. mov eax,0

  10. jmp finish

  1. finish:

  2. ret

  3. WndProc endp

  4. ;---------------------------------

  5. public WndProc

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

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

Заключение

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

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

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

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

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

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5137
Авторов
на СтудИзбе
440
Средний доход
с одного платного файла
Обучение Подробнее