![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Draw на канве принтера
TStas © (2013-03-26 21:53:00)Вчера ковырялся с расечатыванием текста с картинками, с удивлением обрнаружил, что метод DRaw получается вызвать один раз. Две картинки рисоваться не хотели. Код не привожу, поскольку в нём много ссылок на другие модули и функции.
Вопрос вот в чём: это просто мой косяк, косяк конкретного драйвера принтера, который, кстати, не родной, или всё так и должно быть?
TStas (2013-03-31 15:45:00) [1]Потому, что есть готовая, написанная на ее основе. Она размер вычисляет.
Но что странно: когда не получалось, при одном вызове - все здорово, а при повторном - второй раз не рисуется. :(
Попробую со StretchDraw
Григорьев Антон (2013-03-30 23:38:00) [2]Я не увидел в вашем коде вызова Draw. Покажите пример кода, в котором Draw не срабатывает.
И ещё такой вопрос: почему вы не используете TCanvas.StretchDraw? Зачем вызов api-функции StretchBlt?
TStas (2013-03-30 14:13:00) [3]Вставил, но лучше е стало.
TStas (2013-03-29 17:47:00) [4]Я проблему-то решил, но вставить все равно надо, поскольку на некоторыз принтерах выглядит просто мерзко
Григорьев Антон (2013-03-28 21:40:00) [5]Рисунок, который вы создаёте в этой функции, имеет формат pfDevice. Рисунок в этом формате оптимизирован для вывода на конкретном устройстве (в вашем случае - на дисплее), и результат вывода такой картинки на другое устройство непредсказуем. Для вывода на принтер лучше использовать форматы, независимые от устройства. После вызова TBitmap.Create вставьте сразу Result.PixelFormat:=pf24bit. Должно помочь.
P.S. В книге всё это есть. Где-то в разделе, посвящённом графике.
TStas (2013-03-28 20:29:00) [6]PS Антон, я читал вашу книгу, там есть о "подводных камнях". Может, это один из неописанных?
TStas (2013-03-28 20:28:00) [7]>Григорьев Антон. Вот! Именно здесь все и дело. Сами картинки создаются функциями. Но потом, чтобы они не выглядели крошечными на печати, они обрабатываются такой вот ф-цией:
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;
Григорьев Антон (2013-03-27 22:33:00) [8]Какой у картинок PixelFormat? Как они создаются?
han_malign (2013-03-27 15:37:00) [9]
> проблемы с драйверами - возможны.
- ну да, видимо разработчики не догадались, что если печатать желтое поверх голубого - должно зеленое получиться...
TStas (2013-03-27 15:32:00) [10]PS Есть убивать картинкe до EndDocmaking, но после Draw она совсем не выводится. НАверное, канва принтера чем-то отличается от канвы битмапа, на которой всегда рисовал. Ведь есть же TCOntrolCanvas и это не тоже самое, что TCanvas, у котрой Handle установлен, как у контрола. Просто про это почему-то в книжках нет. А печатать какртинки было как-то незачем.
Inovet (2013-03-27 15:30:00) [11]Так отключии её.
TStas (2013-03-27 15:28:00) [12]Да через одну картинку тоже косяк. Там что-то сильно не то. Буду разбираться отдельно.
Драйвер неродной - это специально. Принтер зацепили винды, а если с диска, который есть, ставить, то все время висит в памяти прога, которая ждет зачем-то принтер и, самое главное, ей нетепрпится обновиться и какие-то данные осостать в Самсунг. Вообще странно, что вроде солидная фирма пишем хамские программы.
sniknik (2013-03-27 07:56:00) [13]> Код не привожу, поскольку
лень выделить/описать проблему "в чистом" виде. хотя это не проблема в новом проекте вызвать только пару методов DRaw, на что грешишь...
получится "проблема" вот тебе и код без ссылок/связей, не получится вот тебе и ответ на вопрос "чей это косяк".
> Заранее предупреждаю: сами картинки убиваю ПОСЛЕ endDoc.
это, что шантаж? или думаешь тут "засада"? ну так закоментарь "убийство", и попробуй еще раз.
KilkennyCat (2013-03-26 23:42:00) [14]особого запрета вызывать его хоть тыщу раз нету.
проблемы с драйверами - возможны.
твой косяк - тоже возможно.
так не должно быть :)
сбацай все через одну какую-нить штуку, единый битмап, или метафайл, а его уж на принтер.
TStas (2013-03-26 23:33:00) [15]Я вчера, правди сидьно замученный два часа ковырялся. А сегодня подумал, что могу просто не знать, ведь печатал напрямую только таблица, ну, или совсем простой тект, только форматированный. Короче, Draw не пользовался ни разу, вот и спросил. Будет время, потрачу полдня и разберусь. Благо принтера есть два. Дельфи 7.
TStas (2013-03-26 23:30:00) [16]Нет. Рисуется или одна или другая. Но никак две вместе. Заранее предупреждаю: сами картинки убиваю ПОСЛЕ endDoc.
KilkennyCat (2013-03-26 23:23:00) [17]а как узнал? на месте второй картинки увидел надпись "не хочу"?