《Windows自定义打印的实现计算机windows相关_计算机-windows相关.pdf》由会员分享,可在线阅读,更多相关《Windows自定义打印的实现计算机windows相关_计算机-windows相关.pdf(9页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、 Windows 自定义打印的实现之一 其实在 Windwos 中调用 Windows API 实现打印是比较简单的,而且具有代码 紧凑、实现灵活的优点。我们只要掌握了几个要点,就可以随心所欲的打印了。下 面我们将一一讨论:o 打印机的选择,打印设置对话框的调用 o 在程序中设置打印选项 o 打印单位的转换 o 打印基本流程 o 打印字体的设置 打印机的选择,打印设置对话框的调用 这个不多说了,相关的主要 API 只有一个-PrintDlg(LPPRINTDLG lppd)-看例子代码。PRINTDLG printInfo;ZeroMemory(&printInfo,sizeof(printI
2、nfo;/清空该结构 printInfo.lStructSize=sizeof(printInfo;printInfo.hwndOwner=0;printInfo.hDevMode=0;printInfo.hDevNames=0;/这个是关键,PD_RETURNDC 如果不设这个标志,就拿不到 hDC 了 /PD_RETURNDEFAULT 这个就是得到默认打印机,不需要弹设置对话框 printInfo.Flags=PD_RETURNDC|PD_RETURNDEFAULT;/调用 API 拿出默认打印机 PrintDlg(&printInfo;/看看出错没有 DWORD rst=CommDlg
3、ExtendedError(;if(rst!=0 /出错了,清空标志再次调用 API,此时就会弹出打印设置对话框供用户选择 了 printInfo.Flags=0;PrintDlg(&printInfo;从上面的代码,我们就知道弹不弹对话框的关键是设置 PRINTDLG 结构的 Flags 字段。在程序中设置打印选项 要想在程序中定制我们的打印选项,DEVMODE 结构就是关键了。在这里我 们只举例如何为打印设定自定义纸张。更详细的设置信息可以查询 MSDN。/首先得到 DEVMODE 结构,同时申请系统锁定,我们要修改它了 LPDEVMODE lpDevMode=(LPDEVMODE:Glo
4、balLock(printInfo.hDevMode;if(lpDevMode/成功得到该结构了 个要点就可以随心所欲的打印了下面我们将一一讨论打印机的选择打印设置对话框的调用在程序中设置打印选项打印单位的转换打印基本流程打印字体的设置打印机的选择打印设置对话框的调用这个不多说了相关的主要只有一个看拿出默认打印机看看出错没有出错了清空标志再次调用此时就会弹出打印设置对话框供用户选择了从上面的代码我们就知道弹不弹对话框的关键是设置字段结构的在程序中设置打印选项要想在程序中定制我们的打印选项结构就是关们要修改它了成功得到该结构了自定义纸张设定自定义纸张标志纸宽多少纸高多少顺便设定纸张走纸方向横向还
5、是纵向记住要解锁这个也不能忘了否则更改不会生效自定义打印的实现之二打印单位的转换这个的关键是我们要得到显 lpDevMode-dmPaperSize=DMPAPER_USER;/自定义纸张 /设定自定义纸张标志 lpDevMode-dmFields=lpDevMode-dmFields|DM_PAPERSIZE|DM_PAPERLENGTH|DM_PAPERWIDTH;lpDevMode-dmPaperWidth=(shortwidth;/纸宽多少 lpDevMode-dmPaperLength=(shortheight;/纸高多少 /顺便设定纸张走纸方向,横向还是纵向 lpDevMode-d
6、mOrientation=DMORIENT_PORTRAIT;/记住要解锁 GlobalUnlock(printInfo.hDevMode;/这个也不能忘了,否则更改不会生效 ResetDC(printInfo.hDC,lpDevMode;Windows 自定义打印的实现之二 打印单位的转换 这个的关键是我们要得到显示设备的 DPI,即每英寸设备支持的点数。有了 DPI 我们就可以在我们习惯的单位和设备单位之间转换了,用到的 API 是GetDeviceCaps(,这个函数功能强大,具体可参考 MSDN,在这里我们只用来得到 个要点就可以随心所欲的打印了下面我们将一一讨论打印机的选择打印设置对
7、话框的调用在程序中设置打印选项打印单位的转换打印基本流程打印字体的设置打印机的选择打印设置对话框的调用这个不多说了相关的主要只有一个看拿出默认打印机看看出错没有出错了清空标志再次调用此时就会弹出打印设置对话框供用户选择了从上面的代码我们就知道弹不弹对话框的关键是设置字段结构的在程序中设置打印选项要想在程序中定制我们的打印选项结构就是关们要修改它了成功得到该结构了自定义纸张设定自定义纸张标志纸宽多少纸高多少顺便设定纸张走纸方向横向还是纵向记住要解锁这个也不能忘了否则更改不会生效自定义打印的实现之二打印单位的转换这个的关键是我们要得到显 设备 DPI。看示例代码:/某些设备水平和垂直方向的 DPI
8、 可能不同,所以要分 别得到。/得到水平方向的转换比例 float getXScale(HDC printDC/printDC:打印机 DC 设备句柄 /得到打印机水平方向的 DPI int xDPI=GetDeviceCaps(printDC,LOGPIXELSX;/254.0:每英寸 25.4 毫米 float xScale=(float(254.0/xDPI;return xScale;/得到垂直方向的转换比例 float getYScale(HDC printDC/printDC:打印机 DC 设备句柄 /得到打印机垂直方向的 DPI int yDPI=GetDeviceCaps(pr
9、intDC,LOGPIXELSY;float yScale=(float(254.0/yDPI;return yScale;个要点就可以随心所欲的打印了下面我们将一一讨论打印机的选择打印设置对话框的调用在程序中设置打印选项打印单位的转换打印基本流程打印字体的设置打印机的选择打印设置对话框的调用这个不多说了相关的主要只有一个看拿出默认打印机看看出错没有出错了清空标志再次调用此时就会弹出打印设置对话框供用户选择了从上面的代码我们就知道弹不弹对话框的关键是设置字段结构的在程序中设置打印选项要想在程序中定制我们的打印选项结构就是关们要修改它了成功得到该结构了自定义纸张设定自定义纸张标志纸宽多少纸高多少
10、顺便设定纸张走纸方向横向还是纵向记住要解锁这个也不能忘了否则更改不会生效自定义打印的实现之二打印单位的转换这个的关键是我们要得到显 /厘米转换为设备像素,水平方向 double cm2Unit_W(float xScale,double w/w 单位为厘米 return w*100/xScale;/厘米转换为设备像素,垂直方向 double cm2Unit_H(float yScale,double h/h单位为厘米 return h*100/yScale;上面代码中,如果将 printDC 换为显示器设备 DC 句柄,即可得到厘米转换为 显示器像素单位,打印预览时使用。得到显示器设备句柄可用
11、:GetDC(NULL 得 到。打印基本流程 有了前面的知识,现在我们就可以打印了。Windows 打印是有着固定的流程的,流程也比较简单。按照固定的顺序调用打印 API 即可:StartDoc(-StartPage(-打印具体内容-EndPage(-EndDoc(。如果要打印多页,循环 StartPage(至 EndPage(即可。示例代码:DOCINFO doc;个要点就可以随心所欲的打印了下面我们将一一讨论打印机的选择打印设置对话框的调用在程序中设置打印选项打印单位的转换打印基本流程打印字体的设置打印机的选择打印设置对话框的调用这个不多说了相关的主要只有一个看拿出默认打印机看看出错没有出
12、错了清空标志再次调用此时就会弹出打印设置对话框供用户选择了从上面的代码我们就知道弹不弹对话框的关键是设置字段结构的在程序中设置打印选项要想在程序中定制我们的打印选项结构就是关们要修改它了成功得到该结构了自定义纸张设定自定义纸张标志纸宽多少纸高多少顺便设定纸张走纸方向横向还是纵向记住要解锁这个也不能忘了否则更改不会生效自定义打印的实现之二打印单位的转换这个的关键是我们要得到显 ZeroMemory(&doc,sizeof(doc;doc.cbSize=sizeof(doc;doc.lpszDocName=(LPCTSTRPrint Test File;StartDoc(printDC,&doc;
13、/准备打印 StartPage(printDC;/开始打印页 /在(2.5cm,2.5cm)处打印文本 char*text=打印测试文本;float xScale=getXScale(printDC;float yScale=getYScale(printDC;double x=cm2Unit_W(xScale,2.5;double y=cm2Unit_H(yScale,2.5;/在指定位置打印文本 TextOut(printDC,(intx,(inty,(LPTSTRtext,strlen(text;EndPage(printDC;/结束打印页 EndDoc(printDC;/结束打印 打印
14、字体的设置 很多时候我们希望能控制打印字体,下面的代码可以创建你想要的字体格式:/*创建自定义打印字体 fontFace:字体名称,如果为 NULL,默认采用“宋体”个要点就可以随心所欲的打印了下面我们将一一讨论打印机的选择打印设置对话框的调用在程序中设置打印选项打印单位的转换打印基本流程打印字体的设置打印机的选择打印设置对话框的调用这个不多说了相关的主要只有一个看拿出默认打印机看看出错没有出错了清空标志再次调用此时就会弹出打印设置对话框供用户选择了从上面的代码我们就知道弹不弹对话框的关键是设置字段结构的在程序中设置打印选项要想在程序中定制我们的打印选项结构就是关们要修改它了成功得到该结构了自
15、定义纸张设定自定义纸张标志纸宽多少纸高多少顺便设定纸张走纸方向横向还是纵向记住要解锁这个也不能忘了否则更改不会生效自定义打印的实现之二打印单位的转换这个的关键是我们要得到显 fontHeight:字体高度,单位为厘米 isBold:是否加粗 isItalic:是否斜体 isUnderLine:是否下划线 isStrikeOut:是否删除线 */HFONT getFont(LPCTSTR fontFace,double fontHeight,bool isBold,bool isItalic,bool isUnderLine,bool isStrikeOut int width=0;/字体宽度由
16、系统决定 int weight=FW_NORMAL;DWORD italic=0;DWORD underLine=0;DWORD strikeOut=0;DWORD charSet=DEFAULT_CHARSET;LPCTSTR face=(LPCTSTR宋体;float height=cm2Unit_H(fontHeight;if(fontFace!=0 个要点就可以随心所欲的打印了下面我们将一一讨论打印机的选择打印设置对话框的调用在程序中设置打印选项打印单位的转换打印基本流程打印字体的设置打印机的选择打印设置对话框的调用这个不多说了相关的主要只有一个看拿出默认打印机看看出错没有出错了清空标
17、志再次调用此时就会弹出打印设置对话框供用户选择了从上面的代码我们就知道弹不弹对话框的关键是设置字段结构的在程序中设置打印选项要想在程序中定制我们的打印选项结构就是关们要修改它了成功得到该结构了自定义纸张设定自定义纸张标志纸宽多少纸高多少顺便设定纸张走纸方向横向还是纵向记住要解锁这个也不能忘了否则更改不会生效自定义打印的实现之二打印单位的转换这个的关键是我们要得到显 face=fontFace;if(isBold weight=FW_BOLD;if(isItalic italic=1;if(isUnderLine underLine=1;if(isStrikeOut strikeOut=1;HF
18、ONT font=CreateFont(intheight,width,0,0,个要点就可以随心所欲的打印了下面我们将一一讨论打印机的选择打印设置对话框的调用在程序中设置打印选项打印单位的转换打印基本流程打印字体的设置打印机的选择打印设置对话框的调用这个不多说了相关的主要只有一个看拿出默认打印机看看出错没有出错了清空标志再次调用此时就会弹出打印设置对话框供用户选择了从上面的代码我们就知道弹不弹对话框的关键是设置字段结构的在程序中设置打印选项要想在程序中定制我们的打印选项结构就是关们要修改它了成功得到该结构了自定义纸张设定自定义纸张标志纸宽多少纸高多少顺便设定纸张走纸方向横向还是纵向记住要解锁这
19、个也不能忘了否则更改不会生效自定义打印的实现之二打印单位的转换这个的关键是我们要得到显 weight,italic,underLine,strikeOut,charSet,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,DEFAULT_PITCH|FF_DONTCARE,face;return font;小结 以上就是我们在实现打印中遇到的常见问题,相信理解了这些,在我们自己的 程序中实现打印就不再是什么困难的事情了。个要点就可以随心所欲的打印了下面我们将一一讨论打印机的选择打印设置对话框的调用在程序中设置打印选项打印单位的转换打印基本流程打印字体的设置打印机的选择打印设置对话框的调用这个不多说了相关的主要只有一个看拿出默认打印机看看出错没有出错了清空标志再次调用此时就会弹出打印设置对话框供用户选择了从上面的代码我们就知道弹不弹对话框的关键是设置字段结构的在程序中设置打印选项要想在程序中定制我们的打印选项结构就是关们要修改它了成功得到该结构了自定义纸张设定自定义纸张标志纸宽多少纸高多少顺便设定纸张走纸方向横向还是纵向记住要解锁这个也不能忘了否则更改不会生效自定义打印的实现之二打印单位的转换这个的关键是我们要得到显