configuration de l'impression avec CommonDialog

Le
annie52
Bonjour,
Je dois mettre à jour un programme qui utilise l'objet Printer pour imprimer
et CommonDialog pour configurer l'imprimante (Microsoft CommonDialog Control
6.0(SP6) qui s'appelle COMDLG32.ocx.
Ceci fonctionnait parfaitement avec Windows 95.
Avec Windows XP et Windows 2000 , une imprimante Xerox, une imprimante HP,
une imprimante Dell, le choix de l'imprimante se fait bien mais l'orientation
paysage/portrait et le format de papier A3/A4 n'est pas transmis à l'objet
Printer.
Il semble que les différents driver d'imprimantes ne soient pas en cause ou
alors pourquoi les 3?
Je force donc printer.orientation et printer.papersize avec les valeurs
désirées.
Mais la question que je vous pose est: existe-t-il une autre solution (mise
à jour de Comdlg32.ocx par exemple)?
Merci pour votre aide.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
LE TROLL
Le #15414491
Bonjour,

Lors de l'empaquetage, ne te dit-il pas que les versions ne sont pas bonnes,
ou que les fichiers de dépendance n'y sont pas ???

--
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"annie52" news:
Bonjour,
Je dois mettre à jour un programme qui utilise l'objet Printer pour
imprimer
et CommonDialog pour configurer l'imprimante (Microsoft CommonDialog
Control
6.0(SP6) qui s'appelle COMDLG32.ocx.
Ceci fonctionnait parfaitement avec Windows 95.
Avec Windows XP et Windows 2000 , une imprimante Xerox, une imprimante HP,
une imprimante Dell, le choix de l'imprimante se fait bien mais
l'orientation
paysage/portrait et le format de papier A3/A4 n'est pas transmis à l'objet
Printer.
Il semble que les différents driver d'imprimantes ne soient pas en cause
ou
alors pourquoi les 3?
Je force donc printer.orientation et printer.papersize avec les valeurs
désirées.
Mais la question que je vous pose est: existe-t-il une autre solution
(mise
à jour de Comdlg32.ocx par exemple)?
Merci pour votre aide.


Jacques93
Le #15414481
Bonjour Annie52,
annie52 a écrit :
Bonjour,
Je dois mettre à jour un programme qui utilise l'objet Printer pour imprimer
et CommonDialog pour configurer l'imprimante (Microsoft CommonDialog Control
6.0(SP6) qui s'appelle COMDLG32.ocx.
Ceci fonctionnait parfaitement avec Windows 95.
Avec Windows XP et Windows 2000 , une imprimante Xerox, une imprimante HP,
une imprimante Dell, le choix de l'imprimante se fait bien mais l'orientation
paysage/portrait et le format de papier A3/A4 n'est pas transmis à l'objet
Printer.
Il semble que les différents driver d'imprimantes ne soient pas en cause ou
alors pourquoi les 3?
Je force donc printer.orientation et printer.papersize avec les valeurs
désirées.
Mais la question que je vous pose est: existe-t-il une autre solution (mise
à jour de Comdlg32.ocx par exemple)?
Merci pour votre aide.



Je n'ai pas trop pratiqué 95, par contre sous 2000/XP il y a une
distinction (pas toujours très nette) entre le choix de l'imprimante (et
de certains paramètres), et la mise en page.

On peut récupérer l'orientation dans CommonDialog1.Orientation et
l'affecter à l'objet Printer. Mais même si on affiche le dialogue de
mise en page avec

CommonDialog1.Flags = cdlPDPrintSetup

qui affiche bien le choix de type de papier, on ne peut pas le
récupérer, en tout cas, pas de manière directe.

Une solution est de se passer de COMDLG32.ocx, et de travailler
directement avec ComDlg32.dll. Voici un code adapté de ce qu'on trouve
sur la toile et qui est opérationnel pour l'orientation et le type de
papier :

' ---------------------------------------------------------------------
Option Explicit

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 Const CCHDEVICENAME = 32
Private Const CCHFORMNAME = 32

Private Const DM_ORIENTATION = &H1&
Private Const DM_DUPLEX = &H1000&

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 Long
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency 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 Const GMEM_MOVEABLE = &H2
Private Const GMEM_ZEROINIT = &H40

Private Declare Function GlobalAlloc Lib "kernel32" _
(ByVal wFlags As Long, ByVal dwBytes As Long) 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 GlobalFree Lib "kernel32" _
(ByVal hMem As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function PrintDialog Lib "comdlg32.dll" Alias _
"PrintDlgA" (pPrintdlg As PRINTDLG_TYPE) As Long
Private Declare Function ResetDC Lib "gdi32" Alias "ResetDCA" _
(ByVal hdc As Long, lpInitData As DEVMODE_TYPE) As Long


Public Sub ShowPrinter(frmOwner As Form, Optional PrintFlags As Long)
Dim PrintDlg As PRINTDLG_TYPE
Dim DevModePrn 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
' Positionne les propriétés Orientation et Duplex
With DevModePrn
.dmDeviceName = Printer.DeviceName
.dmSize = Len(DevModePrn)
.dmFields = DM_ORIENTATION Or DM_DUPLEX
.dmPaperWidth = Printer.Width
.dmOrientation = Printer.Orientation
.dmPaperSize = Printer.PaperSize
.dmDuplex = Printer.Duplex
End With
On Error GoTo 0

' Allocation memoire pour l'initialisation de la structure hDevMode
' et copie de ces paramètres dans ce bloc memoire
PrintDlg.hDevMode = GlobalAlloc(GMEM_MOVEABLE Or _
GMEM_ZEROINIT, Len(DevModePrn))
lpDevMode = GlobalLock(PrintDlg.hDevMode)
If lpDevMode > 0 Then
CopyMemory ByVal lpDevMode, DevModePrn, Len(DevModePrn)
bReturn = GlobalUnlock(PrintDlg.hDevMode)
End If

' Affectation des pilote, périphérique, et port
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

' Allocation memoire pour l'initialisation de la structure hDevName
' et copie de ces paramètres dans ce bloc memoire
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

' Appel de la boite de dialogue Imprimer
If PrintDialog(PrintDlg) <> 0 Then
' Au retour : récupération de la structure DevName
lpDevName = GlobalLock(PrintDlg.hDevNames)
CopyMemory DevName, ByVal lpDevName, 45
bReturn = GlobalUnlock(lpDevName)
GlobalFree PrintDlg.hDevNames

' Puis récupération de DevMode et assignation de l'objet Printer
lpDevMode = GlobalLock(PrintDlg.hDevMode)
CopyMemory DevModePrn, ByVal lpDevMode, Len(DevModePrn)
bReturn = GlobalUnlock(PrintDlg.hDevMode)
GlobalFree PrintDlg.hDevMode
NewPrinterName = UCase$(Left(DevModePrn.dmDeviceName, _
InStr(DevModePrn.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
' Assignation des propriétés de l'objet Printer
ResetDC Printer.hdc, DevModePrn
Printer.Copies = DevModePrn.dmCopies
Printer.Duplex = DevModePrn.dmDuplex
Printer.Orientation = DevModePrn.dmOrientation
Printer.PaperSize = DevModePrn.dmPaperSize
'***THE NEXT LINE DOES NOT TAKE EFFECT!***
Printer.PrintQuality = DevModePrn.dmPrintQuality
Printer.ColorMode = DevModePrn.dmColor
Printer.PaperBin = DevModePrn.dmDefaultSource
On Error GoTo 0
End If
End Sub

Private Sub Command1_Click()
ShowPrinter Me
With Printer
MsgBox "Imprimante : " & .DeviceName & vbCrLf & _
"Orientation : " & .Orientation & vbCrLf & _
"Papier : " & .PaperSize
End With
End Sub


--
Cordialement,

Jacques.
annie52
Le #15413411
Non, pas de message particulier.

"LE TROLL" a écrit :

Bonjour,

Lors de l'empaquetage, ne te dit-il pas que les versions ne sont pas bonnes,
ou que les fichiers de dépendance n'y sont pas ???

--
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"annie52" news:
> Bonjour,
> Je dois mettre à jour un programme qui utilise l'objet Printer pour
> imprimer
> et CommonDialog pour configurer l'imprimante (Microsoft CommonDialog
> Control
> 6.0(SP6) qui s'appelle COMDLG32.ocx.
> Ceci fonctionnait parfaitement avec Windows 95.
> Avec Windows XP et Windows 2000 , une imprimante Xerox, une imprimante HP,
> une imprimante Dell, le choix de l'imprimante se fait bien mais
> l'orientation
> paysage/portrait et le format de papier A3/A4 n'est pas transmis à l'objet
> Printer.
> Il semble que les différents driver d'imprimantes ne soient pas en cause
> ou
> alors pourquoi les 3?
> Je force donc printer.orientation et printer.papersize avec les valeurs
> désirées.
> Mais la question que je vous pose est: existe-t-il une autre solution
> (mise
> à jour de Comdlg32.ocx par exemple)?
> Merci pour votre aide.





annie52
Le #15413401
Merci beaucoup Jacques, je ne connaissais pas Comdlg32.dll

"Jacques93" a écrit :

Bonjour Annie52,
annie52 a écrit :
> Bonjour,
> Je dois mettre à jour un programme qui utilise l'objet Printer pour imprimer
> et CommonDialog pour configurer l'imprimante (Microsoft CommonDialog Control
> 6.0(SP6) qui s'appelle COMDLG32.ocx.
> Ceci fonctionnait parfaitement avec Windows 95.
> Avec Windows XP et Windows 2000 , une imprimante Xerox, une imprimante HP,
> une imprimante Dell, le choix de l'imprimante se fait bien mais l'orientation
> paysage/portrait et le format de papier A3/A4 n'est pas transmis à l'objet
> Printer.
> Il semble que les différents driver d'imprimantes ne soient pas en cause ou
> alors pourquoi les 3?
> Je force donc printer.orientation et printer.papersize avec les valeurs
> désirées.
> Mais la question que je vous pose est: existe-t-il une autre solution (mise
> à jour de Comdlg32.ocx par exemple)?
> Merci pour votre aide.

Je n'ai pas trop pratiqué 95, par contre sous 2000/XP il y a une
distinction (pas toujours très nette) entre le choix de l'imprimante (et
de certains paramètres), et la mise en page.

On peut récupérer l'orientation dans CommonDialog1.Orientation et
l'affecter à l'objet Printer. Mais même si on affiche le dialogue de
mise en page avec

CommonDialog1.Flags = cdlPDPrintSetup

qui affiche bien le choix de type de papier, on ne peut pas le
récupérer, en tout cas, pas de manière directe.

Une solution est de se passer de COMDLG32.ocx, et de travailler
directement avec ComDlg32.dll. Voici un code adapté de ce qu'on trouve
sur la toile et qui est opérationnel pour l'orientation et le type de
papier :

' ---------------------------------------------------------------------
Option Explicit

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 Const CCHDEVICENAME = 32
Private Const CCHFORMNAME = 32

Private Const DM_ORIENTATION = &H1&
Private Const DM_DUPLEX = &H1000&

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 Long
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency 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 Const GMEM_MOVEABLE = &H2
Private Const GMEM_ZEROINIT = &H40

Private Declare Function GlobalAlloc Lib "kernel32" _
(ByVal wFlags As Long, ByVal dwBytes As Long) 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 GlobalFree Lib "kernel32" _
(ByVal hMem As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function PrintDialog Lib "comdlg32.dll" Alias _
"PrintDlgA" (pPrintdlg As PRINTDLG_TYPE) As Long
Private Declare Function ResetDC Lib "gdi32" Alias "ResetDCA" _
(ByVal hdc As Long, lpInitData As DEVMODE_TYPE) As Long


Public Sub ShowPrinter(frmOwner As Form, Optional PrintFlags As Long)
Dim PrintDlg As PRINTDLG_TYPE
Dim DevModePrn 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
' Positionne les propriétés Orientation et Duplex
With DevModePrn
.dmDeviceName = Printer.DeviceName
.dmSize = Len(DevModePrn)
.dmFields = DM_ORIENTATION Or DM_DUPLEX
.dmPaperWidth = Printer.Width
.dmOrientation = Printer.Orientation
.dmPaperSize = Printer.PaperSize
.dmDuplex = Printer.Duplex
End With
On Error GoTo 0

' Allocation memoire pour l'initialisation de la structure hDevMode
' et copie de ces paramètres dans ce bloc memoire
PrintDlg.hDevMode = GlobalAlloc(GMEM_MOVEABLE Or _
GMEM_ZEROINIT, Len(DevModePrn))
lpDevMode = GlobalLock(PrintDlg.hDevMode)
If lpDevMode > 0 Then
CopyMemory ByVal lpDevMode, DevModePrn, Len(DevModePrn)
bReturn = GlobalUnlock(PrintDlg.hDevMode)
End If

' Affectation des pilote, périphérique, et port
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

' Allocation memoire pour l'initialisation de la structure hDevName
' et copie de ces paramètres dans ce bloc memoire
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

' Appel de la boite de dialogue Imprimer
If PrintDialog(PrintDlg) <> 0 Then
' Au retour : récupération de la structure DevName
lpDevName = GlobalLock(PrintDlg.hDevNames)
CopyMemory DevName, ByVal lpDevName, 45
bReturn = GlobalUnlock(lpDevName)
GlobalFree PrintDlg.hDevNames

' Puis récupération de DevMode et assignation de l'objet Printer
lpDevMode = GlobalLock(PrintDlg.hDevMode)
CopyMemory DevModePrn, ByVal lpDevMode, Len(DevModePrn)
bReturn = GlobalUnlock(PrintDlg.hDevMode)
GlobalFree PrintDlg.hDevMode
NewPrinterName = UCase$(Left(DevModePrn.dmDeviceName, _
InStr(DevModePrn.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
' Assignation des propriétés de l'objet Printer
ResetDC Printer.hdc, DevModePrn
Printer.Copies = DevModePrn.dmCopies
Printer.Duplex = DevModePrn.dmDuplex
Printer.Orientation = DevModePrn.dmOrientation
Printer.PaperSize = DevModePrn.dmPaperSize
'***THE NEXT LINE DOES NOT TAKE EFFECT!***
Printer.PrintQuality = DevModePrn.dmPrintQuality
Printer.ColorMode = DevModePrn.dmColor
Printer.PaperBin = DevModePrn.dmDefaultSource
On Error GoTo 0
End If
End Sub

Private Sub Command1_Click()
ShowPrinter Me
With Printer
MsgBox "Imprimante : " & .DeviceName & vbCrLf & _
"Orientation : " & .Orientation & vbCrLf & _
"Papier : " & .PaperSize
End With
End Sub


--
Cordialement,

Jacques.



Publicité
Poster une réponse
Anonyme