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

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

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 получаются?


Наверх

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