Воскресенье, 28.04.2024
Королевство Delphi
Главное меню
Статьи
Наш опрос
Нужен форум на сайте?
Всего ответов: 90
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » Статьи » Система » Kol и MCK

Вывод графики на экран

Расскажем про основы вывода графических изображений с помощью KOL. А основы (в моем понимании) - это обычный вывод растровой картинки :)

C помощью КOL вы сможете выводить на экран только bmp. Для того чтобы выводить jpg и gif вы должны подключить JpegObj и KolGif. Благодаря этим дополнительным библиотекам ваша программа конечно станет большего размера, но зато сможет показывать картинки этих двух форматов.

Для того чтобы работать с изображениями вы должны создать объекты типа pBitmap, pGif , pJpeg. Для каждого формата изображения свой тип объекта.

Ниже привожу конструкторы этих объектов.

Конструктор Комментарий
function NewBitmap( W, H: Integer ): PBitmap; Создает объект PBitmap для работы с bmp. W и H - это длина и высота изображения.
function NewJpeg: PJpeg; Создает объект PJpeg для работы с jpg
function NewGif: PGif; Создает объект PGif для работы с gif

После создания объекта вы можете загрузить изображения. Все эти объекты поддерживают загрузку из файла и из потока (через свойства LoadFromFile и LoadFromStream). PBitmap может кроме этого загружать изображения из ресурсов.

Теперь про то, где будет отображаться рисунок. Фактически можно рисовать почти на любом компоненте, но все таки предпочтительней Paintbox. Поэтому далее говоря про PaintBox, я буду подразумевать и другие поверхности. PaintBox имеет следующей конструктор:

function NewPaintbox( AParent: PControl ): PControl;

Создав PaintBox, вам надо указать процедуру обрабатывающую событие OnPaint.
(OnPaint как известно отвечает за отрисовку компонента)
Заголовок процедуры должен быть следующим:

procedure NameProcedur ( Dummy: Pointer; Sender: PControl; DC: HDC );

В теле процедуры происходит сама прорисовка при помощи обращения к свойствам Draw, StretchDraw, DrawTransparent или StretchDrawTransparent.
Все эти свойства присутствуют у PBitmap и PGif. У PJpeg два последних отсутствуют.

Draw - обычная прорисовка с сохранением размера рисунка.
StretchDraw - рисунок будет "растягивается" по размеру той поверхности на которой происходит рисование (в нашем случае PaintBox)
DrawTransparent - аналог Draw только с добавленной возможностью прозрачности определенного цвета.
StretchDrawTransparent - как легко понять из названия StretchDraw с возможностью DrawTransparent (растягивается и прозрачный)

При рисование через Draw или DrawTransparent размер PaintBox должен быть равен размеру рисунка. Если этого не произойдет (например PaintBox больше) то часть PaintBox которая "выпирает" не будет прорисовывается и будет прозрачной. А "дырка" в окне программы - это как то не эстетично :)

Хватит философствовать, пора и показать пример. В нем мы будем использовать ScrollBox для более удобного просмотра выходящих за пределы окна больших картинок.

program Primer_4; 
 
uses 
 windows, 
 messages, 
 kol, 
 JpegObj, 
 KOLGIF; 
 
{$R *.RES} 
var 
 Form, 
 pTop, 
 PB, 
 buOpen, 
 SBox:pControl; 
 ext:string; 
 
 bmp: pBitmap; 
 Gif: pGif; 
 Jpg: pJpeg; 
 
 dlgOpen:pOpenSaveDialog; 
 
/////////////////////////////////////////////////////////// 
procedure DrawPaint( Dummy: Pointer; Sender: PControl; DC: HDC ); 
begin 
 
if AnsiCompareText(ext,'.bmp')=0 then 
 Bmp.Draw(PB.Canvas.Handle,0,0); 
 
if AnsiCompareText(ext,'.gif')=0 then 
 Gif.Draw(PB.Canvas.Handle,0,0); 
 
if AnsiCompareText(ext,'.jpg')=0 then 
 jpg.Draw(PB.Canvas.Handle,0,0); 
 
end; 
/////////////////////////////////////////////////////////// 
Procedure OpenPic ( Dummy : Pointer; Sender : PControl ); 
begin 
 if dlgOpen = nil then 
 dlgOpen := NewOpenSaveDialog('Открыть рисунок','',[]); 
 
 if PB = nil then 
 begin 
 PB := NewPaintBox(SBox); 
 PB.OnPaint := TOnPaint( MakeMethod( nil, @DrawPaint ) ); 
 end; 
 
 dlgOpen.Filter:='Рисунки (bmp,gif,jpg)|*.bmp;*.gif;*.jpg'; 
 
 if dlgOpen.Execute then 
 begin 
 ext := ExtractFileExt(dlgOpen.Filename); 
 
 if AnsiCompareText(ext,'.bmp')=0 then 
 begin 
 if BMP = nil then 
 Bmp := NewBitmap( 0, 0 ); 
 Bmp.LoadFromFile(dlgOpen.Filename); 
 PB.Width := Bmp.Width ; 
 PB.Height:= Bmp.Height; 
 end; 
 
 if AnsiCompareText(ext,'.gif')=0 then 
 begin 
 if Gif = nil then 
 Gif := NewGif; 
 Gif.LoadFromFile(dlgOpen.Filename); 
 PB.Width := Gif.Width ; 
 PB.Height:= Gif.Height; 
 end; 
 
 if AnsiCompareText(ext,'.jpg')=0 then 
 begin 
 if jpg = nil then 
 jpg := NewJpeg; 
 jpg.LoadFromFile(dlgOpen.Filename); 
 PB.Width := jpg.Width ; 
 PB.Height:= jpg.Height; 
 end; 
 
 Form.StatusText[0]:=PChar(ExtractFileName(dlgOpen.Filename)); 
 end; 
end; 
////////////////////////////////////////////////////////// 
 
begin 
 Applet := NewApplet('Пример # 4 (Работа с графикой)'); 
 Form := NewForm(Applet,'Пример # 4').SetSize(640,450); 
 Form.CenterOnParent; // размещаем наше окно посередине экрана 
 
 Form.Font.FontName := 'MS Sans Serif'; 
 Form.Font.FontHeight := 9; 
 
// -------- рисуем интерфейс ----------------------------- 
 pTop := NewPanel(Form,esRaised). SetAlign(caTop); 
 pTop.Height := 35; 
 
 buOpen := NewButton(pTop,'Открыть').SetAlign(caLeft); 
 buOpen.OnClick := TOnEvent( MakeMethod( nil, @OpenPic ) ); 
 
 SBox := NewScrollBoxEx(Form,esLowered).SetAlign(caClient); 
// ------------------------------------------------------- 
 
 run(Applet); 
end. 

Исходный текст : 2,48 Кб ; размер программы: 102Кб(без сжатия и замены System)
Пока это самая большая программа-пример ;-)

Получить ссылку на материал

Категория: Kol и MCK | Добавил: Барон (13.12.2011)
Просмотров: 1150 | Теги: графика, экран | Рейтинг: 4.0/1
[ Пожертвования для сайта ] [ Пожаловаться на материал ]

Если вам помог материал сайта кликните по оплаченной рекламе размещенной в центре

Поиск
Категории раздела
ActiveX [10]
CORBA и COM [16]
Kol и MCK [23]
WinAPI [28]
Компоненты [27]
Работа с Bluetooth [4]
Железо [8]
Текст [18]
Разное [98]
Королевство Delphi © 2010-2024
Яндекс цитирования