Q:如何在用程序设置打印机打印纸张大小的问题?
A:
//方法一
char Device[CCHDEVICENAME];
char Driver[MAX_PATH];
char Port[32];
PDevMode pDev;
THandle hDev;
TPrinter *Prntr = Printer();
HANDLE hPrinter;
Prntr->GetPrinter(Device,Driver,Port,hDev);
if(hDev!=0)
{
pDev =(PDevMode)GlobalLock((void*)hDev);
if(pDev!=NULL)
{
pDev->dmPaperSize=DMPAPER_USER;
pDev->dmPaperLength = 1500;//注意单位为毫米,这个数值不能太大。
pDev->dmPaperWidth = 2000;//同样这儿的数值也不能太大。
pDev->dmFields = (pDev->dmFields)¦(DM_PAPERSIZE);
pDev->dmFields = (pDev->dmFields)¦(DM_PAPERLENGTH);
pDev->dmFields = (pDev->dmFields)¦(DM_PAPERWIDTH);
}
ResetDC(Prntr->Handle,pDev);
GlobalUnlock((void*)hDev);
}
Prntr->BeginDoc();
Prntr->Title="打印测试";//有的打印机如果没有标题是无法打印数据的,所以标题一定要有
Prntr->Canvas->Font->Size = 20;
Prntr->Canvas->TextOutA(100,100,"打印测试代码");
Prntr->EndDoc();
//方法二
HANDLE PrnHd;
PPrinterInfo1 PrnInfo ;
DWORD pcbNeeded ;
DWORD PDevModeBytes ;
LPDEVMODE DevMode;
HDC PrnHdc;
PDocInfo DocInfo ;
TPrinter *Prntr = Printer();
OpenPrinter(Prntr->Printers->Strings[Prntr->PrinterIndex].c_str(),&PrnHd,NULL);
PrnInfo=(PPrinterInfo1)malloc(1024);
GetPrinter(PrnHd,1,(LPBYTE)PrnInfo,1024,&pcbNeeded);
PDevModeBytes= DocumentProperties( Handle,PrnHd,PrnInfo->pDescription,NULL,NULL,0 );
DevMode=(LPDEVMODE)malloc(PDevModeBytes);
DocumentProperties( Handle,PrnHd,PrnInfo->pDescription,DevMode,NULL,DM_OUT_BUFFER );
DevMode->dmPaperSize = DMPAPER_USER;//DMPAPER_A4 ;
DevMode->dmPaperWidth =1600;
DevMode->dmPaperLength=1600;
DevMode->dmFields = DevMode->dmFields ¦ DM_PAPERSIZE;
DevMode->dmFields = DevMode->dmFields ¦ DM_PAPERLENGTH;
DevMode->dmFields = DevMode->dmFields ¦ DM_PAPERWIDTH;
DocumentProperties( Handle,PrnHd,PrnInfo->pDescription,DevMode,DevMode,DM_OUT_BUFFER ¦ DM_IN_BUFFER);
PrnHdc = CreateDC( NULL, Prntr->Printers->Strings[Prntr->PrinterIndex].c_str(),NULL,DevMode );
DocInfo=(PDocInfo)malloc(100 );
DocInfo->cbSize = sizeof(DocInfo);
DocInfo->lpszDocName = NULL;
DocInfo->lpszOutput = NULL;
DocInfo->lpszDatatype = NULL;
DocInfo->fwType = DI_APPBANDING;
StartDoc( PrnHdc, DocInfo);
StartPage(PrnHdc);
TextOut( PrnHdc, 10, 10, "打印测试代码!",17);
EndPage(PrnHdc);
EndDoc(PrnHdc);
DeleteDC(PrnHdc);
free(DocInfo);
free(PrnInfo);
free(DevMode);
Top
6 楼RedProgramer(TST : RedSteel)回复于 2002-09-02 11:22:27 得分 0
你可以用TMetafile,在上面绘出你的图,通过修改TMetafile
的MMHeight和MMWidth属性就可以做到所见即所得,至于取设定的纸张尺寸,可以这样:
int GetPrinterXResolution()//取X方向采样分辨率
{
TPrinter * Prntr =Printer();
char *ADevice,*ADriver,*APort;
int Result=1;
int Resolution;
ADevice=new char[100];
ADriver=new char[100];
APort=new char[100];
THandle DeviceHandle;
PDeviceMode DevMode;
Prntr->GetPrinter(ADevice,ADriver,APort,DeviceHandle);
DevMode=(_devicemodeA*)GlobalLock((void*)DeviceHandle);
Resolution=DevMode->dmPrintQuality; //为X方向采样率
for(int i=0;Result!=0||i<5;i++)
Result=GlobalUnlock((void*)DeviceHandle);
delete [] APort;
delete [] ADriver;
delete [] ADevice;
return Resolution;
}
int GetPrinterYResolution()//取Y方向采样分辨率
{
TPrinter * Prntr =Printer();
char *ADevice,*ADriver,*APort;
int Result=1;
int Resolution;
ADevice=new char[100];
ADriver=new char[100];
APort=new char[100];
THandle DeviceHandle;
PDeviceMode DevMode;
Prntr->GetPrinter(ADevice,ADriver,APort,DeviceHandle);
DevMode=(_devicemodeA*)GlobalLock((void*)DeviceHandle);
Resolution=DevMode->dmYResolution;
for(int i=0;Result!=0||i<5;i++)
Result=GlobalUnlock((void*)DeviceHandle);
delete [] APort;
delete [] ADriver;
delete [] ADevice;
return Resolution;
}
上边的采样率的单位为(象素/英寸)
Top
7 楼hotxu(hotxu)回复于 2002-09-02 11:24:30 得分 0
int OldPaperSize;
int OldOrientation;
int OldTop;
int OldBottom;
int OldLeft;
int OldRight;
DEVMODE *pDev;
LPPAGESETUPDLG mylp=new PAGESETUPDLG;
memset((void *)mylp,0,sizeof (PAGESETUPDLG));
mylp->lStructSize=sizeof(PAGESETUPDLG);
mylp->hwndOwner=this->Handle;
mylp->Flags=PSD_RETURNDEFAULT;
PageSetupDlg( mylp );
if (mylp->hDevMode!=NULL){
pDev=(DEVMODE *)GlobalLock(mylp->hDevMode);
pDev->dmPaperSize =OldPaperSize;
pDev->dmOrientation =OldOrientation;
mylp->rtMargin.left =OldLeft;
mylp->rtMargin.right =OldRight;
mylp->rtMargin.top =OldTop;
mylp->rtMargin.bottom=OldBottom;
GlobalUnlock(mylp->hDevMode);
mylp->Flags=PSD_MARGINS|PSD_INHUNDREDTHSOFMILLIMETERS;
if(PageSetupDlg(mylp)){
pDev=(DEVMODE *)GlobalLock(mylp->hDevMode);
OldPaperSize =pDev->dmPaperSize;
if(OldPaperSize>28)OldPaperSize=9;//A4
OldOrientation=pDev->dmOrientation;
OldLeft =mylp->rtMargin.left;
OldRight =mylp->rtMargin.right;
OldTop =mylp->rtMargin.top;
OldBottom =mylp->rtMargin.bottom;
QRMJzzd->QuickRep1->Page->Orientation =OldOrientation-1;
QRMJzzd->QuickRep1->Page->PaperSize=OldPaperSize;
QRMJzzd->QuickRep1->Page->LeftMargin =OldLeft/100;
QRMJzzd->QuickRep1->Page->RightMargin =OldRight/100;
QRMJzzd->QuickRep1->Page->TopMargin =OldTop/100;
QRMJzzd->QuickRep1->Page->BottomMargin=OldBottom/100;
GlobalUnlock(mylp->hDevMode);
}
GlobalFree(mylp->hDevMode);
}
delete mylp;
QRPreview1->PageNumber=1;
QRMJzzd->QuickRep1->Prepare();
QRMJzzd->QuickRep1->Preview();Top
8 楼RedProgramer(TST : RedSteel)回复于 2002-09-02 11:24:50 得分 0
void GetPrinterPaperSize(int & PaperLength, int & PaperWidth)
{//取打印纸的尺寸,单位为毫米
TPrinter * Prntr =Printer();
char *ADevice,*ADriver,*APort;
ADevice=new char[100];
ADriver=new char[100];
APort=new char[100];
THandle DeviceHandle;
PDeviceMode DevMode;
Prntr->GetPrinter(ADevice,ADriver,APort,DeviceHandle);
DevMode=(_devicemodeA*)GlobalLock((void*)DeviceHandle);
//因为DevMode的dmPaperLength和dmPaperWidth属性的单位为毫米的十分之一,
//所以要转为毫米时需除于十;
PaperLength=DevMode->dmPaperLength/10; //因为DevMode->dmPaperLength
PaperWidth=DevMode->dmPaperWidth/10;
if(PaperLength==0&&PaperWidth==0)//判断是否设置了dmPaperSize
{
switch(DevMode->dmPaperSize)
{
case DMPAPER_LETTER:
PaperLength=11.0*25.4+0.5;
PaperWidth=8.5*25.4+0.5;
break;
case DMPAPER_LEGAL:// Legal, 8 1/2- by 14-inches
PaperLength=14.0*25.4+0.5;
PaperWidth=8.5*25.4+0.5;
break;
case DMPAPER_A4:// A4 Sheet, 210- by 297-millimeters
PaperLength=297;
PaperWidth=210;
break;
case DMPAPER_CSHEET:// C Sheet, 17- by 22-inches
PaperLength=22.0*25.4+0.5;
PaperWidth=17.0*25.4+0.5;
break;
case DMPAPER_DSHEET:// D Sheet, 22- by 34-inches
PaperLength=34.0*25.4+0.5;
PaperWidth=22.0*25.4+0.5;
break;
case DMPAPER_ESHEET: //E Sheet, 34- by 44-inches
PaperLength=44.0*25.4+0.5;;
PaperWidth=34.0*25.4+0.5;
break;
case DMPAPER_LETTERSMALL:// Letter Small, 8 1/2- by 11-inches
PaperLength=11.0*25.4+0.5;;
PaperWidth=8.5*25.4+0.5;
break;
case DMPAPER_TABLOID:// Tabloid, 11- by 17-inches
PaperLength=17.0*25.4+0.5;;
PaperWidth=11.0*25.4+0.5;
break;
case DMPAPER_LEDGER:// Ledger, 17- by 11-inches
PaperLength=17.0*25.4+0.5;;
PaperWidth=11.0*25.4+0.5;
break;
case DMPAPER_STATEMENT:// Statement, 5 1/2- by 8 1/2-inches
PaperLength=8.5*25.4+0.5;;
PaperWidth=5.5*25.4+0.5;
break;
case DMPAPER_EXECUTIVE:// Executive, 7 1/4- by 10 1/2-inches
PaperLength=10.5*25.4+0.5;;
PaperWidth=7.25*25.4+0.5;
break;
case DMPAPER_A3:// A3 sheet, 297- by 420-millimeters
PaperLength=420;
PaperWidth=297;
break;
case DMPAPER_A4SMALL:// A4 small sheet, 210- by 297-millimeters
PaperLength=297;
PaperWidth=210;
break;
case DMPAPER_A5:// A5 sheet, 148- by 210-millimeters
PaperLength=210;
PaperWidth=148;
break;
case DMPAPER_B4:// B4 sheet, 250- by 354-millimeters
PaperLength=250;
PaperWidth=354;
break;
case DMPAPER_B5:// B5 sheet, 182- by 257-millimeter paper
PaperLength=257;
PaperWidth=182;
break;
case DMPAPER_FOLIO:// Folio, 8 1/2- by 13-inch paper
PaperLength=13.0*25.4+0.5;;
PaperWidth=8.5*25.4+0.5;
break;
case DMPAPER_QUARTO:// Quarto, 215- by 275-millimeter paper
PaperLength=275;
PaperWidth=215;
break;
case DMPAPER_10X14:// 10- by 14-inch sheet
PaperLength=14.0*25.4+0.5;;
PaperWidth=10.0*25.4+0.5;
break;
case DMPAPER_11X17:// 11- by 17-inch sheet
PaperLength=17.0*25.4+0.5;;
PaperWidth=11.0*25.4+0.5;
break;
case DMPAPER_NOTE:// Note, 8 1/2- by 11-inches
PaperLength=11.0*25.4+0.5;;
PaperWidth=8.5*25.4+0.5;
break;
case DMPAPER_ENV_9:// #9 Envelope, 3 7/8- by 8 7/8-inches
PaperLength=8.875*25.4+0.5;;
PaperWidth=3.875*25.4+0.5;
break;
case DMPAPER_ENV_10:// #10 Envelope, 4 1/8- by 9 1/2-inches
PaperLength=9.5*25.4+0.5;;
PaperWidth=4.125*25.4+0.5;
break;
case DMPAPER_ENV_11:// #11 Envelope, 4 1/2- by 10 3/8-inches
PaperLength=10.375*25.4+0.5;;
PaperWidth=4.5*25.4+0.5;
break;
case DMPAPER_ENV_12:// #12 Envelope, 4 3/4- by 11-inches
PaperLength=11.0*25.4+0.5;;
PaperWidth=4.75*25.4+0.5;
break;
case DMPAPER_ENV_14:// #14 Envelope, 5- by 11 1/2-inches
PaperLength=11.5*25.4+0.5;;
PaperWidth=5.0*25.4+0.5;
break;
case DMPAPER_ENV_DL:// DL Envelope, 110- by 220-millimeters
PaperLength=220;
PaperWidth=110;
break;
case DMPAPER_ENV_C5:// C5 Envelope, 162- by 229-millimeters
PaperLength=229;
PaperWidth=162;
break;
case DMPAPER_ENV_C3:// C3 Envelope, 324- by 458-millimeters
PaperLength=458;
PaperWidth=324;
break;
case DMPAPER_ENV_C4:// C4 Envelope, 229- by 324-millimeters
PaperLength=324;
PaperWidth=229;
break;
case DMPAPER_ENV_C6:// C6 Envelope, 114- by 162-millimeters
PaperLength=162;
PaperWidth=114;
break;
case DMPAPER_ENV_C65:// C65 Envelope, 114- by 229-millimeters
PaperLength=229;
PaperWidth=114;
break;
case DMPAPER_ENV_B4:// B4 Envelope, 250- by 353-millimeters
PaperLength=353;
PaperWidth=250;
break;
case DMPAPER_ENV_B5:// B5 Envelope, 176- by 250-millimeters
PaperLength=250;
PaperWidth=176;
break;
case DMPAPER_ENV_B6:// B6 Envelope, 176- by 125-millimeters
PaperLength=176;
PaperWidth =125;
break;
case DMPAPER_ENV_ITALY:// Italy Envelope, 110- by 230-millimeters
PaperLength=230;
PaperWidth=110;
break;
case DMPAPER_ENV_MONARCH:// Monarch Envelope, 3 7/8- by 7 1/2-inches
PaperLength=7.5*25.4+0.5;
PaperWidth=3.875*25.4+0.5;
break;
case DMPAPER_ENV_PERSONAL:// 6 3/4 Envelope, 3 5/8- by 6 1/2-inches
PaperLength=6.75*25.4+0.5;
PaperWidth=3.625*25.4+0.5;
break;
case DMPAPER_FANFOLD_US:// US: Std Fanfold, 14 7/8- by 11-inches
PaperLength=14.875*25.4+0.5;
PaperWidth=11.0*25.4+0.5;
break;
case DMPAPER_FANFOLD_STD_GERMAN:// German Std Fanfold, 8 1/2- by 12-inches
PaperLength=12.0*25.4+0.5;
PaperWidth=8.5*25.4+0.5;
break;
case DMPAPER_FANFOLD_LGL_GERMAN:// German Legal Fanfold, 8 1/2- by 13-inches
PaperLength=13.0*25.4+0.5;
PaperWidth=8.5*25.4+0.5;
break;
default:
break;
}
}
int s=1;
for(int i=0;s!=0||i<5;i++)
s=GlobalUnlock((void*)DeviceHandle);
}