Printing to hDc in VBA

Printing to hDc in VBA

am 14.01.2006 21:09:57 von Erik

I'm using an ActiveX control to display a Gantt chart in my Access 2003
application.
It's all setup and programmed and displays nicely.

The control supports printing, but its documentation is not very good. A VB
example is supplied in the documentation, but it does not work in VBA.

The VB example goes:

Object.PrintToHdc Printer.hdc, 100, 100, 5, 5, 200....etc (multiple layout
parameters)

The problem seems to be that I don't have access to Printer.hdc (Handle to
device context) in VBA

I've tried to get a hDc using the CommonDialog Control like this:

Dim PHdc As Long

Me.ComDlg.Flags = cdlPDReturnDC
Me.ComDlg.ShowPrinter
PHdc = Me.ComDlg.hDC
Me.GanttView.PrintToHdc PHdc, 1, 1, 0.3, 0.3, 100...etc


I actually get a value back from ComDlg (ex. 153159585) but a few things
appear strange:

The PHdc variable needs to be dimensioned as a long, to avoid overflow, but
the PrintToHdc method specifies an integer for the hDc parameter.
It makes me wonder if it is a hDc value I get back afterall.

After having selected a printer in the print dialog, I click the Print
button. It now takes about 10 secs to return the hDc value - why so long?

I then supply the returned (hDc) value to the PrintToHdc method, but nothing
happens. No printer activity, no errors.

I'm quite sure to PrintToHdc method is designed to work, but I don't really
know how to obtain the hDc parameter, and if I should insert any additional
code after the PrintToHdc method, to trigger the print out.

Any ideas are velcome

Thanks

Erik Rudbeck

Re: Printing to hDc in VBA

am 14.01.2006 22:03:03 von Stephen Lebans

Access does not expose a handle to a printer Device context from within or
outside of the Form or Report objects. In other words while the Visual Basic
object exposes a Printer Device Context the VBA object model, in particular
the Access VBa object model, does not.

To get a valid hDC for the printer you would have to open the Printer
yourself via the Printer API's. The ReportUtilities project on my site
contains sample code to do this but it is a complex task if you are not
familiar with the pertinent API's. Honestly, I have never used the Common
Dialog ActiveX control to return the DC for the current default printer so I
do not know if you are receiving a valid DC. I would think thought the
control would throw an error if it was unable to accept your cdlPDReturnDC
flag.

If your ActiveX control is specifying an Integer for the hDC parameter then
it sounds like it is an older control developed in the 16 bit Windows days.
Have you checked with the developer of the control for an update? Do they
have a Website where you can contact tech support?

Are you using the Office FileDialog object or the CommonDialog Control's
ActiveX?
--

HTH
Stephen Lebans
http://www.lebans.com
Access Code, Tips and Tricks
Please respond only to the newsgroups so everyone can benefit.


"Erik" wrote in message
news:43c95aeb$0$1827$edfadb0f@dread11.news.tele.dk...
>
> I'm using an ActiveX control to display a Gantt chart in my Access 2003
> application.
> It's all setup and programmed and displays nicely.
>
> The control supports printing, but its documentation is not very good. A
> VB example is supplied in the documentation, but it does not work in VBA.
>
> The VB example goes:
>
> Object.PrintToHdc Printer.hdc, 100, 100, 5, 5, 200....etc (multiple layout
> parameters)
>
> The problem seems to be that I don't have access to Printer.hdc (Handle to
> device context) in VBA
>
> I've tried to get a hDc using the CommonDialog Control like this:
>
> Dim PHdc As Long
>
> Me.ComDlg.Flags = cdlPDReturnDC
> Me.ComDlg.ShowPrinter
> PHdc = Me.ComDlg.hDC
> Me.GanttView.PrintToHdc PHdc, 1, 1, 0.3, 0.3, 100...etc
>
>
> I actually get a value back from ComDlg (ex. 153159585) but a few things
> appear strange:
>
> The PHdc variable needs to be dimensioned as a long, to avoid overflow,
> but the PrintToHdc method specifies an integer for the hDc parameter.
> It makes me wonder if it is a hDc value I get back afterall.
>
> After having selected a printer in the print dialog, I click the Print
> button. It now takes about 10 secs to return the hDc value - why so long?
>
> I then supply the returned (hDc) value to the PrintToHdc method, but
> nothing happens. No printer activity, no errors.
>
> I'm quite sure to PrintToHdc method is designed to work, but I don't
> really know how to obtain the hDc parameter, and if I should insert any
> additional code after the PrintToHdc method, to trigger the print out.
>
> Any ideas are velcome
>
> Thanks
>
> Erik Rudbeck
>
>
>

Re: Printing to hDc in VBA

am 16.01.2006 03:44:53 von david epsom dot com dot au

KB Q105662 has an example of getting a PHDc

ACC: Print Text to Default Printer with Access Basic (1.x/2.0)
http://support.microsoft.com/default.aspx?scid=kb;en-us;1056 62

I haven't looked at ComDlg.hDC, but normally ComDlg returns
a hDC for customisation of the dialog?

(david)


"Erik" wrote in message
news:43c95aeb$0$1827$edfadb0f@dread11.news.tele.dk...
>
> I'm using an ActiveX control to display a Gantt chart in my Access 2003
> application.
> It's all setup and programmed and displays nicely.
>
> The control supports printing, but its documentation is not very good. A
> VB example is supplied in the documentation, but it does not work in VBA.
>
> The VB example goes:
>
> Object.PrintToHdc Printer.hdc, 100, 100, 5, 5, 200....etc (multiple layout
> parameters)
>
> The problem seems to be that I don't have access to Printer.hdc (Handle to
> device context) in VBA
>
> I've tried to get a hDc using the CommonDialog Control like this:
>
> Dim PHdc As Long
>
> Me.ComDlg.Flags = cdlPDReturnDC
> Me.ComDlg.ShowPrinter
> PHdc = Me.ComDlg.hDC
> Me.GanttView.PrintToHdc PHdc, 1, 1, 0.3, 0.3, 100...etc
>
>
> I actually get a value back from ComDlg (ex. 153159585) but a few things
> appear strange:
>
> The PHdc variable needs to be dimensioned as a long, to avoid overflow,
> but the PrintToHdc method specifies an integer for the hDc parameter.
> It makes me wonder if it is a hDc value I get back afterall.
>
> After having selected a printer in the print dialog, I click the Print
> button. It now takes about 10 secs to return the hDc value - why so long?
>
> I then supply the returned (hDc) value to the PrintToHdc method, but
> nothing happens. No printer activity, no errors.
>
> I'm quite sure to PrintToHdc method is designed to work, but I don't
> really know how to obtain the hDc parameter, and if I should insert any
> additional code after the PrintToHdc method, to trigger the print out.
>
> Any ideas are velcome
>
> Thanks
>
> Erik Rudbeck
>
>
>

Re: Printing to hDc in VBA

am 16.01.2006 05:09:52 von Stephen Lebans

The project I pointed the OP to on my site uses the same logic but is a
current Windows 32 bit GDI sample.

No, you can call Common Print Dialog and request the current Printer's DC.

--

HTH
Stephen Lebans
http://www.lebans.com
Access Code, Tips and Tricks
Please respond only to the newsgroups so everyone can benefit.


"david epsom dot com dot au" wrote in message
news:43cb08a0$0$84163$c30e37c6@lon-reader.news.telstra.net.. .
> KB Q105662 has an example of getting a PHDc
>
> ACC: Print Text to Default Printer with Access Basic (1.x/2.0)
> http://support.microsoft.com/default.aspx?scid=kb;en-us;1056 62
>
> I haven't looked at ComDlg.hDC, but normally ComDlg returns
> a hDC for customisation of the dialog?
>
> (david)
>
>
> "Erik" wrote in message
> news:43c95aeb$0$1827$edfadb0f@dread11.news.tele.dk...
>>
>> I'm using an ActiveX control to display a Gantt chart in my Access 2003
>> application.
>> It's all setup and programmed and displays nicely.
>>
>> The control supports printing, but its documentation is not very good. A
>> VB example is supplied in the documentation, but it does not work in VBA.
>>
>> The VB example goes:
>>
>> Object.PrintToHdc Printer.hdc, 100, 100, 5, 5, 200....etc (multiple
>> layout parameters)
>>
>> The problem seems to be that I don't have access to Printer.hdc (Handle
>> to device context) in VBA
>>
>> I've tried to get a hDc using the CommonDialog Control like this:
>>
>> Dim PHdc As Long
>>
>> Me.ComDlg.Flags = cdlPDReturnDC
>> Me.ComDlg.ShowPrinter
>> PHdc = Me.ComDlg.hDC
>> Me.GanttView.PrintToHdc PHdc, 1, 1, 0.3, 0.3, 100...etc
>>
>>
>> I actually get a value back from ComDlg (ex. 153159585) but a few things
>> appear strange:
>>
>> The PHdc variable needs to be dimensioned as a long, to avoid overflow,
>> but the PrintToHdc method specifies an integer for the hDc parameter.
>> It makes me wonder if it is a hDc value I get back afterall.
>>
>> After having selected a printer in the print dialog, I click the Print
>> button. It now takes about 10 secs to return the hDc value - why so long?
>>
>> I then supply the returned (hDc) value to the PrintToHdc method, but
>> nothing happens. No printer activity, no errors.
>>
>> I'm quite sure to PrintToHdc method is designed to work, but I don't
>> really know how to obtain the hDc parameter, and if I should insert any
>> additional code after the PrintToHdc method, to trigger the print out.
>>
>> Any ideas are velcome
>>
>> Thanks
>>
>> Erik Rudbeck
>>
>>
>>
>
>

Re: Printing to hDc in VBA

am 17.01.2006 12:40:05 von Erik

Thanks alot for your inputs both of you.

Meanwhile a found out that the Gantt component supports a PrintToDefault
method, that prints to the default printer and hence do not require a DC.
I will look into your API stuff sometime later anyway.

Thanks again
Erik