
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

