画布打印的问题,应该很多人都遇到过,请赐教,谢谢!

WangZWang 2006-06-07 05:18:09
var
DMode: PDevMode;
h: THandle;
Device, Drive, Port: PChar;
OldLeft: Integer;
begin
with Printer do
begin
Device := StrAlloc(255);
Drive := StrAlloc(255);
Port := StrAlloc(255);
GetPrinter(Device, Drive, Port, h);
DMode := LocalLock(h);
DMode.dmPaperSize := 256;
DMode.dmPaperLength := 2100;
DMode.dmPaperWidth := 2000;
LocalUnLock(h);
SetPrinter(Device, Drive, Port, h);
StrDispose(Device);
StrDispose(Drive);
StrDispose(Port);

BeginDoc;
OldLeft := MainPanel.Left;
MainPanel.Left := 1500;
try
MainPanel.ScaleBy(200, 100);
MainPanel.PaintTo(Handle, 30, 10);
MainPanel.ScaleBy(100, 200);
finally
MainPanel.Left := OldLeft;
end;
EndDoc;
end;
.................
end;
{ 以上代码实现Panel中打印,用针式打印机可以打印正常,但用喷墨,激光打印机
打印出来的内容就非常小,不是针式打印机打印出来的实际尺寸,请赐教,谢谢! }
...全文
326 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
WangZWang 2006-06-09
  • 打赏
  • 举报
回复
问题已经解决,产生原因有下面产生
MainPanel.ScaleBy(200*natio, 100*natio);
MainPanel.PaintTo(Handle, 30*natio, 10*natio);
MainPanel.ScaleBy(100*natio, 200*natio);
改为
MainPanel.ScaleBy(100*natio, 100);
MainPanel.PaintTo(Handle, 30*natio, 10*natio);
MainPanel.ScaleBy(100 , 100*natio);
WangZWang 2006-06-08
  • 打赏
  • 举报
回复
var
DMode: PDevMode;
h: THandle;
Device, Drive, Port: PChar;
OldLeft, pcdpi,prdpi,natio: Integer;
begin
with Printer do
begin
//------------------------------这段代码是不是在喷墨打印机上打有问题?
Device := StrAlloc(255);
Drive := StrAlloc(255);
Port := StrAlloc(255);
GetPrinter(Device, Drive, Port, h);
DMode := LocalLock(h);
DMode.dmPaperSize := 256;
DMode.dmPaperLength := 2100;
DMode.dmPaperWidth := 2000;
LocalUnLock(h);
SetPrinter(Device, Drive, Port, h);
StrDispose(Device);
StrDispose(Drive);
StrDispose(Port);
// -----------------------------------------------
BeginDoc;
//这里以x轴大小为例,还可以取得y的分辨率
{ --------------------------}
pcdpi:=getdevicecaps(getdc(0),LOGPIXELSX);
prdpi:=getdevicecaps(printer.handle,LOGPIXELSX);
natio:=round(prdpi/pcdpi);

OldLeft := MainPanel.Left *natio;
MainPanel.Left := 1500*natio;

try
MainPanel.ScaleBy(200*natio, 100*natio);
MainPanel.PaintTo(Handle, 30*natio, 10*natio);
MainPanel.ScaleBy(100*natio, 200*natio);
finally
MainPanel.Left := OldLeft*natio;
end;

EndDoc;
end;
end;


// 请高手提出一些建议呀,谢谢!
WangZWang 2006-06-08
  • 打赏
  • 举报
回复
绝对不是分辨率的问题,都一样。不要想其他原因。
就在同一台机子上,针式打印机打印的正常,而
喷墨打印机却非常的小,几乎看不见字体,请各位帮忙为谢。
zsr 2006-06-07
  • 打赏
  • 举报
回复
分辨率不一样,当然大小不一样。
打开链接下载源码: https://pan.quark.cn/s/589796089f72 C++课程设计任务列表,涵盖以下内容:1、识别并显示10至99范围内,各位数乘积超过各位数和的数值,例如数字12不满足条件,因为1乘以2小于1加2,故不输出;而数字27满足条件,因为2乘以7大于2加7,因此需要输出该数。2、开发一个功能,用于从用户输入的任意数量实数中找出最大值与最小值:首先要求用户输入一个正整数n,代表数值的个数,随后用户可输入任意n个实数,程序需找出这n个数中的最大值和最小值并将它们展示出来。3、实现两个已排序数组的合并操作:设有数组A和B,且假设这两个数组的元素均已按照降序排列。编写程序将A和B合并成一个新的数组C,并确保C中的元素同样保持降序排列。int A[10]={123, 86,80, 49,33,15,7,0,-1,-3};int B[10]={100,64,51,50,27,19,15,12,5,2};4、设计一个函数,用于计算特定分数序列前n项的总和,该序列为1/2,1/3,1/4,1/5,1/6,1/7,...。要求在主程序中提示用户输入一个整数n,并验证输入的合法性(n需大于1方为有效),若输入合法,则调用求和函数并显示计算结果。5、编写一个程序,计算两个用户输入日期之间的天数差:用户需以year1,month1,day1和year2,month2,day2的格式输入两个日期,程序随后计算这两个日期之间的天数间隔,并将结果输出到屏幕上。要求编制具有如下原型的函数difs2Date:long GetDayDifference(int y1,int m1,int d1,int y2,int m2,int d2);并在主函数中调用此函数,将计...

5,943

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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