Висновок на екран поточного каталогу в графічному режимі з скролінгом

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Міністерство освіти Російської Федерації

Інститут перепідготовки кадрів

Уральського державного технічного університету

Кафедра мікропроцесорної техніки

Курсова робота

На тему: Виведення на екран поточний каталог в графічному режимі (зі скролінгом)

Керівник В.П. Кулюкін

Студент гр.СП-923

г.Нягань

2001р.

ЗМІСТ

ВСТУП 3

ОСНОВНА ЧАСТИНА 4

ВИСНОВОК 17

СПИСОК 18

Введення.

Асемблер-один з найстаріших з існуючих сьогодні мов программірованія.Когда-то це був самий основна мова, без якого не можна було змусити комп'ютер зробити що-небудь корисне.

Поступово ситуація змінювалася. З'явилися більш зручні засоби спілкування з комп'ютером. Але на відміну від інших мов асемблер не вмирав, більше того він немогу цього зробити в принципі.

Якщо коротко, то асемблер-це символічне представлення машинної мови. Всі процеси в машині на найнижчому, апаратному рівні приводяться в дію тільки командами машінногшо мови.

Звідси зрозуміло, що незважаючи на загальну назву, мова Асемблера для кожного типу комп'ютера свій. Це стосується і зовнішнього вигляду програм, написаних на Асемблері, і ідей, відображенням яких ця мова є.

Опис програми.

Windows-додаток на асемблері містить один сегмент даних. Data і один сегмент коду. Code. У програмі використано 28 функцій API. Параметри цих функцій передаються через стек, результат повертається в регістрі ЕАХ.

Регістр mode1 задає модуль сегментації (flat) і стиль генерації коду при вході до процедури програми і вихід з них (stdcall). Модель пам'яті flat означає плоску модель пам'яті. Відповідно до цієї моделі компілятор створює програму, яка містить 32-бітовий сегмент для даних і коду програми. Вказівка ​​цієї моделі пам'яті змушує компонувальник створити виконуваний файл з розширенням. Exe. Параметр stdcall визначає порядок передачі параметрів через стек справа наліво.

Директива include включае в програму файл win32.inc.

Функції Win32 API, що використовуються в програмі повинні бути оголошені за допомогою директиви extrn для того, щоб компілятор міг згенерувати правильний код.

Рядки 35-68 містять опис сегменту даних, в якому визначаються змінні та примірники структур, що використовуються в програмі. Для запуску програми під управлінням Windows необхідно виконати ряд кроків, зміст яких полягає у виклику ряду функцій Win32.API:

* Виконання стартового коду;

* Виконання головної функції, що виконує наступні дії;

Реєструє клас вікна;

Створює вікно;

Відображає вікно;

Запускає цикл обробки повідомлень;

Завершує цикл обробки повідомлення;

* Організація обробки повідомлень у віконній процедурі.

Віконна процедура визначає те, що виводиться в робочу область вікна, і те, як вікна реагувати на призначений для користувача ввод.Созданіе вікна виконується функцією Win32 API CreateWindowEx. Для цього їй потрібно передати безліч параметрів. Для створення вікна необхідні 2 кроки: спочатку визначення класу вікна, а лише потім безпосередньо його створення.

Після виконання функції CreateWindowExA створюється вікно, але це поки відбудеться тільки лише всередині самої Windows, - на екрані це нове вікно поки ще не відобразиться. Для того щоб створене вікно з'явилося на екрані, застосовуємо функцію ShowWindowA. В якості параметрів цієї функції передається дескриптор hWnd вікна, яке необхідно відобразити на екрані, і константа, що задає початковий вигляд вікна.

Додаток може мати кілька віконних функцій. Їх кількість визначається кількістю класів вікон, зареєстрованих в системі функцією Register Class (Ex).

Windows вимагає, щоб віконна функція зберігала значення регістрів ebi, edi і esi, тому що віконна функція повинна бути рекурсівной.По завершення роботи віконна функція формує значення в регістрі EAX. Якщо повідомлення оброблялося у віконній функції, то в eax необхідно помістити нульове значення.

Смуги прокручування - етоелементи управління, призначені для регулювання вертикального і горизонтального положення на екрані асоційованих з ними об'єктів. Різниця між смугами прокрутки, які є частиною вікна та смугами прокрутки - дочірніми вікнами, полягає в тому, що дочірні вікна мають вбудований клавіатурний інтерфейс, що дозволяє впливати на смугу прокручування за допомогою клавіатури. Повідомлення SB_LINEUP генерується обома смугами при натисканні на верхній або стрілкою ліворуч, а повідомлення SB_LINEDOWN - у разі натискання нижній або правій стрілки. Щоб смуга прокрутки функціонувала коректно необхідно визначити для неї діапозон прокручування і задати позицію бігунка.

Вбудована смуга прокрутки, на жаль, дісталася тільки управлінню за допомогою курсору миші. За замовчуванням для смуг прокручування, які є частиною вікна, цей діапазон (число кроків мужду крайніми позиціями бігунка) визначений від 0 до 100. Для того, щоб змінити діапазон прокручування необхідно викликати функцію SetScrollRange

У Windows не дивлячись на те, що операції введення здійснювані додатком, обмежені робочої областю його вікна, програма повинна бути готова відновити інформацію в цій області на вимогу системи.

У програмі використаний ряд функцій Windows API, які як би є основними, коли мова йде про віконні процедурах (CreateWindow, ShowWindow та ін.)

Розглянемо докладніше процедури, які організовані на основі стилю вікна.

Короткий опис процедур:

InvalidateRect - ця функція додає прямокутник до області модифікації вказаних вікон. Область модифікації є частиною області клієнтського вікна, яка повинна бути повторно перересована.

Параметри:

hWnd визначає вікно, чия область змінилася, якщо цей параметр дорівнює 0, то Windows змінює всі вікна і посилає віконної процедури повідомлення * WM_ERASEBKGND and WM_NCPAINT *;

lpRect покажчик на структуру RECT, яка містить координати клієнтського прямокутника, який буде додано до області модіфікаціібласті. Якщо цей параметр дорівнює нуль, то вся область клієнта додається до області модифікації.

BErase визначає чи має бути стертий фон у межах області модифікації. Якщо цей параметр true, фон стирається при виклику BeginPaint

GetClientRect - віднаходить координати області клієнта вікна. Клієнтські координати визначають координати верхнього лівого і правого нижнього кутів. Координати верхнього лівого кута рівні (0,0).

Параметри:

hWnd: визначає вікно, координати якого треба знайти.

lpRect: вказівник на структуру, яка отримає коорідінати.

При правильному завершення функції повертається значення, відмінне від 0.

SetScrollRange - функція встановлює мінімальне та максимальне значення позицій для зазначеної смуги прокручування. Може також використовуватися для приховування стандартної смуги прокручування.

Параметри:

hWnd: визначає, що це стандартне вікно з смугою прокрутки або просто смуга прокрутки, залежно від значення параметра nBar.

nBar: визначає смугу прокручування. Цей параметр може приймати різні значення. Він встановлює діапазон управління, якщо смуга вікно. Встановлює діапазон стандартної вертикальної або горизонтальної смуги прокручування. Визначає мінімальну прокручиваемую позицію. Визначає, чи повинна бути смуга прокрутки повторно відтягнута. Якщо істина, то так, повинна бути.

ScrollWindow - функція, яка прокручує вміст області клієнта вказаного вікна.

hWnd: визначає дескриптор вікна, де клієнтська область повинна бути прокручена.

XAmount: визначає склад модуля для горизонтального прокручування.

YAmount: визначає склад модуля для вертикального прокручування.

lpRect: вказівник на структуру RECT, визначальну частину області клієнта для прокрутки. Якщо цей параметр дорівнює 0, то прокручується вся клієнтська область

lpClipRect: вказівник на структуру RECT, що містить координати прямокутника відсікання.

Якщо функція виконалася правильно, то вона повертає значення, відмінне від нуля.

SetScrollPos - функція, яка встановлює позицію бігунка у зазначеній смузі прокрутки і змінює цю позицію.

Параметри:

hWnd: ідентифікує смугу прокрутки або вікно зі стандартною смугою прокрутки, в залежності від значення параметра nBar.

nBar: визначає смугу прокручування.

Цей параметр може приймати одне з наступних значень:

- SB_CTL - встановлює позицію бігунка в управлінні смуги прокрутки, hWnd - дискриптор смуги прокручування.

- SB_GORS - встановлює позицію бігунка в стандартній горизонтальній смузі прокрутки.

- SB_VERT - встановлює позицію бігунка в стандартній вертикальній смузі прокручування.

nPos: параметр, що визначає нову позицію бігунка. Вона повинна бути в межах прокручуваного діапазону.

bRedraw: параметр, що визначає відтягнута чи повторно смуга прокрутки, для того щоб відобразити нову позицію бігунка. Якщо цей параметр істина, то смуга прокрутки повторно відтягнута.

Якщо функція неправильно завершена, то повертається нуль.

p486; ця директива дозволяє транслятору

; Обробляти команди процесора i486

2. jumps; транслятор автоматично перетворює

; Команду умовної передачі управління в комбінацію

; Умовною і безумовною команд, якщо умовна команда в

; Cілу обмеженість області своєї дії не

; Забезпечує передачу управління за потрібною адресою

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

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

; Передачі параметрів функцій STDCALL,

; Далі діють за замовчуванням

4. include win32.inc; файл, що містить описи структур

; Даних і констант

5. L equ; послідовності символів 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 з.


Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Курсова
36.1кб. | скачати


Схожі роботи:
Реалізація функцій бібліотеки графіки для виводу тексту у графічному режимі OutTextXY SetTextStyle
Реалізація функцій бібліотеки графіки для виводу тексту у графічному режимі OutTextXY SetTextStyle 2
Розрахунок собівартості каталогу
Вивід вмісту каталогу y середовищі MS DOS
Вивчення ефективності використання систематичного каталогу
Консультування в режимі НЛП
Відеопам ять у текстовому режимі
Робота в захищеному режимі мікропроцесора
Комп`ютерна модель СГ в координатах dq 0 в режимі ХХ
© Усі права захищені
написати до нас