打印变小的问题 比如打印机是300dpi*300dpi,那么就是2.54cm打印300个像素点,因此你打出来的会很小。如果你是自己实现打印,就把该区域放大后复制到打印机dc中便可,利用StretchBlt,打印纸张的尺寸你可以利用函数读出来,放大的比例你就可以根据需要自己设定了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 谢谢zamely 你的意思是把画的线条当做图片一样读到DC中吧,这是读取图片代码,怎样改成读取自己上门所画的线段呢?CDC MemDC; // 内存设备环境指针,在视的整个存在过程都将存在 CBitmap Bitmap,*pOldBmp; CRect Source, Dest; // 记录源位图尺寸和最终显示尺寸 BITMAP bm; if(MemDC.GetSafeHdc() == NULL) { HBITMAP hbitmap=(HBITMAP)LoadImage(0,pathpho,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE); Bitmap.Attach(hbitmap); MemDC.CreateCompatibleDC(pDC); Bitmap.GetObject(sizeof(bm),&bm); pOldBmp=MemDC.SelectObject(&Bitmap); Source.top=0; Source.left=0; Source.right= bm.bmWidth; Source.bottom = bm.bmHeight; Dest = Source; } pDc->StretchBlt(LEFT+260+FONTWEIGHT3*3+5,TOP+FONTHIGH-5,415,FONTHIGH*6, &MemDC, 0,0, Source.right,Source.bottom, SRCCOPY); 差不多是这个意思,不知道你解决没有,因为我自己就是这样解决的!是这样的,你直接获取当前绘图区域的dc,然后将绘图区域dc(可以是内存dc)中需要打印的区域放大复制到打印机dc就可以了void CCurveDlg::OnPrint() { //打印对话框 DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_NOSELECTION | PD_HIDEPRINTTOFILE; CPrintDialog dlg(FALSE); CClientDC dc(this); CClientDC* pCurveDlgDC=&dc; CRect rect; m_curvePanel.GetClientRect(&rect); CRect toolbarCltRect; m_curveToolBar.GetClientRect(&toolbarCltRect); UINT top=toolbarCltRect.Height()+CURVEPANEL_TOP_TOOLBAR; UINT left=CURVEPANEL_LEFT_DLG; CDC memDC; memDC.CreateCompatibleDC(pCurveDlgDC); CBitmap memBmp; memBmp.CreateCompatibleBitmap(pCurveDlgDC,rect.Width(),rect.Height()); memDC.SelectObject(&memBmp); memDC.BitBlt(0,0,rect.Width(),rect.Height(),pCurveDlgDC,left,top,SRCCOPY); if (dlg.DoModal() == IDOK) { //获得打印机DC HDC hDC = dlg.GetPrinterDC(); if (hDC == NULL) { return; } //通过HDC获得CDC指针 CDC* pDC = CDC::FromHandle(hDC); pDC->m_bPrinting = TRUE; //文档信息,含StartDoc()需要使用的输入输出文件名和其他信息。 DOCINFO di; ::ZeroMemory (&di, sizeof (DOCINFO)); di.cbSize = sizeof (DOCINFO); di.lpszDocName = _T("Curve"); //开始打印 BOOL bPrinting = pDC->StartDoc(&di); //for (UINT nPage = 0; nPage < 10 && bPrinting; nPage++) //{ UINT nPage = 0; pDC->StartPage(); //输出文本 //CString strText = _T(""); //strText.Format(_T("第%d页"), nPage + 1); pDC->SelectObject(&memBmp); UINT widthPixel,heightPixel; //获取纸张像素大小 heightPixel=pDC->GetDeviceCaps(VERTRES); widthPixel=pDC->GetDeviceCaps(HORZRES); UINT i=0,j=0; for(;i*rect.Width()<widthPixel;i++); i--; for(;j*rect.Height()<heightPixel;j++); j--; i=(i<j)?i:j; //采用600dpi打印分辨率,放大10倍都看不出失真 pDC->StretchBlt(0,0,i*rect.Width(),i*rect.Height(),&memDC,0,0,rect.Width(),rect.Height(),SRCCOPY); /* pDC->TextOut(100, 0, strText); pDC->TextOut(100, 200, _T("111")); pDC->TextOut(400, 200, _T("222")); pDC->TextOut(700, 200, _T("333")); pDC->TextOut(1000, 200, _T("444")); */ bPrinting = (pDC->EndPage() > 0); // } if (bPrinting) pDC->EndDoc(); else pDC->AbortDoc(); //结束打印 pDC->EndDoc(); //删除DC pDC->DeleteDC(); }}这是我的代码,我是先把屏幕区域复制到内存DC,然后再内存DC复制到打印机dc,因为某种原因我需要如此,而你直接复制就可以了。 求图像倾斜算法 MFC VC++6.0 计算器 想用栈,但有些地方不会 新手 随机 发牌程序? 邮件代理服务器是是怎么回事? 用GDI+显示带透明效果的BMP图片 ?有谁想要呢? 关于文档/视图结构的"无标题"的去除 我想做个简单的通讯录,望各位大仙各显神通,本人不胜感激!!! SendMessage广播消息死锁 为什么错?请改正 C# 这种类型的树形菜单栏 如何实现?(如图) 为什么我MFC+SQLSERVER2008 的查询语句失败?
你的意思是把画的线条当做图片一样读到DC中吧,这是读取图片代码,怎样改成读取自己上门所画的线段呢?
CDC MemDC; // 内存设备环境指针,在视的整个存在过程都将存在
CBitmap Bitmap,*pOldBmp;
CRect Source, Dest; // 记录源位图尺寸和最终显示尺寸
BITMAP bm;
if(MemDC.GetSafeHdc() == NULL)
{
HBITMAP hbitmap=(HBITMAP)LoadImage(0,pathpho,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
Bitmap.Attach(hbitmap);
MemDC.CreateCompatibleDC(pDC);
Bitmap.GetObject(sizeof(bm),&bm);
pOldBmp=MemDC.SelectObject(&Bitmap);
Source.top=0;
Source.left=0;
Source.right= bm.bmWidth;
Source.bottom = bm.bmHeight;
Dest = Source;
}
pDc->StretchBlt(LEFT+260+FONTWEIGHT3*3+5,TOP+FONTHIGH-5,415,FONTHIGH*6,
&MemDC, 0,0, Source.right,Source.bottom, SRCCOPY);
差不多是这个意思,不知道你解决没有,因为我自己就是这样解决的!是这样的,你直接获取当前绘图区域的dc,然后将绘图区域dc(可以是内存dc)中需要打印的区域放大复制到打印机dc就可以了
void CCurveDlg::OnPrint()
{
//打印对话框 DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_NOSELECTION | PD_HIDEPRINTTOFILE;
CPrintDialog dlg(FALSE);
CClientDC dc(this);
CClientDC* pCurveDlgDC=&dc;
CRect rect;
m_curvePanel.GetClientRect(&rect);
CRect toolbarCltRect;
m_curveToolBar.GetClientRect(&toolbarCltRect);
UINT top=toolbarCltRect.Height()+CURVEPANEL_TOP_TOOLBAR;
UINT left=CURVEPANEL_LEFT_DLG;
CDC memDC;
memDC.CreateCompatibleDC(pCurveDlgDC);
CBitmap memBmp;
memBmp.CreateCompatibleBitmap(pCurveDlgDC,rect.Width(),rect.Height());
memDC.SelectObject(&memBmp);
memDC.BitBlt(0,0,rect.Width(),rect.Height(),pCurveDlgDC,left,top,SRCCOPY);
if (dlg.DoModal() == IDOK)
{
//获得打印机DC
HDC hDC = dlg.GetPrinterDC();
if (hDC == NULL)
{
return;
}
//通过HDC获得CDC指针
CDC* pDC = CDC::FromHandle(hDC);
pDC->m_bPrinting = TRUE;
//文档信息,含StartDoc()需要使用的输入输出文件名和其他信息。
DOCINFO di;
::ZeroMemory (&di, sizeof (DOCINFO));
di.cbSize = sizeof (DOCINFO);
di.lpszDocName = _T("Curve");
//开始打印
BOOL bPrinting = pDC->StartDoc(&di);
//for (UINT nPage = 0; nPage < 10 && bPrinting; nPage++)
//{
UINT nPage = 0;
pDC->StartPage();
//输出文本
//CString strText = _T("");
//strText.Format(_T("第%d页"), nPage + 1);
pDC->SelectObject(&memBmp);
UINT widthPixel,heightPixel;
//获取纸张像素大小
heightPixel=pDC->GetDeviceCaps(VERTRES);
widthPixel=pDC->GetDeviceCaps(HORZRES);
UINT i=0,j=0;
for(;i*rect.Width()<widthPixel;i++);
i--;
for(;j*rect.Height()<heightPixel;j++);
j--;
i=(i<j)?i:j;
//采用600dpi打印分辨率,放大10倍都看不出失真
pDC->StretchBlt(0,0,i*rect.Width(),i*rect.Height(),&memDC,0,0,rect.Width(),rect.Height(),SRCCOPY); /*
pDC->TextOut(100, 0, strText);
pDC->TextOut(100, 200, _T("111"));
pDC->TextOut(400, 200, _T("222"));
pDC->TextOut(700, 200, _T("333"));
pDC->TextOut(1000, 200, _T("444"));
*/
bPrinting = (pDC->EndPage() > 0);
// }
if (bPrinting)
pDC->EndDoc();
else
pDC->AbortDoc();
//结束打印
pDC->EndDoc();
//删除DC
pDC->DeleteDC();
}
}
这是我的代码,我是先把屏幕区域复制到内存DC,然后再内存DC复制到打印机dc,因为某种原因我需要如此,而你直接复制就可以了。