我修改成功一部分,经过测试成功。(转自CSDN相关帖子)
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="hello";
Prntr->Canvas->Font->Size = 20;
Prntr->Canvas->TextOutA(100,100,"生石膏的大概撒搞活");
Prntr->EndDoc();
BCB(天下三分明月夜,二分无赖是扬州)回复于 2001-07-23 14:07:05 得分 0
#include "printers.hpp"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char Device[CCHDEVICENAME];
char Driver[MAX_PATH];
char Port[32];
THandle hDMode;
PDevMode pDMode;
TPrinter *Prn = Printer();
Prn->GetPrinter(Device,Driver,Port,hDMode);
pDMode=(PDevMode)GlobalLock((HGLOBAL &)hDMode);
pDMode->dmPaperSize= 256;
pDMode->dmFields=pDMode->dmFields | DM_PAPERSIZE;
pDMode->dmPaperLength =1016; //高:4英寸=101.6mm
pDMode->dmFields =pDMode->dmFields| DM_PAPERLENGTH;
pDMode->dmPaperWidth = 2540; //宽:10英寸=25.40mm
pDMode->dmFields =pDMode->dmFields| DM_PAPERWIDTH;
ResetDC(Prn->Handle,pDMode);
GlobalUnlock((HGLOBAL &)hDMode);
Prn->BeginDoc();
Prn->Canvas->Font->Name = "宋体";
Prn->Canvas->Font->Size = 20;
Prn->Canvas->TextOutA (0,0,"页首");
Prn->EndDoc();
}
俺好试了!
缺省打印机本来设在11*10inch,本程序设成10*4inch,
连打印3次,准确换页,打完后查看并没有改变打印机的原缺省纸张大小,怪。
但英寸是人工转换成mm的,这会产生小误省,有没有办法直接设成英寸?!
Wingsun(孙春阳)回复于 2001-07-23 14:32:45 得分 0
第二种方法,经过试验也成功了:
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, "Hello My Friend!",17);
EndPage(PrnHdc);
EndDoc(PrnHdc);
DeleteDC(PrnHdc);
free(DocInfo);
free(PrnInfo);
free(DevMode);