Home » Community » Newbie corner » Direct printing to a specific printer
Re: Direct printing to a specific printer [message #46434 is a reply to message #46416] |
Wed, 11 May 2016 00:37 |
Lance
Messages: 527 Registered: March 2007
|
Contributor |
|
|
You should have no problem doing that. Maybe not out of box.
Look into Upp code PrinterJob.cpp, in particular Execute0()
bool PrinterJob::Execute0(bool dodlg)
{
pdlg = new Win32PrintDlg_;
PRINTDLG& dlg = *pdlg;
dlg.Flags = PD_DISABLEPRINTTOFILE|PD_NOSELECTION|PD_HIDEPRINTTOFILE|PD_RETURNDEFAULT;
dlg.nFromPage = current;
dlg.nToPage = current;
dlg.nMinPage = from;
dlg.nMaxPage = to;
if(from != to)
dlg.Flags |= PD_ALLPAGES;
dlg.hwndOwner = 0;
dlg.Flags |= PD_RETURNDEFAULT;
dlg.nCopies = 1;
if(!PrintDlg(&dlg)) return false;
if(dlg.hDevMode) {
DEVMODE *pDevMode = (DEVMODE*)::GlobalLock(dlg.hDevMode);
pDevMode->dmOrientation = landscape ? DMORIENT_LANDSCAPE : DMORIENT_PORTRAIT;
::GlobalUnlock(dlg.hDevMode);
}
HDC hdc;
if(dodlg) {
dlg.Flags = PD_DISABLEPRINTTOFILE|PD_NOSELECTION|PD_HIDEPRINTTOFILE|PD_RETURNDC|PD_USEDEVMODECOPIESANDCOLLATE;
Vector< Ptr<Ctrl> > disabled = DisableCtrls(Ctrl::GetTopCtrls());
bool b = PrintDlg(&dlg);
EnableCtrls(disabled);
if(!b) return false;
hdc = dlg.hDC;
}
else {
DEVNAMES *p = (DEVNAMES *)::GlobalLock(dlg.hDevNames);
const char *driver = (const char *)p + p->wDriverOffset;
const char *device = (const char *)p + p->wDeviceOffset;
if(dlg.hDevMode) {
DEVMODE *pDevMode = (DEVMODE*)::GlobalLock(dlg.hDevMode);
hdc = CreateDC(driver, device, NULL, pDevMode);
::GlobalUnlock(dlg.hDevMode);
}
else
hdc = CreateDC(driver, device, NULL, NULL);
}
if(dlg.hDevMode)
::GlobalFree(dlg.hDevMode);
if(dlg.hDevNames)
::GlobalFree(dlg.hDevNames);
if(hdc) {
draw = new PrintDraw(hdc, Nvl(name, Ctrl::GetAppName()));
page.Clear();
if(!(dlg.Flags & PD_PAGENUMS)) {
dlg.nFromPage = dlg.nMinPage;
dlg.nToPage = dlg.nMaxPage;
}
for(int i = dlg.nFromPage - 1; i <= dlg.nToPage - 1; i++)
page.Add(i);
return true;
}
return false;
}
Pay attention to this line:
if(hdc) {
draw = new PrintDraw(hdc, Nvl(name, Ctrl::GetAppName()));
That says with a standard win32 HDC, you can create a PrintDraw, which speaks U++. So your task is how to use win32 api to create a HDC with a given device (printer) name. The above listed Execute0 also gives you a lots of clue, some of the relevant code can be boiled down to
DEVNAMES *p = (DEVNAMES *)::GlobalLock(dlg.hDevNames);
const char *driver = (const char *)p + p->wDriverOffset;
const char *device = (const char *)p + p->wDeviceOffset;
hdc = CreateDC(driver, device, NULL, NULL);
now remaining question is what dlg.hDevNames is, how to map your printer name to that particular handle. This is probably a viable path. This is not the say that it's the smartest or shortest path. Check with somebody who is really familiar with Win32 programming.
|
|
|
Goto Forum:
Current Time: Fri May 10 12:56:47 CEST 2024
Total time taken to generate the page: 0.03395 seconds
|