+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 5 su 5

Uso della funzione API PrintDlg

  1. #1
    L'avatar di ganzos
    ganzos non è in linea Scolaretto
    Private Declare Function PrintDlg Lib "comdlg32.dll" Alias "PrintDlgA" (pPrintdlg As PRINTDLGSTRUC) As Long
    
    Qualcuno può indirizzarmi all'uso dettagliato di questa funzione?
    Ho trovato un progetto d'esempio, ma non riesco a capirlo.
    Ho la sensazione che il tutto potrebbe essere molto più semplice.
    Mi basterebbe anche solo conoscere il significato dei vari attributi da attribuire alla funzione.
    Grazie

    Lambert

  2. #2
    Riempire correttamente la struttura non è cosa semplice,ma non avevi già risolto?
    Non pensare che usando quell'api setti direttamente le proprietà di stampa!
    Per fare quello che vuoi te l'operazione è molto complicata,in poche parole semplici semplici devi passare l'handle dell'oggetto printer ad un'api che lo userà per settarci direttamente le proprietà di stampa,ma purtroppo l'operazione non è cosi banale, fatti una ricerca sul motore di ricerca tipo "How to setting property printer with api visual basic 6"
    ℹ️ Leggi di più su vbExtreme ...

  3. #3
    L'avatar di ganzos
    ganzos non è in linea Scolaretto
    Sì, per quel che mi serve, ho risolto con il CommonDialog che mi hai indicato.
    Però, osservando che certe proprietà non le attiva, per esempio la stampa da pag a pag, vorrei usare direttamente la funzione su cui si basa Windows quando ci mostra la CommonDialog.
    Sì, ho capito che il CommonDialog non setta direttamente la stampante, ma serve solo per dichiarare le proprietà di stampa da passare, poi, all'oggetto Printer, ed, appunto, vorrei riuscire a poter dichiarare TUTTO ciò che è visibile in quella finestra.
    Ho trovato un progetto che fa uso dell'API PrintDlg ed in cui la funzione "da pag a pag" è attivata, però non riesco a comprendere il funzionamento del codice.

    Un'altra cosa.
    Mi chiedo come facciano i programmi commerciali, tipo Word ed altro, ad attivare certe proprietà visibili sulla CommonDialog e che non sono proprietà di Printer, ma proprie di quella stampante.
    Per esempio le Canon offrono l'opzione di anteprima di stampa.
    La CommonDialog lanciata sulla Canon tale funzione la mostra, ma come si fa a renderla attiva?

  4. #4
    Per usare la proprietà pagina a pagina devi settare la proprietà commondialog1.flags non mi ricordo a quale valore forse 32 devi cercare le costanti TD_ se non ricordo male.
    La printdlg è uguale alla commondialog solo che riempe la struttura DEVMODE con i parametri selezionati.Mi ricordo però che c'è un metodo per passare la printer.hdc ad una api che setta direttamente le proprietà di stampa,proprio quello che vuoi fare tu....ora provo a cercarlo anche se non ho molto tempo,domani alle 3 parto per le vacanze!!!!!
    ℹ️ Leggi di più su vbExtreme ...

  5. #5
    Ho trovato questo ma rimane simile al commondialog....
    Option Explicit
    
    Private Const CCHDEVICENAME = 32
    Private Const CCHFORMNAME = 32
    Private Const GMEM_MOVEABLE = &H2
    Private Const GMEM_ZEROINIT = &H40
    Private Const DM_DUPLEX = &H1000&
    Private Const DM_ORIENTATION = &H1&
    Private Const PD_PRINTSETUP = &H40
    Private Const PD_DISABLEPRINTTOFILE = &H80000
    
    Private Type PRINTDLG_TYPE
        lStructSize As Long
        hwndOwner As Long
        hDevMode As Long
        hDevNames As Long
        hDC As Long
        flags As Long
        nFromPage As Integer
        nToPage As Integer
        nMinPage As Integer
        nMaxPage As Integer
        nCopies As Integer
        hInstance As Long
        lCustData As Long
        lpfnPrintHook As Long
        lpfnSetupHook As Long
        lpPrintTemplateName As String
        lpSetupTemplateName As String
        hPrintTemplate As Long
        hSetupTemplate As Long
    End Type
    
    Private Type DEVNAMES_TYPE
        wDriverOffset As Integer
        wDeviceOffset As Integer
        wOutputOffset As Integer
        wDefault As Integer
        extra As String * 100
    End Type
    
    Private Type DEVMODE_TYPE
        dmDeviceName As String * CCHDEVICENAME
        dmSpecVersion As Integer
        dmDriverVersion As Integer
        dmSize As Integer
        dmDriverExtra As Integer
        dmFields As Long
        dmOrientation As Integer
        dmPaperSize As Integer
        dmPaperLength As Integer
        dmPaperWidth As Integer
        dmScale As Integer
        dmCopies As Integer
        dmDefaultSource As Integer
        dmPrintQuality As Integer
        dmColor As Integer
        dmDuplex As Integer
        dmYResolution As Integer
        dmTTOption As Integer
        dmCollate As Integer
        dmFormName As String * CCHFORMNAME
        dmUnusedPadding As Integer
        dmBitsPerPel As Integer
        dmPelsWidth As Long
        dmPelsHeight As Long
        dmDisplayFlags As Long
        dmDisplayFrequency As Long
    End Type
    
    Private Declare Function PrintDialog Lib "comdlg32.dll" Alias "PrintDlgA" (pPrintdlg As PRINTDLG_TYPE) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
    Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
    Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
    Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
    Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
    
    Public Sub ShowPrinter(frmOwner As Form, Optional PrintFlags As Long)
        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 = frmOwner.hWnd
    
        PrintDlg.flags = PrintFlags
        On Error Resume Next
            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
    
            On Error Resume Next
                Printer.Copies = DevMode.dmCopies
                Printer.Duplex = DevMode.dmDuplex
                Printer.Orientation = DevMode.dmOrientation
                Printer.PaperSize = DevMode.dmPaperSize
                Printer.PrintQuality = DevMode.dmPrintQuality
                Printer.ColorMode = DevMode.dmColor
                Printer.PaperBin = DevMode.dmDefaultSource
            On Error GoTo 0
        End If
    End Sub
    
    
    Private Sub Form_Load()
        ShowPrinter Me
        Printer.Print "CIAIIIIIII"
        Printer.EndDoc
    End Sub
    
    ℹ️ Leggi di più su vbExtreme ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Risposte: 3
    Ultimo Post: 26-08-2017, 05:57
  2. corrispettivo della funzione VALORE in VBA?
    Da caracalla nel forum Microsoft Access
    Risposte: 10
    Ultimo Post: 25-03-2011, 12:06
  3. funzione giorni della settimana
    Da papy2 nel forum Visual Basic 6
    Risposte: 3
    Ultimo Post: 19-04-2006, 17:19
  4. Utilizzo della funzione Form_Keydown
    Da Cis nel forum Visual Basic 6
    Risposte: 3
    Ultimo Post: 23-03-2006, 18:35
  5. Utilizzo della Funzione KeyAscii
    Da Cis nel forum Visual Basic 6
    Risposte: 2
    Ultimo Post: 22-03-2006, 15:38