![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Delphi 7. Почему Image1.Canvas не печатается? [D7, XP]
CheCoder © (2011-12-11 23:09:00)То есть, код на компе с Windows 7 (разрешение экрана 1366*768) выполняется как надо, а на компе с Windows XP (разрешение экрана 1024*768) принтер выдает чистый лист. Принтер в обоих случаях используется один и тот же.
uses Printers;
***********
procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Canvas.TextOut(10,10,'ПРОВЕРКА');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ScaleX, ScaleY: Integer;
R: TRect;
begin
Printer.BeginDoc;
with Printer do
try
ScaleX := GetDeviceCaps(Handle, logPixelsX) div PixelsPerInch;
ScaleY := GetDeviceCaps(Handle, logPixelsY) div PixelsPerInch;
R := Rect(0, 0, Image1.Picture.Width * ScaleX,
Image1.Picture.Height * ScaleY);
Canvas.StretchDraw(R, Image1.Picture.Graphic);
finally
EndDoc;
end;
end;
end.
CheCoder (2011-12-12 23:54:00) [1]
> Т.е. чтение и штудирование штатной док-ции производителя
> той ОС, для которой ты пишешь программу, ты не приемлешь
> в принципе, так ? Эта док-ция писана для Пушкина, правильно
> ?
Сергей М. - троль!
Сергей М. (2011-12-12 20:41:00) [2]
> CheCoder © (12.12.11 17:02) [11]
> При выполнении длинного, скопипащенного кода
Т.е. чтение и штудирование штатной док-ции производителя той ОС, для которой ты пишешь программу, ты не приемлешь в принципе, так ? Эта док-ция писана для Пушкина, правильно ?
И. Павел (2011-12-12 18:39:00) [3]Точнее вот - самый последний параграф из [16]:
> To print a bitmap reliable you have to convert it to a device-
> independent bitmap and print is using Windows API function
> StretchDIBits(). Look at the document Printing a TForm how
> to use StretchDIBits().
Вот пример:
var
Info : PBitmapInfo;
InfoSize : DWORD;
Image : Pointer;
ImageSize : DWORD;
Bits : HBITMAP;
begin
Bits := bmp.Handle; // bmp is passed as a parameter
GetDIBSizes(Bits, InfoSize, ImageSize);
Info := AllocMem(InfoSize);
try
Image := AllocMem(ImageSize);
try
GetDIB(Bits, 0, Info^, Image^);
StretchDIBits(Printer.Canvas.Handle,
5, 30, Bmp.Width, bmp.Height,
0, 0, bmp.Width, bmp.Height,
Image, Info^, DIB_RGB_COLORS, SRCCOPY);
finally
FreeMem(Image, ImageSize);
end;
finally
FreeMem(Info, InfoSize);
end;
end;
И. Павел (2011-12-12 18:30:00) [4]Вот похожий случай:
http://www.delphifaq.com/faq/f729.shtml
попробуйте использовать WinAPI-шную StretchDraw непосредственно.
И. Павел (2011-12-12 18:23:00) [5]
> Canvas.StretchDraw(R, Image1.Picture.Graphic);
Где-то читал, что у некоторых принтеров могут возникнуть проблемы с копированием на их канву изображений с другой канвы (где не помню, но что читал - точно помню :). Может быть, дело в этом? попробуйте вывести вместо изображения rectangle тех же размеров (870,918), для пробы.
CheCoder (2011-12-12 18:19:00) [6]
> Вы [6] попробовали?
Изменений никаких. По крайней мере внешне...
И. Павел (2011-12-12 18:15:00) [7]
> И. Павел © (12.12.11 18:11) [12]
Хотя нет, похоже это одно и то же...
И. Павел (2011-12-12 18:11:00) [8]
> CheCoder © (12.12.11 17:02) [11]
Вы [6] попробовали?
CheCoder (2011-12-12 17:02:00) [9]
> И где написано что именно 600 ?Нигде не написано. Значит
> это отсебячина.
При выполнении длинного, скопипащенного кода выдаются "Свойства принтера и страницы", где, среди всего прочего, написано LogPixelsX=600, LogPixelsY=600
CheCoder (2011-12-12 16:57:00) [10]
> > Что выводит?870,918
Пардон, при размере Image 150*150 сообщение выводит 900,900
Сергей М. (2011-12-12 16:45:00) [11]
> CheCoder © (12.12.11 16:40) [8]
И где написано что именно 600 ?
Нигде не написано. Значит это отсебячина.
CheCoder (2011-12-12 16:40:00) [12]
> > LogPixelsX=600, LogPixelsX=600 Это с какого же перепугу
> ?
LogPixelsX=600, LogPixelsY=600
CheCoder (2011-12-12 16:39:00) [13]
> Что выводит?
870,918
И. Павел (2011-12-12 09:31:00) [14]
GetDeviceCaps(Handle, logPixelsX)
попробуйте заменить на
GetDeviceCaps(Canvas.Handle, logPixelsX)
Омлет (2011-12-12 09:30:00) [15]
procedure TForm1.Button1Click(Sender: TObject);
var
ScaleX, ScaleY: Integer;
R: TRect;
begin
with Printer do
begin
BeginDoc;
try
ScaleX := GetDeviceCaps(Handle, logPixelsX) div PixelsPerInch;
ScaleY := GetDeviceCaps(Handle, logPixelsY) div PixelsPerInch;
ShowMessage(format('%d, %d', [Image1.Picture.Width * ScaleX, Image1.Picture.Height * ScaleY]));
finally
EndDoc;
end;
end;
end;
Что выводит?
Сергей М. (2011-12-12 09:22:00) [16]
> LogPixelsX=600, LogPixelsX=600
Это с какого же перепугу ?
И. Павел (2011-12-12 09:20:00) [17]> что такое PixelsPerInch, в данном контексте, не могу пока
> сообразить (был бы благодарен за подсказку).
Это TForm.PixelsPerInch свойство формы.
CheCoder (2011-12-12 09:11:00) [18]Только начинаю со всем этим разбираться, так что постараюсь в меру своего понимания. LogPixelsX=600, LogPixelsX=600, что такое PixelsPerInch, в данном контексте, не могу пока сообразить (был бы благодарен за подсказку). А размеры Image 150*150.
Омлет (2011-12-12 08:23:00) [19]Какие размеры у R получаются?