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. push L 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], offset WndProc ;адрес оконной процедуры
78. mov wc.clsCbClsExtra], 0 ;определяет дополнительное число
; байтов для структуры класса окна,
; которые система резервирует
;в служебной памяти для всех окон
; этого класса 79. mov [wc.clsCbWndExtra], 0 ; задает в байтах объем памяти,
; резервируемой системой в конце
; каждой такой структуры каждого окна
; данного класса
80. mov eax, [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..if eax!= 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. je wmpaint 119. cmp [wmsg],WM_VSCROLL ; 120. je wmscroll 121. jmp defwndproc
122. wmcreate: 123. call GetDC,[hwnd] ;дескриптор контекстного устройства 124. mov [hDC],eax
125. call GetTextMetricsA,[hDC],offset tm
126. mov ebx,0 127. mov bx,[tm.tmExtLeading] ; межстрочное расстояние 128. add bx,[tm.tmHeight] ;высота (добавка к координате строки) 129. mov [charht],ebx 130. call ReleaseDC,[hwnd],[hDC] ; отказ от контекстного устройства 131. mov eax, 0 132. jmp finish 133. defwndproc: 134. call DefWindowProcA,[hwnd],[wmsg],[wparam],[lparam] 135. jmp finish
136. wmscroll: 137. call GetClientRect,[hwnd],offset rc ;определение клиентской
; области окна 138. movzx eax,[word ptr wparam] ;преобразование содержимого 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. sbb eax,[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. call InvalidateRect,[hwnd],offset rc,TRUE ; определяем окно с
; изменившейся
; областью 165. call SetScrollPos,[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. jmp finish
173. wmsize: ;для перерисовки нового размера окна
;значение старшего слова означает высоту
; клиентской части 174. mov eax,[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. mov eax,[cyPos] ; начальная позиция бегунка 219. mov ecx,[charht] ;получили координату вывода в пикселях 220. mov dx,0 221. mul cx 222. movzx ecx,ax 223. mov [cory],5 ; занесли по у -5 224. mov ecx,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: mov dl,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. jne qqq1 238. m2: 239. mov [num],esi 240. call TextOutA,[hDC],5,[cory],offset buf_v,[num] ; вывод
;первого
;найденного
; файла 241. qqq1: mov ebx,1 242. m6: 243. call FindNextFileA,[hFindFile],offset w32fd ; следующий файл 244. cmp eax,0 ; проверка для
; последнего файла 245. je kon 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: inc ebx ;счетчик строк 261. jmp m6 262. kon: call EndPaint,[hwnd],offset lppaint ;отдали
;контекст
; устройства и
;перешли в цикл
;обработки сообщений 263. mov eax,0 264. jmp finish
265. finish: 266. ret 267. WndProc endp 268. public WndProc 269. end start ; конец программы.
Заключение.
Моя задача состояла в создании учебной программы, демонстрирующей вывод на экран в графическом режиме заданный каталог со скролингом. С полосами прокрутки связан единственный недостаток, который заключается в том, что приложениями невозможно управлять без мыши. Но так как большинство приложений Windows поддерживают работу с мышью, это вряд ли стоит считать серьезным недостатком. Необходимо было выполнить целый ряд действий, прежде чем приложение смогло адекватно реагировать на сообщения, посылаемые полосами прокрутки.
Библиографический список.
1. Windows 98: руководство разработчика: Пер.с англ. – К.: Издательская группа BHV, 1999. – T.1. –672 c.
2. Зубков С.В. Asstmbler. Для DOC, Windows Unix. M.: ДМК, 1999. 640 с.
3. ----------------------- [pic]
Страницы: 1, 2