|
-
Aug 26th, 2004, 09:25 AM
#1
Thread Starter
Hyperactive Member
Print Dialog Pointer without Opening? HELP!!!
I'm working with another app's API and I need to provide a pointer to the Print Dialog Box.
It's easy to do once I open it and then a User closes it.
The problem is that I'd like to provide the pointer without having User interaction.
I would prefer to never open the PrintDialog window at all, however, if I can open it and then immediately close it (with 'Print') that might work.
Here's the details -
1) I'm creating an automated app.
2) I set all the printing parameters using DEVMODE and a PrintDialog object.
3) Then, I need to hand over the pointer which apparently doesn't exist until the PrintDialog is opened, then closed (with 'Print').
Here's some of the code (just for example, may be incomplete):
Code:
Private Declare Function PrtDialog Lib "comdlg32.dll" Alias "PrintDlgA" (pPrintdlg As PRINTDLG) As Long
Dim pd As PRINTDLG
Dim ptrpd As Long 'Pointer to a printDlg structure
Dim whDevMode As DEVMODE
Dim whDevNames As DEVNAMES
Dim lpDevMode As Long, lpDevName As Long
Dim tmpPrinter As Printer
Dim selectedPrinterName As String
selectedPrinterName = "Adobe PDF"
For Each tmpPrinter In Printers
If tmpPrinter.DeviceName = selectedPrinterName Then
Exit For
End If
Next tmpPrinter
With whDevMode
.dmSize = Len(whDevMode)
.dmFields = DM_ORIENTATION Or DM_DUPLEX Or DM_PAPERSIZE Or DM_COLOR Or DM_SCALE
.dmDeviceName = tmpPrinter.DeviceName
.dmOrientation = DMORIENT_LANDSCAPE
.dmCopies = 1
.dmPaperSize = DMPAPER_TABLOID
End With
'Allocate memory for the initialization hDevMode structure
'and copy the settings gathered above into this memory
pd.hDevMode = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, Len(whDevMode))
lpDevMode = GlobalLock(pd.hDevMode)
If lpDevMode > 0 Then
CopyMemory ByVal lpDevMode, whDevMode, Len(whDevMode)
bReturn = GlobalUnlock(pd.hDevMode)
End If
'Set the current driver, device, and port name strings
With whDevNames
.wDriverOffset = 8
.wDeviceOffset = .wDriverOffset + 1 + Len(tmpPrinter.DriverName)
.wOutputOffset = .wDeviceOffset + 1 + Len(tmpPrinter.Port)
.wDefault = 0
.Extra = tmpPrinter.DriverName & Chr(0) & tmpPrinter.DeviceName & Chr(0) & tmpPrinter.Port & Chr(0)
End With
'Allocate memory for the initial hDevName structure
'and copy the settings gathered above into this memory
pd.hDevNames = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, Len(whDevNames))
lpDevName = GlobalLock(pd.hDevNames)
If lpDevName > 0 Then
CopyMemory ByVal lpDevName, whDevNames, Len(whDevNames)
bReturn = GlobalUnlock(lpDevName)
End If
With pd
.lStructSize = 66
.hwndOwner = Me.hWnd
.hDC = 0
.Flags = PD_RETURNDC Or PD_RETURNIC Or PD_PAGENUMS Or PD_USEDEVMODECOPIES
.nFromPage = chunks(j)
.nToPage = chunks(j)
.nMinPage = 1
.nMaxPage = 999
.nCopies = 1
.hInstance = 0
.lCustData = 0
.lpfnPrintHook = 0
.lpfnSetupHook = 0
.lpPrintTemplateName = 0
.lpSetupTemplateName = 0
.hPrintTemplate = 0
.hSetupTemplate = 0
End With
'**************************************************
' Here's the problem.
' I need the pointer to the PrintDialog, which doesn't exist until after the print
' dialog is shown and a user clicks 'print'.
' I need to be able to print without any user intervention.
' So, how can you get the pointer without opening the Printdialog window?
'
'This opens the Dialog
If (PrtDialog(pd) = 0) Then
MsgBox "Error... Unable to initialize printer "
Exit Sub
End If
'grab the pointer
ptrpd = AnyPtr(pd)
'***************
'From here the pointer is passed of to the other app's API...
Thanks.
Last edited by wayneh; Aug 27th, 2004 at 08:38 AM.
-
Aug 27th, 2004, 08:22 AM
#2
Thread Starter
Hyperactive Member
I noticed lots of viewers but no answers....
Anyone have a clue on this one?
-
Nov 26th, 2004, 06:03 AM
#3
Addicted Member
You are geting no answers because you are making a great work, and nobody seams to know more than you ! However, i bealive that it will be some API to give you the pointer. Or, at least, will be other way to do the same ! I have not understand very well the reason way you want to use Printer Dialog. You want to choose another printer to be printer default ? If so, it's possible to do it programatically without using printer dialog. And, you can also change all your work, in order to create PDF files "on the fly", to use the free Acrobat Reader to make all the hard printing preview work for you. It's up to you !
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|