很复杂。
首先用PrintDlg得到一个hPrinterDC;
然后计算打印纸的大小用GetDeviceCaps以计算每页能打印的字符数。
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_FILE_PRINT:
{
DOCINFO di = {sizeof(DOCINFO),szAppName};//程序名
if(StartDoc(hPrinterDC, &di) >0)
for( int i = 0; i< num_Pages; i++)
{
if(StartPage(hPrinterDC) <0)
break;
//drawing functions;
if(EndPage(hPrinterDC) <0)
break;
}
}
首先用PrintDlg得到一个hPrinterDC;
然后计算打印纸的大小用GetDeviceCaps以计算每页能打印的字符数。
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_FILE_PRINT:
{
DOCINFO di = {sizeof(DOCINFO),szAppName};//程序名
if(StartDoc(hPrinterDC, &di) >0)
for( int i = 0; i< num_Pages; i++)
{
if(StartPage(hPrinterDC) <0)
break;
//drawing functions;
if(EndPage(hPrinterDC) <0)
break;
}
}
/* */
/* 関数名称: 字体セット */
/* */
/* 機能概要: 印刷用の字体をセットする */
/* */
/* 呼出形式: print->SetFont(height,weight,bItalic */
/* ,bUnderline,font) */
/* int height(i) :文字の高さ */
/* int weight(i) :文字の広さ */
/* BOOL bItalic(i) :斜字の設定 */
/* BOOL bUnderline(i) :下り線の設定 */
/* CString font(i) :文字の字体 */
/* */
/* 復帰値 : 判定結果 無し */
/* */
/*******************************************************************/
VOID CPrint::SetFont(INT nHeight,INT nWeight,BOOL bItalic,BOOL bUnderline,CString szFont)
{
m_font.Detach();
m_font.CreateFont(nHeight,0,0,0,nWeight,bItalic,bUnderline,0,DEFAULT_CHARSET,0,0,0,0,szFont);
}
/*******************************************************************/
/* */
/* 関数名称: プリンター初期化処理 */
/* */
/* 機能概要: システムの通常使うプリンターを取得する */
/* ページの部局をセットする */
/* プリンターの印刷方式をセットする */
/* */
/* 呼出形式: print->InitPrint() */
/* */
/* 復帰値 : 判定結果 */
/* TRUE OK */
/* FALSE ERROR */
/* */
/*******************************************************************/
BOOL CPrint::InitPrint()
{
CPrintDialog printDlg(FALSE);
//
// if (printDlg.DoModal() == IDCANCEL) return false;
//
if(!printDlg.GetDefaults())
{
return FALSE;
}
printDlg.GetDevMode()->dmOrientation = 1;
printdc.Attach(printDlg.CreatePrinterDC());
printdc.m_bPrinting = TRUE;
printdc.SetMapMode(MM_LOMETRIC);
//
CString szTitle;
szTitle.LoadString(AFX_IDS_APP_TITLE);
//
::ZeroMemory (&di, sizeof (DOCINFO));
di.cbSize = sizeof (DOCINFO);
di.lpszDocName = szTitle;
return true;
}
/*******************************************************************/
/* */
/* 関数名称: ページが印刷され始める処理 */
/* */
/* 機能概要: Doc印刷開始するし 新しいページ開始する */
/* */
/* 呼出形式: print->StartPrint() */
/* */
/* 復帰値 : 判定結果 */
/* TRUE OK */
/* FALSE ERROR */
/* */
/*******************************************************************/
INT CPrint::StartPrint(VOID)
{
INT nPrintingOK = printdc.StartDoc(&di);
nPrintingOK &= printdc.StartPage();
return nPrintingOK;
}
/*******************************************************************/
/* */
/* 関数名称: 印刷完了処理 */
/* */
/* 機能概要: Doc印刷完了する */
/* 字体と印刷Handleを消滅する */
/* */
/* 呼出形式: print->EndPrint() */
/* */
/* 復帰値 : 判定結果 無し */
/* */
/*******************************************************************/
VOID CPrint::EndPrint(VOID)
{
printdc.EndPage();
printdc.EndDoc(); m_font.Detach();
printdc.Detach();
::DeleteDC(printdc);
}
/*******************************************************************/
/* */
/* 関数名称: 居中印刷 */
/* */
/* 機能概要: 字体をセットする */
/* 指定された矩形の中で居中に文字を描く */
/* */
/* 呼出形式: print->PrintStrC(rc, Text) */
/* RECT rc(i) :矩形 */
/* CString Text(i) :文字 */
/* */
/* 復帰値 : 判定結果 無し */
/* */
/*******************************************************************/
VOID CPrint::PrintStrC(RECT rc, CString szText) //居右に 印刷する
{
printdc.SelectObject(&m_font);
printdc.DrawText(szText,&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
/*******************************************************************/
/* */
/* 関数名称: 居左印刷 */
/* */
/* 機能概要: 字体をセットする */
/* 指定された矩形の中で居左に文字を描く */
/* */
/* 呼出形式: print->PrintStrL(rc, Text) */
/* RECT rc(i) :矩形 */
/* CString Text(i) :文字 */
/* */
/* 復帰値 : 判定結果 無し */
/* */
/*******************************************************************/
VOID CPrint::PrintStrL(RECT rc, CString szText) //居左に 印刷する
{
printdc.SelectObject(&m_font);
printdc.SetBkMode(TRANSPARENT);
printdc.DrawText(szText,&rc,DT_SINGLELINE|DT_NOCLIP);
printdc.SetBkMode(OPAQUE);
}