图形打印,up者有分

jim801716 2004-03-15 11:48:34
有图形打印源代码吗
jim801715@sina.com
谢谢
...全文
82 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tvman 2004-03-19
  • 打赏
  • 举报
回复
up a
kpld8888 2004-03-19
  • 打赏
  • 举报
回复
打印有打印机DC呀。会在屏幕上画图,当然打印也就会啦
edwardsoft 2004-03-18
  • 打赏
  • 举报
回复
void CSGVView::OnPrintBitmap()
{
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;
}
jim801716 2004-03-17
  • 打赏
  • 举报
回复
求源码
bluebohe 2004-03-15
  • 打赏
  • 举报
回复
http://www.csdn.net/develop/read_article.asp?id=23388
http://www.csdn.net/develop/read_article.asp?id=23389
yueshujiang 2004-03-15
  • 打赏
  • 举报
回复
VC++

这里可能有:
http://www.pcvc.net/
http://www.vckbase.com/
http://www.vchelp.net/vchelp/vchelp.asp
asett1 2004-03-15
  • 打赏
  • 举报
回复
图形打印实际上就是copy屏幕,输出到OnDraw()再进行打印
如果是图元,可以以矢量格式存贮和打印
lmphp 2004-03-15
  • 打赏
  • 举报
回复
2 lou up!
快乐鹦鹉 2004-03-15
  • 打赏
  • 举报
回复
一楼
seagis 2004-03-15
  • 打赏
  • 举报
回复
你要打印图形的那一部分呢?
如果是只打印当前视图,我已经成功地打印出来了!
hello312 2004-03-15
  • 打赏
  • 举报
回复
可以手动绘制阿

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧