VC_对话框程序打印及打印预览的实现
C#打印、打印预览、页面设置案例
操作方式:
1.新建一个项目,其中有两个form(Form1,Form2)
2.在Form1中添加菜单mainMenu1,一个richTextBox1(定义为Public),一个打印文档控件PrintDocument,名称为MyPrintDC。一个状态栏名称为myStatus。
关于(mnAbout)
3.在Form2中添加一个标签:查找内容,文本(txtSearch),命令按钮(btnSearch) 查找一下个,命令按钮(btnCancel)取消
4.Form1中代码:
加入引用:
using System.IO;
在控件定义阶段中加入:
private StringReader myReader;
Graphics myGraphics=e.Graphics;
Font myPrintFont=this.richTextBox1.Font;
//计算一页行数
float iLinePage=e.MarginBounds.Height/myPrintFont.GetHeight(myGraphics);
this.richTextBox1.SelectedText ="";
this.mnCopy.Enabled =false;
this.mnCut.Enabled =false;
this.mnPaste.Enabled =true;
}
}
}
复制菜单(mnCopy):
if (this.richTextBox1.SelectedText!="")
{
vc 实现打印功能
vc 实现打印功能vc 实现打印功能分类:VC 6.0/MFC 2011-11-29 21:16 852人阅读评论(1) 收藏举报Visual C++6.0是开发Windows应用程序的强大工具,但是要通过它实现程序的打印功能,一直是初学者的一个难点,经常有朋友询问如何在VC中实现打印功能,他们往往感到在MFC提供的框架内实现这个问题很复杂,不知道如何下手。
本例针对这个问题,介绍一种简单的方法实现文字串的打印功能,读者朋友可以在此基础上稍微改动一下,就可以实现文件、图像的打印功能。
一、实现方法在Windows 操作系统下,显示器、打印机和绘图仪都被视为输出设备,正常情况下,系统默认的输出设备是显示器。
要使用打印机,首先需要创建一个指向打印机的设备环境句柄,然后通过该句柄调用相关的绘图函数把所需的文字和图形输出至打印机上。
当打印结束后,删除这个设备环境句柄即可。
当Windows系统中安装好打印机后,系统总是自动设置一个打印机为系统的默认打印机,在Windows的启动配置文件Win.ini中的[window]段中列出了带有关键字device的默认打印机。
下面是某一机器中Win.ini中的[Windows]字段的内容:[windows]load=run=NullPort=Nonedevice=HP LaserJet 4050(computer000),HPBFDB1,LPT1在上述关键字device后的字符串中,包含了系统中默认打印机的三个重要属性,它们依次是打印机的设备名HP LaserJet 4050(computer000),驱动程序名是HPBFDB1,输出端口为LPT1。
为了操纵系统默认的打印机,实现程序的打印功能,在程序中可调用API函数GetProfileString ()从Win.ini文件中获得device这个设备字符串,该函数的原型为:DWORD GetProfileString( LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize)。
VC编程中在打开文件对话框上实现图象预览
VC编程中在打开文件对话框上实现图象预览(图)安全中国 更新时间:2009-06-12 03:01:40 责任编辑:池天前言:本文主要是介绍在打开文件对话框,实现对图象,文本等预览(在VC++6.0下实现)。
本人的水平有限,如有表达不清之处,请谅解,请各位提出意见与建议!正文:1、Win98下预览对话框的实现:2、Win2000,XP下预览对话框的实现:3、m_ofn成及OPENFILENAME的介绍:4、定制个性的CFileDialog对话框:5、怎么样把预览区,放在对话框的右边:6、多选问题的解决:7、对预览问题的收集,如对文本,声音等:1、Win98下预览对话框的实现:对常用格式的图片,在打开文件对话框中实现预览功能效果如下图:图一思路:从CFileDialog派生CFileDialogEx类,为对话框安装钩子,利用HOOK拦截我们感兴趣的CDN_SELCHANGE消息,在其中加入我们的预览功能,原理就是这么简单!使用方法:1):在ResourView中,加一个对话框,其 ID为IDD_DIALOG_HOOK, 注意其属性的设置:Dialog Properties->styles下=> style为Child、Border为None, 选中Clip siblings。
More Styles下 => 选中3D-look、 Contol。
2):在对话框上加一个 Static Text控件,用来显示图片。
ID为IDC_PIC,其属性的设置为:Text Properties下 => 选中Notify、Sunken。
3):将Picture.h,Picture.cpp;CFileDialogEx.h,CFileDialogEx.cpp添加到工程中。
其中类CFileProcess是文件处理类,用于文件进行操作。
类CPicture用于处理图片。
(详见代码)4)在应用处,只要包含头文件#include”FileDialogEx.h”。
VC中编写打印程序
DWORD m_dwFlags; // flags passed to IPrint::Print
void SetMinPage(UINT nMinPage);
1、文档视图结构的程序的打印程序的编写
通常情况下,一个结构组织的比较好的MFC程序是基于文档视图结构的,这一框架结构给我们提供了很多功能,比如菜单,注册表的关联,文件类型的注册,打印功能等。
下面是MFC的打印的函数的实现,该函数名为OnFilePrint它不是一个虚函数,而是响应缺省的COMMAND消息的处理函数,因为MFC提供了向导生成的菜单和工具栏,关于打印的命令ID为ID_FILE_PRINT ,而在视图类的MessageMap里有这样一项,ON_COMMAND (ID_FILE_PRINT, CView::OnFilePrint),因此实际使用的过程中可以不用原来的ID, 而使用自己的ID如ID_MYPRINT,再在MessageMap里加入ON_COMMAND (ID_MYPRINT, CView::OnFilePrint)即可完成原来一样的功能。ViewPrnt.cpp中有CView的OnFilePrint的函数的具体实现,下面是MFC的源代码中的主要代码:
pFrame->m_pView->OnMyPrintPreview();
}
在对话框中响应 WM_BEGIN_PRINTING, WM_END_PRINTING,WM_MY_PRINT消息,分别完成打印的初始化,释放和具体的打印操作;如在示例程序中添加了三个消息响应函数来执行该功能。
CPrintFrame *pFrame = new CPrintFrame;
MFC对话框中实现打印
2. 在CprintDlg.h中,添加三个消息
protected:
// Generated message map functions
//{{AFX_MSG(CPrint)
virtual void OnOK();
//}}AFX_MSG
1 实现打印
在对话框应用程序中不具备MFC的视和框架交互,要想实现打印和打印预览必须直接获取打印机的设备环境句柄,这时可以设置CPringDialog类中的构造函数的参数,获取打印机的设备环境句柄。利用这个句柄,转换为指针,则按打印流程实现打印任务。
(1)从CFrameWnd类派生出主窗口类CMyFrameWnd加入项目,这个类将作为控制类来实现程序的打印和打印预。
(1)从CView类派生出CMyView类加入项目。并在CMyView类中重载相关的打印和打印预览函数。这个类主要用来传递OnBeginPrinting,OnPrint,OnEndPrinting等相关函数。
(2 )在控制类的PrintPreview函数中用一个CsingleDocTemplate对象创建框架和视图窗口,其中视图类CMyView并不显示,因为它马上就被预览视图(preview view)所掩盖。m_pMainWnd改为指向新的CFrameWnd,这样预览类就可以用它作为主框架。m_pMainWnd的初始值被保存下来,当预览结束时,要将m_pMainWnd恢复到其初始值。当然,要在控制类包含头文件MyView.h。具体程序如下:
LRESULT OnBeginPrinting(WPARAM wParam,LPARAM lParam);
LRESULT OnEndPrinting(WPARAM wParam,LPARAM lParam);
C#实现打印与打印预览功能
在windows应用程序中文档的打印是一项非常重要的功能,在以前一直是一个非常复杂的工作,Microsoft .Net Framework的打印功能都以组件的方式提供,为程序员提供了很大的方便,但是这几个组件的使用还是很复杂的,有必要解释一下。
打印操作通常包括以下四个功能:1 打印设置设置打印机的一些参数,比如更改打印机驱动程序等;2 页面设置设置页面大小纸张类型等3 打印预览类似于word中的打印预览4 打印实现打印功能的核心是PrintDocument类这个类属于System.Drawing.Printing名字空间这个类封装了当前的打印设置页面设置以及所有的与打印有关的事件和方法这个类包括以下几个属性,事件和方法1、PrinterSettings 属性存放打印机的设置信息,这个属性不需要程序员设置,因为它是由打印对话框获取的.2、PrintCountroller 属性控制打印过程3、DefaultPageSettings 属性存放页面设置信息,打印纸大小方向等,也不需要程序员设置,因为它是由页面设置对话框获取的.4、DocumentName 属性指定文档名称,出现在打印机状态窗口中1。
BeginPrint事件在打印之前发出2. PrintPage事件每打印一页是发出,事件接受一个PrintPageEventArgs参数该参数封装了打印相关的信息PrintPageEventArgs参数有很多重要的属性1 Cancel 取消打印2 Graphics页面的绘图对象3 HasMorePages 是否还有要打印的页面Print方法:该方法没有参数调用它将按照当前设置开始打印.若实现打印功能首先构造PrintDocument对象添加打印事件1: PrintDocument printDocument;2:privatevoid InitializeComponent()3: {4: ...5:// 这里的printDocument对象可以通过将PrintDocument控件拖放到窗体上来实现,注意要设置该控件的PrintPage事件。
C#中打印、预览、打印机设置和打印属性的方法
C#中打印、预览、打印机设置和打印属性的方法private void Form1_Load(object sender, System.EventArgs e) {//获取或设置一个值,该值指示是否发送到文件或端口printDocument1.PrinterSettings.PrintToFile = true;//设置打印时横向还是纵向ndscape = true;}private void fileOpenMenuItem_Click(object sender, System.EventArgs e){OpenFile();}private void OpenFile(){openFileDialog1.Filter = 'Text Files (*.txt)|*.txt';//打开文本的类型//获取文件对话框的初始目录(StartupPath)获得bin文件下的文件openFileDialog1.InitialDirectory = System.Windows.Forms.Application.StartupPath;DialogResult userResponse = openFileDialog1.ShowDialog();//MessageBox.Show(userResponse.ToString());if (userResponse==DialogResult.OK){filePath = openFileDialog1.FileName.ToString();//转换文件路径}}private void MyPrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)//充分利用e{int topMargin = printDocument1.DefaultPageSettings.Margins.Top;//上边距int leftMargin = printDocument1.DefaultPageSettings.Margins.Left;//左边距float linesPerPage = 0;//页面行号float verticalPosition = 0;//绘制字符串的纵向位置float horizontalPosition=leftMargin;//左边距string textLine = null;//行字符串currentLine = 0;//行计数器// float Xline=0;//int line=0;// Calculate the number of lines per page.linesPerPage = e.MarginBounds.Height / myFont.GetHeight(e.Graphics);// Xline=e.MarginBounds.Width/myFont.GetHeight();// for each text line that will fit on the page, read a new line from the documentwhile (currentLine < linesPerPage ){textLine = streamT oPrint.ReadLine();if(textLine == null){break;}// 求出已经打印的范围verticalPosition = topMargin + currentLine * myFont.GetHeight(e.Graphics);// 设置页面的属性e.Graphics.DrawString(textLine, myFont, myBrush, horizontalPosition, verticalPosition);// 增加行数currentLine ++;}// If more lines of text exist in the file, print another page.if (textLine != null){e.HasMorePages = true;}else{e.HasMorePages = false;}}private void printPreviewButton_Click(object sender, System.EventArgs e){try{streamToPrint = new StreamReader(filePath);try{PrintPreview();finally{streamToPrint.Close();}}catch(Exception ex){MessageBox.Show(ex.Message);}}private void runtimeDialogButton_Click(object sender, System.EventArgs e){try{streamToPrint = new StreamReader(filePath);try{RuntimeDialog();}finally{streamToPrint.Close();}}catch(Exception ex){MessageBox.Show(ex.Message);}private void printPreviewControlButton_Click(object sender, System.EventArgs e){try{streamToPrint = new StreamReader(filePath);try{PrintPreviewControl();}finally{streamToPrint.Close();}}catch(Exception ex){MessageBox.Show(ex.Message);}}private void RuntimeDialog(){PrintPreviewDialog pPDlg;pPDlg = new PrintPreviewDialog();pPDlg.Document = pDoc;pPDlg.WindowState = FormWindowState.Maximized;pPDlg.PrintPreviewControl.Columns = 2;pPDlg.ShowDialog();pPDlg.Dispose();private void PrintPreviewControl(){Form formPreview = new Form();PrintPreviewControl previewControl = new PrintPreviewControl();previewControl.Document = printDocument1;previewControl.StartPage = 2;formPreview.WindowState = FormWindowState.Maximized;formPreview.Controls.Add(previewControl);formPreview.Controls[0].Dock = DockStyle.Fill;formPreview.ShowDialog();formPreview.Dispose();}private void PrintPreview(){//设置页面的预览的页码//设置显示页面显示的大小(也就是原页面的倍数)printPreviewDialog1.PrintPreviewControl.StartPage = 0;printPreviewDialog1.PrintPreviewControl.Zoom =1.0;//设置或返回窗口状态,即该窗口是最小化、正常大小还是其他状态。
基于MFC对话框的报表打印和预览功能(推荐文档)
基于MFC对话框的报表打印和预览功能第一步:在工程中加入实现打印功能的四个文件PrintFrame.h,PringtView.h,PrintFrame.cpp, PrintView.cppCPrintFrame和CPrintView类是两个个可重用的类,开发者只需要把这两个类对应的四个文件拷贝到工程文件所在目录中(PrintFrame.h,PringtView.h,PrintFrame.cpp, PrintView.cpp),并将这四个文件加入工程,并在需要执行打印功能的代码处加入#include "PrintFrame.h"#include "PrintView.h"第二步:添加三个消息响应函数来执行该功能ON_MESSAGE(WM_BEGIN_PRINTING,OnBeginPrinting)ON_MESSAGE(WM_END_PRINTING,OnEndPrinting)ON_MESSAGE(WM_MY_PRINT,OnMyPrint)这三个消息响应函数放在.cpp文件的BEGIN_MESSAGE_MAP(CReportDlg, CDialog)与END_MESSAGE_MAP()之间,如下:BEGIN_MESSAGE_MAP(CReportDlg, CDialog) //{{AFX_MSG_MAP(CReportDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1, OnButton1)ON_MESSAGE(WM_BEGIN_PRINTING,OnBeginPrinting)ON_MESSAGE(WM_END_PRINTING,OnEndPrinting)ON_MESSAGE(WM_MY_PRINT,OnMyPrint)ON_BN_CLICKED(IDC_BUTTON2, OnButton2)//}}AFX_MSG_MAPEND_MESSAGE_MAP()其中OnMyPrint是跟具体要打印什么内容有关的开发人员要重点完成的代码,可以打印表格,图片,数据,只要GDI绘图可以进行的操作在这里都可以完成。
vc实现打印功能
vc实现打印功能vc 实现打印功能分类: VC 6.0/MFC 2011-11-29 21:16 852人阅读评论(1) 收藏举报Visual C++6.0是开发Windows应用程序的强大工具,但是要通过它实现程序的打印功能,一直是初学者的一个难点,经常有朋友询问如何在VC中实现打印功能,他们往往感到在MFC提供的框架内实现这个问题很复杂,不知道如何下手。
本例针对这个问题,介绍一种简单的方法实现文字串的打印功能,读者朋友可以在此基础上稍微改动一下,就可以实现文件、图像的打印功能。
一、实现方法在Windows操作系统下,显示器、打印机和绘图仪都被视为输出设备,正常情况下,系统默认的输出设备是显示器。
要使用打印机,首先需要创建一个指向打印机的设备环境句柄,然后通过该句柄调用相关的绘图函数把所需的文字和图形输出至打印机上。
当打印结束后,删除这个设备环境句柄即可。
当Windows系统中安装好打印机后,系统总是自动设置一个打印机为系统的默认打印机,在Windows的启动配置文件Win.ini中的[window]段中列出了带有关键字device的默认打印机。
下面是某一机器中Win.ini中的[Windows]字段的内容:在上述关键字device后的字符串中,包含了系统中默认打印机的三个重要属性,它们依次是打印机的设备名HP LaserJet 4050(computer000),驱动程序名是HPBFDB1,输出端口为LPT1。
为了操纵系统默认的打印机,实现程序的打印功能,在程序中可调用API函数GetProfileString()从Win.ini文件中获得device这个设备字符串,该函数的原型为:DWORD GetProfileString( LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize)。
第8章 打印和打印预览
8.2
用MFC编程实现打印 MFC编程实现打印
MFC对打印和打印预览等进行了包装。在MFC支持的 对打印和打印预览等进行了包装。 对打印和打印预览等进行了包装 支持的 应用程序中, 应用程序中,OnDraw()函数负责显示屏和其他设备进行绘 函数负责显示屏和其他设备进行绘 制或者打印。本节简要的介绍利用MFC实现打印编程。 实现打印编程。 制或者打印。本节简要的介绍利用 实现打印编程
8.1.2 文本和字符
Win32 API提供的函数可以控制文本的特征,其中包括 提供的函数可以控制文本的特征, 提供的函数可以控制文本的特征 文本放置位置、字符之间的距离、文本颜色、 文本放置位置、字符之间的距离、文本颜色、文本之后的背 景色等。字体都有不同的大小特征, 景色等。字体都有不同的大小特征,可以用 GetTextMetrics()函数决定。TrueType字体还包含关于诸如 函数决定。 函数决定 字体还包含关于诸如 紧缩对”之类特征的信息。紧缩对是一对字符, “紧缩对”之类特征的信息。紧缩对是一对字符,当被一起 放在字符串中时,间距会被调整到具有最佳外观。 放在字符串中时,间距会被调整到具有最佳外观。 GetKerningPairs()函数可以检索这些字符组合。TrueType 函数可以检索这些字符组合。 函数可以检索这些字符组合 字体还有不能适用于其它字体的特征。 字体还有不能适用于其它字体的特征。函数 GetOutlineTextMetrics() 检索这些特征。 检索这些特征。
CPrintInfo类 8.2.3 CPrintInfo类
CPrintInfo类存储着关于打印或打印预览作业的的信息。 类存储着关于打印或打印预览作业的的信息。 类存储着关于打印或打印预览作业的的信息 框架在每次Print或Print Preview命令被选择时创建一个 框架在每次 或 命令被选择时创建一个 CPrintInfo对象,并当命令完成时销毁它。CPrintInfo包含着 对象, 对象 并当命令完成时销毁它。 包含着 关于整体打印作业的信息,也包含着打印作业的当前状态。 关于整体打印作业的信息,也包含着打印作业的当前状态。 一些信息存储在相关的CPrintDialog对象中,这个对象包 一些信息存储在相关的 对象中, 对象中 含着用户在Print对话框中输入的信息。打印期间,CPrintInfo 对话框中输入的信息。 含着用户在 对话框中输入的信息 打印期间, 对象在框架和视图之间传递,并用于两者之间的信息交换。 对象在框架和视图之间传递,并用于两者之间的信息交换。文 档的长度是直到打印后才知道的。在这种情况下, 档的长度是直到打印后才知道的。在这种情况下,视图类每次 在页被打印后测试文档的结尾。当到达结尾时, 在页被打印后测试文档的结尾。当到达结尾时,视图类把 CPrintInfo的m_bContinuePrinting成员设置为 的 成员设置为FALSE;通知 ; 成员设置为 框架停止打印循环。 框架停止打印循环。
MFC对话框使用CPrintDialog实现打印,指定打印机、后台打印
MFC对话框使用CPrintDialog实现打印,指定打印机、后台打印对话框打印,网上一搜一大堆,基本分2类:A类:CPrintDialog.DoModal,然后在模态对话框里选打印机、打印配置;B类:GetPrinterDeviceDefaults,调用默认打印机。
我的工作内容是理解以上2类后,再根据MSDN,实现MDF对话框后台指定打印机打印。
废话不多说,上菜~功能:基于对话框的MFC打印(非文档视图结构),指定打印机,后台打印(不弹出对话框)思路:1、枚举打印机,并选择其中一个;2、CPrintDialog实例指定到选中的打印机;3、CPrintDialog后台打印具体实现:1、变量(控件)。
在对话框上添加一个combobox (IDC_COMBO1,对应变量m_cboPrint)、一个edit (IDC_EDIT1),edit允许回车,多行(代码就不贴了,知道MFC应该就懂);2、在OnInitDialog里枚举打印机设备,如果报函数未定义,加入头文件#include <winspool.h>需要调用两次EnumPrinters函数,第一次的到结构体的大小,第二次得到打印机列表// TODO: 在此添加额外的初始化代码DWORD dwNeeded;DWORD dwReturn;DWORD dwFlag = PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_LOCAL;EnumPrinters(dwFlag, NULL, 4, NULL, 0, &dwNeeded, &dwReturn);PRINTER_INFO_4* p4;p4 = new PRINTER_INFO_4[dwNeeded];EnumPrinters(dwFlag, NULL, 4, (PBYTE)p4, dwNeeded, &dwNeeded, &dwReturn);for (int i = 0; i<(int)dwReturn; i++)this->m_cboPrint.AddString(p4[i].pPrinterName);delete []p4;3、操作对话框,在IDC_EDIT1里输入打印的内容,在IDC_COMBO1里选中打印机;4、打印(我是用OK按钮打印的,大家随便)// TODO: 在此添加控件通知处理程序代码// CDialogEx::OnOK();this->UpdateData();CString strMessage;CString strPrintDevice;this->GetDlgItem(IDC_EDIT1)->GetWindowT extW(strMessa ge);strMessage += _T("\r\n"); //添加结尾,方便后面循环读取打印数据this->GetDlgItem(IDC_COMBO1)->GetWindowTextW(strPri ntDevice);DWORD dwFlag = PD_ALLPAGES | PD_NOPAGENUMS | PD_USEDEVMODECOPIES | PD_HIDEPRINTTOFILE; //打印配置界面的按钮可用性,因为后台打印,其实这个配置没什么意义CPrintDialog pPrintdlg(FALSE, dwFlag, this);//CPrintDialog实例化,因为MFC的打印设备无关性,可以理解为这就是一台打印机HGLOBAL hDevMode = NULL;HGLOBAL hDevNames = NULL;if (GetPrinterDevice(strPrintDevice.GetBuffer(0), &hDevNames, &hDevMode)) //获得指定打印机的配置、名字AfxGetApp()->SelectPrinter(hDevNames, hDevMode);elseAfxMessageBox(_T("Failed to select custom printer"));strPrintDevice.ReleaseBuffer();pPrintdlg.m_pd.hDevMode = hDevMode;//让pPrintdlg使用我们指定的打印机pPrintdlg.m_pd.hDevNames = hDevNames;CDC dc;dc.Attach(pPrintdlg.CreatePrinterDC());//后台打印创建法,如果需要弹出打印对话框,请用DoModalDOCINFO di;//下面的内容网上很多,就不解释了di.cbSize = sizeof(DOCINFO);di.lpszDocName = _T("有驱打印测试");di.lpszDatatype = NULL;di.lpszOutput = NULL;di.fwType = 0;dc.StartDocW(&di);dc.StartPage();dc.SetMapMode(MM_TEXT);CRect recPrint(0, 0, dc.GetDeviceCaps(LOGPIXELSX), dc.GetDeviceCaps(LOGPIXELSY));dc.DPtoLP(&recPrint);dc.SetWindowOrg(0, 0);CFont newFont;VERIFY(newFont.CreatePointFont(120, _T("宋体"), &dc));CFont* oldFont = dc.SelectObject(&newFont);dc.SetTextAlign(TA_TOP | TA_LEFT);CString strPrint;int nIndex = 0;int x = 50;int y = 50;CSize textSize;textSize = dc.GetT extExtent(_T("00"), 2);//根据当前字体的宽、高,后面以此高度为行高while ((nIndex = strMessage.Find(_T("\r\n"))) > -1)//将IDC_EDIT1编辑框中内容打印,支持换行,一次换行等于'\r\n',所以在开头strMessage += _T("\r\n") {strPrint = strMessage.Left(nIndex);strMessage = strMessage.Mid(nIndex+2);dc.TextOutW(x, y, strPrint);y += textSize.cy;//下移一行,行高为字体高度}dc.SelectObject(oldFont);newFont.DeleteObject();dc.EndPage();dc.EndDoc();DeleteDC(dc.Detach());关于GetPrinterDevice,来自微软的一篇文章,点我跳转代码也贴出来BOOL CMFCApplication2Dlg::GetPrinterDevice(LPTSTR pszPrinterName, HGLOBAL* phDevNames, HGLOBAL* phDevMode){// if NULL is passed, then assume we are setting app object's// devmode and devnamesif (phDevMode == NULL || phDevNames == NULL)return FALSE;// Open printerHANDLE hPrinter;if (OpenPrinter(pszPrinterName, &hPrinter, NULL) == FALSE) return FALSE;// obtain PRINTER_INFO_2 structure and close printerDWORD dwBytesReturned, dwBytesNeeded;GetPrinter(hPrinter, 2, NULL, 0, &dwBytesNeeded);PRINTER_INFO_2* p2 = (PRINTER_INFO_2*)GlobalAlloc(GPTR, dwBytesNeeded);if (GetPrinter(hPrinter, 2, (LPBYTE)p2, dwBytesNeeded,&dwBytesReturned) == 0) {GlobalFree(p2);ClosePrinter(hPrinter);return FALSE;}ClosePrinter(hPrinter);// Allocate a global handle for DEVMODEHGLOBAL hDevMode = GlobalAlloc(GHND, sizeof(*p2->pDevMode) +p2->pDevMode->dmDriverExtra);ASSERT(hDevMode);DEVMODE* pDevMode = (DEVMODE*)GlobalLock(hDevMode);ASSERT(pDevMode);// copy DEVMODE data from PRINTER_INFO_2::pDevMode memcpy(pDevMode, p2->pDevMode, sizeof(*p2->pDevMode) +p2->pDevMode->dmDriverExtra);GlobalUnlock(hDevMode);// Compute size of DEVNAMES structure from PRINTER_INFO_2's dataDWORD drvNameLen = lstrlen(p2->pDriverName)+1; // driver nameDWORD ptrNameLen = lstrlen(p2->pPrinterName)+1; // printer nameDWORD porNameLen = lstrlen(p2->pPortName)+1; // port name// Allocate a global handle big enough to hold DEVNAMES.HGLOBAL hDevNames = GlobalAlloc(GHND,sizeof(DEVNAMES) +(drvNameLen + ptrNameLen + porNameLen)*sizeof(TCHAR));ASSERT(hDevNames);DEVNAMES* pDevNames = (DEVNAMES*)GlobalLock(hDevNames);ASSERT(pDevNames);// Copy the DEVNAMES information from PRINTER_INFO_2 // tcOffset = TCHAR Offset into structureint tcOffset = sizeof(DEVNAMES)/sizeof(TCHAR);ASSERT(sizeof(DEVNAMES) == tcOffset*sizeof(TCHAR));pDevNames->wDriverOffset = tcOffset;memcpy((LPTSTR)pDevNames + tcOffset, p2->pDriverName, drvNameLen*sizeof(TCHAR));tcOffset += drvNameLen;pDevNames->wDeviceOffset = tcOffset;memcpy((LPTSTR)pDevNames + tcOffset, p2->pPrinterName,ptrNameLen*sizeof(TCHAR));tcOffset += ptrNameLen;pDevNames->wOutputOffset = tcOffset;memcpy((LPTSTR)pDevNames + tcOffset, p2->pPortName, porNameLen*sizeof(TCHAR));pDevNames->wDefault = 0;GlobalUnlock(hDevNames);GlobalFree(p2); // free PRINTER_INFO_2// set the new hDevMode and hDevNames*phDevMode = hDevMode;*phDevNames = hDevNames;return TRUE;}基本上是完整代码了,如果有内存错误,请联系我。
C#打印和打印预览
C#打印和打印预览C#打印和C#打印预览的实现的三⼤部分:页⾯设置、打印预览、打印具体⽤到的类和属性事件都是什么内容呢?那么本⽂就向你介绍C#打印和C#打印预览的实现具体事宜。
我们谈到C#打印和C#打印预览的实现其中主要就是包括:页⾯设置、打印预览、打印三⼤部分。
打印的原理是:⽣成mdi⽂件,系统碰到mdi的时候会⾃动以打印的⽅式处理。
所以,不管⽤什么模板,什么⽅式;能在PrintPage事件处理中,⽣成⼀张要打印内容的图⽚就OK了!主要的⽀持类都包括在命名空间System.Drawing.Printing中,在程序集System.Drawing.dll中实现。
C#打印和C#打印预览的实现主要通过PrintDocument类来完成,另外还包括⼏个辅助类:PrintDialog(打印对话框)、PrintPreviewDialog(打印预览对话框)、PageSetupDialog。
PrintDocument类是实现打印和打印预览的中⼼类,实际的打印操作是通过这个类来完成的。
使⽤这个类进⾏打印的操作过程:1)创建类实例 PrintDocument printDt = new PrintDocument();2)设置类实例的属性3)为该类的打印事件添加事件处理函数4)调⽤该类的Print函数进⾏打印。
打印:printDt.Print();在windows应⽤程序中⽂档的打印是⼀项⾮常重要的功能,在以前⼀直是⼀个⾮常复杂的⼯作,Microsoft .Net Framework的打印功能都以组件的⽅式提供,为程序员提供了很⼤的⽅便,但是这⼏个组件的使⽤还是很复杂的,有必要解释⼀下。
打印操作通常包括以下四个功能:1 打印设置设置打印机的⼀些参数,⽐如更改打印机驱动程序等;2 页⾯设置设置页⾯⼤⼩纸张类型等3 打印预览类似于word中的打印预览4 打印实现打印功能的核⼼是PrintDocument类这个类属于System.Drawing.Printing名字空间这个类封装了当前的打印设置页⾯设置以及所有的与打印有关的事件和⽅法这个类包括以下⼏个属性,事件和⽅法1、PrinterSettings 属性存放打印机的设置信息,这个属性不需要程序员设置,因为它是由打印对话框获取的.2、PrintCountroller 属性控制打印过程3、DefaultPageSettings 属性存放页⾯设置信息,打印纸⼤⼩⽅向等,也不需要程序员设置,因为它是由页⾯设置对话框获取的.4、DocumentName 属性指定⽂档名称,出现在打印机状态窗⼝中1。
c语言编译过程打印
C语言编译过程打印
C语言是一种常用的编程语言,其编译过程涉及到多个阶段。
下面我们将详细介绍C语言的编译过程,并通过打印输出来展示每个阶段的内容。
1.预处理阶段
在C语言的编译过程中,预处理阶段是第一步。
预处理器会对源代码进行预处
理,处理的内容包括宏定义、条件编译、包含头文件等。
在这个阶段,编译器会将源代码中的宏替换为对应的代码,将条件编译指令下的代码块进行条件判断,将头文件中的内容插入到源代码中。
预处理结束后,会生成一个预处理后的文件,
通常以.i为后缀名。
通过打印输出来展示预处理阶段的内容,可以输出预处理后的文件内容。
例如,可以使用以下命令:
2.编译阶段
编译阶段是C语言编译过程中的第二步。
在这个阶段,编译器会将预处理后的
文件转换成汇编语言代码。
编译器会对源代码进行语法分析、语义分析、优化等操作,确保生成的汇编语言代码是正确的。
编译结束后,会生成一个汇编语言文
件,通常以.s为后缀名。
通过打印输出来展示编译阶段的内容,可以输出汇编语言文件的内容。
例如,可以使用以下命令:
3.汇编阶段
汇编阶段是C语言编译过程中的第三步。
在这个阶段,汇编器会将汇编语言代码转换成机器语言代码。
汇编器会将汇编指令翻译成机器码,并生成一个目标文件,通常以.o为后缀名。
通过打印输出来展示汇编阶段的内容,可以输出目标文件的内容。
例如,可以使用以下命令:。
C#教程之打印和打印预览
C#教程之打印和打印预览最近研究⼀了⼀下关于PDF打印和打印预览的功能,在此⼩⼩的总结记录⼀下学习过程。
实现打印和打印预览的⽅法,⼀般要实现如下的菜单项:打印、打印预览、页⾯设置、PrintDocument类PrintDocument组件是⽤于完成打印的类,其常⽤的属性、⽅法事件如下:属性DocumentName:字符串类型,记录打印⽂档时显⽰的⽂档名(例如,在打印状态对话框或打印机队列中显⽰),即⽤户填写⽣成pdf⽂件名时的默认值为DocumentName ⽅法Print:开始⽂档的打印。
事件BeginPrint:在调⽤Print⽅法后,在打印⽂档的第⼀页之前发⽣。
事件PrintPage:需要打印新的⼀页时发⽣。
事件EndPrint:在⽂档的最后⼀页打印后发⽣。
若要打印,⾸先创建PrintDocument组建的对象,然后使⽤页⾯上设置对话框PageSetupDialog设置页⾯打印⽅式,这些设置作为打印页的默认设置、使⽤打印对话框PrintDialog设置对⽂档进⾏打印的打印机的参数。
在打开两个对话框前,⾸先设置对话框的属性Document为指定的PrintDocument类对象,修改的设置将保存到PrintDocument组件对象中。
第三步是调⽤PrintDocument.Print⽅法来实际打印⽂档,调⽤该⽅法后,引发下列事件:BeginPrint、PrintPage、EndPrint。
其中每打印⼀页都引发PrintPage事件,打印多页,要多次引发PrintPage事件。
完成⼀次打印,可以引发⼀个或多个PrintPage事件。
///<summary>///打印纸设置///</summary>///<param name="sender"></param>///<param name="e"></param>protected void FileMenuItem_PageSet_Click(object sender, EventArgs e){PageSetupDialog pageSetupDialog = new PageSetupDialog();pageSetupDialog.Document = printDocument;pageSetupDialog.ShowDialog();}///<summary>///打印机设置///</summary>///<param name="sender"></param>///<param name="e"></param>protected void FileMenuItem_PrintSet_Click(object sender, EventArgs e){PrintDialog printDialog = new PrintDialog();printDialog.Document = printDocument;printDialog.ShowDialog();}///<summary>///预览功能///</summary>///<param name="sender"></param>///<param name="e"></param>protected void FileMenuItem_PrintView_Click(object sender, EventArgs e){PrintPreviewDialog printPreviewDialog = new PrintPreviewDialog {Document = printDocument};lineReader = new StreamReader(@"f:\新建⽂本⽂档.txt");try{ // 脚本学堂 printPreviewDialog.ShowDialog();}catch (Exception excep){MessageBox.Show(excep.Message, "打印出错", MessageBoxButtons.OK, MessageBoxIcon.Error);}}///<summary>///打印功能///</summary>///<param name="sender"></param>///<param name="e"></param>protected void FileMenuItem_Print_Click(object sender, EventArgs e){PrintDialog printDialog = new PrintDialog {Document = printDocument};lineReader = new StreamReader(@"f:\新建⽂本⽂档.txt");if (printDialog.ShowDialog() == DialogResult.OK){try{printDocument.Print();}catch (Exception excep){MessageBox.Show(excep.Message, "打印出错", MessageBoxButtons.OK, MessageBoxIcon.Error);printDocument.PrintController.OnEndPrint(printDocument, new PrintEventArgs());}}}程序员应为这3个事件编写事件处理函数。
VC++中所见即所得打印的简易实现
VC++中所见即所得打印的简易实现在VC++6.0中用应用程序向导(AppWizard)生成的单文档或多文档程序提供了对打印功能的实现,但遗憾的是如果对自动生成的框架程序不做任何改进,打印出来的文档或图形和屏幕上的显示相比就会特别小。
为什么会这样呢?本文对这种现象的原因和MFC的打印机制进行了深入的分析,并提出了一种特别简单的方法,在原有的程序中只需加入几行代码就能解决这一问题,实现所见即所得的打印。
首先,分析MFC的打印机制,把原理弄清楚了,就不难明白现象形成的原因和提出解决办法。
MFC 应用程序的核心是文档对象以及相关的视图窗口的概念,即Cdocument类和Cview类的构成和关系,简单地说Cdocument类负责数据的生成和储存,Cview类负责数据的显示和用户交互。
输出到屏幕和输出到打印机都是数据的显示,实质上是一样的,所以打印功能也是由Cview类来实现的。
在Cview类中由应用程序向导自动生成的源代码提供了一个OnDraw(CDC* pDC)的函数,通过重载这个函数,利用它提供的pDC(设备上下文)指针,可以在屏幕上显示各种图形和数据。
Cview类的打印是通过OnPrint(CDC* pDC, CPrintInfo* pInfo)这个函数实现的,应用程序向导自动生成的源代码中没有这个函数的框架,而这个函数对打印的实现就是简单地调用OnDraw(CDC* pDC)这个函数,把打印机的设备上下文指针pDC传递给OnDraw(CDC* pDC)函数。
可见Cview类对输出到屏幕和输出到打印机的处理都是一样的,只是换了一个设备上下文而已,那么为什么输出到打印机的图像特别小呢?这与VC采用的缺省的坐标映射方式MM_TEXT有关,这种方式的好处是用户图形坐标和设备的象素完全一致。
但是在屏幕的象素大小为800*600时,每逻辑英寸包含的屏幕象素为96,而打印机的点数却要多好几倍,如当打印机为HP LaserJet 6L时每逻辑英寸包含的打印机点数为600,也就是说打印机的清晰度比屏幕要高得多。
NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现
开源:.NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现我个人认为,开发MIS,首先就得解决网格的问题,而开发工具为我们提供了如DataGrid、MSHFlexGrid的控件。
其次,是打印的问题,将业务单据与数据报表打印出来。
可想而知,即使一个业务功能非常完美齐全的管理软件,没有打印的支持,也一定不算是一个完整的软件。
对于打印,我们总是在用户打印之前可以看看打印的效果,这时,一般的软件都提供了打印预览;如果需要调整打印的效果如纸张的大小、边距的设置,又提供了页面设置对话框让用户选择和调整;如果系统有多个打印机,当用户单击打印按钮时还可以选择输出的对象。
总之,对于打印,我们至少要提供打印页面设置、打印机设置、打印预览对话框,让用户有更多的机会参与交互。
这一些,是一个打印模块比较重要也比较基本的东西,让我们一起来实现它们吧。
进入Vs2003 IDE,从文件菜单上单击新建项目,项目类型为C#,在模板中选择类库,名称估且叫GoldPrinter,确定即可。
在打开的开发环境中,删除解决方案资源管理器中默认生成的Class1.cs。
现在,我们要考虑一下,对于打印,可能是在Windows下,也可能是Web下。
如果将两者的方法统一起来,让调用者不用操心是什么方式下那该多好啊。
因此,我们首先设计一个接口,提供两者共用的方法。
在项目上鼠标右键单击后添加一个新类,名称为:IPrinterPageSetting,由于是接口,将class 改为interface,并去掉构造函数。
看上去应类似如下:using System;namespace GoldPrinter{////// IPrinterPageSetting 的摘要说明。
///public class IPrinterPageSetting{}}方法中至少包含三个声明即ShowPageSetupDialog()、ShowPrintSetupDialog()、ShowPrintPreviewDialog(),也就是打开打印页面设置、打印机设置、打印预览对话框。
vc设置打印机模式并预览打印
vc设置打印机模式并预览打印调用打印属性对话框:if(::OpenPrinter("Adobe PDF", &hPrint, NULL)){::PrinterProperties(m_hWnd, hPrint);::ClosePrinter(hPrint);}注:通过EnumPrinters可以枚举全部的本地、网络打印机信息,通过指定以上的方法,可以打开打印机属性对话框,建议通过以上方法修改打印机固定属性,比较安全。
枚举打印机需要调用两次EnumPrinters函数,第一次的到结构体的大小,第二次得到打印机列表DWORD dwNeeded, dwReturn;// 得到结构大小BOOL bl = ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 4, NULL, 0,&dwNeeded, &dwReturn);// 得到打印机设备列表PRINTER_INFO_4* p4;p4 = (PRINTER_INFO_4*)malloc(dwNeeded);::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 4, (PBYTE)p4, dwNeeded,&dwNeeded, &dwReturn);for(int i=0;i< div> < dwNeeded;i++){TRACE("This is printer name : %s\r\n", p4[i].pPrinterName);}// 注意以上代码,NT以上系统支持,98不支持最简单的一段打印程序流程:1、得到默认打印机名称(如果你不打算更改打印机的话,就不需要保存该选项)2、保存默认打印机名称3、设定新的默认打印机4、取得默认打印机的选项5、修改属性,如纸张选择,横纵等。