Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с печатью формы [WinXP]


ggg ©   (2007-10-23 03:56:00) 

Просто пытаюсь отправить форму на печать. На некоторых компьютерах - всё нормально, а на некоторых - вместо Image/StringGrid/Memo выводятся черные прямоугольники. Причем панели и лаблы выводятся как положено.

const
PrintMargin = 120;
var
 bmp: TBitmap;
 r2: TRect;
begin
if PrintDialog1.Execute then
  begin
     bmp := GetFormImage;
     bmp.Transparent := true;
     bmp.TransparentColor := Color;
     bmp.Height := ClientHeight - pnlBottomMenu.Height - 2;

     r2 := Rect(
      0, 0,
       Printer.PageWidth - PrintMargin * 2,
       Printer.PageHeight - PrintMargin
     );

     r2 := GetCenterScaledSize(r2, bmp.Width, bmp.Height);

   Printer.BeginDoc;
     try
    Printer.Canvas.Brush.Color := clWhite;
       r2.Left := PrintMargin;
       r2.Top := PrintMargin;
       r2.Right := r2.Left + r2.Right;
       r2.Bottom := r2.Top + r2.Bottom;
    Printer.Canvas.StretchDraw(
    r2,
        bmp
      );
     finally
    Printer.EndDoc;
     end;
     bmp.Free;
   end;

Проблема возникла при печати на одном из ч/б принтеров. Причем, если имадж содержит монохромный рисунок, то он выводится нормально, а вот если цветной - прямоугольник.
Хотя если выбрать печатать в файл, а потом этот файл открыть и распечатать - все нормально.
Как исправить?


ggg   (2007-10-24 15:14:00) [1]

> homm ©   (23.10.07 18:04) [6]
Боюсь, что нет ))
Проблема действительно решилась использованием кода из TForm.Print, в частности заменой StretchDraw на StretchDIBits.
Спасибо, REA.


homm   (2007-10-23 18:04:00) [2]

> [5] ggg   (23.10.07 17:48)
> Однозначно правильно. При печати в файл форма отображается
> верно.

Ага, а при блитинге на канву принтера, вдруг пропадают именно прамоугольники, где должны быть Image/StringGrid/Memo???
То, что возвращает GetFormImage — это битмэп, на нем уже нет ни Image ни StringGrid ни Memo, все что там есть сплошной набор битов, формирующих изображения, если ошибка не в этой функции, значит либо пропадает все, либо ничего. Но я склонен полагать, что ошибка все-же в ней.


ggg   (2007-10-23 17:48:00) [3]

> homm [4]
Однозначно правильно. При печати в файл форма отображается верно.

Сейчас нет доступа к тому принтеру, не могу проверить решение с Form.Print;


homm   (2007-10-23 14:27:00) [4]

> [3] ggg   (23.10.07 14:21)
> эм... Forms.pas из состава BDS2006

А ты проверяешь, без отправки на печать, всегда ли эта функция возвращает верные картинки?


ggg   (2007-10-23 14:21:00) [5]

> REA [1]
Спс, попробую.

> homm [2]
эм... Forms.pas из состава BDS2006

function TCustomForm.GetFormImage: TBitmap;
var
 Ofs: Integer;
begin
 Result := TBitmap.Create;
 try
   Result.Width := ClientWidth;
   Result.Height := ClientHeight;
   Result.Canvas.Brush := Brush;
   Result.Canvas.FillRect(ClientRect);
   Result.Canvas.Lock;
   try
     if GetWindowLong(Handle, GWL_STYLE) and WS_BORDER <> 0 then
       Ofs := -1  // Don't draw form border
     else
       Ofs := 0;  // There is no border
     PaintTo(Result.Canvas.Handle, Ofs, Ofs);
   finally
     Result.Canvas.Unlock;
   end;
 except
   Result.Free;
   raise;
 end;
end;


homm   (2007-10-23 11:28:00) [6]

> [0] ggg   (23.10.07 03:56)
> bmp := GetFormImage;

Код GetFormImage в студию.


REA   (2007-10-23 10:57:00) [7]

Не использовать StretchDraw. См. исходники TCustomForm.Print


Наверх

Титульная страница Поиск, карта сайта Написать письмо