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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.09.2008, 11:24
Rat Rat вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 391
Репутация: 6078
По умолчанию Печать скриншота на принтере

Всем привет!

Возникла проблема при печати скриншота на принтере. Вот исходник:

Код:
program Project1;

uses
   Windows, Graphics, Forms, Printers, Types;

{$R *.res}

var
  PRect: Trect;
  PBitMap: TBitmap;
  DC: HDC;
  Canva:Tcanvas;
  Buffer: array[0..1023] of Char;
  tmp: String;
begin
  try
    Canva := TCanvas.Create;
    PBitmap := TBitMap.Create;
    DC := GetDC(0);
    Canva.Handle := DC;
    with Screen do
    begin
      PBitmap.Width := Width;
      PBitmap.Height := Height;
      PBitmap.Canvas.CopyRect(Rect(0,0, Width, Height), Canva, Rect(0, 0, Width, Height));
      SetString(tmp, Buffer, GetTempPath(Sizeof(Buffer) - 1, Buffer));
      PBitmap.SaveToFile(tmp+'tmp294u2.bmp');
    end;
      Pbitmap.LoadFromFile(tmp+'tmp294u2.bmp');
    with PRect do
    begin
      left := 0;
      top := 0;
      right := Printer.PageWidth;
      Bottom := Printer.PageHeight;
    end;
      printer.BeginDoc;
      printer.Canvas.StretchDraw(Prect, Pbitmap);
      printer.EndDoc;
  finally
    ReleaseDC(0, DC);
    PBitmap.Free;
    Canva.Free;
    end;
end.

Проблема в том, что после получения экрана в PBitmap, я не хочу его сохранять в файл, а хочу сразу выводить на принтер. Но если его не сохранять, то печатается чистый лист. Если сохранить, а потом тут же загрузить, всё печатается нормально. Я думаю, что во время загрузки файла, в PBitmap, подставляются какие то параметры, которые необходимы для печати. Только не могу понять какие. Ктонибудь сталкивался с этой проблемой?
Ответить с цитированием
  #2  
Старый 14.09.2008, 22:18
ProperDoze ProperDoze вне форума
Новичок
 
Регистрация: 04.08.2008
Сообщения: 53
Репутация: 10
По умолчанию

Почему нельзя пойти таким путем:
1. Сохранить в файл
2. Вывести на печать
3. Дождаться конца печати
4. Удалить

Если я не ошибаюсь, то принтеры прежде чем печатать сохраняют данные где-то на диск и потом печатают (в смысле не печатают сразу из памяти). Поправьте, если я не прав.

Последний раз редактировалось ProperDoze, 14.09.2008 в 22:23.
Ответить с цитированием
  #3  
Старый 14.09.2008, 23:20
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,024
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

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

Код в свое время я нашел где-то на борландовской базе знаний.
Ответить с цитированием
  #4  
Старый 16.09.2008, 07:44
Rat Rat вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 391
Репутация: 6078
По умолчанию

Ага. А при записи он автоматом конвертируется в DIB?

Думаю, что всетаки каких то параметров просто не хватает.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter