Графические устройства

         

Курсоры для Windows

Наиболее доступными являются файлы, содержащие рисунки курсоров, подготовленные в стандарте Windows. Операционные системы Windows используют курсоры различной формы: стрелка, вертикальная черта, рука, песочные часы и пр. Конкретный рисунок курсора зависит от выполняемых действий и выбирается системой автоматически. Windows 9X позволяет изменять рисунки курсора при выборе "темы рабочего стола".
Windows 3.X работают с черно-белыми курсорами, заготовки рисунков которых хранятся в специальном файле и извлечь их из него не так просто. Однако существует специальное приложение MouseWarp, которое позволяет оператору выбирать рисунок курсора по своему усмотрению. В комплект этого приложения входит 19 файлов с заготовками рисунков курсоров, которые можно использовать для наших целей.
Windows 9X не только сама изменяет форму курсора, но и позволяет это сделать оператору. Прилагаемые к ней заготовки рисунков курсоров хранятся в отдельном каталоге (cursors) и вы можете их использовать.

Структура файлов Icon.



Семейство Windows использует один общий стандарт icon для хранения файлов с заготовками рисунков курсоров и пиктограмм (значков). Спецификации файлов имеют тип (расширение) cur для курсоров и ico для пиктограмм.

К сожалению, автор не встречал точного описания структуры таких файлов, даже в справочнике Борна содержатся явные неточности. Если вам попадется описание стандарта icon для Windows, то ему не следует слепо доверять. Обязательно распечатайте дамп одного из доступных вам файлов и сравните распечатку с вариантом описания. В качестве эталона можно взять файл nc.ico, входящий в комплект Norton Commander. Для версии NC 5.0 он содержит заготовку рисунка капитанской фуражки с красными цифрами 5.0.

Стандартный файл формата icon состоит из четырех основных частей: заголовка, палитры цветов, заготовки рисунка и маски.

Первые восемь байтов заголовка содержат следующие данные:

  • слово со смещением 0 всегда очищено (пустое), это признак формата
    icon;
  • слово со смещением 2 содержит тип рисунка: 1 — пиктограмма, 2 — курсор;
  • слово со смещением 4 содержит количество хранящихся в файле рисунков (обычно 1);
  • байт со смещением 6 содержит количество точек в строке (обычно 20h);
  • байт со смещением 7 содержит количество строк в рисунке (обычно 20h).

Из других полей заголовка следует отметить слово с адресом 36 (24h), содержащее размер точки рисунка, выраженный в битах. Он равен 1 для черно-белых и 4 для цветных рисунков. Эта величина указывает способ распаковки рисунка и размер палитры.

Палитра используемых цветов располагается в файле, начиная с адреса ЗЕf. Она содержит 2 или 16 строк, в которых хранятся коды цветов в формате b, g, r, 0. Заметим, что в таком формате хранится палитра в вмр-файлах для Windows (см. приложение А). В зависимости от количества цветов палитра занимает 8 (2 цвета) или 64 (16 цветов) байта.

Сразу после палитры размещается образ рисунка. Адрес его начала зависит от размера палитры и равен 46h для черно-белых рисунков или 7Eh для 16-цветных. Количество точек в рисунке фиксировано и составляет 32-32 = = 1024 точки. Черно-белые рисунки упакованы по 8 точек в байте, а цветные — по 2 точки в байте. Соответственно, образ рисунка занимает в файле 128 или 512 байтов.

После образа рисунка располагается маска. Адрес ее начала сбь для черно-белых рисунков или 27Eh для цветных. Маска — это черно-белый рисунок, упакованный по 8 точек в байте и занимающий 128 байтов. Адрес ее начала отстоит от конца файла на 128 байтов.

Образ рисунка и маска хранятся в перевернутом виде: первой записана последняя строка, второй — предпоследняя и т. д., последней в файле хранится первая строка рисунка или маски. Такой способ хранения данных используется в файлах формата BMP (см. приложение А).

Дамп файла с рисунком курсора. В примере 6.1 приведена распечатка (дамп) файла ieft_00.cur, входящего в комплект Mouse Warp. Он содержит рисунок стрелки, наклоненной вправо (обычно стрелка наклонена влево). Распечатка приведена в общепринятой шестнадцатеричной форме, каждой строке предшествует адрес ее начала в файле.

Пример 6.1. Распечатка (dump) файла Left_00.cur

Заголовок файла

000 00 00 02 00 01 00 20 20 00 00 ОЕ 00 04 00 30 01
010 00 00 16 00 00 00 28 00 00 00 20 00 00 00 40 00
020 00 00 01 00 01 00 00 00 00 00 00 01 00 00 00 00
030 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Палитра, содержащая описание черного и белого цветов

ОЗЕ 00 00 00 00 FF FF FF 00

Рисунок курсора, упакованный по 8 точек в байте

046 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
056 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
066 06 00 00 00 06 00 00 00 03 00 00 00 03 00 00 00
076 01 80 00 00 01 84 00 00 00 СС 00 00 00 DC 00 00
086 00 FC 00 00 07 FC 00 00 03 FC 00 00 01 FC 00 00
096 00 FC 00 00 00 7С 00 00 00 ЗС 00 00 00 1C 00 00
ОА6 00 ОС 00 00 00 04 00 00 00 00 00 00 00 00 000 00
ОВ6 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00* 00

Маска курсора, упакованная по 8 точек в байте

ОС6 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
OD6 FF FF FF FF FF FF FF FF FF FF FF FF F9 FF FF FF
ОЕ6 FO FF FF FF FO FF FF FF F8 7F FF FF F8 7D FF FF
OF6 FC 39 FF FF FC 31 FF FF fE 01 FF FF FE 01 FF FF
106 ЕО 01 FF FF FO 01 FF FF F8 01 FF FF FC 01 FF FF
116 FE 01 FF FF FF 01 FF FF FF 81 FF FF FF Cl FF FF
126 FF El FF FF FF Fl FF FF FF F9 FF FF FF FD FF FF
136 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

Для того чтобы лучше понять, как хранятся и кодируются рисунок и маска, советуем вам нарисовать их на бумаге в клетку. В рассматриваемом примере они упакованы одинаково, по восемь точек в байте. Единица в разряде означает наличие точки (заштрихованная клетка на бумаге), а нуль — ее отсутствие (пустая клетка на бумаге). После построения вы увидите, что маска похожа на негативное изображение рисунка, но если их совместить, то окажется, что рисунок стрелки в маске оконтурен белой линией.


Содержание раздела