РефератыИнформатика, программированиеВыВывод на экран текущего каталога в графическом режиме (со скроллингом)

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

Министерство образования Российской Федерации


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


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


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


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


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


Руководитель В.П. Кулюкин


Студент гр.СП-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> ; последовательности символов LARGE,


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


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


6. extrnginPaint: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

r />

46. fl dw 0


47. szTitleNamedb 'Это курсовой',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. pushL 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], offsetWndProc ;адрес оконной процедуры


78. mov wc.clsCbClsExtra], 0 ;определяет дополнительное число


; байтов для структуры класса окна,


; которые система резервирует


;в служебной памяти для всех окон


; этого класса


79. mov [wc.clsCbWndExtra], 0 ; задает в байтах объем памяти,


; резервируемой системой в конце


; каждой такой структуры каждого окна


; данного класса


80. moveax, [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..ifeax!= 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. jewmpaint


119. cmp [wmsg],WM_VSCROLL ;


120. je wmscroll


121. jmp defwndproc


122. wmcreate:


123. callGetDC,[hwnd] ;дескриптор контекстного устройства


124. mov [hDC],eax


125. call GetTextMetricsA,[hDC],offset tm


126. mov ebx,0


127. mov bx,[tm.tmExtLeading] ; межстрочноерасстояние


128. addbx,[tm.tmHeight] ;высота (добавка к координате строки)


129. mov [charht],ebx


130. callReleaseDC,[hwnd],[hDC] ; отказ от контекстного устройства


131. mov eax, 0


132. jmp finish


133. defwndproc:


134. call DefWindowProcA,[hwnd],[wmsg],[wparam],[lparam]


135. jmp finish


136. wmscroll:


137. callGetClientRect,[hwnd],offsetrc ;определение клиентской


; области окна


138. movzxeax,[wordptrwparam] ;преобразование содержимого 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. sbbeax,[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. callInvalidateRect,[hwnd],offsetrc,TRUE ; определяем окно с


; изменившейся


; областью


165. callSetScrollPos,[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. jmpfinish


173. wmsize: ;для перерисовки нового размера окна


;значение старшего слова означает высоту


; клиентской части


174. moveax,[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. moveax,[cyPos] ; начальная позиция бегунка


219. mov ecx,[charht] ;получили координату вывода в пикселях


220. mov dx,0


221. mul cx


222. movzxecx,ax


223. mov [cory],5 ; занесли по у -5


224. movecx,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: movdl,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. jneqqq1


238. m2:


239. mov [num],esi


240. call TextOutA,[hDC],5,[cory],offset buf_v,[num] ; вывод


;первого


;найденного


; файла


241. qqq1: movebx,1


242. m6:


243. call FindNextFileA,[hFindFile],offset w32fd ; следующийфайл


244. cmpeax,0 ; проверка для


; последнего файла


245. jekon


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: incebx ;счетчик строк


261. jmp m6


262. kon: call EndPaint,[hwnd],offset lppaint ;отдали


;контекст


; устройства и


;перешли в цикл


;обработки сообщений


263. moveax,0


264. jmp finish


265. finish:


266. ret


267. WndProc endp


268. public WndProc


269. endstart ; конец программы.



Заключение.


Моя задача состояла в создании учебной программы, демонстрирующей вывод на экран в графическом режиме заданный каталог со скролингом. С полосами прокрутки связан единственный недостаток, который заключается в том, что приложениями невозможно управлять без мыши. Но так как большинство приложений Windows поддерживают работу с мышью, это вряд ли стоит считать серьезным недостатком. Необходимо было выполнить целый ряд действий, прежде чем приложение смогло адекватно реагировать на сообщения, посылаемые полосами прокрутки.


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


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


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

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

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

Слов:2697
Символов:25634
Размер:50.07 Кб.