int bmpWidth = 1600; int bmpHeight = 500; memDC.CreateCompatibleDC( &dc ); CBitmap * bitmap = new CBitmap(); bitmap->CreateCompatibleBitmap(&dc,bmpWidth, bmpHeight); CBitmap * pOldBitmap = (CBitmap *) memDC.SelectObject( bitmap ); if (pOldBitmap == NULL) // if bitmap is very big, better check this ! { memDC.DeleteDC(); delete bitmap; AfxMessageBox("Not enough resource for the bitmap. Either reduce the bitmap dimension or \nswitch to lower screen setting (e.g. 256-color mode), and try again."); return; } //draw bitmap here, or it can be done in another function memDC.Ellipse(0, 0, bmpWidth - 1, bmpHeight - 1);
CDC prtDC; CPrintInfo printInfo; CSize size; DOCINFO di; CString szPortName, szAppName, szPrintError; szAppName.LoadString(AFX_IDS_APP_TITLE); szPrintError = ""; CSize paper_size; //printer paper size in mm int xLogPPI = 0; int yLogPPI = 0; if( AfxGetApp()->GetPrinterDeviceDefaults(&printInfo.m_pPD->m_pd) ) { HDC hDC = printInfo.m_pPD->m_pd.hDC; if (hDC == NULL) hDC = printInfo.m_pPD->CreatePrinterDC(); if(hDC !=NULL) { prtDC.Attach(hDC); paper_size.cx = prtDC.GetDeviceCaps(HORZSIZE); paper_size.cy = prtDC.GetDeviceCaps(VERTSIZE); xLogPPI = prtDC.GetDeviceCaps(LOGPIXELSX); yLogPPI = prtDC.GetDeviceCaps(LOGPIXELSY); } else { AfxMessageBox("Can not find printer. Please check installed/default printers."); return; } } int scr_xLogPPI = dc.GetDeviceCaps(LOGPIXELSX); int scr_yLogPPI = dc.GetDeviceCaps(LOGPIXELSY); int paper_width = (int) ((double) paper_size.cx * (double) xLogPPI / 25.4); //width of a printed page in pixels int paper_height = (int) ((double) paper_size.cy * (double) yLogPPI / 25.4); double ratio_x = (double) xLogPPI / (double) scr_xLogPPI; double ratio_y = (double) yLogPPI / (double) scr_yLogPPI; CString strPageNumber = "";
int page_info_left = (int) ( (double) paper_width * 0.9 ); int page_info_right = paper_width; int page_info_top = (int) ( (double) paper_height * 0.99); int page_info_bottom = paper_height; CRect page_info_rect = CRect(page_info_left, page_info_top, page_info_right,page_info_bottom ); int printed_pages = 0; int total_print_pages = 0; BOOL bAbort_print = FALSE; // calculate pages int total_pages = (bmpWidth * ratio_x + paper_width - 1 ) / paper_width; //pop up printer dialog CPrintDialog prtDlg(FALSE, PD_PAGENUMS);
是否要用到com,可我还没有看过
对话框打印预览的在 codeguru 。com有很多例子,你自己去找一下
{
CDC memDC;
CClientDC dc(this);
int bmpWidth = 1600;
int bmpHeight = 500;
memDC.CreateCompatibleDC( &dc );
CBitmap * bitmap = new CBitmap();
bitmap->CreateCompatibleBitmap(&dc,bmpWidth, bmpHeight);
CBitmap * pOldBitmap = (CBitmap *) memDC.SelectObject( bitmap );
if (pOldBitmap == NULL) // if bitmap is very big, better check this !
{
memDC.DeleteDC();
delete bitmap;
AfxMessageBox("Not enough resource for the bitmap. Either reduce the bitmap dimension or
\nswitch to lower screen setting (e.g. 256-color mode), and try again.");
return;
}
//draw bitmap here, or it can be done in another function
memDC.Ellipse(0, 0, bmpWidth - 1, bmpHeight - 1);
CDC prtDC;
CPrintInfo printInfo;
CSize size;
DOCINFO di;
CString szPortName, szAppName, szPrintError;
szAppName.LoadString(AFX_IDS_APP_TITLE);
szPrintError = ""; CSize paper_size; //printer paper size in mm
int xLogPPI = 0;
int yLogPPI = 0; if( AfxGetApp()->GetPrinterDeviceDefaults(&printInfo.m_pPD->m_pd) )
{
HDC hDC = printInfo.m_pPD->m_pd.hDC;
if (hDC == NULL)
hDC = printInfo.m_pPD->CreatePrinterDC();
if(hDC !=NULL)
{
prtDC.Attach(hDC);
paper_size.cx = prtDC.GetDeviceCaps(HORZSIZE);
paper_size.cy = prtDC.GetDeviceCaps(VERTSIZE);
xLogPPI = prtDC.GetDeviceCaps(LOGPIXELSX);
yLogPPI = prtDC.GetDeviceCaps(LOGPIXELSY);
}
else
{
AfxMessageBox("Can not find printer. Please check installed/default printers.");
return;
}
}
int scr_xLogPPI = dc.GetDeviceCaps(LOGPIXELSX);
int scr_yLogPPI = dc.GetDeviceCaps(LOGPIXELSY);
int paper_width = (int) ((double) paper_size.cx * (double) xLogPPI / 25.4); //width of a printed page in pixels
int paper_height = (int) ((double) paper_size.cy * (double) yLogPPI / 25.4);
double ratio_x = (double) xLogPPI / (double) scr_xLogPPI;
double ratio_y = (double) yLogPPI / (double) scr_yLogPPI; CString strPageNumber = "";
int page_info_left = (int) ( (double) paper_width * 0.9 );
int page_info_right = paper_width;
int page_info_top = (int) ( (double) paper_height * 0.99);
int page_info_bottom = paper_height;
CRect page_info_rect = CRect(page_info_left, page_info_top,
page_info_right,page_info_bottom );
int printed_pages = 0;
int total_print_pages = 0;
BOOL bAbort_print = FALSE; // calculate pages
int total_pages = (bmpWidth * ratio_x + paper_width - 1 ) / paper_width;
//pop up printer dialog
CPrintDialog prtDlg(FALSE, PD_PAGENUMS);
prtDlg.m_pd.nMinPage = 1;
prtDlg.m_pd.nMaxPage = total_pages;
prtDlg.m_pd.nFromPage = 1;
prtDlg.m_pd.nToPage = total_pages;
if(prtDlg.DoModal() == IDOK )
{
memset(&di, 0, sizeof(DOCINFO));
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = szAppName;
szPortName = prtDlg.GetPortName();
di.lpszOutput = szPortName;
prtDC.m_bPrinting = TRUE;
}
else
return; //Cancel button pressed, don't forget this! if(prtDC.StartDoc(&di) == -1)
{
AfxMessageBox("Printing error occured. Unable to find printer.");
prtDC.Detach();
prtDC.DeleteDC();
return;
}
prtDC.SetMapMode(MM_TEXT);
int i = 0;
for(i = 0; i < total_pages; i++)
{
prtDC.StartPage();
strPageNumber.Format("Page:%d of %d", ++printed_pages, total_print_pages );
if ( i == (total_pages - 1) && total_pages > 1 ) //last page
{
int last_bmpWidth = bmpWidth - paper_width / ratio_x * i;
prtDC.StretchBlt(0, 0, last_bmpWidth * ratio_x, bmpHeight* ratio_y, &memDC,
paper_width * i / ratio_x, 0, last_bmpWidth, bmpHeight, SRCCOPY);
}
else
prtDC.StretchBlt(0, 0, paper_width, bmpHeight* ratio_y, &memDC,
paper_width * i / ratio_x, 0, paper_width / ratio_x , bmpHeight, SRCCOPY);
prtDC.TextOut(page_info_rect.left, page_info_rect.top, strPageNumber );
prtDC.EndPage();
}
memDC.SelectObject(pOldBitmap);
delete bitmap;
memDC.DeleteDC();
prtDC.EndDoc();
prtDC.Detach();
prtDC.DeleteDC();
return;
}