怎么设置打印机的纸张大小
如何设置打印机的纸张大小
主要采用documentProperties和SetPrinter进行设置,可是每次都不成功,奇怪的是设置之后将界面关闭,下一次打开居然就是上一次界面上设置的最近一次的纸张类型,也就是说最近一次是成功的?是不是设置完成要进行类似刷新的操作?在线等。。。。。。。。。。。。。。
一下是本人采用的两种设置打印纸张大小方法:求朋友们指点
第二种方法,,,,,,,,,,,,,
主要采用documentProperties和SetPrinter进行设置,可是每次都不成功,奇怪的是设置之后将界面关闭,下一次打开居然就是上一次界面上设置的最近一次的纸张类型,也就是说最近一次是成功的?是不是设置完成要进行类似刷新的操作?在线等。。。。。。。。。。。。。。
一下是本人采用的两种设置打印纸张大小方法:求朋友们指点
DWORD dwNeeded = 0;
PRINTER_INFO_2 *pi2 = NULL;
PRINTER_DEFAULTS pd;
BOOL bFlag;
LONG lFlag;
// Open printer handle (on Windows NT, you need full-access because you
// will eventually use SetPrinter)...
ZeroMemory(&pd, sizeof(pd));
pd.DesiredAccess = PRINTER_ALL_ACCESS;
bFlag = GetPrinter(hPrinter, 2, 0, 0, &dwNeeded);
if ((!bFlag) && (GetLastError() != ERROR_INSUFFICIENT_BUFFER) ||
(dwNeeded == 0))
{
ClosePrinter(hPrinter);
hPrinter = NULL;
return FALSE;
}
// Allocate enough space for PRINTER_INFO_2...
pi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded);
if (pi2 == NULL)
{
ClosePrinter(hPrinter);
hPrinter = NULL;
return FALSE;
}
// The second GetPrinter fills in all the current settings, so all you
// need to do is modify what you're interested in...
bFlag = GetPrinter(hPrinter, 2, (LPBYTE)pi2, dwNeeded, &dwNeeded);
if (!bFlag)
{
GlobalFree(pi2);
ClosePrinter(hPrinter);
hPrinter = NULL;
return FALSE;
}
// If GetPrinter didn't fill in the DEVMODE, try to get it by calling
// DocumentProperties...
if (pi2->pDevMode == NULL)
{
dwNeeded = DocumentProperties(NULL, hPrinter,
(LPWSTR)(LPCTSTR)curPrinter,
NULL, NULL, 0);
if (dwNeeded <= 0)
{
GlobalFree(pi2);
ClosePrinter(hPrinter);
hPrinter = NULL;
return FALSE;
}
pDevMode = (DEVMODE *)GlobalAlloc(GPTR, dwNeeded);
if (pDevMode == NULL)
{
GlobalFree(pi2);
ClosePrinter(hPrinter);
hPrinter = NULL;
return FALSE;
}
lFlag = DocumentProperties(NULL, hPrinter,
(LPWSTR)(LPCTSTR)curPrinter,
pDevMode, NULL,
DM_OUT_BUFFER);
if (lFlag != IDOK || pDevMode == NULL)
{
GlobalFree(pDevMode);
GlobalFree(pi2);
ClosePrinter(hPrinter);
hPrinter = NULL;
return FALSE;
}
pi2->pDevMode = pDevMode;
}
//make sure the prop is supported
if(pi2->pDevMode->dmFields & DM_PAPERSIZE)
{
map<CString ,int >::iterator iter;;
iter = resMap.find(paperSize);
if(iter == resMap.end())
{
AfxMessageBox(_T("打印机不支持当前纸张类型"));
return FALSE;
}
pi2->pDevMode->dmPaperSize = iter->second;
curDmPaperSize = iter->second; //do not forget,pleaz
}
else
{
GlobalFree(pi2);
//ClosePrinter(hPrinter);
return FALSE;
}
// Do not attempt to set security descriptor...
pi2->pSecurityDescriptor = NULL;
// Make sure the driver-dependent part of devmode is updated...
lFlag = DocumentProperties(NULL, hPrinter,
(LPWSTR)(LPCTSTR)curPrinter,
pi2->pDevMode, pi2->pDevMode,
DM_IN_BUFFER | DM_OUT_BUFFER);
if (lFlag != IDOK)
{
GlobalFree(pi2);
ClosePrinter(hPrinter);
hPrinter = NULL;
return FALSE;
}
// Update printer information...
bFlag = SetPrinter(hPrinter, 2, (LPBYTE)pi2, 0);
//maybe we should use ResetDC to get A$ back.
curPaperSize = GetPaperSize();
// // Tell other apps that there was a change...
// SendMessageTimeout(HWND_BROADCAST, WM_DEVMODECHANGE, 0L,
// (LPARAM)(LPCTSTR)curPrinter,
// SMTO_NORMAL, 1000, NULL);
if (pi2)
GlobalFree(pi2);
//ClosePrinter(hPrinter);
return TRUE;
第二种方法,,,,,,,,,,,,,
DWORD Errno,buf[2000],len=sizeof(PRINTER_INFO_2);
PRINTER_INFO_2 pinfo2;
TCHAR PrinterName[128];
LPDEVMODE lpmod;
DEVMODE devmod;
PRINTDLG pda;
PRINTER_DEFAULTS pDefault;
memset(&pda,0,sizeof(pda));
pda.lStructSize = sizeof(pda);
//PD_RETURNDEFAULT使之获得默认打印机的设置且不显示对话框