300分:直线打印问题(300分)

  • 主题发起人 主题发起人 ozj
  • 开始时间 开始时间
O

ozj

Unregistered / Unconfirmed
GUEST, unregistred user!
当用Canvas.LineTo在打印机画布中画一条直线时,在打印机画出时线条有一定的宽度,但
当我用Bresenham算法用setpixel画点连成直线,当在打印机画出时,线条
很细(只有一个打印机点线宽),不知如何解决,请帮一下!
 
屏幕的分辨率和打印机的分辨率是不同的!我想你应该注意它们之间的像素(点数)
的转换!
 
从屏幕转到打印机也是一个象素。
不知用SetMapMode 能否实现?
 
你可以用打印的api 函数试试
 
哪一个wind api?
 
请试试(我已试过可以):
procedure TForm1.Button1Click(Sender: TObject);
begin
with Printer do
begin
BeginDoc;
with Canvas do
begin
if SetMapMode(Handle,MM_TEXT)=0 then //逻辑坐标为打印机点坐标
ShowMessage('Failed: SetMapMode(Handle,MM_TEXT)');
Pen.Width := 1;
Pen.Color := clBlack;
Brush.Style := bsClear;
Rectangle(100,100,500,400); //画一个40x30(点)的矩形
MoveTo(150,150);
LineTo(450,350);
TextOut(110,110,'40x30(点)');


if SetMapMode(Handle,MM_LOMETRIC) = 0 then //每一逻辑点为0.1MM,注意Y轴方向向下
ShowMessage('Failed: SetMapMode(Handle,MM_LOMETRIC)');
Pen.Width := 1;
Pen.Color := clBlack;
Brush.Style := bsClear;
Rectangle(100,-100,500,-400); //画一个40MMx30MM的矩形
MoveTo(150,-150);
LineTo(450,-350);
TextOut(110,-110,'40MMx30MM');
end;
EndDoc;
end;
end;
 
如果以象素来画线,第二种setmapmode更细,说明lineto函数已做了处理,
不知有无更好的招?
 
>>以象素来画线,第二种setmapmode更细
如此看来,你的打印机使用的分辨率很低。
 
恰恰因为打印机分辨率高,所以才细,我以解决问题,方法是画多条线来并成一条。
 
多人接受答案了。
 
ozj, 谢谢你的加分。
>>第二种setmapmode更细
请计算:1DOT/MM=254DOT/INCH=254DPI
如果打印机分辨率>254DPI,则第二种setmapmode(每一逻辑点为0.1MM)应该更粗
如果打印机分辨率=254DPI,则两种setmapmode一样粗
如果打印机分辨率<254DPI,则第一种setmapmode应该更粗(第二种打印机需要抖动
使之变细)
所以我说你的打印机分辨率很低。
你只要看两个矩形大小比较就知道了。

>>画多条线来并成一条
太别扭了吧,多条线可能会有重叠和空隙,而且对不同分辨率的打印机结果不一样。
 
可以根据不同分辨率的打印机进行比例换算出要多少条线来并一条,谢谢!
 
后退
顶部