Перейти к содержанию
  • Регистрация
  • 0
Euvene

Работа с Printer->Canvas

Вопрос

Добрый день. Возникла такая проблема, нужно распечатать обычную таблицу, но при печати получается все очень мелкое, может кто подскажет как это исправить...

вот код:

TRectF SrcRect, DestRect;
	int h = 40, w = 60, x0 = 50, y0 = 150, x, y;
	TPrinter *Printer = Fmx::Printer::Printer();

	Printer->ActivePrinter->SelectDPI(1200, 1200);

	Printer->Canvas->Fill->Color = claBlack;
	Printer->Canvas->Fill->Kind = TBrushKind(1);
	Printer->Canvas->Stroke->Kind = TBrushKind::Solid;
	Printer->Canvas->Stroke->Color = claBlack;

	Printer->BeginDoc();
	DestRect.SetHeight(h);
	DestRect.SetWidth(w);

	for (int i = 0; i < StringGrid1->RowCount; i++)
	{
		x = x0;
		for (int j = 0; j < StringGrid1->ColumnCount; j++)
		{
			DestRect.SetLocation(x, y0);
			Printer->Canvas->Font->Size = 14;
			// Printer->Canvas->DrawRect(DestRect, 0, 0, AllCorners, 1);
			// Printer->Canvas->Font->SetSettings(StringGrid1->TextSettings->Font->Family,StringGrid1->TextSettings->Font->Size,StringGrid1->TextSettings->Font->StyleExt);
			Printer->Canvas->FillText(DestRect, StringGrid1->Cells[j][i], false,
				100, TFillTextFlags(), TTextAlign::Center, TTextAlign::Center);
			x += w;

		}
		y0 += h;

	}

	Printer->EndDoc();

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0
В 05.04.2017 в 11:46, Euvene сказал:

Printer->ActivePrinter->SelectDPI(1200, 1200);

Конечно будет очень мелкое, ведь Вы устанавливаете 1200 точек на дюйм и ширина листа А4 в портретном режиме у Вас получается чуть меньше 100000 точек. Исходя из этого просто задайте адекватные значения для h, w, x0, y0, x, y и все у Вас будет в порядке.

Например, для печати битмапки, я ипользую такой код:

var
  bmp: TBitmap;
  SrcRect, DestRect: TRectF;
  DPI: TPoint;
  cx, cy: Extended;
begin
    Printer.ActivePrinter.SelectDPI(1200, 1200);
    DPI := Printer.ActivePrinter.DPI[Printer.ActivePrinter.ActiveDPIIndex];
    {$IFDEF MSWINDOWS}
    cx := DPI.X / GetDeviceCaps(GetDC(GetDesktopWindow), LOGPIXELSX);
    cy := DPI.Y / GetDeviceCaps(GetDC(GetDesktopWindow), LOGPIXELSY);
    {$ENDIF}

    bmp := TBitmap.Create(0, 0);
    try
      FEditor.GetAsBitmap(bmp);

      SrcRect := TRectF.Create(0, 0, bmp.Width * cx, bmp.Height * cy);
      DestRect := TRectF.Create(0, 0, Printer.PageWidth, Printer.PageHeight);

      if SrcRect.Width / SrcRect.Height > DestRect.Width / DestRect.Height then
        Printer.Orientation := TPrinterOrientation.poLandscape
      else
        Printer.Orientation := TPrinterOrientation.poPortrait;

      if (SrcRect.Width < DestRect.Width) and (SrcRect.Height < DestRect.Height) then
      begin
        DestRect.Left := (DestRect.Width - SrcRect.Width) / 2;
        DestRect.Width := SrcRect.Width;
        DestRect.Top := (DestRect.Height - SrcRect.Height) / 2;
        DestRect.Height := SrcRect.Height;
      end
      else
      begin
        SrcRect.Fit(DestRect);
        DestRect := SrcRect;
      end;

      Printer.BeginDoc;
      try
        Printer.Canvas.DrawBitmap(bmp, TRectF.Create(0, 0, bmp.Width, bmp.Height), DestRect, 1);
      finally
        Printer.EndDoc;
      end;
    except
      Printer.Abort;
    end;
    FreeAndNil(bmp);
end;

 

Изменено пользователем dnekrasov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...