печать картинки + BitBlt = не могу

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
evgm00
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 12.02.2007 (Пн) 20:53

печать картинки + BitBlt = не могу

Сообщение evgm00 » 12.03.2007 (Пн) 20:26

привет всем
пытаюсь отправить на принтер

Printer.NewPage
Call BitBlt(Printer.hDC, 0, 0, lWidthPixels, lHeightPixels, PictureBox.hDC, 0, 0, SRCCOPY)
Printer.EndDoc

при любом раскладе lWidthPixels, lHeightPixels хоть в пикселях хоть в мм, при любом Printer.ScaleMode = vbTwips хоть км
картинка печатается маленькая (раз в 4,5 меньше) в левом верхнем углу

что-то я не так делаю - надо чтобы картинка выводилась на весь лист при любом формате бумаги - то есть масштабировалась
пробовал
lWidthPixels = PictureBox.ScaleX(PictureBox.ScaleWidth, PictureBox.ScaleMode, vbPixels)
lHeightPixels = PictureBox.ScaleY(PictureBox.ScaleHeight, PictureBox.ScaleMode, vbPixels)

безрезультатно
что не так и как надо чтобы было так???
заранее спасибо

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.03.2007 (Пн) 20:37

Раз.

tag_warning
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 13.03.2007 (Вт) 7:04

evgm00, у принтера свое разрешение.
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

evgm00
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 12.02.2007 (Пн) 20:53

Сообщение evgm00 » 13.03.2007 (Вт) 8:13

Matew писал(а):evgm00, у принтера свое разрешение.


и как же это узнать???
(плотно с принтерами не работал, так что...)
как вычислить ширину и высоту взависимости от принтера
чтобы она полностью на лист любого формата любого разрешения принтера масштабировалась???

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 13.03.2007 (Вт) 8:20

Используй Printer.ScaleHeight и
Declare Function StretchBlt Lib "gdi32" Alias "StretchBlt" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
вместо BitBlt.
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 13.03.2007 (Вт) 8:22

evgm00, у тебя некорректная смесь API с VB. Или пользуйся только функциями VB или только API (имеется ввиду конкретно твой случай). Для получения свойств принтера пользуйся либо объектом Printer, либо соответствующими функциями API (GetPrinter, GetDeviceCaps и так далее, MSDN рулит).

З.Ы. где-то выкладывал пример, где возвращались все данные о принтере.
Весь мир матрица, а мы в нем потоки байтов!

evgm00
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 12.02.2007 (Пн) 20:53

Сообщение evgm00 » 13.03.2007 (Вт) 9:02

спасибо большое - все получилось
только вот почему-то принтер отпечатывает картинку и следом выплевывает еще одну пустую страницу зачем-то...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 13.03.2007 (Вт) 9:57

код свой покажи, похоже ты дважды отсылаешь печать новой страницы
Весь мир матрица, а мы в нем потоки байтов!

evgm00
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 12.02.2007 (Пн) 20:53

Сообщение evgm00 » 13.03.2007 (Вт) 10:14

вот такая смесь:

Printer.ScaleMode = vbPixels
PictureBox.ScaleMode = vbPixels
Printer.Orientation = vbPRORLandscape
Printer.NewPage
Call StretchBlt(Printer.hdc, 0, 0, Printer.ScaleWidth, Printer.ScaleHeight, PictureBox.hdc, 0, 0, PictureBox.ScaleWidth, PictureBox.ScaleHeight, SRCCOPY)
Printer.EndDoc

evgm00
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 12.02.2007 (Пн) 20:53

Сообщение evgm00 » 13.03.2007 (Вт) 11:02

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

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 13.03.2007 (Вт) 15:12

Printer.NewPage убери
Весь мир матрица, а мы в нем потоки байтов!

evgm00
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 12.02.2007 (Пн) 20:53

Сообщение evgm00 » 15.03.2007 (Чт) 10:25

!Viper! писал(а):Printer.NewPage убери


заремил Printer.NewPage
вообще печать прекратилась
не передается задание на принтер...

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 15.03.2007 (Чт) 10:54

Тебе же сказали, что смешивать класс Printer и API нехорошо.
Замени StretchBlt на Printer.PaintPicture.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

evgm00
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 12.02.2007 (Пн) 20:53

Сообщение evgm00 » 15.03.2007 (Чт) 11:01

BV писал(а):Тебе же сказали, что смешивать класс Printer и API нехорошо.
Замени StretchBlt на Printer.PaintPicture.


ну уж нет уж...
лучше подскажите как заменить все на АПИ
PaintPicture не устроит - кртинка не загружается как изображение откуда-то а рисуется графическими методами (это схема ограмная)
она гораздо бельше видимой области экрана (да еще и n- кол-во листов разбита да еще и со слоями) так что боюсь что тут только АПИ
только надо все правильно отработать

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.03.2007 (Чт) 11:36

evgm00 писал(а):PaintPicture не устроит - кртинка не загружается как изображение откуда-то а рисуется графическими методами

Не вижу логики во фразе.
Нет никакой разницы, откуда что загружается или рисуется.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

evgm00
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 12.02.2007 (Пн) 20:53

Сообщение evgm00 » 15.03.2007 (Чт) 18:26

GSerg писал(а):
evgm00 писал(а):PaintPicture не устроит - кртинка не загружается как изображение откуда-то а рисуется графическими методами

Не вижу логики во фразе.
Нет никакой разницы, откуда что загружается или рисуется.


ну как нет разницы???
(я повторюсь третий раз - нет у меня достаточного опыта печати из VB)
может я неправильно формулирую вопрос... или вообще (что более вероятно) не понимаю сути процесса...
как мне написать PaintPicture???
PictureBox.Picture - инвалид - ее просто нет...
Printer.PaintPicture(PictureBox.Picture, 0, 0, ... и тд)
----------------------
что печатать-то??? откуда ее взять???

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.03.2007 (Чт) 21:49

evgm00 писал(а):как мне написать PaintPicture???
PictureBox.Picture - инвалид - ее просто нет...
Printer.PaintPicture(PictureBox.Picture, 0, 0, ... и тд)
----------------------
что печатать-то??? откуда ее взять???

PictureBox.Image не подойдёт?
Изображение

evgm00
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 12.02.2007 (Пн) 20:53

Сообщение evgm00 » 08.08.2007 (Ср) 8:17

Form1.Picture1 - картинка А3

Printer.ScaleMode = vbPixels
Form1.Picture1.ScaleMode = vbPixels
Printer.Orientation = vbPRORLandscape
Printer.NewPage
Call StretchBlt(Printer.hdc, 0, 0, Printer.ScaleWidth, Printer.ScaleHeight, Form1.Picture1.hdc, 0, 0, Form1.Picture1.ScaleWidth, Form1.Picture1.ScaleHeight, SRCCOPY)
Printer.EndDoc

дома все масштабировалось на А4 и печаталось (только выплевывалась вторая чистая страница)
на работе хоть на А4 хоть на А3 выезжает две чистые страницы почему-то
в чем дело???

заранее спасибо

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.08.2007 (Ср) 8:27

evgm00, посмотри этот кирпич, там есть в том числе и вывод картинки.
Lasciate ogni speranza, voi ch'entrate.

evgm00
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 12.02.2007 (Пн) 20:53

Сообщение evgm00 » 09.08.2007 (Чт) 11:15

посмотрел - попробовал - все равно выходит чистая страница

Dim aaa As New PrintJob
Call aaa.AddImage("ааа", 0, 0, Printer.ScaleWidth, Printer.ScaleHeight, Form1.Picture1.Image)
Call aaa.PrintCurrentJob(Printer)
Printer.EndDoc

хотя дома на др принтере все работает - работает и мой вариант описаный выше и этот класс...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 09.08.2007 (Чт) 11:24

А что за принтер?
Lasciate ogni speranza, voi ch'entrate.

evgm00
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 12.02.2007 (Пн) 20:53

Сообщение evgm00 » 09.08.2007 (Чт) 11:26

может что в настройках самой системы???
и дома и на работе WinXPpro
дома А4 НР DeskJet 3745 естесственно локальный
на работе А3 HP Color LaserJet 5500 PCL 6 (FET18) естесственно сетевой
может не в коде дело совсем???

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 09.08.2007 (Чт) 12:03

Если сделать Printer.Print "Test", то тоже пустая страница выводится? Или проблемы только с растровыми рисунками?
Lasciate ogni speranza, voi ch'entrate.

evgm00
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 12.02.2007 (Пн) 20:53

Сообщение evgm00 » 09.08.2007 (Чт) 12:14

нет "Test" печатает

evgm00
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 12.02.2007 (Пн) 20:53

Сообщение evgm00 » 10.08.2007 (Пт) 9:24

Call Form1.Picture1.Move(0, 0, 16839.9, 11907) - картина А4
Call Form1.Picture2.Move(0, 0, 23814, 16839.9) - картина А3

Call StretchBlt(Form1.Picture1.hdc, 0, 0, Form1.Picture1.Width, Form1.Picture1.height, Form1.Picture2.hdc, 0, 0, Form1.Picture2.Width, Form1.Picture2.height, SRCCOPY)

картинка копируется с масштабированием

Printer.NewPage
Call StretchBlt(Printer.hdc, 0, 0, Printer.Width, Printer.height, Form1.Picture2.hdc, 0, 0, Form1.Picture2.Width, Form1.Picture2.height, SRCCOPY)
Printer.EndDoc

выходит 2 чистые страницы

Printer.Print "Test" работает

Printer.PaintPicture (Form1.Picture2.......
печатает есс-но только то что видно на экране

Form1.Picture2.Picture = LoadPicture("ляляля")
Call StretchBlt(Printer.hdc, 0, 0, Printer.Width, Printer.height, Form1.Picture2.hdc, 0, 0, Form1.Picture2.Width, Form1.Picture2.height, SRCCOPY)

печатает с диким увеличением

и картинка и принтер ScaleMode = vbPixels

помогите подскажите


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот, Majestic-12 [Bot], Yandex-бот и гости: 14

    TopList