fastreport 报表打印固定长度的问题

FlySkyFree 2007-08-10 05:26:55
我想用fastreport打印一固定长度的线,比如10mm,我怎么写?
我在上面放了个Picture,在TfrxReport的OnBeforePrint里这样写的:
int w,h;
if ((TfrxPictureView*)frxReport->FindObject("pShow"))
{
w =715 ;
h =831 ;
mybitmap = new Graphics::TBitmap();
mybitmap->Height = h ;
mybitmap->Width = w ;
mybitmap->Canvas->Brush->Style = bsSolid;
mybitmap->Canvas->Brush->Color = clWhite;
mybitmap->Canvas->FillRect(Rect(0,0,mybitmap->Width,mybitmap->Height));
mybitmap->Canvas->MoveTo(10,10);
mybitmap->Canvas->LineTo(10,20);
((TfrxPictureView*)frxReport->FindObject("pShow"))->Picture->Assign(mybitmap);
delete mybitmap;
}
这样打印出来的长度不对。
...全文
356 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
FlySkyFree 2007-08-20
  • 打赏
  • 举报
回复
我试了下,按固定值96打出来的都是10mm。我这里只有激光打印机,现在换打印机不知道打出来的还是10mm。
还是不怎么懂这样转化后就行。
Snow_Ice11111 2007-08-18
  • 打赏
  • 举报
回复
那比例值y就按默认的标准DPI值96固定试试,不再通过计算获得了。
FlySkyFree 2007-08-18
  • 打赏
  • 举报
回复
是改变计算机的DPI,就是:桌面->属性->设置->高级->DPI
就是用FastReport做的,
我在frxReport上面放了个Picture,在TfrxReport的OnBeforePrint里这样写的:
int w,h;
if ((TfrxPictureView*)frxReport- >FindObject("pShow"))
{
double y;
y = GetDeviceCaps(GetDC(NULL) ,LOGPIXELSX);
y/=25.4;
w =715 ;
h =831 ;
mybitmap = new Graphics::TBitmap();
mybitmap- >Height = h ;
mybitmap- >Width = w ;
mybitmap- >Canvas- >Brush- >Style = bsSolid;
mybitmap- >Canvas- >Brush- >Color = clWhite;
mybitmap- >Canvas- >FillRect(Rect(0,0,mybitmap- >Width,mybitmap- >Height));
mybitmap- >Canvas- >MoveTo(10*y,10*y);
mybitmap- >Canvas- >LineTo(10*y,20*y);
((TfrxPictureView*)frxReport- >FindObject("pShow"))- >Picture- >Assign(mybitmap);
delete mybitmap;
}
Snow_Ice11111 2007-08-18
  • 打赏
  • 举报
回复
改变DPI??DPI通常是指打印机的硬件分辨率,难以人为修改的,你是说改变屏幕的当前分辨率吧?如:1024*768 ==> 1280*1024

如果是的话,不知道你用的哪种方法打印的,请贴上你的代码便于分析。
FlySkyFree 2007-08-18
  • 打赏
  • 举报
回复
Snow_Ice11111:
我看了下,我改变DPI的值为120后,y=GetDeviceCaps(GetDC(NULL) ,LOGPIXELSX);的值为120
然后打印出来的线就大于10mm了,有没有什么办法在改变DPI的情况下,使打印出来的长度还是10mm
Snow_Ice11111 2007-08-17
  • 打赏
  • 举报
回复
任何一个显示中的有效窗口句柄都行。实在不行GetDC(NULL)试试。
FlySkyFree 2007-08-17
  • 打赏
  • 举报
回复
窗口的句柄为0啊
Snow_Ice11111 2007-08-17
  • 打赏
  • 举报
回复
如果你想通过fastreport后,再打印出来的结果是10mm的话,那你可以把GetDeviceCaps函数中第一个参数的句柄换成窗口的句柄试试。
Snow_Ice11111 2007-08-17
  • 打赏
  • 举报
回复
通过fastreport后,可能之前通过打印机分辨率计算后的距离会被当作是屏幕分辨率下的距离。实测两者分辨率之间的差别的确约在6倍左右。
FlySkyFree 2007-08-17
  • 打赏
  • 举报
回复
Snow_Ice11111:我发现直接用打印机来实现可以是10mm,如下:
y=GetDeviceCaps(Printer()->Handle,LOGPIXELSX)/25.4;
Printer()->Canvas->MoveTo(10*y,10*y);
Printer()->Canvas->LineTo(10*y,20*y);

但若通过建立图片,然后放入fastreport的Picture后再打印出来就不对了。
FlySkyFree 2007-08-17
  • 打赏
  • 举报
回复
是真正通过打印机打印出来后测量出来的
Snow_Ice11111 2007-08-17
  • 打赏
  • 举报
回复
这样打出来的长度不是10mm,有6cm多,远远大于10mm
--------------------------------------------------------------------
你这个结果是通过电脑屏幕上显示时目测估计得到的长度,还是真正通过打印机打印出来后测量出来的?
FlySkyFree 2007-08-17
  • 打赏
  • 举报
回复
Snow_Ice11111,谢谢你。
y=GetDeviceCaps(Printer()- >Handle,LOGPIXELSY); ,这时y=600,
y/=25.4 后y=23.622047244
mybitmap->Canvas->MoveTo(10,10);
mybitmap->Canvas->LineTo(10,10+10*y);
这样打出来的长度不是10mm,有6cm多,远远大于10mm
Snow_Ice11111 2007-08-17
  • 打赏
  • 举报
回复
GetDC(NULL)是通过API得到桌面DC当前的分辨率;Screen- >PixelsPerInch则是通过BCB工程自带的默认对象Screen来得到当前屏幕的分辨率,两者是异曲同工的,所以结果也一样。
改变打印机型号的话,长度还是我们希望的10mm,前提是要该打印机被设为默认打印机。
FlySkyFree 2007-08-17
  • 打赏
  • 举报
回复
谢谢 Snow_Ice11111。
用GetDC(NULL)可以达到要求。我看了下
y=GetDeviceCaps(GetDC(NULL) ,LOGPIXELSX);和
y=Screen->PixelsPerInch;的值一样是96
和DPI的值96一样,是不是改变DPI后这个值会变;改变打印机的型号打印出来的是不是还是10mm?
Snow_Ice11111 2007-08-16
  • 打赏
  • 举报
回复
注意,打印机的水平分辨率和垂直分辨率通常是不同的。


BTW:最近论坛好冷清啊!
Snow_Ice11111 2007-08-16
  • 打赏
  • 举报
回复
double y=GetDeviceCaps(Printer()->Handle,LOGPIXELSY); //这个是得到默认打印机当前垂直方向的分辨率,单位为多少个像素每英寸(25.4毫米)
y/=25.4; //转化为多少个像素每毫米
mybitmap- >Canvas- >LineTo(10,10+10*y); //现在就是10mm了


试试吧。

Snow_Ice11111 2007-08-16
  • 打赏
  • 举报
回复
要得到打印机当前的分辨率,然后根据这个分辨率,通过数学公式计算LineTo移动的像素值。
fengshuling2 2007-08-14
  • 打赏
  • 举报
回复
up
coolcalf 2007-08-13
  • 打赏
  • 举报
回复
除了自己多测试之外,能有其它什么办法。顶
加载更多回复(1)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧