![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с печатью формы [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