powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Print Common Dialog API
7 сообщений из 7, страница 1 из 1
Print Common Dialog API
    #37258198
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятно что Googl-ом пользоваться умею и примеров там есть.
Опыт работы с Open/Save как бы не хилый (более чем) в плане всяких хуков и кастомизаций.
Для печати использую следующее:
Код: plaintext
    ShellExecute  0 , "printto", FileName, Chr( 34 ) & PrinterName & Chr( 34 ),  0 , SW_SHOWNORMAL
На текущий момент используется "диалог" собственного производства, позволяющий выбрать PrinterName.
Но как все подобные "самопалы" что-то неважнецки он выглядит, как ныне подумалось.
Т.е. хочу использовать стандартный.

Но потенциальная проблема кот. не глядя видится такова:
Мне от этого диалога надо получить
1) только имя принтера
Ну может быть
2) (не уверен что мне это надо) номера страниц, ибо природа печатаемых файлов известна и вычленить страницы возможно

Хочу сказать что опции типа:
Диапазон страниц
Число копий
Печать в файл
Кнопка Настройка и все что за ней стоит

мне в этом диалоге не нужны, вредны и только будут сбивать с толку, ибо все равно через printto эти параметры не передашь, посему красиво было бы

1) чего-то задизейблить
2) чего-то скрыть

Т.е. тыкнул в принтер и нажал печать.

Нет ли достойных примеров с учетом пожелания свести к примитиву органы данного диалога?
...
Рейтинг: 0 / 0
Print Common Dialog API
    #37259263
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, допустим
PrintDialog.flags = ..or PD_NOSELECTION -тупо установить All Pages без возможности выбора
Or PD_HIDEPRINTTOFILE/PD_DISABLEPRINTTOFILE -скрыть/disable Print to File

Or PD_COLLATE -показывает картинку "11/22/33" с копиями но почему-то без галки Collate(разобрать по копиям)

но при этом
or PD_USEDEVMODECOPIESANDCOLLATE/PD_USEDEVMODECOPIES -культурный тон (число копий на основании драйвера принтера) эту картинку Collate опять убирает, а для красоты пусть была бы лучше.

Потом, чего делать с Preferences(настройки принтера). Ну допустим, через хук я разберусь и ее задизейблю (c Open/Save такие трюки удавались, здесь пока не пробовал).
А надо ли это делать?
Дмитрий77мне в этом диалоге не нужны, вредны и только будут сбивать с толку, ибо все равно через printto эти параметры не передашь,
А может все-таки как то "передашь"?
Если я правильно понимаю,

Public PrintDialog As PRINTDLGS
ShowPrinter = PrintDlg(PrintDialog)
1)возвращает структуру PRINTDLGS
2) + настройки принтера, которые я ручками накурочил через этот диалог через "Preferences" (так понимаю отличаются от дефолтных кот. в Start->Settings->Printer and Faxes), например Портрет/Альбом, разрешение и т.п.

Т.е. как всю эту "временную ерунду" передать в Printto (для данного сеанса печати порожденного этим диалогом) без изменения глобальных настроек принтера? (в ShellExecute(Filename, PrintTo))
Использую PrintTo, потому что позволяет указать имя принтера и эксплуатирует приложение ассоциированное с типом файла, но не из VB-PictureBox-а же глючности печатать?
Есть еще ключ ShellExecute(Filename, Print )) без "to"
но там имя принтера даже не укажешь похоже.

Пока я даже не понимаю как получить PrinterName (as String)

Наткнулся еще на
ПРАКТИЧЕСКОЕ руководство: Изменение и управление печатью диалоговых из Visual Basic
но не уверен что это правильный путь - использовать доп. библиотеку пусть и не vb-control, даже не пробовал пока.

Помогите кто чем может. Пока бардак в голове.
...
Рейтинг: 0 / 0
Print Common Dialog API
    #37260733
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 Пока я даже не понимаю как получить PrinterName (as String)
Пока бардак в голове.
Ну, насколько сумел разобрался.
http://www.vbmonster.com/Uwe/Forum.aspx/vb-controls/6238/Print-API-instead-of-Common-Dialog-VB6 Задизейблил/украсил как смог, т.е. насколько позволяют флаги.
Код: plaintext
    the_PrintDlg.flags = PD_NOSELECTION Or PD_HIDEPRINTTOFILE Or PD_NOPAGENUMS Or PD_USEDEVMODECOPIES
Окончательный вариант прилагается.
Дмитрий77Потом, чего делать с Preferences(настройки принтера). Ну допустим, через хук я разберусь и ее задизейблю (c Open/Save такие трюки удавались, здесь пока не пробовал)..
Разобраться то разобрался.
http://www.vbmonster.com/Uwe/Forum.aspx/basic/5116/Problem-with-Print-Dialog-Hook-functions-in-VB-6
Но я то хочу UseExDialog = true
а при попытке PD_ENABLEPRINTHOOK он гад делает UseExDialog = false
http://www.windowsdevelop.com/windows-forms-general/useexdialog-when-using-a-printhookproc-6250.shtml
При UseExDialog = false можно через хук конечно задизейблить
ID_PROPERTIES = &H401
Но...короче отказался от этого в пользу красивого окна.
Анализ майкрософтовских даже родных прог показывает, что окно Print используется настолько "некорректно" : лишние настройки, неизменение реальных параметров при тек. печати и т.п., что на это можно забить.

Дмитрий77 А может все-таки как то "передашь"? .
Бог с ним с параметрами. Для быстрой печати документа целиком + красивое стандартное окно Print с выбором принтера то что сделал вполне пригодно. Если уж user хочет перевернутых отдельных страниц в формате B333, пусть открывает в приложении и оттуда печатает.

Дмитрий77Помогите кто чем может. .
Да-с..все сам, все сам. Обидно что нет грамотных людей по данным вопросам. Не в первый раз кстати данную тематику затрагиваю.
...
Рейтинг: 0 / 0
Print Common Dialog API
    #37260743
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

>Да-с..все сам, все сам.
Не смог я уловить Вашу беду
Лично у меня печатается так - всё выделил, нажал на клаве кнопки Контрол пюс цифру по количеству копий и всё, дело в шляпе
Что каксается принтера, печатается на том, на котором последний раз печаталось
А кстати когда ни один не подключен как узнать??
...
Рейтинг: 0 / 0
Print Common Dialog API
    #37260831
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ципихович ЭндрюА кстати когда ни один не подключен как узнать??
Если вы мой код посмотрите + немного раскомментируете + соседняя тема,
то все сможете посмотреть через диалог + настроить все параметры печати через диалог.
Ну, с флагами поиграйтесь, я там "заблокировал" все что можно было.
в the_DevMode будет содержаться все настроенное вами: ориентация, копии, страницы и т.п.
Имя выбранного принтера лучше брать из LongPrinterName (поддержка имен >32)
И можете это the_DevMode экспортировать в объект принтер, или чего у вас там.

Но это если ВАШЕ ПРИЛОЖЕНИЕ САМО ЗАНИМАЕТСЯ печатью.

У меня приложение само ПЕЧАТЬЮ НЕ ЗАНИМАЕТСЯ. А "паразитирует" на системе, т.е. "приложении, с которым ассоциирован данный тип файла". Например для pdf это обычно Adobe Reader, для картинок "Программа просмотра изображений/фотоальбом", для doc это будет ваш любимый Word.
Поэтому я и использую printto, что универсально. Хотя есть ограничения: если так печатать html, то окно диалога принтера будет выведено дважды.

Т.е. я в идеале хочу передать the_DevMode что называется в printo и в ответственное за это приложение (я заранее не знаю какое именно), понятно что приложения разные и я не могу рассчитывать на корректное использование приложением всего набора the_DevMode, но хочется как-то таки передать текущий the_DevMode в неизвестное приложение но стандартным механизмом.

Теоретически, я могу наклепать кучу затычек:
например,
-менять глобальную структуру the_DevMode на временную, потом делать ShellExecute и возвращать структуру назад.
-запускать ShellExecute <N> раз по числу копий
-вычленять отдельные страницы через GDI+/GS и т.п.
-предварительно "переворачивать" в альбом через GDI+
-печатать VB+GDI (видел пример Бенедикта, но не стал смотреть даже, ибо кто-то сказал что печатает не всегда хорошо и долго...а это вполне ожидаемо в самопальных vb-конструкциях печати)
Но это все детский сад типа временной подмены дефолтного принтера через Printers
Это неСИСТЕМНЫЙ подход, куча рутины и куча глюков, которые себя обязательно выдадут в какой-то мелочи/частном случае. Это при километрах кода и пачках модулей.
...
Рейтинг: 0 / 0
Print Common Dialog API
    #37260844
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

где Копи мемори брать??
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Private Type DEVMODE
    dmOrientation As Integer
    dmPaperSize As Integer
    dmPaperLength As Integer
    dmPaperWidth As Integer
End Type

Sub qq()
'
'To handle long printer names - Обрабатывать длинные имена принтера

        CopyMemory the_DevName, ByVal lpDevName, Len(the_DevName)
        LongPrinterName = Mid$(the_DevName.extra, _
          the_DevName.wDeviceOffset - the_DevName.wDriverOffset +  1 )
        LongPrinterName = Left$(LongPrinterName, _
          InStr(LongPrinterName, Chr$( 0 )) -  1 )


End Sub
если я правильно понял из соседнего топика???
...
Рейтинг: 0 / 0
Print Common Dialog API
    #37260865
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ципихович Эндрюгде Копи мемори брать??
Вы в своем репертуаре? Ее надо декларировать.
А вообще-то в приложенном выше рабочем примере все есть
+ссылки на первоисточники заметьте (где кода еще больше, но мне пока не надо).
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Print Common Dialog API
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]