Битовые образы mfc


Основы программирования с помощью библиотеки MFC — часть 61

Рис. 13. Использование собственных иконки и курсора в диалоге

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

Стандартные иконки и курсоры

Часто в программах нужно использовать курсоры и иконки, уже предопределенные в Windows. Для этого можно использовать или функцию API LoadImage(), или функции MFC LoadStandardIcon() и LoadStandardCursor(). Работа со стандартными курсорами и иконками почти ничем не отличается от работы с пользовательскими. Для стандартных иконок есть предопределенные идентификаторы с префиксом IDI_, а для стандартных курсоров — с префиксом IDC_. Например, стандартный курсор в виде «песочных часов» имеет идентификатор IDC_WAIT.

Битовые образы — очень важная часть Windows. При хранении битовых образов в отдельном файле обычно используется расширение BMP (это единственный растровый формат, который напрямую поддерживается Windows). Часто они хранятся и в ресурсах. Битовые образы используются шире, чем все остальные ресурсы. Это объясняется наличием для них чрезвычайно мощной поддержки. Если Вы имеете большой опыт программирования только под DOS, то будете удивлены, узнав, что в Windows многие вещи, которые можно легко нарисовать программно, отображаются с помощью готовых битовых образов. Например, кнопки в нажатом и отпущенном состоянии, каркасы для целых окон. Так как компьютеры теперь имеют большие жесткие диски, то выбор между программным рисованием объекта и готовой картинкой часто однозначно решается в пользу последней.

Создание битовых образов

В MFC битовые образы описываются классом CBitmap. Для их создания можно использовать либо ресурсный редактор, либо импортировать в ресурсы готовые файлы BMP, созданные при помощи графических пакетов.

Битовые образы, не зависящие от устройства (DIB)

03.08.2015, 00:37

Битовые образы
Привет всем, я решил сделать компьютерную игру. Частью являются грибы (без смеха). Ножка и верхняя.

Битовые операции, битовые поля.
Здравствуйте! Еслть 4 диапазона чисел: 0-100, 0-100, 0-6000, 0-3. Сделать в виде битовых операций.

Самописный DIB в QImage
Добрый день. Есть уже готовая самописная либа для загрузки и обработки Bmp изображений. Не.

Как получить доступ к DIB-секции?
подскажите пожалуйста как с этим правильно работать // using System.Drawing; // using.

AuxDIBImageLoad — Filed to open DIB file
Только начал изучать текстурирование в OpenGL. Узнал, что для загрузки изображения в память можно.

Графический интерфейс GDI в Microsoft Windows

4.1. Битовые изображения в формате DDB

Как мы уже говорили, битовые изображения в формате DDB являются аппаратно-зависимыми. Поэтому структура изображения в оперативной памяти зависит от особенностей аппаратуры.

В предыдущих томах «Библиотеки системного программиста» мы использовали изображения DDB и даже приводили исходный текст функции DrawBitmap, с помощью которой можно нарисовать такое изображение на экране.

Как правило, изображения DDB либо загружаются из ресурсов приложения, либо создаются непосредственно в оперативной памяти. Для вывода изображений DDB на экран используются такие функции, как BitBlt и StretchBlt.

Изображения DIB, в отличие от изображений DDB, являются аппаратно-независимыми, поэтому без дополнительного преобразования их нельзя отображать на экране с помощью функций BitBlt и StretchBlt. В операционной системе Windows версий 3.х битовые изображения хранятся в файлах с расширением имени bmp, при этом используется аппаратно-независимый формат DIB.

Загрузка изображений из ресурсов приложения

Самый простой способ использования битовых изображений в приложениях Windows заключается в том, что изображение создается графическим редактором в виде bmp-файла и описывается в файле определения ресурсов приложения при помощи оператора BITMAP:

Созданное таким образом битовое изображение можно загрузить в память при помощи функции LoadBitmap :

Параметр hinst определяет идентификатор копии приложения, из ресурсов которого нужно загрузить изображение. Идентификатор ресурса изображения задан параметром lpszBitmap. Функция LoadBitmap возвращает идентификатор загруженного изображения или NULL при ошибке.

После использования приложение должно удалить битовое изображение. Для этого лучше всего воспользоваться макрокомандой DeleteBitmap , описанной в файле windowsx.h следующим образом:

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

Приложение может определить параметры загруженного изображения, вызвав функцию GetObject :

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

Для нас интересно использование этой функции с целью получения параметров изображения. Идентификатор изображения должен передаваться через параметр hgdiobj. Параметр lpvObject должен указывать на структуру типа BITMAP, в которую будут записаны сведения об изображении. Через параметр cbBuffer следует передать размер структуры BITMAP:


Структура BITMAP и указатели на нее описаны в файле windows.h:

Опишем назначение отдельных полей этой структуры.

Поле Описание
bmType Тип битового изображения. Должен быть равен 0
bmWidth Ширина битового изображения в пикселах, должна быть больше 0
bmHeight Высота битового изображения в пикселах, должна быть больше 0
bmWidthBytes Размер памяти, занимаемый одной строкой растра битового изображения. Это значение должно быть четным, так как массив изображения состоит из целых чисел размером 16 бит. Таким образом, произведение bmWidthBytes*8 должно быть кратно 16. Кроме того, это произведение должно быть больше или равно произведению bmWidth*bmBitsPixel
bmPlanes Количество плоскостей в битовом изображении. В зависимости от типа видеоадаптера и его режима работы для представления цвета одного пиксела может использоваться несколько бит, расположенных в одной или нескольких плоскостях видеопамяти (подробное описание структуры видеопамяти в различных режимах вы можете найти в 3 томе «Библиотеки системного программиста»)
bmBitsPixel Количество битов, используемых для представления цвета пиксела. Если используется несколько плоскостей, то это поле содержит количество бит одной плоскости, используемых для представления цвета пиксела
bmBits Дальний указатель на массив, содержащий биты изображения

Загрузив битовое изображение из ресурсов приложения, вы можете определить его размеры, узнать количество цветовых плоскостей и количество бит в одной плоскости, определяющих цвет пиксела. Кроме этого, вы можете получить указатель на область памяти, содержащую биты изображения.

Для монохромных битовых изображений используется одна плоскость. Для определения цвета пиксела (черный или белый) используется один бит памяти. Размер памяти, занимаемый одной строкой растра битового изображения, кратен величине 16 бит.

Пусть, например, вы подготовили с помощью графического редактора, входящего в состав приложения Resource Workshop, битовое изображение, показанное на рис. 4.1. Для наглядности каждая строка растра этого изображения пронумерована.

Рис. 4.1. Черно-белое битовое изображение

Этому представлению соответствует дамп памяти, представленный ниже:

Так как буфер, в котором хранится строка, должен иметь длину, кратную длине слова (два байта), буфер каждой строки дополняется нулем.

Обратите внимание, что для изображений DDB используется система координат, соответствующая режиму отображения MM_TEXT, т. е. система координат, принятая для устройства отображения.

Рисование изображения DDB

Итак, мы загрузили битовое изображение в память и определили его параметры. Теперь наша задача заключается в том, чтобы нарисовать загруженное изображение в окне приложения.

Как мы уже говорили, в программном интерфейсе Windows (а точнее, в программном интерфейсе GDI) нет функции, предназначенной для рисования битовых изображений. Как же быть?

Используется следующая последовательность действий.

Прежде всего надо создать контекст памяти, совместимый с контекстом отображения реального устройства вывода. Для этого следует воспользоваться функцией CreateCompatibleDC.

Далее необходимо выбрать предварительно загруженное битовое изображение в контекст памяти с помощью функции SelectObject, указав ей в качестве параметров идентификатор контекста памяти и идентификатор загруженного изображения.

Затем нужно скопировать биты изображения из контекста памяти в контекст отображения, вызвав функцию BitBlt или StretchBlt. При этом изображение будет нарисовано на устройстве вывода, которое соответствует контексту отображения.

Рассмотрим реализацию этой последовательности действий на примере функции DrawBitmap , которую мы использовали в приложениях, описанных в предыдущих томах «Библиотеки системного программиста»:

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

Прежде всего функция DrawBitmap создает контекст памяти, совместимый с контекстом отображения, передаваемого через параметр hDC:

В качестве параметра для этой функции можно использовать значение NULL. В этом случае будет создан контекст памяти, совместимый с экраном видеомонитора. Функция возвращает идентификатор созданного контекста или NULL при ошибке.

Далее функция DrawBitmap выбирает изображение в созданный контекст памяти:

Функция SelectObject возвращает идентификатор битового изображения, которое было выбрано в контекст памяти раньше. Так как мы только что создали контекст памяти, мы получим идентификатор битового изображения, выбранного в контекст памяти по умолчанию. Это монохромное изображение, состоящее из одного пиксела. Контекст памяти необходимо удалить после использования. Перед удалением мы должны выбрать в него изображение, которое было выбрано при создании, т. е. изображение с идентификатором hOldbm.

Теперь мы выбрали наше изображение в контекст памяти и готовы выполнить копирование в контекст отображения. Однако перед этим необходимы некоторые подготовительные действия.

Прежде всего нужно сделать так, чтобы в контексте памяти использовался тот же режим отображения, что и в контексте отображения. По умолчанию при создании контекста памяти (как и любого другого контекста) устанавливается режим отображения MM_TEXT. Однако в контексте отображения, идентификатор которого передается функции DrawBitmap, может быть установлен любой режим отображения, например, метрический. Для обеспечения соответствия режимов отображения удобно использовать функции GetMapMode и SetMapMode :

Функция GetMapMode возвращает код режима отображения, установленного в контексте отображения. Этот код передается в качестве второго параметра функции SetMapMode, которая устанавливает такой же режим отображения в контексте памяти.

Так как функции BitBlt , копирующей биты изображения, необходимо указать координаты прямоугольной области, занимаемой изображением в контексте памяти, следует определить размеры изображения. Это можно сделать с помощью функции GetObject, которую мы только что описали:

В данном случае нас интересуют ширина и высота изображения в пикселах:

Так как в контексте отображения может быть выбран любой режим отображения, размеры изображения необходимо преобразовать в логические, вызвав функцию DPtoLP:


Об этой функции мы рассказывали в разделе, посвященной режимам отображения.

Для копирования битов изображения из контекста памяти в контекст отображения функция DrawBitmap использует функцию BitBlt (читается как «бит-блит»):

Функция копирует битовое изображение из исходного контекста hdcSrc в контекст отображения hdcDest. Возвращаемое значение равно TRUE при успешном завершении или FALSE при ошибке.

Размеры копируемого изображения задаются парамерами nWidth и nHeight. Координаты левого верхнего угла изображения в исходном контексте определяются параметрами nXSrc и nYSrc, а в контексте, куда копируется изображение, параметрами nXDest и nYDest.

Последний параметр dwRop определяет растровую операцию, используемую для копирования.

Отметим, что размеры и координаты необходимо задавать в логических единицах, соответствующих выбранному режиму отображения.

В нашем случае изображение копируется из точки (0,0) в физической системе координат в точку (x,y) в логической системе координат. Поэтому перед копированием изображения необходимо выполнить преобразование физических координат (0,0) в логические, вызвав функцию DPtoLP:

После этого можно вызывать функцию BitBlt:

Эта функция копирует битовое изображение, имеющее размеры ptSize, из контекста памяти hMemDC в контекст отображения hDC. При этом логические координаты верхнего левого угла изображения в контексте памяти находятся в структуре ptOrg. Координаты верхнего левого угла прямоугольной области в контексте отображения, куда будет копироваться изображение, передаются через параметры x и y.

Илон Маск рекомендует:  17 лучших плагинов для Sublime Text 2

После рисования битового изображения функция DrawBitmap выбирает в контекст памяти первоначально выбранное при его создании изображение, состоящее из одного монохромного пиксела, и затем удаляет контекст памяти:

В качестве кода растровой операции используется константа SRCCOPY. При этом цвет пикселов копируемого изображения полностью замещает цвет соответствующих пикселов контекста отображения.

Мы уже говорили об использовании растровых операций для рисования линий и закрашивания областей. При рисовании битовых изображений вы также можете использовать растровые операции, причем цвет полученного изображения в зависимости от выбранной растровой операции может определяться цветом исходного изображения, цветом поверхности, на которой выполняется рисование, и цветом кисти, выбранной в контекст отображения.

Чаще всего используется код растровой операции SRCCOPY. В этом случае цвет кисти, выбранной в контекст отображения, не имеет значения, так как ни цвет кисти, ни цвет фона не влияют на цвет нарисованного изображения.

Однако вы можете использовать и другие коды растровых операций (всего их 256). В этом случае для вычисления цвета полученного после рисования пиксела можно выбрать практически любое логическое выражение, учитывающее цвет фона, цвет кисти и цвет пиксела изображения.

В файле windows.h описаны константы для наиболее полезных кодов растровых операций. Мы опишем эти константы вместе с соответствующими логическими выражениями. При этом символом S мы будем обозначать цвет исходного изображения, символом D — цвет фона на котором выполняется рисование, и P — цвет кисти, выбранной в контекст отображения.

S

(S | D)

S | D

D

Код растровой операции Логическое выражение Описание
SRCCOPY S Исходное изображение копируется в контекст отображения
SRCPAINT S | D Цвет полученного изображения определяется при помощи логической операции ИЛИ над цветом изображения и цветом фона
SRCAND S & D Цвет полученного изображения определяется при помощи логической операции И над цветом изображения и цветом фона
SRCINVERT S ^ D Цвет полученного изображения определяется при помощи логической операции ИСКЛЮЧАЮЩЕЕ ИЛИ над цветом изображения и цветом фона
SRCERASE S &

D

Цвет фона инвертируется, затем выполняется операция И над результатом и цветом исходного изображения
NOTSRCCOPY После рисования цвет изображения получается инвертированием цвета исходного изображения
NOTSRCERASE Цвет полученного изображения получается инвертированием результата логической операции ИЛИ над цветом изображения и цветом фона
MERGECOPY P & S Выполняется логическая операции И над цветом исходного изображения и цветом кисти
MERGEPAINT Выполняется логическая операции ИЛИ над инвертированным цветом исходного изображения и цветом фона
PATCOPY P Выполняется копирование цвета кисти
PATPAINT P |

S | D

Цвет кисти комбинируется с инвертированным цветом исходного изображения, при этом используется логическая операция ИЛИ. Полученный результат комбинируется с цветом фона, также с помощью логической операции ИЛИ
PATINVERT P ^ D Цвет полученного изображения определяется при помощи логической операции ИСКЛЮЧАЮЩЕЕ ИЛИ над цветом кисти и цветом фона
DSTINVERT Инвертируется цвет фона
BLACKNESS Область закрашивается черным цветом
WHITENESS 1 Область закрашивается белым цветом

Остальные коды приведены в документации, которая поставляется вместе с SDK. В более удобном виде все коды растровых операций приведены в приложении к книге «Developing Windows 3.1 Application whit Microsoft C/C++» (автором которой является Brent Rector). Мы не будем воспроизводить полную таблицу для кодов растровых операций, так как во-первых, эти операции редко используются, а во-вторых, таблица занимает много места.

Для рисования битовых изображений можно использовать вместо функции BitBlt функцию StretchBlt , с помощью которой можно выполнить масштабирование (сжатие или растяжение) битовых изображений:

Параметры этой функции аналогичны параметрам функции BitBlt, за исключением того, что ширина и высота исходного и полученного изображения должна определяться отдельно. Размеры исходного изображения (логические) задаются параметрами nWidthSrc и nHeightSrc, размеры нарисованного изображения задаются параметрами nWidthDest и nHeightDest.

Возвращаемое значение равно TRUE при успешном завершении или FALSE при ошибке.

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

При использовании этой функции вы можете закрашивать области экрана с использованием следующих кодов растровых операций: PATCOPY, PATINVERT, PATPAINT, DSTINVERT, BLACKNESS, WHITENESS.

Возвращаемое функцией PatBlt значение равно TRUE при успешном завершении или FALSE при ошибке.


Создание изображений в памяти

Другой способ работы с изображениями в формате DDB заключается в создании их непосредственно в оперативной памяти.

Вы должны подготовить массив, содержащий биты изображения, заполнить структуру типа BITMAP, которая описывает изображение, и затем вызвать функцию CreateBitmapIndirect , указав ей в качестве единственного параметра указатель lpbm на заполненную структуру типа BITMAP:

Функция вернет идентификатор битового изображения, который вы можете использовать обычным способом.

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

Например, пусть нам надо нарисовать битовое изображение, показанное в увеличенном виде на рис. 4.2.

Рис. 4.2. Битовое изображение

Подготовим в памяти массив, описывающий это изображение. Каждая строка массива соответствует одной строке сканирования битового изображения:

При этом нам необходимо принимать во внимание, что размер одной строки сканирования изображения должен быть кратен 16 битам, т. е. двум байтам.

Однако сам по себе приведенный выше массив бит не содержит информации о размере изображения или о количестве бит, обозначающих цвет одного пиксела. Для формирования битового изображения необходимо подготовить структуру типа BITMAP, содержащую все необходимые сведения:

В этом массиве указаны размеры изображения (ширина — 64 пиксела, высота — 9 пикселов), размер памяти для одной строки сканирования в байтах (равен 8), количество цветовых плоскостей (одна) и количество бит, используемых для представления цвета одного пиксела (один бит). Указатель на массив бит будет проинициализирован непосредственно перед созданием изображения, так как сегмент данных может переместиться.

После того как массив данных и структура подготовлены, можно вызывать функцию CreateBitmapIndirect, передав ей в качестве параметра указатель на структуру:

Непосредственно перед вызовом функции CreateBitmapIndirect следует установить в структуре типа BITMAP указатель на массив бит изображения.

Есть еще одна возможность. Вы можете создать битовое изображение, вызвав функцию CreateBitmap :

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

Функции CreateBitmap и CreateBitmapIndirect возвращают идентификатор созданного в памяти изображения, который можно использовать для выбора изображения в контекст памяти, или NULL при ошибке.

Другие функции для работы с изображениями DDB

Если вы создали изображение DDB, то пользуясь его идентификатором, нетрудно скопировать в него новый массив бит, соответствующий новому изображению. Для этой цели можно воспользоваться функцией SetBitmapBits :

Первый параметр этой функции предназначен для передачи идентификатора битового изображения. Параметр lpvBits является указателем на массив бит, размер этого массива задается при помощи параметра cBits.

При успешном выполнении функция возвращает количество байт, использованных для изменения изображения. Если произошла ошибка, возвращается нулевое значение.

Обратную операцию (чтение массива памяти изображения) можно выполнить при помощи функции GetBitmapBits :

Эта функция копирует байты изображения hbmp в массив lpvBits, причем размер массива указывается через параметр cbBuffer.

Функция возвращает количество скопированных в буфер байт в случае нормального завершения или нулевое значение при ошибке.

Если вам нужно создать цветное битовое изображение DDB, можно воспользоваться функцией CreateCompatibleBitmap :

Эта функция создает неинициализированное изображение шириной nWidth пикселов и высотой nHeight пикселов, причем формат изображения соответствует контексту отображения hdc.

Ваше приложение может выбрать неинициализированное изображение, созданное при помощи функции CreateCompatibleBitmap, в контекст памяти (совместимый с тем же контекстом отображения). Затем оно может нарисовать в контексте памяти все что угодно, используя обычные функции GDI, такие как LineTo (передавая им в качестве первого параметра идентификатор контекста памяти). После этого приложение может вызвать функцию BitBlt для отображения результата в окне приложения.

Если желательно создать удаляемое (discardable) битовое изображение, вместо предыдущей функции вы можете вызвать функцию CreateDiscardableBitmap :

Она имеет параметры, аналогичные параметрам функции CreateCompatibleBitmap. Если изображение, созданное с использованием этой функции, не выбрано в контекст памяти, оно может быть удалено. При попытке выбрать в контекст удаленное изображение функция SelectBitmap вернет нулевое значение. В этом случае необходимо удалить изображение макрокомандой DeleteBitmap, после чего создать его заново.

Битовые образы mfc


DT_
Определение технологии TECHNOLOGY

  • DT_PLOTTER — векторный плоттер
  • DT_RASDISPLAY — растровый дисплей
  • DT_RASPRINTER — растровый принтер
  • DT_RASCAMERA — растровая камера
  • DT_CHARSTREAM — текстовый поток
  • DT_METAFILE — метафайл
  • DT_DISPFILE — Файл дисплея
  • HORZSIZE — физическая ширина дисплея в мм
  • VERTSIZE — физическая высота дисплея в мм
  • HORZRES — размер дисплея по горизонтали в элементах изображения
  • VERTRES — размер дмсплея по вертикали в строках развертки
  • LOGPIXELSX — число элементов в логическом дюйме по горизонтали
  • LOGPIXELSY — число элементов в логическом дюйме по вертикали
  • BITSPIXEL — количество битов для кодирования цвета
  • PLANES — количество битовых плоскойстей
  • NUMBRUSHES — количество кистей
  • NUMPENS — количество перьев
  • NUMFONTS — количество шрифтов
  • NUMCOLORS — количество цветов в таблице цветов устройства
  • ASPECTX — относительная ширина элемента изображеия устройства
  • ASPECTY — относительная высота
  • ASPECTXY — размер элемента по диаганали
  • PDEVICESIZE — размер внутреней структуры PDEVICE

CP_
возможности задания плоскостей отсечки CLIPCAPS

  • CP_NONE — не поддерживаеться отсечка
  • CP_RECTANGLE — прямоугольная область отсечки
  • CP_REGION — произвольная область отсечки
  • SIZEPALETTE — количество цветов в системной палитре
  • NUMRESERVED — количество зарезирвированных цветов в системной палитре
  • COLORRES — текущее цветовое разрешение

RC_
Возможности растеризации RASTERCAPS

  • RC_BANDING — требует поддержки обьединения
  • RC_BIGFONT — способность устройтсва работать с битовыми образами шрифтов более 64КБ
  • RC_BITBLT — подддержка возможностей битовых образов
  • RC_BITMAP64 — поддержка битовых образо более 64 КБ
  • RC_DEVBITS — способность работыс аппаратно зависимым битовыми образами
  • RC_DI_BITMAP — способность работ с SetDIBits, GetDIBits функциями Windows
  • RC_DIBTODEV — сопособность работы с SetDIBitsToDevice функцией Windows
  • RC_FLOODFILL — устройство может осуществлять потоковое заполнение
  • RC_GDI20_OUTPUT — поддерка функций Windows ver 2.0
  • RC_GDI20_STATE — включат блок состояния в контекст устройства.
  • RC_NONE — нет поддержки растровых операций
  • RC_OP_DX_OUTPUT — устройство может работать с массивами DX и выводить прозрачное изображение
  • RC_PALETTE — устройство может работать с палитрами
  • RC_SAVEBITMAP — устройство способно локально хранить битовые образы
  • RC_SCALING — устройство поддерживает масштабирование изображения
  • RC_STRETCHBLT — устройство может работать с функцией StretchBlt
  • RC_STRETCHDIB — устройство может работать с функцией StretchDIBits

CC_
Возможность устройтсва вычерчивать кривые CURVECAPS

  • CC_NONE — устройство не может чертить кривые
  • CC_CIRCLES — устройство может чертить окружности
  • CC_PIE — устройство может чертить векторные диаграммы.
  • CC_CHORD — устройство может чертить хорды
  • CC_ELLIPSES — устройство может чертить элипсы
  • CC_WIDE — устройство может чертить жирные рамки
  • CC_STYLED — устройство может чертить рамки с использованием стилей
  • CC_WIDESTYLED — устройство может чертить жирные рамки с использованием стилей
  • CC_INTERIORS — устройство может заполнять внутренее пространство
  • CC_ROUNDRECT — устройство может вычерчивать прямоугольники с закруглеными углами

LL_
Способность устройства вычерчивать линии LINECAPS

  • LC_NONE — устройство не чертит линии
  • LC_POLYLINE — устройство может вычерчивать несколько связанных линий
  • LC_MARKER — устройство может выводить маркером
  • LC_POLYMARKER — устройство может выводить множественные маркеры
  • LC_WIDE — устройство вычерчивает широкие линии
  • LC_STYLED — устройство вычерчивает линии с поддеркой стилей
  • LC_WIDESTYLED — устройство вычерчивает ширование линии с использованием стилей
  • LC_INTERIORS — устройство способно заполнять внутренее пространство

PC_
Способность вычерчивания полигонов POLYGONALCAPS

  • PC_NONE — устройство не чертит полигоны
  • PC_POLYGON — устройство может чертить многоугольники с различным заполнением
  • PC_RECTANGLE — устройство выерчивает многоугольники
  • PC_WINDPOLYGON — устройство вычерчивает многоугольники со спиральным заполнением
  • PC_SCANLINE — устройство может использовать построчную развертку
  • PC_WIDE — устройство способно вычерчивать широкие рамки
  • PC_STYLED — устройство способно вычерчивать границы с использованием стилей
  • PC_WIDESTYLED — устройство способно вычерчивать широкие рамки с использование стилей
  • PC_INTERIORS — устройство способно заполнять внутренее пространство

TC_
Способность устройства работать с TEXTCAPS

  • TC_OP_CHARACTER — определяет разрешение при выводе текстов позволяющий поместить свой шрифт в любой элемент изображения
  • TC_OP_STROKE — определяет разрешения для вывода штрихов, указывая что устройство может пропустить любой штрих в своем шрифте
  • TC_CP_STROKE — определяет точночть отсечки шрифта.
  • TC_CR_90 — устройство способно поварачивать шрифты на 90 градусов
  • TC_CR_ANY — устройство способно поворачивать шрифты на любой градус
  • TC_SF_X_YINDEP — устройсвто поддерживает независимое масштабирование по ширине и высоте
  • TC_SA_DOUBLE — устройство может удваивать размер шрифта
  • TC_SA_INThEGER — устройство может увеличивать размер своих шрифтов в любое количестов раз
  • TC_SA_CONTIN — устройство может свободно менять размер шрифтов сохраняя пропорции
  • TC_EA_DOUBLE — создание жирного шрифта за счет двойной печати
  • TC_IA_ABLE — устройство может работать с курсивным шрифтом
  • TC_UA_ABLE — устройство позволяет использовать подчеркнутый текст
  • TC_SO_ABLE — устройство позволяет использовать зачеркивание текста
  • TC_RA_ABLE — устройство позволяет использовать растровые шрифты
  • TC_VA_ABLE — устройство позволяет использовать векторные шрифты
  • TC_RESERVED — зарезирвировано

    Битовые образы mfc


    Это набор классов, охватывающих большую часть функциональных возможностей операционных систем Microsoft Windows, а также предоставляющих разработчику значительное количество не только очень мощных дополнительных классов, но и целые механизмы, которые, не нарушая идеологию операционной системы, существенно ее расширяют и. упрощают. Перед создателями библиотеки стояла задача создания объектно-ориентированного интерфейса для Windows, удовлетворяющего следующим основным целям проектирования программных продуктов:

    сокращение усилий по программированию приложений для Windows;

    скорость выполнения программ, написанных с использованием библиотеки, должна быть сопоставима с программами, написанными на языке С с использованием Win32 API; минимальный размер вспомогательного кода;

    способность напрямую вызывать любую С-функцию Win32 API; легкость использования Win32 API в C++ должна быть такая же, как и при использовании традиционного С. Надо сказать, что поставленная задача была решена на очень высоком уровне. Созданная библиотека классов охватывает все компоненты Windows — окна, блоки диалога, контексты устройств, общие объекты GDI (битовые образы и кисти), элементы управления и многие другие стандартные элементы. Суть программирования под Windows — обработка событий — предоставлена программистам в удобном и привычном виде. Классы библиотеки полностью вобрали в себя многочисленные операторы switch, которые так загромождают программы, написанные на языке С. Наряду с этим вы можете совершенно свободно смешивать вызовы библиотеки классов с прямыми вызовами Win32 API. Кроме того, за сравнительно небольшой промежуток времени корпорацией Microsoft было разработано несколько версий библиотеки MFC, которые становились все мощнее и удобнее. Вместе с Visual C++ 6.0 поставляется версия 4.23 библиотеки, и есть все основания считать, что ее развитие будет продолжено. К тому же поддержка библиотеки MFC компиляторами и средствами разработки ПО, созданными другими компаниями, позволяет сконцентрироваться именно на ней. Но давайте рассмотрим все по порядку. Начнем с макросов, глобальных функций и переменных, которые, хотя и не входят непосредственно в библиотеку, очень тесно с ней связаны и значительно облегчают программирование, а затем перейдем к общему обзору библиотеки. Знакомство с библиотекой будет неполным и не даст существенных преимуществ при работе с ней, если мы не рассмотрим включенные в нее макросы, глобальные функции и переменные. Все макросы, глобальные функции и переменные можно разбить на несколько категорий: основные, работа с базами данных, работа в Internet, OLE и элементы управления OLE. Поскольку в данной книге мы не будем подробно рассматривать работу с базами данных, в сети и с использованием OLE (этим вопросам будут посвящены следующие книги), то ограничимся изучением только основных макросов, глобальных функций и переменных. Начнем, естественно, с начала. Практически все глобальные функции начинаются с префикса «Afx». Исключение составляют большинство функций для работы с базами данных и функции, обеспечивающие обмен данными. Для всех без исключения глобальных переменных применяется префикс «Afx», а все макросы записываются заглавными буквами.

    Соглашения об именах библиотеки MFC

    В качестве префикса, обозначающего имя класса, библиотека MFC использует заглавную букву С от слова «class» (класс), за которым идет имя, характеризующее его назначение. Например, CWinApp — класс, определяющий приложение, CWnd — базовый класс всех оконных объектов, CDialog — класс окон диалога и т.д. Мы также будем придерживаться этого соглашения в приводимых примерах. Например, программа FrameWork содержит определения трех классов: CFrameWorkApp, CMainFrame и CChildWnd. Для имен методов классов используется три способа. При первом способе имя объединяет глагол и существительное, например, Loadlcon (Загрузить пиктограмму) или DrawText (Нарисовать текст). При втором, имя метода состоит только из существительного, например, DialogBox (Блок диалога). Для функций, предназначенных для преобразования одного типа в другой, обычными являются такие имена, как XtoY (из X в Y). Для членов классов библиотеки MFC принят следующий способ назначения имен: обязательный префикс m_ (от class member — член класса), затем идет префикс, характеризующий тип данных, и завершается все содержательным именем переменной, например, m_pMainWnd, где р — префикс, описывающий указатель (для переменных не членов класса префикс m_ не используется, чтобы можно было отличить обычные переменные от элементов любых классов, а не только классов библиотеки MFC). В своих примерах я придерживаюсь аналогичного способа формирования имен, и вам рекомендую поступать также.

    Статья «MSDN по русски. Описание классов»

    CFile* GetFile() const;

    BOOL IsStoring() const;

    template class CArray : public CObject

    TYPE — параметр шаблона, определяющий тип объектов, хранящихся в массиве. Объекты данного типа возвращаются функциями-членами класса CArray .
    ARG_TYPE — параметр шаблона, определяющий тип, используемый для доступа к объектам, хранящиеся в массиве. Часто он представляет собой ссылку на значение параметра TYPE . Объекты данного типа используются в качестве аргументов функций-членов класса CArray .

    int Add(ARG_TYPE newElement); throw(CMemoryException);

    ARG_TYPE — параметр шаблона, определяющий тип аргументов, используемых для ссылки на элементы массива.
    newElement — элемент, добавляемый в массив.

    int GetSize() const;

    int GetUpperBound() const;

    operator [ ]
    TYPE& operator [](int nIndex);
    TYPE operator [](int nIndex) const;

    TYPE — параметр шаблона, определяющий тип объектов, хранящихся в массиве.
    nIndex — индекс элемента, к которому необходимо получить доступ.

    nNewSize — новый размер массива (количество элементов). Должен иметь значение большее или равное 0.
    nGrowBy — минимальное количество элементов, на которое будет увеличен размер массива при необходимости.

    BOOL CreateCompatibleBitmap(CDC* pDC, int nWidth, int nHeight);

    pDC — указатель на объект класса контекста устройства.
    nW > — определяет ширину битового образа (в элементах изображения).
    nHeight — определяет высоту битового образа (в элементах изображения).

    DWORD GetBitmapBits(DWORD dwCount, LPVOID lpBits) const;

    dwCount — определяет количество байт, которые необходимо скопировать.
    lpBits — указатель на буфер, в который будет записан битовый образ. Битовый образ представляет собой байтовый массив. Хранение информации производится по линиям горизонтальной развертки, для хранения которых используются 16-битные структуры. Поэтому, если битовый образ содержит нечетное количество столбцов, и для хранения информации о цвете каждого из элементов изображения используется нечетное количество байт, объем памяти, необходимый для хранения одной строки горизонтальной развертки будет на один байт превышать ее действительный размер.

    DWORD SetBitmapBits(DWORD dwCount, const void* lpBits);

    dwCount — определяет число байт, которое необходимо скопировать.
    lpBits — указатель на область в оперативной памяти, из которой следует скопировать битовый образ в объект класса CBitmap .

    afx_msg void memberFxn();

    ON_BN_CLICKED — пользователь нажал кнопку;
    ON_BN_DOUBLECLICKED — пользователь дважды нажал кнопку.

    UINT GetState() const;

    0x0003 — определяет состояние флажков и переключателей. Значение 0 говорит о том, что флажок сброшен, 1 — установлен, а 2 — что кнопка находится в неопределенном состоянии;
    0x0004 — определяет выделение кнопки. Ненулевое значение означает, что данная кнопка выделена, то есть пользователь нажал и удерживает не ней левую кнопку мыши;
    0x0008 — определяет фокус ввода. Ненулевое значение означает, что данная кнопка имеет фокус ввода.

    void SetCheck(int nCheck);


    nCheck — определяет состояние кнопки. Этот аргумент может принимать одно из следующих значений:
    0 — кнопка сброшена;
    1 — кнопка установлена;
    2 — состояние кнопки не определено. Это значение состояния кнопки может быть установлено только в том случае, когда она имеет стиль BS_3STATE или стиль BS_AUTO3STATE.

    Таблица П2.3. Воздействие функций класса CCmdUI на отдельные элементы управления

    Элемент управления Enable SetCheck SetRadio SetText
    Команда меню Делает доступной или недоступной Устанавливает или снимает флажок (v) Устанавливает или снимает переключатель (.) Устанавливает текст элемента управления
    Кнопка панели инструментов Делает доступной или недоступной Выделяет, снимает выделение или переводит в неопределенное состояние Работает аналогично функции SetCheck Не используется
    Панель строки состояния Делает текст видимым или невидимым Устанавливает выступающую или нормальную рамку Работает аналогично функции SetCheck Устанавливает текст в панели
    Обычная кнопка в CDialogBar Делает доступной или недоступной Устанавливает или снимает флажок Работает аналогично функции SetCheck Устанавливает текст в кнопке
    Обычный элемент управления в CDialogBar Делает доступной или недоступной Не используется Не используется Устанавливает текст окна

    bOn — если данный аргумент имеет значение TRUE , то соответствующий элемент управления становится доступным. В противном случае он становится недоступным.

    nCheck — определяет состояние флажка. Если данный аргумент равен 0, то флажок сбрасывается, если — 1, то флажок устанавливается, а если значение данного аргумента равно 2, то флажок устанавливается в неопределенное состояние.

    virtual void SetText(LPCTSTR lpszText);

    lpszText — указатель на текстовую строку, заканчивающуюся нулем.

    void EnableDocking(DWORD dwStyle);

    dwStyle — определяет возможность фиксации панели управления на одной из сторон окна и определяет стороны, на которых панель управления может фиксироваться. Может быть комбинацией следующих флагов:
    CBRS_ALIGN_TOP — разрешает фиксацию на верхней стороне рабочей области окна;
    CBRS_ALIGN_BOTTOM — разрешает фиксацию на нижней стороне рабочей области окна;
    CBRS_ALIGN_LEFT — разрешает фиксацию на левой стороне рабочей области окна;
    CBRS_ALIGN_RIGHT — разрешает фиксацию на правой стороне рабочей области окна;
    CBRS_ALIGN_ANY — разрешает фиксацию на любой стороне рабочей области окна;
    CBRS_FLOAT_MULTI — разрешает использование нескольких плавающих панелей управления в одном окне.
    Если данный аргумент равен 0 (то есть не указан ни один флаг) панель управления не фиксируется.

    DTS_APPCANPARSE — позволяет пользователю нажать клавишу и произвести редактирование в рабочей области окна;
    DTS_LONGDATEFORMAT — использует длинный формат представления даты;
    DTS_RIGHTALIGN — приводит к выравниванию информации по правому краю в пределах элемента управления. По умолчанию используется выравнивание по левому краю;
    DTS_SHORTDATEFORMAT — использует короткий формат представления даты;
    DTS_TIMEFORMAT — выводит информацию о времени;
    DTS_UPDOWN — помещает справа от данного элемента управления счетчик, который может использоваться для корректировки информации о дате и времени.

    DTN_CLOSEUP — пользователь закрывает раскрывающийся месячный календарь;
    DTN_DATETIMECHANGE — изменение информации в элементе управления;
    DTN_DROPDOWN — пользователь открывает раскрывающийся месячный календарь;
    DTN_USERSTRING — пользователь завершил редактирование строки в элементе управления;
    DTN_KILLFOCUS — элемент управления потерял фокус ввода;
    DTN_SETFOCUS — элемент управления получил фокус ввода.

    BOOL GetTime(COleDateTime& timeDest) const;
    DWORD GetTime(CTime& timeDest) const;
    DWORD GetTime(LPSYSTEMTIME pTimeDest) const;

    timeDest — в первой версии данной функции содержит ссылку на объект класса COleDateTime, в который будет записана информация о системной дате и времени. Во второй версии данной функции этот аргумент содержит ссылку на объект классаCTime, в который будет записана информация о системной дате и времени.
    PTimeDest — указатель на объект структуры SYSTEMTIME, в который будет записана информация о системной дате и времени. Не может принимать нулевого значения.

    BOOL SetFormat(LPCTSTR pstrFormat);

    pstrFormat — указатель на заканчивающуюся нулем строку, определяющую формат выводимой информации. Передача в данном аргументе нулевого значения установит формат, используемый по умолчанию.

    BOOL SetTime(const COleDateTime& timeNew);
    BOOL SetTime(const CTime* pTimeNew);
    BOOL SetTime(LPSYSTEMTIME pTimeNew = NULL);

    timeNew — ссылка на объект класса COleDateTime, содержащий время, которое необходимо установить в элементе управления.
    pTimeNew — во второй версии данной функции содержит указатель на объект класса CTime, содержащий время, которое необходимо установить в элементе управления. В третьей версии данной функции этот аргумент содержит указатель на объект структуры SYSTEMTIME, содержащий время, которое необходимо установить в элементе управления.

    Таблица П2.4. Функции, выполняющие аналогичные действия с различными контекстами устройств

    Использует m_hAttribDC Использует m_hDC
    GetTextExtent GetOutputTextExtent
    GetTabbedTextExtent GetOutputTabbedTextExtent
    GetTextMetrics GetOutputTextMetrics
    GetCharWidth GetOutputCharWidth

    BOOL BitBlt(int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop);

    x — определяет горизонтальную координату верхнего левого угла прямоугольника в который будет копироваться битовый образ (области вывода).
    y — определяет вертикальную координату верхнего левого угла прямоугольника в который будет копироваться битовый образ.
    nWidth — определяет ширину (в логических единицах) прямоугольника в который будет копироваться битовый образ.
    nHeight — определяет высоту (в логических единицах) прямоугольника в который будет копироваться битовый образ.
    pSrcDC — указатель на объект класса CDC, определяющий контекст устройства из которого производится копирование битового образа. Если значение аргумента dwRop определяет растровую операцию для которой не требуется источника, этот аргумент должен иметь значение NULL.
    xSrc — определяет горизонтальную координату верхнего левого угла прямоугольника из которого будет копироваться битовый образ.
    ySrc — определяет вертикальную координату верхнего левого угла прямоугольника из которого будет копироваться битовый образ.
    dwRop — определяет растровую операцию, которую необходимо выполнить. Коды растровых операций определяют каким образом GDI должен комбинировать цвета при выполнении операции, включающей в себя текущую кисть, возможно, исходный битовый образ и результирующий битовый образ. Данный аргумент может принимать следующие значения:
    BLACKNESS — закрашивает всю область вывода в черный цвет;
    DSTINVERT — инвертирует битовый образ, расположенный в области вывода;
    MERGECOPY — комбинирует образец и исходный битовый образ с использованием логического оператора И;
    MERGEPAINT — комбинирует инвертированный битовый образ, расположенный в области вывода, и исходный битовый образ с использованием логического оператора ИЛИ;
    NOTSRCCOPY — копирует инвертированный исходный битовый образ в область вывода;
    NOTSRCERASE — инвертирует результат логического оператора ИЛИ между инвертированным битовым образом, расположенным в области вывода, и исходным битовым образом;
    PATCOPY — заполняет область вывода с использованием образца;
    PATINVERT — комбинирует битовый образ, расположенный в области вывода, и исходный битовый образ с использованием логического оператора ИСКЛЮЧАЮЩЕГО ИЛИ;
    PATPAINT — комбинирует образец и инвертированный исходный битовый образ с использованием логического оператора ИЛИ. Результат этой операции комбинируется с битовым образом, расположенным в области вывода, с использованием логического оператора ИЛИ;
    SRCAND — комбинирует элементы изображения битового образа, расположенного в области вывода, и исходного битового образа с использованием логического оператора И;
    SRCCOPY — копирует исходный битовый образ в область вывода;
    SRCERASE — инвертирует битовый образ, расположенный в области вывода, и комбинирует результат с исходным битовым образом с использованием логического оператора И;
    SRCINVERT — комбинирует битовый образ, расположенный в области вывода, и исходный битовый образ с использованием логического оператора ИСКЛЮЧАЮЩЕГО ИЛИ;
    SRCPAINT — комбинирует элементы изображения битового образа, расположенного в области вывода, и исходного битового образа с использованием логического оператора ИЛИ;
    WHITENESS — закрашивает всю область вывода в белый цвет.

    virtual BOOL CreateCompatibleDC(CDC* pDC);

    pDC — указатель на объект класса контекста устройства. Если аргумент pDC имеет значение NULL, функция создает контекст устройства памяти, совместимый с системным дисплеем.

    Какова судьба MFC и C++?

    Важно понимать, что MFC — это тонкая ОО-обертка над WinAPI, которая оживает за счет виззардов и кодогенерации. Кастомность порой там дается слишком большими усилиями. Но если вашей целью является разработка несложных интерфейсов и тесная интеграция с системой — это неплохой выбор. Но серьезно готовиться и идти на рынок с этим, как с основным инструментом, вряд ли стоит.

    Java едва ли чаще используется для десктопа, чем MFC. А вот C# сейчас цветет бурным цветом. Хотя часто встречается тандем из бизнес-логики на C++ и интерфейса на С#.

    З.Ы. Поиск по сайтам с вакансиями и банальное сравнение количества вакансий для различных технологий скажут вам больше, чем юзеры тостера, которым либо повезло, либо не повезло столкнуться с этой потрясающей технологией от Microsoft.

    Битовые образы. Контекст памяти.

    Зачем вообще нужен bitmap? Существуют как минимум две проблемы, которые можно решить с помощью bitmap. Во первых: при рисовании в окне, полученный рисунок нигде не хранится, поэтому если вы довольно долго формировали рисунок, и вам понадобилось перерисовать окно, может получиться, что перерисовка занимает довольно много времени. Во вторых, например, вы в OnPaint случайным образом рисуете 10000 прямоугольников, после чего ваше окно перекрывет другое окно. Затем вы опять возвращаетесь к вашему приложению, но часть окна, которая была перекрыта другим окном, заново перерисовывется, но там уже возникают другие случайные прямоугольники. Поэтому нужно сохранять участки отображения в памяти.


    Bitmap имеет определенную структуру: количество цветов, длина, ширина, количество плоскостей, .

    Bitmap имеет смысл создавать такой же, как область экрана, т.е. bitmap должен быть совместим с данным экраном, точнее с данным типом отображения.

    Не существует битовых образов для обычных контекстов отображения (pDC — обычный контекст).

    Для того, чтобы рисовать на bitmap, нужно завести специальный контекст, называемый контекстом памяти, и выбрать этот bitmap в контекст памяти.

    Выведем bitmap на экран:

    SRCCOPY учитывет только цвет источника, а цвет приемника и цвет текущей кисти игнорируются.
    Если режимы отображения различны (например: MM_TEXT и MM_LOMETRIC), то произойдет преобразование координат (может возникнуть проблема).
    Есть режим вывода bitmap, при котором он растягивается или сжимается:

    Чтобы использовать BitBlt и StretchBlt, не обязательно иметь контекст памяти.

    Битовые образы, не зависящие от устройства (DIB)

    03.08.2015, 00:37

    Битовые образы
    Привет всем, я решил сделать компьютерную игру. Частью являются грибы (без смеха). Ножка и верхняя.

    Битовые операции, битовые поля.
    Здравствуйте! Еслть 4 диапазона чисел: 0-100, 0-100, 0-6000, 0-3. Сделать в виде битовых операций.

    Самописный DIB в QImage
    Добрый день. Есть уже готовая самописная либа для загрузки и обработки Bmp изображений. Не.

    Как получить доступ к DIB-секции?
    подскажите пожалуйста как с этим правильно работать // using System.Drawing; // using.

    AuxDIBImageLoad — Filed to open DIB file
    Только начал изучать текстурирование в OpenGL. Узнал, что для загрузки изображения в память можно.

    Работа с файлами в формате BMP

    Как уже говорилось, в рамках данного курса обработка изображений будет проводиться средствами библиотеки IPL. При этом, в качестве формата графических файлов для хранения исходных изображений, предназначенных для проведения дальнейшей обработки, предлагается использовать BMP. Причинами такого выбора является возможность хранений полноцветных изображений без потерь и хорошо известная, простая структура. К сожалению, библиотека IPL не располагает возможностями по работе с какими бы то ни было графическими файлами. Поэтому, прежде чем переходить к рассмотрению процедур обработки изображения, рассмотрим структуру формата BMP, и приведем пример чтения графического файла в этом формате.

    Структура данных файла в формате BMP имеет следующий вид:

    В начале идет структура заголовка файла ( BITMAPFILEHEADER ), имеющая следующий вид:

    typedef struct tagBITMAPFILEHEADER
    <
    WORD bfType;
    DWORD bfSize;
    WORD bfReserved1;
    WORD bfReserved2;
    DWORD bfOffBits;
    > BITMAPFILEHEADER, *PBITMAPFILEHEADER;

    bfType Тип файла. Должен быть «BM». bfSize Размер файла в байтах. bfReserved1, bfReserved2 Зарезервированные поля. bfOffBits Смещение битового массива относительно начала файла.

    Далее следует структура информационного заголовка ( BITMAPINFOHEADER ), имеющая следующий вид:

    typedef struct tagBITMAPINFOHEADER
    <
    DWORD biSize;
    LONG biWidth;
    LONG biHeight;
    WORD biPlanes;
    WORD biBitCount;
    DWORD biCompression;
    DWORD biSizeImage;
    LONG biXPelsPerMeter;
    LONG biYPelsPerMeter;
    DWORD biClrUsed;
    DWORD biClrImportant;
    > BITMAPINFOHEADER, *PBITMAPINFOHEADER;

    biSize Размер структуры. biWidth , biHeight Ширина и высота изображения в пикселах соответственно. biPlanes Количество плоскостей. Использовалось ранее при небольшой глубине фвета. Сейчас, при числе цветов 256 и больше, оно всегда равно 1. Сохранено для совместимости. biBitCount Глубина цвета в битах на пиксель. biCompression Тип сжатия. Если компрессия не используется, то флаг имеет значенине BI_RGB . Возможны варианты BI_RLE8 , BI_RLE4 , BI_BITFIELDS и BI_JPEG . biSizeImage Размер изображения в байтах. Если изображение не сжато (то есть поле biCompression установлено в BI_RGB), то здесь может быть записан 0. biXPelsPerMeter , biYPelsPerMeter Горизонтальное и вертикальное разрешение (в пикселях на метр) соответственно. Важно в первую очередь для устройства, на которое будет выводиться битовый массив. biClrUsed Количество используемых цветов кодовой таблицы. Если значение поля равно 0, то используется максимально возможное количество цветов, которые разрешены значением поля biBitCount . biClrImportant Количество основных цветов. Определяет число цветов, необходимых для отображения изображения. Если значение поля равно 0, то используются все цвета.

    За информационным заголовком следует таблица цветов, представляющая собой массив структур RGBQUAD (4-байтовых полей). Каждое поле соответствует своему цвету в палитре, а три байта из четырех – синей, зеленой и красной компонентам этого цвета. Последний байт каждого поля зарезервирован и должен быть равен 0.

    После таблицы цветов находятся данные изображения, которое по строкам растра записано снизу вверх, а внутри строки – слева направо. Длина каждой строки выровнена на границу в 4 байта (при длине строки, некратной четырем, она дополняется нулями).

    Теперь рассмотрим пример реализации чтения графических файлов в формате BMP приложением, построенным на основе MFC с использованием библиотеки IPL:

    // Чтение файла в формате BMP
    BITMAPINFOHEADER* ipLoad( const char * fname)
    <
    if(!fname)
    return NULL;

    BITMAPINFOHEADER* infohdr = NULL;
    ifstream fsrc;

    try
    <
    BITMAPFILEHEADER filehdr;
    BITMAPINFOHEADER bmphdr;

    fsrc.open(fname, ios::in | ios::binary);
    if (fsrc.fail())
    throw runtime_error(«Ошибка чтения графического файла»);

    fsrc.read(( char *)&filehdr, sizeof (BITMAPFILEHEADER) );
    if (fsrc.fail())
    throw runtime_error(«Ошибка чтения заголовка файла BMP»);

    if (filehdr.bfType != 0x4d42)
    throw runtime_error(«Неверный тип исходного файла»);

    fsrc.read(( char *)&bmphdr, sizeof (BITMAPINFOHEADER));
    if (fsrc.fail())
    throw runtime_error(«Ошибка чтения информационного заголовка файла BMP»);

    if (bmphdr.biSize != 0x28)
    throw runtime_error(«Неверный тип исходного файла»);

    int colorbytes = filehdr.bfOffBits — sizeof (BITMAPFILEHEADER) — sizeof (BITMAPINFOHEADER);

    int totalbytes = filehdr.bfSize — sizeof (BITMAPFILEHEADER);

    infohdr = (BITMAPINFOHEADER*) new unsigned char [totalbytes];
    if (!infohdr)
    throw runtime_error(«Ошибка выделения памяти для размещения изображения»);

    memcpy(infohdr, &bmphdr, sizeof (bmphdr) );

    char * quads = ( char *)infohdr + sizeof (BITMAPINFOHEADER);

    char * pixels = ( char *)quads + colorbytes;

    fsrc.read(( char *)quads, colorbytes);

    fsrc.read(( char *)pixels, totalbytes — colorbytes — sizeof (BITMAPINFOHEADER));

    fsrc.close();
    >
    catch(runtime_error e)
    <
    TRACE0(e.what());
    if(infohdr)
    <
    free( infohdr );
    infohdr = 0;
    >
    > return infohdr;
    >
    // Чтение и размещение изображения
    void CTestDoc::Serialize(CArchive& ar)
    <
    if (ar.IsStoring())
    <
    >
    else
    < if (m_img != NULL)
    <
    iplDeallocate(m_img, IPL_IMAGE_ALL);
    >

    BITMAPINFOHEADER* bmphdr = ipLoad(ar.GetFile()->GetFilePath());

    if (bmphdr)
    < m_img = iplCreateImageHeader(3, 0, IPL_DEPTH_8U,
    IPL_DATA_ORDER_PIXEL, IPL_ORIGIN_BL,
    bmphdr->biHeight, NULL, NULL, NULL,

    iplConvertFromDIB(bmphdr, m_img);

    UpdateAllViews(NULL);
    >
    else
    <
    TRACE0(«Ошибка при чтении файла BMP»);
    >
    >
    >

    Илон Маск рекомендует:  Проверка статуса MSN пользователя
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL