By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
435,638 Members | 2,241 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 435,638 IT Pros & Developers. It's quick & easy.

Printing to hDc in VBA

P: n/a

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

Jan 14 '06 #1
Share this Question
Share on Google+
5 Replies


P: n/a
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" <no******@sorry.dk> wrote in message
news:43**********************@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

Jan 14 '06 #2

P: n/a
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...b;en-us;105662

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

(david)
"Erik" <no******@sorry.dk> wrote in message
news:43**********************@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

Jan 16 '06 #3

P: n/a
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" <david@epsomdotcomdotau> wrote in message
news:43***********************@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...b;en-us;105662

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

(david)
"Erik" <no******@sorry.dk> wrote in message
news:43**********************@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


Jan 16 '06 #4

P: n/a
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
Jan 17 '06 #5

P: 2
Hi Erik,

Could you please let me know that name of the control as I'm looking for a Gantt style control for Access. Thanks.
Apr 27 '06 #6

This discussion thread is closed

Replies have been disabled for this discussion.