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