Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.03.2014, 21:19
Akunin Akunin вне форума
Прохожий
 
Регистрация: 02.12.2010
Сообщения: 7
Репутация: 10
Восклицание Сохранение Printer.Canvas

Добрый день.
Вопрос: Как сохранить Printer.canvas в переменную/файл?

Что-то вроде этого

Код:
begin
// задание настроек принтера-размер бумаги, ориентация, коллаж, дуплекс и т.п. 
Printer.BeginDoc;
// задание некоторых свойств Printer.Canvas.Font
 
Printer.canvas.Textout(5,5,'бла бла бла');

// Вот здесь нужно выдернуть содержимое Printer.canvas и сохранить ее в какую-нибуть переменную, например, типизированную как TBitmap.
// с размерами переменной вопросов не возникает, не могу именно импортировать изображение. 
Помогите в какую сторону копать, читал  про метафайлы и ТП, может в сторону GDI?

// далее можно Printer.Abort и т.п., это не важно.
может быть что-то типа 
      printer.BeginDoc;
      printer.Canvas.TextOut(5,5,'aaaaa');
      Form1.canvas.CopyRect(Bounds(10,10,30,30),Printer.Canvas,Bounds(10,10,30,30));
      printer.Abort

MAD: пользуемся тегами!

Последний раз редактировалось M.A.D.M.A.N., 23.03.2014 в 10:02.
Ответить с цитированием
  #2  
Старый 21.03.2014, 05:45
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,056
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А что мешает написать процедуру, которая на вход принимает Canvas и на ней все отрисовывает? А уж какую канву ей подсунуть - это уже дело вызывающего кода. Собственно, так и сделал в одной из своих программ. Процедура отрисовки для печати и превью одна и та же, только "подсовывается" разная канва (ну там еще небольшие игры с пересчетом координат и размеров, т.к. кол-во точек у принтера обычно существенно больше, чем у экрана).
Ответить с цитированием
  #3  
Старый 21.03.2014, 18:16
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
unit Unit1;

interface

uses
  Printers,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  ACanvas: TCanvas;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Printer.BeginDoc;
  ACanvas:=Printer.Canvas;
  //
end;

end.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 22.03.2014, 23:43
Akunin Akunin вне форума
Прохожий
 
Регистрация: 02.12.2010
Сообщения: 7
Репутация: 10
Печаль !

Дело в том, что мне не нужно просто сохранить канву принтера в изображение. Пробовал разные варианты, пока не получается-сохраняет пустое изображение.
Как вариант-печатать сразу в файл, но это не красиво для решения моей задачи. Нужно что-то наподобие этого... объясните, в чем ошибка...
Код:
  Bitmap: TBitmap;
  Source,
  Dest: TRect;
  acanvas:Tcanvas;
begin
  Bitmap := TBitmap.Create;
  try
      printer.BeginDoc;
      printer.Canvas.TextOut(5,5,'aaaaa');
      acanvas:=printer.Canvas;
      Dest:= Rect(0, 0, 200, 200);
      Source:= Rect(0, 0, 200, 200);
      Bitmap.Canvas.CopyRect(Dest, acanvas, Source);
      Bitmap.SaveToFile('C:\1.bmp');
      printer.Abort;
  finally Bitmap.Free;
  end; // try

MAD: теги. последнее предупреждение.

Последний раз редактировалось M.A.D.M.A.N., 23.03.2014 в 10:02.
Ответить с цитированием
  #5  
Старый 23.03.2014, 10:31
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

удали Bitmap вообще и не используй Abort
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 24.03.2014, 10:32
Akunin Akunin вне форума
Прохожий
 
Регистрация: 02.12.2010
Сообщения: 7
Репутация: 10
По умолчанию

И что дальше?
Каким образом тогда сохранять канву в файл?
Такое ощущение, что вы не совсем педставляете задачу...
Ответить с цитированием
  #7  
Старый 24.03.2014, 11:24
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Akunin
И что дальше?
Каким образом тогда сохранять канву в файл?
Такое ощущение, что вы не совсем педставляете задачу...
А задача заключается в том, чтобы что-то нарисовать на канве принтере, а потом внезапно отменить печать на принтер и пытаться сохранить в файл рисунок с канвы принтера? И в чём заключается смысл этих странных манипуляций?
Ответить с цитированием
  #8  
Старый 24.03.2014, 17:54
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,056
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

смысл заключается, видимо, в том, что ТС сам не понимает зачем он это хочет и как это сделать. Коду все равно на какой канве рисовать, принтер это или Bitmap. Соответсвенно, надо просто коду подсовывать канву соотв. размера.
Ответить с цитированием
  #9  
Старый 25.03.2014, 01:30
Akunin Akunin вне форума
Прохожий
 
Регистрация: 02.12.2010
Сообщения: 7
Репутация: 10
По умолчанию

Мне не нужно печататть на "какой-то канве, типа bitmap". Необходим именно printer.canvas.
Печать отменять не обязательно, я в начале написал, что можно отменять, а можно и нет.
Смысл, вкратце, такой:
1) заполнить канву принтера некоторыми символами.
2) считать с канвы в файл.
3) можно печать или абортить печать, на данном этапе это не важно.
4) обрабатывать сохраненный файл некоторыми алгоритмами.

в кратце-задача-доказать, что в канве принтера не произошло никаких искажений (после передачи туда контента, как textout так и графики), т.е. своего рода обратный контроль.
пока никто дельных вариантов не предложил.

Последний раз редактировалось Akunin, 25.03.2014 в 01:36.
Ответить с цитированием
  #10  
Старый 25.03.2014, 18:13
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

обработай символы до вывода на печать. доказывать ничего не нужно - при правильном подходе все будет без искажений.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:54.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter