CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

如何使一个打印函数能同时满足针式打印机与激光打印机?

楼主aloneone(一条龙)2005-01-08 21:48:26 在 C++ Builder / 基础类 提问

Printer()->Canvas->TextOut(10,10,"OK");  
  在针打上的位置与激打上的位置相差很远,  
  另外我设置线条的宽度——比如15宽,结果针打上画的线比激打画的线粗很多。  
  请高手赐教 问题点数:50、回复次数:7Top

1 楼jishiping(JSP 季世平)回复于 2005-01-08 22:46:11 得分 0

你要根据打印机的分辨率,来调整输出位置,字体大小,线条宽度等属性。打印机的分辨率,可以用API函数GetDeviceCaps来取得。  
  GetDeviceCaps(Printer()->Canvas->Handle,   HORZRES);     //水平分辨率  
  GetDeviceCaps(Printer()->Canvas->Handle,   VERTRES);     //垂直分辨率Top

2 楼aloneone(一条龙)回复于 2005-01-08 23:30:43 得分 0

能再具体点吗,比如几代码?Top

3 楼kmfangxun()回复于 2005-01-09 18:28:02 得分 20

 
          HDC   hmdc=GetDC(Screen->Handle);  
          HDC   hmemdc=CreateCompatibleDC(hmdc);  
          double   xmdpi=GetDeviceCaps(hmemdc,LOGPIXELSX);//   内存分辨率  
          double   ymdpi=GetDeviceCaps(hmemdc,LOGPIXELSY);  
     
        double   xdpi=GetDeviceCaps(Printer()->Handle,LOGPIXELSX);   //打印机分辨率  
          double   ydpi=GetDeviceCaps(Printer()->Handle,LOGPIXELSY);  
          DeleteDC(hmdc);  
          DeleteDC(hmemdc);  
   
          double   xratio=xdpi/xmdpi;  
          double   yratio=ydpi/ymdpi;  
   
          Printer()->BeginDoc();  
          Printer()->Canvas->TextOut(10*xratio,10*yratio,"OK");  
          Printer()->EndDoc();  
   
   
   
  Top

4 楼aloneone(一条龙)回复于 2005-01-12 22:57:00 得分 0

---------------  
  HDC   hmdc=GetDC(Screen->Handle);  
  ---------------  
  这段代码会出错,说TScreen   没有Handle这个成员  
  Top

5 楼aloneone(一条龙)回复于 2005-01-12 23:06:22 得分 0

---------------------------  
  GetDeviceCaps(Printer()->Canvas->Handle,   HORZRES);     //水平分辨率  
  GetDeviceCaps(Printer()->Canvas->Handle,   VERTRES);     //垂直分辨率  
  ---------------------------  
  这上方法,我还不知道如何应用到打印程序中,  
  我试了一台激打,一台针打发现宽高都一样,激打是600*600,针打是160*160  
  不过我找到了我的解决办法:  
  1.先设定一个主要字体的大小  
  2.以此字体的尺寸做为基准定行高与列宽  
  3.任何坐标都以行列为基准设定.  
  不过这种方法只对字体大小相对单一的情况有效若字体大小的标准比较多定位就不够精确  
  我想GetDeviceCaps()应是最终的解决之道,但应用的方法还是有此不明白,希望大家教导.  
  Top

6 楼jishiping(JSP 季世平)回复于 2005-01-13 11:47:57 得分 30

首先,你必须确保在分辨率较低的打印机下(这儿就是针打)打印正确,记下此时的打印机的分辨  
  率(比如是160*160)。然后再调整你的代码,首先用GetDeviceCaps得到打印机的分辨率。用此打  
  印机的分辨率除以先前记下的针打的分辨率,得到一个放大系数Radio。然后将原来设定输出字体的  
  地方,字体的Size乘以系数Ratio,输出位置的坐标,也是乘以系数Ratio,线条的宽度也乘以系数  
  Ratio,这样就可以了。  
   
  比如,你原来在针打下的代码为:  
  TCanvas*   Canvas   =   Printer()->Canvas;  
  Canvas->Font->Size   =   20;  
  Canvas->TextOut(10,   10,   "Sample   Text");  
  Canvas->Pen->Width   =   2;  
  Canvas->MoveTo(50,   50);  
  Canvas->LineTo(100,   100);  
   
  那么现在的代码,就修改为:  
  TCanvas*   Canvas   =   Printer()->Canvas;  
  double   Ratio   =   (double)GetDeviceCaps(  
          Canvas->Handle,HORZRES)/160;   //这儿的160是一开始测试用的针大的分辨率  
  Canvas->Font->Size   =   20*Ratio;  
  Canvas->TextOut(10*Ratio,   10*Ratio,   "Sample   Text");  
  Canvas->Pen->Width   =   2*Ratio;  
  Canvas->MoveTo(50*Ratio,   50*Ratio);  
  Canvas->LineTo(100*Ratio,   100*Ratio);Top

7 楼kmfangxun()回复于 2005-01-13 14:37:49 得分 0

 
  HDC   hmdc=GetDC(Screen->Handle);  
   
  改为:  
   
  HDC   hmdc=GetDC(Form1->Handle);//某窗体的Handle  
  Top

相关问题

  • 用函数控制打印机
  • 针式打印机
  • 请问用喷墨打印机和激光打印机打印的条码为什么不能扫锚?除了用专用条码打印机外,用针式打印机打印的行吗?(我这没有针打,所以没试)
  • 急!打印问题。在激光打印机下可以正常打印,在爱朴生针式打印机下没有字(只有表格)
  • 针式打印机问题
  • === 针式打印机问题 ===
  • PB中如何调用打印机的函数?
  • 判断打印机是否安装的函数?
  • 什么函数可以进行打印机设置?
  • 如何在打印机上使用SetPixelV(SetPixel)函数?

关键词

  • 代码
  • 字体
  • 线条
  • 打印机
  • canvas
  • getdevicecaps
  • hmdc
  • ratio
  • 分辨率
  • printer

得分解答快速导航

  • 帖主:aloneone
  • kmfangxun
  • jishiping

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo