Рефераты. Вывод на экран текущий каталог в графическом режиме (со скролингом) p> ;означающее начало сегмента данных
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. szTitleName db 'Это курсовой',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. 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



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.