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.