Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Печать из RichTextBox


Автор: vfedorov 14.4.2007, 00:01
Привет

Мне известног как печатать содержимое RichTextBox с использованием Printers.

Вопрос: как можно распечатать содержимое  RichTуxtBox с вызовом стандартного диалога печати? т.е. чтобы пользователь смог выбирать различные настройки, принтеры и т.д.

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

Автор: bom 14.4.2007, 01:42
API:
PageSetupDlg
PrintDialog 

Автор: vfedorov 14.4.2007, 11:28
Спасибо за информацию. Пишу такой код

Код

Public Function ShowPrinter(Optional PrintFlags As Long) As Boolean
    Dim PrintDlg As PRINTDLG_TYPE
    Dim DevMode As DEVMODE_TYPE
    Dim DevName As DEVNAMES_TYPE
    Dim lpDevMode As Long, lpDevName As Long
    Dim bReturn As Integer
    Dim objPrinter As Printer, NewPrinterName As String
    PrintDlg.lStructSize = Len(PrintDlg)
    PrintDlg.hwndOwner = cmndlg.ownerform
    PrintDlg.flags = PrintFlags
    DevMode.dmDeviceName = Printer.DeviceName
    DevMode.dmSize = Len(DevMode)
    DevMode.dmFields = DM_ORIENTATION Or DM_DUPLEX
    DevMode.dmPaperWidth = Printer.Width
    DevMode.dmOrientation = Printer.Orientation
    DevMode.dmPaperSize = Printer.PaperSize
    DevMode.dmDuplex = Printer.Duplex
    On Error GoTo 0
    PrintDlg.hDevMode = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, Len(DevMode))
    lpDevMode = GlobalLock(PrintDlg.hDevMode)
    If lpDevMode > 0 Then
        CopyMemory ByVal lpDevMode, DevMode, Len(DevMode)
        bReturn = GlobalUnlock(PrintDlg.hDevMode)
    End If
    With DevName
        .wDriverOffset = 8
        .wDeviceOffset = .wDriverOffset + 1 + Len(Printer.DriverName)
        .wOutputOffset = .wDeviceOffset + 1 + Len(Printer.Port)
        .wDefault = 0
    End With
    With Printer
        DevName.extra = .DriverName & Chr(0) & .DeviceName & Chr(0) & .Port & Chr(0)
    End With
    PrintDlg.hDevNames = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, Len(DevName))
    lpDevName = GlobalLock(PrintDlg.hDevNames)
    If lpDevName > 0 Then
        CopyMemory ByVal lpDevName, DevName, Len(DevName)
        bReturn = GlobalUnlock(lpDevName)
    End If
    If PrintDialog(PrintDlg) <> 0 Then
        lpDevName = GlobalLock(PrintDlg.hDevNames)
        CopyMemory DevName, ByVal lpDevName, 45
        bReturn = GlobalUnlock(lpDevName)
        GlobalFree PrintDlg.hDevNames
        lpDevMode = GlobalLock(PrintDlg.hDevMode)
        CopyMemory DevMode, ByVal lpDevMode, Len(DevMode)
        bReturn = GlobalUnlock(PrintDlg.hDevMode)
        GlobalFree PrintDlg.hDevMode
        NewPrinterName = UCase$(Left(DevMode.dmDeviceName, InStr(DevMode.dmDeviceName, Chr$(0)) - 1))
        If Printer.DeviceName <> NewPrinterName Then
            For Each objPrinter In Printers
                If UCase$(objPrinter.DeviceName) = NewPrinterName Then
                    Set Printer = objPrinter
                End If
            Next
        End If
        Printer.Copies = DevMode.dmCopies
        Printer.Copies = 3
        'Printer.Duplex = DevMode.dmDuplex
        Printer.Orientation = DevMode.dmOrientation
        Printer.PaperSize = DevMode.dmPaperSize
        Printer.PrintQuality = DevMode.dmPrintQuality
        Printer.ColorMode = DevMode.dmColor
        'Printer.PaperBin = DevMode.dmDefaultSource
        PrintRTF Form1.Text1, 500, 300, 300, 300
        On Error GoTo 0
        ShowPrinter = True
    Else
        ShowPrinter = False
    End If
End Function


У меня

1. Неверно отображается в DevMode.dmCopies число копий

2. Невозможно вручную изменить Printer.Copies - выдаёт 308 ошибку

Что бы это могло быть?

И как эту проблему разрешить?

Автор: bom 14.4.2007, 12:28
... Свойство принтера -> Дополнительно ->  Включить дополнительные возможности печати = True

Добавлено через 3 минуты и 14 секунд
Код

DevMode.dmCopies = Printer.Copies

Не вижу. Надо добавить.

Автор: vfedorov 15.4.2007, 10:42

Код

DevMode.dmCopies = Printer.Copies


Да - поменял - положение не изменилось.

... Свойство принтера -> Дополнительно ->  Включить дополнительные возможности печати = True

как это можно сделать программно?

Автор: bom 15.4.2007, 13:55
Цитата(vfedorov @  14.4.2007,  14:28 Найти цитируемый пост)

Код

PrintDlg.hwndOwner = cmndlg.ownerform


Это правильно?  Должно равняться hwnd вызывающей формы (тип long), а не object.
Цитата(vfedorov @  14.4.2007,  14:28 Найти цитируемый пост)

Printer.Copies = DevMode.dmCopies    
Printer.Copies = 3

Надо оставить что то одно.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)