Вывод на екран поточний каталог в графічному режимі (зі скролингом)
GetClientRect — відшукує координати області клієнта вікна. Клієнтські координати визначають координати верхнього лівого і правого нижнього кутів. Координати верхнього лівого кута рівні (0,0). Параметри: hWnd: визначає вікно, координати якого треба знайти. lpRect: покажчик на структуру, яка отримає кооридинаты. При правильному завершенні функції повертається значення, не на 0. SetScrollRange… Читати ще >
Вывод на екран поточний каталог в графічному режимі (зі скролингом) (реферат, курсова, диплом, контрольна)
року міністерство освіти Російської Федерации.
Інститут перепідготовки кадров.
Уральського державного технічного университета.
Кафедра мікропроцесорної техники.
Курсова работа.
На тему: Висновок на екран поточний каталог в графічному режимі (зі скролингом).
Керівник В. П. Кулюкин.
Студент гр. СП-923.
г. Нягань.
2001 г.
1. ЗАПРОВАДЖЕННЯ 3.
2. ОСНОВНА ЧАСТИНА 4.
3. ВИСНОВОК 17.
4. БІБЛІОГРАФІЧНИЙ СПИСОК 18.
Асемблеродне із найбільш старих з сьогодні мов программирования. Когда-то це був основний мову, якого не можна було змусити комп’ютер зробити щось корисне. Поступово ситуація змінювалася. З’явилися кращі кошти спілкування з комп’ютером. Однак у відмінність з інших мов асемблер не помирав, більше він немог цього у принципі. Якщо лаконічно, то асемблерце символічне уявлення машинного мови. Усі в машині на низькому, апаратній рівні наводяться на дію лише командами машинногшо мови. Звідси випливає, що попри під назвою, мову Ассемблера кожному за типу комп’ютера свій. Це стосується зовнішнього вигляду програм, написаних на Ассемблері, й ідей, відбитком яких цю мову является.
Опис программы.
Windows-приложение на ассемблері містить один сегмент даних .data і один сегмент коду .code. У конкурсній програмі використано 28 функцій АПІ. Параметри цим функцій передаються через стік, результат повертається у регістрі ЕАХ. Регістр mode1 задає модуль сегментації (flat) і стиль генерації коду при вході у процедури програми розвитку й виході їх (stdcall). Модель пам’яті flat позначає пласку модель пам’яті. Відповідно до цієї моделлю компілятор створює програму, що містить 32-битовый сегмент для даних, і коду програми. Вказівка цієї моделі пам’яті змушує компоновщик створити виконуваний файл з розширенням .exe. Параметр stdcall визначає порядок передачі параметрів через стік справа-наліво. Директива include включае у програмі файл win32.inc. Функції Win32 АПІ, використовувані у програмі мають оголошені з допомогою директиви extrn у тому, щоб компілятор міг згенерувати правильний код. Рядки 35−68 містять опис сегмента даних, у якому визначаються перемінні і екземпляри структур, використовувані у програмі. Для запуску додатка за управлінням Windows необхідні ряд кроків, зміст яких залежить від виклик низки функцій Win32. API: * Виконання стартового коду; * Виконання головною функції, що виконує такі дії;. Реєструє клас вікна;. Створює вікно;. Відображає вікно;. Запускає цикл обробки повідомлень;. Завершує цикл обробки повідомлення; * Організація обробки повідомлень в віконною процедурі. Віконна процедура визначає те, що виводиться в робочу область вікна, і те, як вікна реагувати на користувальницький ввод. Создание вікна виконується функцією Win32 АПІ CreateWindowEx. І тому їй потрібно передати безліч параметрів. До сформування вікна необхідні 2 кроку: спочатку визначення класу вікна, а лише потім безпосередньо створення. По виконанні функції CreateWindowExA створюється вікно, але що можливе лише лише всередині самої Windows, — на це нове вікно поки що не відобразиться. Щоб створене вікно тут прийшли у екрані, застосовуємо функцію ShowWindowA. Як параметрів цієї функції передається дескриптор hWnd вікна, що слід відобразити на екрані, і константа, задающая початковий вид вікна. Додаток може мати кілька віконних функцій. Їхню кількість визначається кількістю класів вікон, зарегестрированных у системі функцією Register Class (Ex). Windows вимагає, щоб віконна функція зберігала значення регістрів ebi, edi і esi, т.к. віконна функція мусить бути рекурсивной. По завершенні роботи віконна функція формує значення регістрі EAX. Якщо повідомлення оброблялося в віконної функції, то eax необхідно помістити нульовий значення. Смуги прокручування — этоэлементы управління, призначені для регулювання вертикального і горизонтального становища на екрані асоційованих із нею об'єктів. Різниця між смугами прокручування, можуть бути частиною вікна і смугами прокручування — дочірніми вікнами, полягає у тому, що дочірні вікна мають вмонтований клавіатурний інтерфейс, дозволяє впливати на смугу прокручування з допомогою клавіатури. Повідомлення SB_LINEUP генерується обома смугами при щиглику верхній чи лівої стрілці, а повідомлення SB_LINEDOWN — у разі натискання нижньої чи правої стрілки. Щоб смуга прокручування функціонувала коректно необхідно визначити нею диапозон прокручування і позицію бігунка. Вбудована смуга прокручування, на жаль, дісталася лише управлінню з допомогою курсору миші. За умовчанням для смуг прокручування, можуть бути частиною вікна, цей диапозон (число кроків мужду крайніми позиціями бігунка) визначено від 0 до 100. А, щоб змінити диапозон прокручування необхідно викликати функцію SetScrollRange У Windows не дивлячись те що, що операції введення здійснювані додатком, обмежені робочої областю його вікна, програма має бути готовою оновити інформацію у цій галузі на вимогу системи. У конкурсній програмі використаний ряд функцій Windows АПІ, що ніби є основними, коли йдеться про віконних процедурах (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: параметр, визначальний відтягнута чи повторно смуга прокручування, для здобуття права відобразити нову позицію бігунка. Якщо це параметр істина, то смуга прокручування повторно оттянута.
Якщо функція неправильно завершено, то повертається ноль.
1. 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 endvscroll1.
148. sblineup: 149. mov [cyStep],-1 150. jmp endvscroll.
151. endvscroll:
152. cmp [cyPos], 0 153. je bp3 154. endvscroll1: 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. divx 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].