Вывод на экран текущий каталог в графическом режимеРефераты >> Программирование и компьютеры >> Вывод на экран текущий каталог в графическом режиме
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.