⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_29935.htm

📁 vc
💻 HTM
字号:
<p>
序号:29935 发表者:极品飞车 发表日期:2003-02-18 21:34:16
<br>主题:在现有的程序中如何添加代码实现打印功能
<br>内容:我想在自己的MFC生成的程序中添加打印功能.谢谢!!!
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:bird 回复日期:2003-02-19 08:54:24
<br>内容:看看:<BR><BR>http://www.swm.com.cn/yingyong/rj-99-yy9/99-9-1.htm
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:金枪鱼 回复日期:2003-02-20 00:57:14
<br>内容:看看这个无视图打印函数,或许有帮助<BR><BR>//打印函数<BR>//s为要打印的字符串(本函数会自动在其最后添加一个换行符号"\n")<BR><BR>void CA××××::MyPrint(int Startx,int Starty,CString s)<BR>{<BR>&nbsp;&nbsp; CDC dc;<BR>&nbsp;&nbsp; CPrintDialog printDlg(FALSE,PD_ALLPAGES|PD_HIDEPRINTTOFILE);&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(IDCANCEL==printDlg.DoModal())&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteDC(dc.Detach()); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;dc.Attach(printDlg.GetPrinterDC());<BR>&nbsp;&nbsp;&nbsp;&nbsp;DOCINFO Info; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Info.cbSize = sizeof(DOCINFO);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Info.lpszDocName = "鼎码科技";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Info.lpszOutput = NULL;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Info.lpszDatatype = NULL;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Info.fwType = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;dc.StartDoc(&amp;Info); //通知打印机驱动程序执行一新的<BR>&nbsp;&nbsp;&nbsp;&nbsp;//打印任务(并不具体打印,而是写入缓冲区准备打印)<BR>&nbsp;&nbsp;&nbsp;&nbsp;//成功返回正数,否则为-1<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;dc.StartPage();//通知打印机驱动程序打印新页<BR>//映射模式选择<BR>&nbsp;&nbsp;&nbsp;&nbsp;dc.SetMapMode(MM_HIMETRIC);//设置当前影射模式为:单位0.01毫米<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CRect rectPrint(0, 0,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dc.GetDeviceCaps(HORZRES),//返回设备的.以象素为单位的物理显示宽度 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dc.GetDeviceCaps(VERTRES)//返回设备的.以象素为单位的物理显示高度<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.DPtoLP(&amp;rectPrint);//设备物理单位转化为逻辑单位<BR>&nbsp;&nbsp;&nbsp;&nbsp; dc.SetWindowOrg(0, -rectPrint.bottom);//设置原点<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR><BR>//字体设置<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp; //构造三种字体,&nbsp;&nbsp;&nbsp;&nbsp;CFont font,font1,font2;<BR>&nbsp;&nbsp;&nbsp;&nbsp;LOGFONT lf,lf1,lf2;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//清理逻辑字体的设置<BR>&nbsp;&nbsp;&nbsp;&nbsp;memset(&amp;lf,0,sizeof(LOGFONT));<BR>&nbsp;&nbsp;&nbsp;&nbsp;memset(&amp;lf1,0,sizeof(LOGFONT));<BR>&nbsp;&nbsp;&nbsp;&nbsp;memset(&amp;lf2,0,sizeof(LOGFONT));<BR>&nbsp;&nbsp;&nbsp;&nbsp;//定义正文逻辑字体的属性<BR>&nbsp;&nbsp;&nbsp;&nbsp;lf.lfHeight=110; <BR>&nbsp;&nbsp;&nbsp;&nbsp;lf.lfWidth=0;//缺省 <BR>&nbsp;&nbsp;&nbsp;&nbsp;........<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;VERIFY(font.CreatePointFontIndirect(&amp;lf,&amp;dc));<BR>&nbsp;&nbsp;&nbsp;&nbsp;VERIFY(font1.CreatePointFontIndirect(&amp;lf1,&amp;dc));<BR>&nbsp;&nbsp;&nbsp;&nbsp;VERIFY(font2.CreatePointFontIndirect(&amp;lf2,&amp;dc));<BR><BR>// 创建画笔来画表格和线<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;CPen myPen1,myPen2;<BR>&nbsp;&nbsp;&nbsp;&nbsp;myPen1.CreatePen(PS_SOLID,25,RGB(0,0,0));<BR>&nbsp;&nbsp;&nbsp;&nbsp;myPen2.CreatePen(PS_SOLID,60,RGB(0,0,0));<BR> //设置字体的缺省原点<BR>dc.SetTextAlign(TA_TOP|TA_LEFT);//缺省<BR><BR>//打出头部<BR>&nbsp;&nbsp;&nbsp;&nbsp;CFont* old_font=dc.SelectObject(&amp;font1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString strPageHeader=_T("鼎码科技");<BR>&nbsp;&nbsp;&nbsp;&nbsp;//计算这个字符串字符所在的长宽<BR>&nbsp;&nbsp;&nbsp;&nbsp;CSize sizeHeader=dc.GetTextExtent(strPageHeader,strPageHeader.GetLength());<BR>&nbsp;&nbsp;&nbsp;&nbsp;//将这个字符串放在中间的矩形框中对中打印<BR>&nbsp;&nbsp;&nbsp;&nbsp;CRect rectHeader;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rectHeader.left=(rectPrint.right-sizeHeader.cx)/2;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rectHeader.top= -rectPrint.bottom;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rectHeader.right=(rectPrint.right-sizeHeader.cx)/2+sizeHeader.cx;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rectHeader.bottom=-rectPrint.bottom-sizeHeader.cy;<BR>&nbsp;&nbsp;&nbsp;&nbsp;dc.DrawText(strPageHeader,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strPageHeader.GetLength(),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rectHeader,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DT_CENTER|DT_SINGLELINE<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<BR>//在打出的页头文本下面画两根线<BR>&nbsp;&nbsp;&nbsp;&nbsp;CPen *pOldPen=dc.SelectObject(&amp;myPen1);//选择画笔1,并保留原来的画笔<BR>&nbsp;&nbsp;&nbsp;&nbsp;dc.MoveTo(rectHeader.left,rectHeader.bottom-100);<BR>&nbsp;&nbsp;&nbsp;&nbsp;dc.LineTo(rectHeader.right,rectHeader.bottom-100);<BR>&nbsp;&nbsp;&nbsp;&nbsp;dc.SelectObject(&amp;myPen2);//选择画笔2<BR>&nbsp;&nbsp;&nbsp;&nbsp;dc.MoveTo(rectHeader.left,rectHeader.bottom-230);<BR>&nbsp;&nbsp;&nbsp;&nbsp;dc.LineTo(rectHeader.right,rectHeader.bottom-230);<BR>&nbsp;&nbsp;&nbsp;&nbsp;//画笔使用完毕,恢复缺省画笔<BR>&nbsp;&nbsp;&nbsp;&nbsp;dc.SelectObject(pOldPen);//恢复原来的画笔<BR><BR>//打印页脚<BR>&nbsp;&nbsp;&nbsp;&nbsp;dc.SelectObject(&amp;font2);//选择字体,这里不保留上面已经调用字体font1<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString strPageEnd=_T("鼎码科技");<BR>&nbsp;&nbsp;&nbsp;&nbsp;CSize sizePageEnd=dc.GetTextExtent(strPageEnd,strPageEnd.GetLength());<BR>&nbsp;&nbsp;&nbsp;&nbsp;CPoint pointPageEnd;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pointPageEnd.x=rectPrint.right-sizePageEnd.cx-100;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pointPageEnd.y=sizePageEnd.cy+50;<BR>&nbsp;&nbsp;&nbsp;&nbsp;dc.TextOut(pointPageEnd.x,pointPageEnd.y,strPageEnd);<BR><BR>//打印正文<BR>&nbsp;&nbsp;&nbsp;&nbsp;dc.SelectObject(&amp;font);//选择字体<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>int index;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CSize size;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int x = Startx;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int y = Starty;<BR>&nbsp;&nbsp;&nbsp;&nbsp;size = dc.GetTextExtent("00", 2);<BR>&nbsp;&nbsp;&nbsp;&nbsp;while((index = s.Find("\n")) != -1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ss = s.Left(index);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ss.Find("\r") != -1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ss = s.Left(index-1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = s.Mid(index+1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dc.TextOut(x, y, ss);//打印到缓冲区<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y -= size.cy;//减小Y座标<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;dc.SelectObject(old_font); //恢复原来的字体<BR>&nbsp;&nbsp;&nbsp;&nbsp;font.DeleteObject(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;font1.DeleteObject();<BR>&nbsp;&nbsp;&nbsp;&nbsp;font2.DeleteObject();//删除字体<BR>&nbsp;&nbsp;&nbsp;&nbsp;myPen1.DeleteObject();<BR>&nbsp;&nbsp;&nbsp;&nbsp;myPen2.DeleteObject();//删除画笔<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;dc.EndPage(); //通知打印机驱动程序页结束<BR>&nbsp;&nbsp;&nbsp;&nbsp;dc.EndDoc();//通知打印机驱动程序打印完毕(缓冲区写入完毕,具体打印开始)<BR>&nbsp;&nbsp;&nbsp;&nbsp;DeleteDC(dc.Detach()); //删除打印机DC<BR>&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>}
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -