RSS    

   Курсовая работа: Вывод на экран текущего каталога в графическом режиме (со скроллингом)

2. jumps           ; транслятор автоматически преобразует

; команду условной передачи управления в комбинацию

; условной и безусловной команд, если условная команда в

; cилу ограниченности области своего действия не

; обеспечивает передачу управления по нужному адресу

3. model flat,STDCALL        ; выбирается модель памяти для 32-

; разрядного программирования и правила

;передачи параметров функциям STDCALL,

; далее действующие по умолчанию

4. include win32.inc    ; файл, содержащий  описания структур

; данных и констант

5. L equ <LARGE>    ; последовательности символов LARGE,

; являющейся именем операции,  

; объявляющей следующий за ней операнд ; 32-разрядным, присваивается имя L

6.         extrn                ginPaint:PROC           ; описание импортируемых из

;Windows функций

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. 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 поддерживают работу с мышью, это вряд ли стоит считать серьезным недостатком. Необходимо было выполнить целый ряд действий, прежде чем приложение смогло адекватно реагировать на сообщения, посылаемые полосами прокрутки.


Библиографический список.


Windows 98: руководство разработчика: Пер.с англ. – К.: Издательская группа BHV, 1999. – T.1. –672 c.

Зубков С.В. Asstmbler. Для DOC, Windows Unix. M.: ДМК, 1999. 640 с.


Страницы: 1, 2


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

Обратная связь

Поиск
Обратная связь
Реклама и размещение статей на сайте
© 2010.