Trucos Mostrar diálogo de impresoras mediante API (modificar valores por defecto)

Enviado por Cristóbal Tello ( ctg@tinet.fut.es )

Para mostrar el diálogo de impresoras, pudiendo mostrar valores distintos a
los que tenga por defecto la impresora :

En un módulo :

Public Const CCHDEVICENAME = 32 ' Nombre de la impresora
Public Const CCHFORMNAME = 32 ' Tipo de papel cargado en la impresora
Public Const DM_ORIENTATION = &H1& ' Flag para la orientación
Public Const DMORIENT_LANDSCAPE = 2 ' Horizontal
Public Const DMORIENT_PORTRAIT = 1 ' Vertical
Public Const DMPAPER_A3 = 8 ' A3 297 x 420 mm
Public Const DMPAPER_A4 = 9 ' A4 210 x 297 mm
Public Const DMPAPER_A5 = 11 ' A5 148 x 210 mm
Public Const DM_PAPERSIZE = &H2&
Public Const DM_PRINTQUALITY = &H400&
Public Const DMBIN_MANUAL = 4
Public Const DMRES_HIGH = (-4)
Public Const DM_COLOR = &H800
Public Const DMCOLOR_COLOR = 2
Public Const GMEM_MOVEABLE = &H2
Public Const GMEM_ZEROINIT = &H40
'
'Estructura DEVMODE
'
Type DEVMODE
        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
'
'Estructura PRINTDLG
'
Type PRINTDLG
        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
'
'Modos para PRINTDLG
'
Public Enum EPRINTDLG
    PD_ALLPAGES = &H0
    PD_SELECTION = &H1
    PD_PAGENUMS = &H2
    PD_NOSELECTION = &H4
    PD_NOPAGENUMS = &H8
    PD_COLLATE = &H10
    PD_PRINTTOFILE = &H20
    PD_PRINTSETUP = &H40
    PD_NOWARNING = &H80
    PD_RETURNDC = &H100
    PD_RETURNIC = &H200
    PD_RETURNDEFAULT = &H400
    PD_SHOWHELP = &H800
    PD_ENABLEPRINTHOOK = &H1000
    PD_ENABLESETUPHOOK = &H2000
    PD_ENABLEPRINTTEMPLATE = &H4000
    PD_ENABLESETUPTEMPLATE = &H8000
    PD_ENABLEPRINTTEMPLATEHANDLE = &H10000
    PD_ENABLESETUPTEMPLATEHANDLE = &H20000
    PD_USEDEVMODECOPIES = &H40000
    PD_USEDEVMODECOPIESANDCOLLATE = &H40000
    PD_DISABLEPRINTTOFILE = &H80000
    PD_HIDEPRINTTOFILE = &H100000
    PD_NONETWORKBUTTON = &H200000
End Enum
'
'Funciones API
'
Declare Function PrintDlgAPI Lib "comdlg32.dll" Alias "PrintDlgA" _
(pPrintdlg As PRINTDLG) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long

Y para mostrar el diálogo :

Dim pd As PRINTDLG
Dim dvmode As DEVMODE, pDevMode As Long
Dim res As Long
Dim ShowPrintDlg As Boolean
'
dvmode.dmDeviceName = Printer.DeviceName 'Nombre del dispositivo
dvmode.dmFields = DM_ORIENTATION Or DM_PAPERSIZE 'Campos a retocar
dvmode.dmOrientation = DMORIENT_LANDSCAPE 'Horizontal
dvmode.dmPaperSize = DMPAPER_A5 'Tamaño A5
dvmode.dmSize = Len(dvmode)
'
'Todo para poner la estructura dmmode en pd.hDevMode
'
pd.hDevMode = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, Len(dvmode))
pDevMode = GlobalLock(pd.hDevMode)
CopyMemory ByVal pDevMode, dvmode, Len(dvmode)
res = GlobalUnlock(pd.hDevMode)
'
pd.Flags = PD_DISABLEPRINTTOFILE 'Desactivo imprimir en fichero
pd.LStructSize = Len(pd) 'Longitud de la estructura
ShowPrintDlg = PrintDlgAPI(pd) 'Mostramos el diálogo
'Si el usuario pulsa Cancelar ShowPrintDlg será False
If ShowPrintDlg then
   'imprimir ....
else
   '
End if



Trucos Trucos

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com