Solved

Setting printer paper trays to a network printer  for a print job

Posted on 1999-01-24
8
330 Views
Last Modified: 2013-12-03
How does one set the printer tray for a particular print job in Windows SDK programming ? I have tried CreateDC, ResetDC Setprinter? In dire need of this please help. This is VC++.
0
Comment
Question by:arjunram
  • 4
  • 3
8 Comments
 

Author Comment

by:arjunram
ID: 1419200
Adjusted points to 200
0
 
LVL 1

Expert Comment

by:arbitrary
ID: 1419201
what do u mean by tray -  paper size?

0
 
LVL 15

Expert Comment

by:NickRepin
ID: 1419202
Here is the working sample (console app)
1) run it a.exe - it'll print all trays & ids
2) run a.exe tray_id - it'll print test page

#include <windows.h>
#include <iostream.h>
#include <stdio.h>

// Usage: a.exe [tray_#]

PRINTDLG pdSetup;

void GetDefPrinter() {
  memset(&pdSetup,0,sizeof(PRINTDLG));
  pdSetup.lStructSize=sizeof(PRINTDLG);
  pdSetup.Flags=PD_RETURNDEFAULT;
  PrintDlg(&pdSetup);
}

void main(int argc,char* argv[])
{
   // Fill PRINTDLG struct
   GetDefPrinter();

   // Obtain printer info
   LPDEVMODE dm=LPDEVMODE(GlobalLock(pdSetup.hDevMode));
   LPDEVNAMES dn=LPDEVNAMES(GlobalLock(pdSetup.hDevNames));

   if(argc<2) { // Print trays info
      // Check trays
      DWORD nTrays=DeviceCapabilities(LPTSTR(dn)+dn->wDeviceOffset,
         LPTSTR(dn)+dn->wOutputOffset,DC_BINNAMES,0,0);
      if(nTrays==DWORD(-1) || nTrays==0) {
         cout<<"Cannot get trays count!"<<endl;
         exit(1);
      }
   
      typedef char trayNameT[24];
      trayNameT* trayName=new char[nTrays][24];
      DeviceCapabilities(LPTSTR(dn)+dn->wDeviceOffset,
         LPTSTR(dn)+dn->wOutputOffset,DC_BINNAMES,LPTSTR(trayName),0);
      LPWORD trayID=new WORD[nTrays];
      DeviceCapabilities(LPTSTR(dn)+dn->wDeviceOffset,
         LPTSTR(dn)+dn->wOutputOffset,DC_BINS,LPTSTR(trayID),0);

      for(DWORD i=0;i<nTrays;i++) {
         cout<<trayID[i]<<' '<<trayName[i]<<endl;
      }
   }
   else {
      // Get tray ID
      DWORD id=strtoul(argv[1],0,0);  
      dm->dmDefaultSource=id;

      HDC hdcPrinter=CreateDC(LPTSTR(dn)+dn->wDriverOffset,
         LPTSTR(dn)+dn->wDeviceOffset,0,dm);

      // Test printing
      TEXTMETRIC tmPrinter; // Printer metricies
      int cxPage, cyPage; // Width and Height of page
      char szText[120]; // Buffer for output
      cxPage=GetDeviceCaps(hdcPrinter, HORZRES);
      SelectObject(hdcPrinter, CreatePen(PS_SOLID, 1, 0));
      DOCINFO di={sizeof(DOCINFO),"Test",NULL};
      int jobId=StartDoc(hdcPrinter,&di);
      StartPage(hdcPrinter);
      Rectangle(hdcPrinter, 0, 0, cxPage, 500);
      SelectObject(hdcPrinter, CreatePen(PS_SOLID, 10, 0));
      Rectangle(hdcPrinter, 2000, 2000, 2600, 2600);
      SelectObject(hdcPrinter, CreatePen(PS_SOLID, 50, 0));
      Rectangle(hdcPrinter, 200, 1000, 300, 1300);
      wsprintf(szText, "Printer Test");
      TextOut(hdcPrinter, 50, (20 * 5), szText, strlen(szText));
      if (EndPage(hdcPrinter) > 0) {
         EndDoc(hdcPrinter);
      }
      DeleteObject(SelectObject(hdcPrinter, GetStockObject(BLACK_PEN)));
      DeleteDC(hdcPrinter);
   }
   GlobalUnlock(pdSetup.hDevNames);
   GlobalUnlock(pdSetup.hDevMode);
}

0
Netscaler Common Configuration How To guides

If you use NetScaler you will want to see these guides. The NetScaler How To Guides show administrators how to get NetScaler up and configured by providing instructions for common scenarios and some not so common ones.

 

Author Comment

by:arjunram
ID: 1419203
Crash occurs when doing a createDC. Please let me knwo on any further advances on this issue. I dire need. If you are close to the fix please let me know.
0
 
LVL 15

Expert Comment

by:NickRepin
ID: 1419204
This code works fine.
At least, I've told you what to do.
Thank you for polite answer.

0
 
LVL 15

Accepted Solution

by:
NickRepin earned 200 total points
ID: 1419205
arjunram, you've asked also the Q about crash while using StretchDIBits. It seems that all crashes in your PC.
May be, the problem is in your code?

Anyway, I try to post the answer again. I hope you will be more kind to me. I've wasted a half of hour to write this example to you. Did you try it alone, I mean, without pasting to your app?
0
 

Author Comment

by:arjunram
ID: 1419206
Hi,
     None of the windows applications work(print to a different tray) if the printer is a network printer. Looks like there is a problem in the setting. ThanX a lot for the sample code.
0
 
LVL 15

Expert Comment

by:NickRepin
ID: 1419207
I've checked this code at network printer before post it here.
0

Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

This article describes how to programmatically preset the "Pages per Sheet" option that's available with most printer drivers.   This setting lets you do "n-Up" printing, where two, four, or more pages are printed on each sheet of paper. If your …
This article surveys and compares options for encoding and decoding base64 data.  It includes source code in C++ as well as examples of how to use standard Windows API functions for these tasks. We'll look at the algorithms — how encoding and decodi…
This Micro Tutorial demonstrates using Microsoft Excel pivot tables, how to reverse engineer competitors' marketing strategies through backlinks.
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…

773 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question