Solved

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

Posted on 1999-01-24
8
332 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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
Online Training Solution

Drastically shorten your training time with WalkMe's advanced online training solution that Guides your trainees to action. Forget about retraining and skyrocket knowledge retention rates.

 

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

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Duplicates in Aggregate Query 3 50
SSIS 2010 Convert to SSIS 2013 On Different Box 3 63
Dialogbox API leak? 18 109
reboot server with scheduled time and week base 4 66
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 …
If you have ever found yourself doing a repetitive action with the mouse and keyboard, and if you have even a little programming experience, there is a good chance that you can use a text editor to whip together a sort of macro to automate the proce…
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…
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…

696 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