Выше были рассмотрены типы графических файлов. Для хранения графических объектов, содержащихся в битовых матрицах, пиктограммах и метафайлах, в C++Builder определены соответствующие классы — TBitmap, TIcon и TMetafile. Все они являются производными от абстрактного базового класса графических объектов TGraphic. Кроме того определен класс, являющийся надстройкой над TBitmap, TIcon и TMetafile и способный хранить любой из этих объектов. Это класс TPicture, с которым вы уже познакомились в начале этой главы. Он имеет свойство Graphic, которое может содержать и битовые матрицы, и пиктограммы, и метафайлы. Более того, он может содержать и объекты определенных пользователем графических классов, производных от TGraphic. Для доступа к графическому объекту можно использовать свойство TPicture->Graphic, но если тип графического объекта известен, то можно непосредственно обращаться к свойствам TPicture->Bitmap, TPicture->Icon или TPicture->Metafile.
Для всех рассмотренных классов определены методы загрузки и сохранения в файл:
void _fastcall LoadFromFile(const System::AnsiString Filename); void _fastcall SaveToFile (const System: :AnsiString Filename);
При этом для классов TBitmap, TIcon и TMetafile формат файла должен соответствовать классу объекта. Объект класса TPicture может оперировать с любым форматом. Для всех рассмотренных классов определены методы присваивания значений объектов:
void _fastcall Assign(TPersistent* Source);
Однако, для классов TBitmap, TIcon и TMetafile присваивать можно только значения однородных объектов: соответственно битовых матриц, пиктограмм, метафайлов. При попытке присвоить значения разнородных объектов генерируется исключение. Класс TPicture — универсальный, ему можно присваивать значения объектов любых из остальных трех классов. А значение TPicture можно присваивать только тому объекту, тип которого совпадает с типом объекта, хранящегося в нем.
Приведем пример. Часто в приложениях создается объект типа TBitmap, назначение которого — запомнить содержимое графического изображения и затем восстанавливать его, если оно будет испорчено или изменено пользователем. Код, решающий эту задачу, может иметь вид:
// Объявление и создание объекта Bitmap
Graphics::TBitmap *Bitmap = new Graphics::TBitmap ();
void_fastcall TForml::FormDestroy(TObject «Sender)
// Уничтожение Bitmap и освобождение памяти
(
Bitmap->Free () ;
)
//———————————————
void _ fastcall TForral::MOpenClick(TObject *Sender) // Загрузка изображения из файла в Bitmap и Imagel {
if (OpenPictureDialogl->Execute ()) (
Bitmap->LoadFromFile(OpenPictureDialogl->FileName) Imagel->Picture->Assign(Bitmap);
) }
//———————————————————————
void_fastcall TForml::MSaveClick(TObject *Sender) // Сохранение изображения из Imagel в Bitmap {
Bitmap->Assign(Imagel->Picture); } //———————————————————————
void _ fastcall TForml :: MRestoreClick (TObj ect *Sender)
// Восстановление изображения в Imagel из Bitmap
{
Imagel->Picture->Assign (Bitmap) ; }
В этом коде сначала объявляется переменная Bitmap типа TBitmap и создается соответствующий объект. Если вы создали объект Bitmap, то надо не забыть его уничтожить при окончании работы и освободить от него память. Автоматически это не делается. Поэтому надо освобождать память, например, в обработчике события формы OnDestroy (процедура FormDestroy) методом Free:
Bitmap->Free ( ) ;
В процедуре MOpenClick в объект Bitmap методом LoadFromFile загружается изображение из выбранного пользователем файла. Затем оператор
Imagel->Picture->Assign (Bitmap) ;
присваивает значение графического объекта Bitmap свойству Picture компонента Imagel. Изображение тем самым делается видимым пользователю. Этот оператор можно записать иначе:
Forml->Imagel->Picture->Bitmap->Assign (Bitmap) ;
что даст тот же самый результат.
Если надо переписать в Bitmap отредактированное пользователем в Imagel изображение (о редактировании будет рассказано в последующих разделах), это можно сделать оператором (процедура MSaveClick):
Bitmap->Assign (Imagel->Picture) ;
Если же надо восстановить в Imagel прежнее изображение, испорченное по каким-то причинам, то это можно сделать оператором (процедура MRestoreClick):
Imagel->Picture->Assign(Bitmap);
Таким образом, мы видим, что методом Assign можно копировать изображение из одного однотипного графического объекта в другой и обратно.
Загружать изображения можно не только из файлов, но и из ресурсов приложения с помощью методов
void _fastcall LoadFromResourceName(int Instance, const System::AnsiString ResName);
или
void _fastcall LoadFromResourcelD(int Instance, int ResID);
где ResName — имя графического объекта в файле ресурса, a ResID — его идентификатор. Например, оператор
Bitmapl->LoadFromResourceName(HInstance,»MYBITMAP»);
загружает в объект Bitmapl из ресурса битовую матрицу с именем «MYBITMAP».
Имеются еще методы загрузки и выгрузки графических объектов в поток и в буфер обмена Clipboard, но эти методы используются относительно редко и вы можете посмотреть их в справке по C++Builder.
