如何使一个打印函数能同时满足针式打印机与激光打印机?
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




