16,548
社区成员




//初始化打印机
memset(&m_pd, 0, sizeof(PRINTDLG));
m_pd.lStructSize = sizeof(PRINTDLG);
m_pd.Flags |= PD_RETURNDEFAULT | PD_RETURNDC;
if (!PrintDlg(&m_pd))
{
mbox("初始化打印失败.");
return NULL;
}
//默认打印机
DWORD dw = 64;
TCHAR printerName[64];
BOOL b=GetDefaultPrinter(printerName, &dw);
HANDLE printer = NULL;
b=OpenPrinter(printerName, &printer, NULL);
//获取DEVMODE
long size = DocumentProperties(NULL,
printer,
NULL,
NULL,
NULL,
0);
HGLOBAL mem = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, size);
LPBYTE bytePtr = (LPBYTE)GlobalLock(mem);
size = DocumentProperties(NULL,
printer,
printerName,
(LPDEVMODE)bytePtr,
NULL,
DM_OUT_BUFFER);
DEVMODE dev;
memcpy(&dev, (LPDEVMODE)bytePtr, sizeof(DEVMODE));
//添加页形
FORM_INFO_1 form;
memset(&form, 0, sizeof(FORM_INFO_1));
form.Flags = FORM_USER;
form.ImageableArea.right = 19700;
form.ImageableArea.bottom = 27000;
form.pName = "_case27";
form.Size.cx = 19700;
form.Size.cy = 27000;
b = AddForm(printer, 1, (LPBYTE)&form);
//枚举可用页形
DWORD needByte = 0, returnNum = 0;
b = EnumForms(printer,
1,
NULL,
0,
&needByte,
&returnNum);
HGLOBAL mem1 = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE, needByte);
LPBYTE bytePtr1 = (LPBYTE)GlobalLock(mem1);
b = EnumForms(printer,
1,
bytePtr1,
needByte,
&needByte,
&returnNum);
int formIndex = 0;
FORM_INFO_1* formPtr = (FORM_INFO_1*)bytePtr1;
for (int i = 0; i < returnNum; i++)
{
if (lstrcmp(formPtr->pName, "_case27") == 0)
{
formIndex = i;
break;
}
formPtr++;
}
GlobalUnlock(mem1);
GlobalFree(mem1);
dev.dmFields = DM_FORMNAME | DM_PAPERLENGTH | DM_PAPERWIDTH | DM_PAPERSIZE;
dev.dmPaperSize = returnNum+1;
dev.dmPaperLength = 270;
dev.dmPaperWidth = 197;
lstrcpy((TCHAR*)dev.dmFormName, "_case27");
CopyMemory(bytePtr, &dev, sizeof(DEVMODE));
// memcpy(&bytePtr, &dev, sizeof(DEVMODE));
size = DocumentProperties(NULL,
printer,
printerName,
(LPDEVMODE)bytePtr,
(LPDEVMODE)bytePtr,
DM_IN_BUFFER | DM_OUT_BUFFER);
if(!ResetDC(m_pd.hDC,(DEVMODE*)bytePtr))
{
mbox("初始化打印失败.");
ClosePrinter(printer);
return NULL;
}
GlobalUnlock(mem);
GlobalFree(mem);
ClosePrinter(printer);