Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.04.01;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.008 c
15-1322773113
Германн
2011-12-02 00:58
2012.04.01
Список устройств в "Диспетчере оборудования"


15-1323168272
LDV
2011-12-06 14:44
2012.04.01
использование bookmark


15-1322801637
NkzAlex
2011-12-02 08:53
2012.04.01
Новое слово в ИТ?:


1-1290434672
DeadAlice
2010-11-22 17:04
2012.04.01
Печать на POS-принтер с определением состояния процесса


2-1323871689
upc
2011-12-14 18:08
2012.04.01
VirtualStringTree и ComboBox