7. extrn CreateWindowExA:PROC
8. extrn DefWindowProcA:PROC
9. extrn DispatchMessageA:PROC
10. extrn EndPaint:PROC
11. extrn ExitProcess:PROC
12. extrn GetMessageA:PROC
13. extrn GetModuleHandleA:PROC
14. extrn LoadCursorA:PROC
15. extrn LoadIconA:PROC
16. extrn PostQuitMessage:PROC
17. extrn RegisterClassA:PROC
18. extrn ShowWindow:PROC
19. extrn TextOutA:PROC
20. extrn UpdateWindow:PROC
21. extrn GetTextMetricsA:PROC
22. extrn SetCurrentDirectoryA:PROC
23. extrn FindFirstFileA:PROC
24. extrn FindNextFileA:PROC
25. extrn FindClose:PROC
26. extrn SetScrollPos:PROC
27. extrn InvalidateRect:PROC
28. extrn GetClientRect:PROC
29. extrn ScrollWindow:PROC
30. extrn GetDC:PROC
31. extrn ReleaseDC:PROC
32. extrn SetScrollRange:PROC
33. extrn TranslateMessage:PROC
34. .data ;предопределенноеимя,
;означающее начало сегмента данных
35. hFindFile dd 0
36. newhwnd dd 0
37. wc WNDCLASS <?>
38. qq1 db '@@@@'
39. lppaint PAINTSTRUCT <?>
40. qq2 db '@@@@'
41. msg MSGSTRUCT <?>
42. tm TEXTMETRIC <?>
43. rc RECT <?>
44. charht dd 0
45. hInst dd 0
46. fl dw 0
47. szTitleNamedb 'Это курсовой',0
48. szClassName db 'ASMCLASS32',0
49. Buffer db 'Помни о порядке передачи параметров функции!',0
50. buf_v db 260 dup (0)
51. num dd 0
52. ;##########################
53. lpPathName dd 0
54. szP db 0
55. w32fd WIN32_FIND_DATA <?>
56. lpFileName dd 0
57. fn db "*.*",0
58. ;##########################
59. nVertDifference dd 0
60. nVertPosition dd 0
61. cyStep dd 0
62. nFirst dd 0
63. nLast dd 0
64. cyMax dd 0
65. cyPos dd 0
66. cory dd 5
67. count dd 0
68. py dd 0
69. .code ;предопределенное имя, означающее
;начало сегмента кода
70. start:
71. pushL 0
72. call GetModuleHandleA ;возвращает базовый адрес модуля,
;указывающий, куда был отображен в адресном
; пространстве процесса EXE- или DLL файла
73. mov [hInst], eax ; результат выполнения функции сохраняется в качестве переменной hInst
74. reg_class:
75. ;************************************************
;инициализация структуры WNDCLASS
76. mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW ; стиль класса
77. mov [wc.clsLpfnWndProc], offsetWndProc ;адрес оконной процедуры
78. mov wc.clsCbClsExtra], 0 ;определяет дополнительное число
; байтов для структуры класса окна,
; которые система резервирует
;в служебной памяти для всех окон
; этого класса
79. mov [wc.clsCbWndExtra], 0 ; задает в байтах объем памяти,
; резервируемой системой в конце
; каждой такой структуры каждого окна
; данного класса
80. moveax, [hInst]
81. mov [wc.clsHInstance], eax ; содержит базовый адрес данного
;EXE- файла, полученный с помощью
;функции GetModuleHandle
82. call LoadIconA, 0, IDI_APPLICATION ; заданнаяпоумолчанию
; пиктограмма
83. mov [wc.clsHIcon], eax
84. call LoadCursorA, 0 ,IDC_ARROW ; стандартнаястрелкакурсора
85. mov [wc.clsHCursor], eax
86. mov [wc.clsHbrBackground],COLOR_WINDOW +1
87. mov dword ptr [wc.clsLpszMenuName], 0
88. mov dword ptr [wc.clsLpszClassName], offset szClassName
89. call RegisterClassA, offset wc ; регистрируетклассокна,
; атрибуты которого определены ;в структуре WNDCLASS
90. call CreateWindowExA, 0,offset szClassName,offset szTitleName, \
; создает окно, имеющее указанный тип
; и принадлежащее указанному классу
91. WS_OVERLAPPEDWINDOW OR WS_VSCROLL,CW_USEDEFAULT, \
92. CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0, \
93. [hInst], 0
94. mov [newhwnd], eax
95. call ShowWindow, [newhwnd], SW_SHOWNORMAL ; показываеткаким
; образом должно быть
; показано окно
96. call UpdateWindow, [newhwnd] ; обновляет изображение
; окна, посылая
;сообщение WM_PAINT
; оконной процедуре, если
; область модификации
; окна не пуста
97. msg_loop:
98. call GetMessageA, offset msg, 0, 0, 0 ;считывает сообщение
; очереди сообщений
; прикладной задачи
99..ifeax!= 0
100. call DispatchMessageA, offset msg ; передаетсообщение
; оконнойпроцедуре
101. call TranslateMessage, offset msg
102. jmp msg_loop
103. ; .endif
104. call ExitProcess, [msg.msWPARAM] ;
105. ;*************************************************
106. ;Оконнаяпроцедура
107. ;**************************************************
108. WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD,\
109. wparam:DWORD, lparam:DWORD
110. LOCAL hDC:DWORD
111. cmp [wmsg], WM_DESTROY ; посылаетсяоконнойпроцедуресразу
; же после закрытия окна
112. je wmdestroy
113. cmp [wmsg], WM_SIZE ; посылается оконной процедуре после того,
; как изменился размер окна
114. je wmsize
115. cmp [wmsg], WM_CREATE ; передача оконной процедуре нового
; окна после того, как окно создано,
; но прежде чем окно стало видимым
116. je wmcreate
117. cmp [wmsg],WM_PAINT ; обеспечивают перерисовку окна, когда
; часть или вся рабочая область окна
; становится недействительной
118. jewmpaint
119. cmp [wmsg],WM_VSCROLL ;
120. je wmscroll
121. jmp defwndproc
122. wmcreate:
123. callGetDC,[hwnd] ;дескриптор контекстного устройства
124. mov [hDC],eax
125. call GetTextMetricsA,[hDC],offset tm
126. mov ebx,0
127. mov bx,[tm.tmExtLeading] ; межстрочноерасстояние
128. addbx,[tm.tmHeight] ;высота (добавка к координате строки)
129. mov [charht],ebx
130. callReleaseDC,[hwnd],[hDC] ; отказ от контекстного устройства
131. mov eax, 0
132. jmp finish
133. defwndproc:
134. call DefWindowProcA,[hwnd],[wmsg],[wparam],[lparam]
135. jmp finish
136. wmscroll:
137. callGetClientRect,[hwnd],offsetrc ;определение клиентской
; области окна
138. movzxeax,[wordptrwparam] ;преобразование содержимого wparam в
; двойное слово
139. cmp eax,SB_LINEDOWN ; щелчок мыши на стрелке вниз,
; приводит к прокрутке на одну строку
; вниз
140. je sblinedown
141. cmp eax,SB_LINEUP ; щелчокмышинастрелкевверх,
; приводит к прокрутке на одну строку
; вверх
142. je sblineup
143. cmp eax,SB_ENDSCROLL ;отпускание любого органа управления
; отпущена клавиша мыши после
; удерживания ее на полосе прокрутки
144. je bp3
145. sblinedown:
146. mov [cyStep],1 ; прибавить шаг
147. jmp endvscroll_1
148. sblineup:
149. mov [cyStep],-1
150. jmp endvscroll
151. endvscroll:
152. cmp [cyPos],0
153. je bp3
154. endvscroll_1: mov eax,[cyPos] ;посылаемпозициюбегункав
; регистр
155. add eax,[cyStep]
156. mov [cyPos],eax
157. mov eax,0
158. sbbeax,[charht] ;расчет межстрочного расстояния
159. mov ecx,[cyStep]
160. mov edx,0
161. mul ecx
162. mov ecx,eax
163. call ScrollWindow,[hwnd],0,ecx,0,0 ; определяемдескрипторокна,
; где клиентская область должна
; быть прокручена
164. callInvalidateRect,[hwnd],offsetrc,TRUE ; определяем окно с
; изменившейся
; областью
165. callSetScrollPos,[hwnd],SB_VERT,[cyPos],TRUE ;установление
;позиции бегунка в
; стандартной
;вертикальной
;полосе прокрутки
166. call UpdateWindow,[hwnd] ;обновление изображения окна,
; если область не пуста
167. bp3: mov eax,0
168. jmp finish
169. wmdestroy:
170. call PostQuitMessage,0
171. mov eax, 0
172. jmpfinish
173. wmsize: ;для перерисовки нового размера окна
;значение старшего слова означает высоту
; клиентской части
174. moveax,[lparam]
175. mov cl,16
176. rcr eax,cl
177. and eax,0ffffh
178. mov dx,0
179. mov cx,word ptr [charht]
180. div cx
181. movzx ecx,ax
182. mov eax,101
183. sbb eax,ecx
184. cmp eax,0
185. ja www1
186. mov eax,0
187. www1: mov [cyMax],ecx
188. call FindFirstFileA,offset fn,offset w32fd
189. mov [hFindFile],eax
190. mov esi,1
191. s_m4:
192. call FindNextFileA,[hFindFile],offset w32fd
193. cmp eax,0
194. je s_m5
195. inc esi
196. jmp s_m4
197. s_m5: mov [nLast],esi
198. mov eax,[cyMax]
199. cmp eax,[cyPos]
200. ja www2
201. mov [cyPos],eax
202. www2: push FALSE
203. push esi
204. push L 0
205. push SB_VERT
206. push [hwnd]
207. call SetScrollRange
208. push TRUE
209. push [cyPos]
210. push SB_VERT
211. push [hwnd]
212. call SetScrollPos
213. mov eax, 0
214. jmp finish
215. wmpaint:
216. call BeginPaint,[hwnd],offset lppaint ;получиликонтекст
; устройства
217. mov [hDC],eax
218. moveax,[cyPos] ; начальная позиция бегунка
219. mov ecx,[charht] ;получили координату вывода в пикселях
220. mov dx,0
221. mul cx
222. movzxecx,ax
223. mov [cory],5 ; занесли по у -5
224. movecx,1 ; занесли по x -1
225. call FindFirstFileA,offset fn,offset w32fd ;отыскиваем
;первый
; файл
226. mov [hFindFile],eax
227. cmp ecx,[cyPos]
228. jne qqq1
229. mov esi,0
230. m3: movdl,w32fd.cFileName[esi] ;отрисовка первой строки
231. cmp dl,0
232. je m2
233. mov buf_v[esi],dl
234. inc esi
235. jmp m3
236. cmp [cyPos],0 ; если не ноль, то переход на метку
; qqql
237. jneqqq1
238. m2:
239. mov [num],esi
240. call TextOutA,[hDC],5,[cory],offset buf_v,[num] ; вывод
;первого
;найденного
; файла
241. qqq1: movebx,1
242. m6:
243. call FindNextFileA,[hFindFile],offset w32fd ; следующийфайл
244. cmpeax,0 ; проверка для
; последнего файла
245. jekon
246. mov esi,0
247. mov edi,0
248. m4: mov dl,w32fd.cFileName[edi] ; получилиимя
;файла
249. cmp dl,0
250. je m5
251. mov buf_v[esi],dl
252. inc edi
253. inc esi
254. jmp m4
255. m5: cmp ebx,[cyPos]
256. jb qqq2
257. mov eax,[charht]
258. add [cory],eax
259. call TextOutA,[hDC],5,[cory],offset buf_v,esi ;вывод
;новой строки
260. qqq2: incebx ;счетчик строк
261. jmp m6
262. kon: call EndPaint,[hwnd],offset lppaint ;отдали
;контекст
; устройства и
;перешли в цикл
;обработки сообщений
263. moveax,0
264. jmp finish
265. finish:
266. ret
267. WndProc endp
268. public WndProc
269. endstart ; конец программы.
Заключение.
Моя задача состояла в создании учебной программы, демонстрирующей вывод на экран в графическом режиме заданный каталог со скролингом. С полосами прокрутки связан единственный недостаток, который заключается в том, что приложениями невозможно управлять без мыши. Но так как большинство приложений Windows поддерживают работу с мышью, это вряд ли стоит считать серьезным недостатком. Необходимо было выполнить целый ряд действий, прежде чем приложение смогло адекватно реагировать на сообщения, посылаемые полосами прокрутки.
Библиографический список.
Windows 98: руководство разработчика: Пер.с англ. – К.: Издательская группа BHV, 1999. – T.1. –672 c.
Зубков С.В. Asstmbler. Для DOC, Windows Unix. M.: ДМК, 1999.640 с.