Вывод графики с использованием отображаемых файлов
Теперь загруженные данные нужно суметь нарисовать на канве, в данном случае на канве объекта PaintBox. Делается это следующим образом:
procedure TForml.PaintMe(Sender: TObject); var OldP: hPalette;i: integer; begin if Memory=nil then Exit; OldP: = SelectPalette(PaintBox.Canvas.Handle, Palette, False); RealizePalette(PaintBox.Canvas.Handle); SetStretchBltMode(PaintBox.Canvas.Handle, STRETCH_DELETESCANS); case ViewMode of vmStretch: with bminfo^ do i: = StretchDIBits(PaintBox.Canvas.Handle, 0.0,PaintBox.Height,PaintBox.Width, 0.0,biWidth,Abs(biHeight), Memory, pBitmapInfo(bminfo)^, DIB_RGB_COLORS, PaintBox.Canvas.CopyMode); vmlxl: with bminfoA,PaintBox.ClientRect do i: = SetDIBitsToDevice (PaintBox.Canvas.Handle,Left,Top,Right-Left, Bottom-Top, Left,Top,Top,Bottom-top, Memory, pBitmapInfо(bminfo)^, DIB_RGB_COLORS); vmZoom: begin with bminfo^,PaintBox.ClientRect do i: = StretchDIBits (PaintBox.Canvas.Handle,Left,Top,Right-Left, Bottom-Top, 0.0,biWidth,Abs(biHeight), Memory, pBitmapInfo(bminfo)^, DIB_RGB_COLORS, PaintBox.Canvas.CopyMode); end; end; if (i=0) or (i=GDI_ERROR) then begin ec: = GetLastError; Forml.Caption: = 'Error code '+IntToStr(ec); end; SelectPalette(PaintBox.Canvas.Handle, OldP, False); end;
В зависимости от установленного режима отображения (vmstretch, vmzoom или vmlxl) применяются разные функции WIN API: stretchoisits или SetoiBitsToDevice. Выигрыш в скорости работы приложения особенно ощущается, если загружаемые файлы становятся велики и должны размещаться в файле подкачки. Наше же приложение не использует его и отображает данные прямо из файла на экран (рис. 10.3).
Рис. 10.3. Этот снимок с метеорологического спутника имеет размер десятки мегабайт