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

ЖАНРЫ

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

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

Шрифт:

kScale — для пересчета размеров шрифта, а потом уже закладываюсь на его размеры и получаю два новых коэф-та для kW, kH — которые и позволяют мне с учетом высоты шрифта выводить графику и пр. У меня при работе kW <> kH, что приходится учитывать.

Решили пункт 1.

procedure SetKoeffMeta; // установить коэф-ты

var

 PrevMetafile : TMetafile;

 MetaCanvas : TMetafileCanvas;

begin

 PrevMetafile := nil;

 MetaCanvas := nil;

 try

PrevMetaFile := TMetaFile.Create;

try

MetaCanvas := TMetafileCanvas.Create(PrevMetafile, 0);

kScale := GetDeviceCaps(Printer.Handle, LOGPIXELSX) / Screen.PixelsPerInch;

MetaCanvas.Font.Assign(oGrid.Font);

MetaCanvas.Font.Size := Round(oGrid.Font.Size * kScale);

kW := MetaCanvas.TextWidth('W') / oGrid.Canvas.TextWidth('W');

kH := MetaCanvas.TextHeight('W') / oGrid.Canvas.TextHeight('W');

finally

MetaCanvas.Free;

end;

 finally

PrevMetafile.Free;

 end;

end;

Решаем 2.

var

 PrevMetafile : TMetafile;

 MetaCanvas : TMetafileCanvas;

begin

 PrevMetafile := nil;

 MetaCanvas := nil;

 try

PrevMetaFile := TMetaFile.Create;

PrevMetafile.Width := oWidth;

PrevMetafile.Height := oHeight;

try

MetaCanvas := TMetafileCanvas.Create(PrevMetafile, 0);

//
здесь должен быть ваш код - с учетом масштабиpования.

// я эту вещь вынес в ассигнуемую пpоцедуpу, и данный блок

// вызываю лишь для отpисовки целой стpаницы.

см. PS1.

finally

MetaCanvas.Free;

end;

...

PS1. Код, котоpый используется для отpисовки. oCanvas - TCanvas метафайла.

...

var iHPage : integer; // высота страницы

begin

 with oCanvas do begin

iHPage := 3000;

//
залили область метайфайла белым - для дальнейшей pаботы

Pen.Color := clBlack;

Brush.Color := clWhite;

FillRect(Rect(0, 0, 2000, iHPage));

// установили шpифты - с учетом их дальнейшего масштабиpования

oCanvas.Font.Assign(oGrid.Font);

oCanvas.Font.Size := Round(oGrid.Font.Size * kScale);

...

xEnd := xBegin;

iH := round(RowHeights[iRow] * kH);

for iCol := 0 to ColCount - 1 do begin

x := xEnd;

xEnd := x + round(ColWidths[iCol] * kW);

Rectangle(x, yBegin, xEnd, yBegin + iH);

r := Rect(x + 1, yBegin + 1, xEnd – 1, yBegin + iH – 1);

s := Cells[iCol, iRow];

// выписали в полученный квадрат текст

DrawText(oCanvas.Handle, PChar(s), Length(s), r, DT_WORDBREAK or dt_center);

Главное, что важно помнить на этом этапе – это не забывать, что все выводимые объекты должны пользоваться описанными коэф-тами (как вы их получите – это уже ваше дело). В данном случае – я работаю с пеpеделанным TStringGrid, который сделал для многостраничной печати. Последний пункт – надо сформированный метафайл или bmp напечатать.

var

 Info: PBitmapInfo;

 InfoSize: Integer;

 Image: Pointer;

 ImageSize: DWORD;

 Bits: HBITMAP;

 DIBWidth, DIBHeight: Longint;

 PrintWidth, PrintHeight: Longint;

begin

 ...

 case ImageType of

 itMetafile:

begin

if Picture.Metafile<>nil then Printer.Canvas.StretchDraw(Rect(aLeft, aTop, aLeft+fWidth, aTop+fHeight), Picture.Metafile);

end;

 itBitmap:

begin

if Picture.Bitmap<>nil then begin

with Printer, Canvas do begin

Bits := Picture.Bitmap.Handle;

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