Форум: "Начинающим";
Текущий архив: 2012.04.01;
Скачать: [xml.tar.bz2];
ВнизDelphi 7. Почему Image1.Canvas не печатается? Найти похожие ветки
← →
CheCoder © (2011-12-11 23:09) [0]То есть, код на компе с 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.
← →
Омлет © (2011-12-12 08:23) [1]Какие размеры у R получаются?
← →
CheCoder © (2011-12-12 09:11) [2]Только начинаю со всем этим разбираться, так что постараюсь в меру своего понимания. LogPixelsX=600, LogPixelsX=600, что такое PixelsPerInch, в данном контексте, не могу пока сообразить (был бы благодарен за подсказку). А размеры Image 150*150.
← →
И. Павел © (2011-12-12 09:20) [3]> что такое PixelsPerInch, в данном контексте, не могу пока
> сообразить (был бы благодарен за подсказку).
Это TForm.PixelsPerInch — свойство формы.
← →
Сергей М. © (2011-12-12 09:22) [4]
> LogPixelsX=600, LogPixelsX=600
Это с какого же перепугу ?
← →
Омлет © (2011-12-12 09:30) [5]
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:31) [6]
GetDeviceCaps(Handle, logPixelsX)
попробуйте заменить наGetDeviceCaps(Canvas.Handle, logPixelsX)
← →
CheCoder © (2011-12-12 16:39) [7]
> Что выводит?
870,918
← →
CheCoder © (2011-12-12 16:40) [8]
> > LogPixelsX=600, LogPixelsX=600 Это с какого же перепугу
> ?
LogPixelsX=600, LogPixelsY=600
← →
Сергей М. © (2011-12-12 16:45) [9]
> CheCoder © (12.12.11 16:40) [8]
И где написано что именно 600 ?
Нигде не написано. Значит это отсебячина.
← →
CheCoder © (2011-12-12 16:57) [10]
> > Что выводит?870,918
Пардон, при размере Image 150*150 сообщение выводит 900,900
← →
CheCoder © (2011-12-12 17:02) [11]
> И где написано что именно 600 ?Нигде не написано. Значит
> это отсебячина.
При выполнении длинного, скопипащенного кода выдаются "Свойства принтера и страницы", где, среди всего прочего, написано LogPixelsX=600, LogPixelsY=600
← →
И. Павел © (2011-12-12 18:11) [12]
> CheCoder © (12.12.11 17:02) [11]
Вы [6] попробовали?
← →
И. Павел © (2011-12-12 18:15) [13]
> И. Павел © (12.12.11 18:11) [12]
Хотя нет, похоже это одно и то же...
← →
CheCoder © (2011-12-12 18:19) [14]
> Вы [6] попробовали?
Изменений никаких. По крайней мере внешне...
← →
И. Павел © (2011-12-12 18:23) [15]
> Canvas.StretchDraw(R, Image1.Picture.Graphic);
Где-то читал, что у некоторых принтеров могут возникнуть проблемы с копированием на их канву изображений с другой канвы (где не помню, но что читал - точно помню :). Может быть, дело в этом? попробуйте вывести вместо изображения rectangle тех же размеров (870,918), для пробы.
← →
И. Павел © (2011-12-12 18:30) [16]Вот похожий случай:
http://www.delphifaq.com/faq/f729.shtml
попробуйте использовать WinAPI-шную StretchDraw непосредственно.
← →
И. Павел © (2011-12-12 18:39) [17]Точнее вот - самый последний параграф из [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 20:41) [18]
> CheCoder © (12.12.11 17:02) [11]
> При выполнении длинного, скопипащенного кода
Т.е. чтение и штудирование штатной док-ции производителя той ОС, для которой ты пишешь программу, ты не приемлешь в принципе, так ? Эта док-ция писана для Пушкина, правильно ?
← →
CheCoder © (2011-12-12 23:54) [19]
> Т.е. чтение и штудирование штатной док-ции производителя
> той ОС, для которой ты пишешь программу, ты не приемлешь
> в принципе, так ? Эта док-ция писана для Пушкина, правильно
> ?
Сергей М. - троль!
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.04.01;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.003 c