Форум: "Начинающим";
Текущий архив: 2014.02.02;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.002 c