|
使用打印机(VC++) 对话框等应用程序里,需要自己编写打印机控制程序。本笔记纪录使用API,①向默认打印机输出数据,②显示打印机设置对话框后打印的处理方法。③使用MFC的CPrintDialog打印的方法。 1.为了做测试,编一个极为简单的打印任务。在打印纸上打一个長方形,印一个字符串“Printer Testing”。 void CPrinterTestDlg::DoPrinting(CDC* pDC)
{
DOCINFO docinfo;
memset(&docinfo, 0, sizeof(DOCINFO));
docinfo.cbSize = sizeof(DOCINFO);
docinfo.lpszDocName = _T("Printer Testing.");
pDC->StartDoc(&docinfo);
pDC->StartPage();
DWORD dwScrWidth = pDC->GetDeviceCaps(HORZRES);
DWORD dwScrHeight = pDC->GetDeviceCaps(VERTRES);
CRect r(0, 0, dwScrWidth-1, dwScrHeight-1);
r.DeflateRect(1, 1);
pDC->Rectangle(&r);
CString strText(_T("Printer Testing."));
pDC->DrawText(strText, &r, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
pDC->EndPage();
pDC->EndDoc();
}
2.使用API,向默认打印机输出数据,打印纸横向,B5尺寸。 #include "winspool.h"
void CPrinterTestDlg::PrintFromDefaultPrinter()
{
TCHAR PrinterName[400];
DWORD dwBufferSize = 400;
BOOL bRet = GetDefaultPrinter(PrinterName, &dwBufferSize);
if (!bRet)
return;
LPDEVMODE pDevMode = GetDevMode_LandscapeB5(PrinterName);
CDC dcPrint;
bRet = dcPrint.CreateDC(NULL, PrinterName, NULL, pDevMode);
if (!bRet)
return;
DoPrinting(&dcPrint);
dcPrint.DeleteDC();
}
LPDEVMODE CPrinterTestDlg::GetDevMode_LandscapeB5(LPTSTR pPrinterName)
{
HANDLE hPrinter;
LPDEVMODE pDevMode = NULL;
DWORD dwNeeded;
DWORD dwRet;
if (!OpenPrinter(pPrinterName, &hPrinter, NULL))
return NULL;
dwNeeded = DocumentProperties(m_hWnd,
hPrinter, /* handle to our printer */
pPrinterName, /* Name of the printer */
NULL, /* Asking for size so */
NULL, /* these are not used. */
0); /* Zero returns buffer size. */
pDevMode = (LPDEVMODE)malloc(dwNeeded);
dwRet = DocumentProperties(m_hWnd,
hPrinter,
pPrinterName,
pDevMode, /* The address of the buffer to fill. */
NULL, /* Not using the input buffer. */
DM_OUT_BUFFER); /* Have the output buffer filled. */
if (dwRet != IDOK)
{
free(pDevMode);
ClosePrinter(hPrinter);
return NULL;
}
if (pDevMode->dmFields & DM_ORIENTATION)
{
/* 横向用紙 */
pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
}
if (pDevMode->dmFields & DM_PAPERSIZE)
{
/* B5紙*/
pDevMode->dmPaperSize = DMPAPER_B5;
}
dwRet = DocumentProperties(m_hWnd,
hPrinter,
pPrinterName,
pDevMode, /* Reuse our buffer for output. */
pDevMode, /* Pass the driver our changes. */
DM_IN_BUFFER | /* Commands to Merge our changes and */
DM_OUT_BUFFER); /* write the result. */
ClosePrinter(hPrinter);
if (dwRet != IDOK)
{
free(pDevMode);
return NULL;
}
return pDevMode;
}
3.使用API,显示打印机设置对话框后打印。 BOOL CPrinterTestDlg::PrintFromDialogBox()
{
PRINTDLG pd;
// Initialize PRINTDLG
ZeroMemory(&pd, sizeof(pd));
pd.lStructSize = sizeof(pd);
pd.hwndOwner = m_hWnd;
pd.hDevMode = NULL; // Don't forget to free or store hDevMode
pd.hDevNames = NULL; // Don't forget to free or store hDevNames
pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC;
pd.nCopies = 1;
pd.nFromPage = 0xFFFF;
pd.nToPage = 0xFFFF;
pd.nMinPage = 1;
pd.nMaxPage = 0xFFFF;
if (PrintDlg(&pd)==TRUE)
{
CDC dcPrint;
dcPrint.Attach(pd.hDC);
DoPrinting(&dcPrint);
dcPrint.Detach();
DeleteDC(pd.hDC);
GlobalFree(pd.hDevMode);
GlobalFree(pd.hDevNames);
return TRUE;
}
return FALSE;
}4.使用MFC的CPrintDialog打印。 void Test(BOOL bDispDialog)
{
CPrintDialog dlg(FALSE);
if (!bDispDialog) //デフォルトプリンタに印刷します。
{
dlg.GetDefaults();
CDC dc;
dc.Attach(dlg.CreatePrinterDC());
DoPrinting(&dcPrint);
dc.Detach();
}
else
if (dlg.DoModal() == IDOK) //プリンタ選択画面を出してから印刷します。
{
CDC dc;
dc.Attach(dlg.CreatePrinterDC());
DoPrinting(&dcPrint);
dc.Detach();
}
}
|