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

Вниз

Draw на канве принтера   Найти похожие ветки 

 
TStas ©   (2013-03-26 21:53) [0]

Вчера ковырялся с расечатыванием текста с картинками, с удивлением обрнаружил, что метод DRaw получается вызвать один раз. Две картинки рисоваться не хотели. Код не привожу, поскольку в нём много ссылок на другие модули и функции.
Вопрос вот в чём: это просто мой косяк, косяк конкретного драйвера принтера, который, кстати, не родной, или всё так и должно быть?


 
KilkennyCat ©   (2013-03-26 23:23) [1]

а как узнал? на месте второй картинки увидел надпись "не хочу"?


 
TStas ©   (2013-03-26 23:30) [2]

Нет. Рисуется или одна или другая. Но никак две вместе. Заранее предупреждаю: сами картинки убиваю ПОСЛЕ endDoc.


 
TStas ©   (2013-03-26 23:33) [3]

Я вчера, правди сидьно замученный два часа ковырялся. А сегодня подумал, что могу просто не знать, ведь печатал напрямую только таблица, ну, или совсем простой тект, только форматированный. Короче, Draw не пользовался ни разу, вот и спросил. Будет время, потрачу полдня и разберусь. Благо принтера есть два. Дельфи 7.


 
KilkennyCat ©   (2013-03-26 23:42) [4]

особого запрета вызывать его хоть тыщу раз нету.
проблемы с драйверами - возможны.
твой косяк - тоже возможно.
так не должно быть :)
сбацай все через одну какую-нить штуку, единый битмап, или метафайл, а его уж на принтер.


 
sniknik ©   (2013-03-27 07:56) [5]

> Код не привожу, поскольку
лень выделить/описать проблему "в чистом" виде. хотя это не проблема в новом проекте вызвать только пару методов DRaw, на что грешишь...
получится "проблема" вот тебе и код без ссылок/связей, не получится вот тебе и ответ на вопрос "чей это косяк".

> Заранее предупреждаю: сами картинки убиваю ПОСЛЕ endDoc.
это, что шантаж? или думаешь тут "засада"? ну так закоментарь "убийство", и попробуй еще раз.


 
TStas ©   (2013-03-27 15:28) [6]

Да через одну картинку тоже косяк. Там что-то сильно не то. Буду разбираться отдельно.
Драйвер неродной - это специально. Принтер зацепили винды, а если с диска, который есть, ставить, то все время висит в памяти прога, которая ждет зачем-то принтер и, самое главное, ей нетепрпится обновиться и какие-то данные осостать в Самсунг. Вообще странно, что вроде солидная фирма пишем хамские программы.


 
Inovet ©   (2013-03-27 15:30) [7]

Так отключии её.


 
TStas ©   (2013-03-27 15:32) [8]

PS Есть убивать картинкe до EndDocmaking, но после Draw она совсем не выводится. НАверное, канва принтера чем-то отличается от канвы битмапа, на которой всегда рисовал. Ведь есть же TCOntrolCanvas и это не тоже самое, что TCanvas, у котрой Handle установлен, как у контрола. Просто про это почему-то в книжках нет. А печатать какртинки было как-то незачем.


 
han_malign   (2013-03-27 15:37) [9]


> проблемы с драйверами - возможны.

- ну да, видимо разработчики не догадались, что если печатать желтое поверх голубого - должно зеленое получиться...


 
Григорьев Антон ©   (2013-03-27 22:33) [10]

Какой у картинок PixelFormat? Как они создаются?


 
TStas ©   (2013-03-28 20:28) [11]

>Григорьев Антон. Вот! Именно здесь все и дело. Сами картинки создаются функциями. Но потом, чтобы они не выглядели крошечными на печати, они обрабатываются такой вот ф-цией:
function CompressBMP(SrcBMP: TBitmap; Range: Integer): TBitmap;
var
 coef: Real;
 h, w: Integer;
begin
 Result:=TBitmap.Create;

 W:=SrcBMP.Width;
 H:=SrcBMP.Height;
 if W > h then coef:=Range/w
 else coef:=Range/h;

 h:=Round(coef*h);
 w:=Round(coef*w);

 Result.Width:=w;
 REsult.Height:=h;

 SetStretchBltMode(Result.Canvas.Handle, HALFTONE);
 StretchBlt(REsult.Canvas.Handle, 0, 0, Result.Width, Result.Height,
   SrcBMP.Canvas.Handle, 0, 0,  SrcBMP.Width, SrcBMP.Height, SRCCOPY);

end;
Несмотря на своё название, она может и увеличивать картинки.
ПРосто Draw действительно можно вызывать, пока не надоеест, а вот ее - один раз. почему-то. У меня всё получилось, когда один раз я ее вызыывал, аа второй раз делал так:

     With Printer.Canvas do
       Begin
       Brush.Style := bsClear;
       SetStretchBltMode(Handle, HALFTONE);
       StretchBlt(Handle, X, Y, W, W,
         b1.Canvas.Handle, 0, 0,  b1.Width, b1.Height, SRCCOPY);
       End; //bith

     b1.Free;
     End;


 
TStas ©   (2013-03-28 20:29) [12]

PS Антон, я читал вашу книгу, там есть о "подводных камнях". Может, это один из неописанных?


 
Григорьев Антон ©   (2013-03-28 21:40) [13]

Рисунок, который вы создаёте в этой функции, имеет формат pfDevice. Рисунок в этом формате оптимизирован для вывода на конкретном устройстве (в вашем случае - на дисплее), и результат вывода такой картинки на другое устройство непредсказуем. Для вывода на принтер лучше использовать форматы, независимые от устройства. После вызова TBitmap.Create вставьте сразу Result.PixelFormat:=pf24bit. Должно помочь.

P.S. В книге всё это есть. Где-то в разделе, посвящённом графике.


 
TStas ©   (2013-03-29 17:47) [14]

Я проблему-то решил, но вставить все равно надо, поскольку на некоторыз принтерах выглядит просто мерзко


 
TStas ©   (2013-03-30 14:13) [15]

Вставил, но лучше е стало.


 
Григорьев Антон ©   (2013-03-30 23:38) [16]

Я не увидел в вашем коде вызова Draw. Покажите пример кода, в котором Draw не срабатывает.

И ещё такой вопрос: почему вы не используете TCanvas.StretchDraw? Зачем вызов api-функции StretchBlt?


 
TStas ©   (2013-03-31 15:45) [17]

Потому, что есть готовая, написанная на ее основе. Она размер вычисляет.
Но что странно: когда не получалось, при одном вызове - все здорово, а при повторном - второй раз не рисуется. :(
Попробую со StretchDraw



Страницы: 1 вся ветка

Текущий архив: 2014.02.02;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.006 c
2-1364484308
ch_dark
2013-03-28 19:25
2014.02.02
помогите не могу разобраться с меню


2-1364333792
znt
2013-03-27 01:36
2014.02.02
Вероятность победы + random


15-1376669029
Потапов А.В.
2013-08-16 20:03
2014.02.02
Посоветуйте планшет на андроид


15-1376365256
Ротанг
2013-08-13 07:40
2014.02.02
Как настроить почту в Windows 8


2-1364555765
ragnar
2013-03-29 15:16
2014.02.02
импорт в БД