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

eName 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.



Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

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

Слов:2489
Символов:25005
Размер:48.84 Кб.