Реферат по предмету "Информатика, программирование"


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




Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.