354______________________________________________Глава 5

(

Graphics::TBitmap *Bitmap = new Graphics;:TBitmap;

try
(
Bitmap->LoadFromFile(OpenPictureDialogl->FileName) ;

Canvas->Draw(0,0,Bitmap);

)

finally
(
Bitmap->Free() ;

}
>
}

Эти операторы обеспечивают загрузку выбранного пользователем графическо-
го файла и отображение изображения непосредственно на канве формы (поскольку
оператор Canvas->Draw относится к канве формы, можно было бы это уточнить,
написав Forml->Canvas->Draw). Запустите приложение, выберите файл и вы уви-
дите что-нибудь вроде представленного на рис. 5.14 а. А теперь, не закрывая свое-
го приложения, вернитесь в C++Builder и, ничего там не делая, опять перейдите в
свое выполняющееся приложение. Если окно Редактора Кода, выступившее на
первый план при вашем переходе в C++Builder, целиком перекрыло окно вашего
приложения, то вернувшись в него вы увидите, что картинка в окне исчезла. Если
же вы опять загрузите в него картинку и сдвинете окно приложения так, чтобы
окно Редактора Кода не могло целиком его закрыть, то, повторив эксперимент с
переходом в C++Builder и обратно вы, возможно, увидите результат, подобный
представленному на рис. 5.14 б.

Рис. 5.14                    а)

Демонстрация исходного
изображения (а) и его
стирания (б) при
перекрытии его другим
окном

Вы видите, что если окно какого-то другого приложения перекрывает на
время окно вашего приложения, то изображение, нарисованное на канве формы,
портится. В компоненте Image этого не происходило, поскольку в классе TImage
уже предусмотрены все необходимые действия, осуществляющие перерисовку ис-
порченного изображения. А при рисовании на канве формы или других оконных
компонентов эти меры должен принимать сам разработчик приложения.

Если окно было перекрыто и изображение испортилось, операционная сист(
ма сообщает приложению, что в окружении что-то изменилось и что приложени'
должно предпринять соответствующие действия. Как только требуется обновлени'
окна, для него генерируется событие OnPaint. В обработчике этого события (в на
шем случае события формы) нужно перерисовать изображение.

Перерисовка может производиться разными способами в зависимости от при
ложения. В нашем примере можно было бы вынести объявление указателя Bitmap
за пределы приведенной выше процедуры, т.е. сделать эту переменную глобаль
ной:

Graphics::TBitmap *Bitmap;