Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsia_8-11_Massivy-struktury.doc
Скачиваний:
11
Добавлен:
21.12.2018
Размер:
1.47 Mб
Скачать

3) В Win32 имеется функция GetFileInformationByHandle, с помощью которой можно получить все атрибуты файла:

BOOL GetFileInformationByHandle(HANDLE hFile,

LPBY_HANDLE_FILE_INFORMATION lpFileInformation);

На вход данной функции передается дескриптор файла, о котором необходимо получить информацию, и указатель на экземпляр структуры BY_HANDLE_FILE_INFORMATION, который заполняется этой функцией. В этой структуре сосредоточена вся информация о файле.

Пример 10: Разработать Win32 - консольное приложение с использованием функции GetFileInformationByHandle.

;---------------------------описание структур----------------------------

FILETIME struc

DwLowDateTime dd ? ;младшие 32 бита значения времени

DwHighDateTime dd ? ;старшие 32 бита значения времени

FILETIME ends

BY_HANDLE_FILE_INFORMATION struc

DwFileAttributes dd 0 ;атрибуты файла

struc

ftCreationTime_DwLowDateTime dd ? ; младшие 32 бита времени

; создания файла

ftCreationTimeDwHighDateTime dd ? ;старшие 32 бита времени создания

; файла

Ends

Struc

FtLastAccessTime_DwLowDateTime dd ? ; младшие 32 бита времени

; последнего доступа

FtLastAccessTime_DwHighDateTime dd ? ; старшие 32 бита времени

; последнего доступа

еnds

struc

ftLastWriteTime_DwLowDateTime dd ? ; младшие 32 бита времени

; последней записи

ftLastWnteTime_DwHighDateTime dd ? ;старшие 32 бита времени

; последней записи

ends

dwVolumeSerialNumber dd 0 ;серийный номер тома, на котором

; находится файл

nFileSizeHigh dd 0 ; старшие 32 бита размера файла

nFileSizeLow dd 0 ; младшие 32 бита размера файла

nNumberOfLinks dd 0 ; число ссылок на файл

nFileIndexHigh dd 0 ;старшие 32 бита идентификатора файла

nFileIndexLow dd 0 ; младшие 32 бита идентификатора файла

ends

.data

info BY_HANDLE_FILE_INFORMATION <>

TitleText db 'Получение информации о файле в Win32',0

lpBuf db "File1.txt",0

hFile dd 0

.code

;-------------------------------------Открываем файл--------------------

push 0

push 0

push OPEN_EXISTING ; открыть существующий файл, если его нет –

; ошибка

push 0 ; защита файла не требуется

push FILE_SHARE_READ ;разрешено совместное использование файла

; (по чтению)

push GENERIC_READ ; разрешено чтение из файла

push offset lpBuf

call CreateFileA

сmp eax,0ffffffffh

je exit ; если неуспех

mov hFile,eax ; дескриптор файла

;---------------------------GetFileInformationByHandle

push offset info

push hFile

call GetFileInformationByHandle

cmp eax,0

jz exit ; выход в случае неудачи

; результат смотрим в отладчике TD32.exe

Самостоятельно на практике: Вывести все атрибуты созданного текстового файла File1.txt на консоль.

Лекция №11. Работа с графикой на ассемблере

"У меня есть пример, который должен работать с текстовым экраном. Но он не работает под Windows XP. Как это исправить?"

Ответ:

Действительно, может показаться, что ни одна программа для DOS, использующая прямой вывод в видеопамять (по адресам 0B800h:0000h) не работает под Windows XP (хотя нормально работает под Windows 98), т.к. на экране ничего не появляется. Но на самом деле это не так.

Все консольные приложения Windows работают в текстовом режиме, но это не одно и то же, что и текстовый режим, в котором работала DOS. Консоль в Windows не имеет прямой связи с видеопамятью, т.к. обычно Windows работает в графическом режиме, в то время как консоль представляет собой текстовое устройство, да и размеры консоли вовсе не ограничиваются текстовыми режимами, которые поддерживает видеокарта. Вы можете задать произвольные размеры консоли (в символах) в свойствах ярлыка программы (закладка "Расположение").

При этом, когда в окне консоли запускается DOS задача, эмуляция видеопамяти по адресам 0B800h:0000h не настроена. И изменение оперативной памяти в этом блоке не приводит к изменению состояния буфера консоли. Не поможет в этом случае и переход в полноэкранный режим.

Но решение этой проблемы существует, и оно достаточно простое. Если Ваша программа намеревается работать напрямую с видеопамятью, просто добавьте в ее начало следующие строчки кода:

mov ax, 3

int 10h

Эта функция установит обычный текстовый режим 80х25 для программы и одновременно ... настроит эмуляцию участка памяти 0B800h:0000h в буфер консоли. Программа при этом будет работать правильно (как в оригинальной DOS) как в оконном, так и в полноэкранном режиме. И при это не стоит слушать людей, которые утверждают, что ХР не разрешает работать напрямую с буфером видеопамяти по адресам 0B800h:0000h!

Современные видеоконтроллеры поддерживают разнообразные текстовые и графические режимы. Текстовые режимы различаются по разрешению (число отображаемых символов по горизонтали и вертикали) и цветовой палитре (монохромный или 16-цветный режим). Для графических режимов основным признаком классификации является количество одновременно отображаемых цветов и, соответственно, количество бит видеопамяти, отводимое на каждую точку (пиксел) изображения. Различают следующие типы графических режимов:

–     монохромный (1-битное кодирование);

–     16-цветный EGA/VGA (4-битное кодирование);

–     256-цветный SVGA (8-битное кодирование);

–     HiColor (16-битное кодирование);

–     TrueColor (24-битное / 32-битное кодирование).

Графические режимы VGA (SVGA) сильно устарели, а текстовые продолжают успешно применяться.

Для работы с графическим адаптером, в BIOS используется прерывание INT 10h. Оно позволяет устанавливать графические режимы работы, выводить символы и графику. Выбор графического режима Функция 0 (ah=0) прерывания INT 10h устанавливает видео режим, который был указан в регистре AL.

В этой таблице приведены значения для графических режимов.

Графические режимы

Режим

Разрешение

Количество цветов

06h

640x200

2

0Dh

320x200

16

0Eh

640x200

16

0Fh

640x350

2

10h

640x350

16

11h

640x480

2

12h

640x480

16

13h

320x200

256

6Ah *

800x600

16

Режим 6Ah утвержден VESA, но его поддерживают не все видео адаптеры

Существуют также дополнительные режимы, которые используются для SVGA и XGA адаптеров. Они устанавливаются вызовом VESA BIOS Extension (AX=4F02h INT 10h).

Рисование точки

Для рисования точки необходимо вызвать функцию 0Ch прерывания INT 10h. Цвет помещается в AL, видеостраница в BH, координатаY в DX, а координатаX в CX. Следующая процедура рисует точку с цветом 1, в X=50 и Y=20.

mov ah,0Ch ; функция рисования точки

mov al,1 ; цвет точки

mov bh,0 ; видео страница

mov cx,50 ; координата X

mov dx,20 ; координата Y

int 10h ; вызов прерывания BIOS

Функция 0Ch исполняется очень медленно, особенно при рисовании множества точек. Настоящие графические программы (такие как игры) записывают непосредственно в видеопамять, после того, как они рассчитали цвет и расположение точки. Но в нашем случае INT 10h является промежуточным шагом на пути к настоящему программированию графики (прямой вывод графики в видео режиме 13h (320x200x256)).

Пример программы

Эта программа переключается в графический режим, рисует длинную линию, используя функцию 0Сh, затем ожидает нажатия клавиши и возвращается в прежний режим.

.model small

.stack 100h

.386

Mode_6 = 6 ; 640 X 200, 2 colors

Mode_13 = 0Dh ; 320 X 200, 16 colors

Mode_14 = 0Eh ; 640 X 200, 16 colors

Mode_15 = 0Fh ; 640 X 350, 2 colors

Mode_16 = 10h ; 640 X 350, 16 colors

Mode_17 = 11h ; 640 X 480, 2 colors

Mode_18 = 12h ; 640 X 480, 16 colors

Mode_19 = 13h ; 320 X 200, 256 colors

Mode_6A = 6Ah ; 800 X 600, 16 colors

.data

saveMode db ; Сохранить текущий видео режим

currentX dw 100 ; координата X

currentY dw 100 ; координата Y

color db 1 ; номер цвета

; В 2 цветном режиме 1 = белый, в 16 цветном 1 = синий

.code

main proc

mov ax,@data

mov ds,ax

; Получить текущий видео режим

mov ah,0Fh

int 10h

mov saveMode,al

; Переключиться в графический режим

mov ah,0 ; установка видео режима

mov al,Mode_17 ; номер режима

int 10h

; Рисование прямой линии

LineLength = 100

mov dx,currentY

mov cx,LineLength ; счетчик цикла

L1:

push cx

mov ah,0Ch ; рисование точки

mov al,color ; цвет точки

mov bh,0 ; видео страница

mov cx,currentX

int 10h

inc currentX

;inc color ; используйте для разноцветной линии

pop cx

loop L1

; Ожидаем нажатия клавиши

mov ah,0

int 16h

; Возврат в прежний видео режим

mov ah,0 ; установить видео режим

mov al,saveMode ; сохраненный видео режим

int 10h

; Выход из программы

mov ax,4c00h

int 21h

main endp

end main

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]