Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

GetDIBSizes(Bits, InfoSize, ImageSize);

Info := AllocMem(InfoSize);

try

Image := AllocMem(ImageSize);

try

GetDIB(Bits, 0, Info^, Image^);

with Info^.bmiHeader do begin

DIBWidth := biWidth;

DIBHeight := biHeight;

end;

PrintWidth := DIBWidth;

PrintHeight := DIBHeight;

StretchDIBits(Canvas.Handle, aLeft, aTop, PrintWidth, PrintHeight, 0, 0, DIBWidth, DIBHeight, Image, Info^, DIB_RGB_COLORS, SRCCOPY);

finally

FreeMem(Image, ImageSize);

end;

finally

FreeMem(Info, InfoSize);

end;

end;

end;

end;

 end;

В

чем заключается идея PreView? Остается имея на руках Metafila, Bmp – отрисовать с пересчетом внешний вид изобpажения (надо высчитать левый верхний угол и размеpы «предварительно просматриваемого» изображения. Для показа изобpажения достаточно использовать StretchDraw.

После того, как удалось вывести объекты на печать, проблему создания PreView решили как «домашнее задание».

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

w:=MulDiv(Bmp.Width, GetDeviceCaps(Printer.Handle,LOGPIXELSX), Screen.PixelsPerInch);

h:=MulDiv(Bmp.Height, GetDeviceCaps(Printer.Handle,LOGPIXELSY), Screen.PixelsPerInch);

PrevBmp.Width:=w;

PrevBmp.Height:=h;

PrevBmp.Canvas.StretchDraw(Rect(0, 0, w, h),Bmp);

aPicture.Assign(PrevBmp);

Пpи этом масштабируется битовый образ с минимальными искажениями, а вот при печати – приходится bmp печатать именно так, как описано выше. Итог – наша bmp при печати чуть меньше, чем печатать ее через WinWord, но при этом – внешне – без каких-либо искажений и пр.

Imho, я для себя пpоблему печати pешил. Hа основе вышесказанного, сделал PreView для myStringGrid, где вывожу сложные многостpочные заголовки и пр. на несколько листов, осталось кое-что допилить, но с принтером у меня проблем не будет уже точно :)

PS. Кстати, Андрей Аристов на основе своей наработки сделал сложные геокарты, которые по качеству не хуже, а может, и лучше, чем выдает Surfer (специалисты поймут). Hа ватмат.

PPS. Прошу прощения за возможные стилистические неточности – время вышло, охрана уже ругается. Но код – выдран из работающих исходников.

Разное 

Как в ATX корпусе программно выключить питание под DOS

Serj Kolesnikov рекомендует:

=== Cut ===

 mov ax,5301h

 sub bx,bx

 int 15h

 jc @@finish

 mov ax,530Eh

 sub bx,bx

 mov cx,102h

 int 15h

 jc @@finish

 mov ax,5307h

 mov bx,1

 mov cx,3

 int 15h

@@finish:

 int 20h

=== Cut ===

Операционная

система 

Буфер обмена 

Как удобнее работать с буфером обмена как с последовательностью байт?

Из советов Nomadic'a:

Используя потоки —

unit ClipStrm;

{

 This unit is Copyright (c) Alexey Mahotkin 1997-1998

 and may be used freely for any purpose. Please mail

 your comments to

 E-Mail: alexm@hsys.msk.ru

 FidoNet: Alexey Mahotkin, 2:5020/433

 This unit was developed during incorporating of TP Lex/Yacc

 into my project. Please visit ftp://ftp.nf.ru/pub/alexm

 or FREQ FILES from 2:5020/433 or mail me to get hacked

 version of TP Lex/Yacc which works under Delphi 2.0+.

}

interface uses Classes, Windows;

type TClipboardStream = class(TStream)

private

 FMemory : pointer;

 FSize : longint;

 FPosition : longint;

 FFormat : word;

public

 constructor Create(fmt : word);

 destructor Destroy; override;

 function Read(var Buffer; Count : Longint) : Longint; override;

 function Write(const Buffer; Count : Longint) : Longint; override;

 function Seek(Offset : Longint; Origin : Word) : Longint; override;

end;

Поделиться с друзьями: