Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1363698120
NBAH1990
2013-03-19 17:02
2014.02.02
Определение темы текста по словарю.


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


15-1376574390
картман
2013-08-15 17:46
2014.02.02
графики, диаграммы


4-1266967102
leonidus
2010-02-24 02:18
2014.02.02
Проблема установки глобального хука на клавиатуру


15-1376656788
Иксик
2013-08-16 16:39
2014.02.02
Размер обычной советской шахматной доски





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский