nHorRes:=GetDeviceCaps(Printer.Handle, HORZRES);是A4纸的像素宽度,
选择了字体:
printer.Canvas.Font.Name:='Ms Sans Serif';
printer.Canvas.Font.size:=12;
得到当前字体下字符的宽度:
nCharWidth:=printer.Canvas.TextWidth('A');
得到每毫米的像素数:
PixPerMX := trunc(GetDeviceCaps(Printer.Handle, LOGPIXELSX)/25.4);
nCharWidth的单位是毫米吗?
因为nCharWidth*PixPerMX得到的是像素阿,
而帮助上说TextWidth返回的是像素阿,为什么还要乘每毫米的像素数?
选择了字体:
printer.Canvas.Font.Name:='Ms Sans Serif';
printer.Canvas.Font.size:=12;
得到当前字体下字符的宽度:
nCharWidth:=printer.Canvas.TextWidth('A');
得到每毫米的像素数:
PixPerMX := trunc(GetDeviceCaps(Printer.Handle, LOGPIXELSX)/25.4);
nCharWidth的单位是毫米吗?
因为nCharWidth*PixPerMX得到的是像素阿,
而帮助上说TextWidth返回的是像素阿,为什么还要乘每毫米的像素数?
解决方案 »
- 自己定义一个button,怎么写单击事件
- 关于串口数据提取算法问题?急
- Delphi中ADO连接MS SQL Servel 2000 数据库的问题
- 用INDY POST数据到一URL,提示connection closed gracefully,请问是什么原因,有办法解决吗?
- InterBase 的问题
- 用DataModule有什么优点?数据处理速度会比用Form更快吗?
- rave报表中的一个text如何得到form里edit控件的值?
- ####怎么在sqlserver中打印表结构?
- 求救!制作安装盘
- 最近惨了!如何让我的计算机占有尽量多的带宽呀!想想办法啦!
- A窗体edit内容写入后,关闭A窗体,传到B窗体memo中的继续讨论
- 有错,但在哪儿?!请指教...
nCharWidth:=printer.Canvas.TextWidth('A');
得到每毫米的像素数:(应该是每个字符的像素数才对)
PixPerMX := trunc(GetDeviceCaps(Printer.Handle, LOGPIXELSX)/25.4);
nCharWidth:=printer.Canvas.TextWidth('A');得到的是一个字符什么值?
帮助上说是像素值,好像不对。PixPerMX := trunc(GetDeviceCaps(Printer.Handle, LOGPIXELSX)/25.4);
得到的是什么呢?
nCharWidth:=printer.Canvas.TextWidth('A');
得到每毫米的像素数:
PixPerMX := trunc(GetDeviceCaps(Printer.Handle, LOGPIXELSX)/25.4);nCharWidth*PixPerMX 得到的是什么的像素?
我想得到一个字符在当前字体下的像素数,
用nHorRes除以一个字符在当前字体下的像素数,可以得到横向打印的字符最大个数,但
nCharWidth:=printer.Canvas.TextWidth('A');得到的WIDTH是像素吗?
nHorRes div nCharWidth
应该就是横向打印的最大字符数你试试对不对?
printer.Canvas.Font.Name:='Ms Sans Serif';
printer.Canvas.Font.size:=8;nCharWidth:=printer.Canvas.TextWidth('A'); 得到的值小了许多,
而不设字体时,默认的和上面的字体时一样的,不只为什么?
printer.Canvas.Font.size:=12;
printer.Refresh ;并且要把上面的语句放在取值之前。这回应该可以了。
nCharWidth:=printer.Canvas.TextWidth('A'); 这个值还有问题?
字体是'Ms Sans Serif'大小是8时,nCharWidth=34;
如果自己设字体
printer.Canvas.Font.Name:='Ms Sans Serif';
printer.Canvas.Font.size:=8;
printer.Refresh ;
和默认的一样,nCharWidth=6;
见鬼了
if PrintDialog.Execute then
begin
sum:=2;
// printer.Canvas.Font.Name:='Ms Sans Serif';
// printer.Canvas.Font.size:=8; nHorRes:=GetDeviceCaps(Printer.Handle, HORZRES);
nVerRes:=GetDeviceCaps(Printer.Handle, VERTRES); nCharWidth:=printer.Canvas.TextWidth('X');
nCharHeight:=printer.Canvas.TextHeight('X');
lineint:= nHorRes div nCharWidth;
printer.BeginDoc;
for i:=0 to lineint do
begin
printer.Canvas.TextOut(sum,10,'a');
sum:=sum+ nCharWidth;
end;
printer.EndDoc;
end;
// printer.Canvas.Font.size:=8;
但是去掉//的话,nCharWidth的值会变成6,小了很多PS:谢谢zfmich
然后两个相乘才是真正在这种字体字号下打印机在纸面上应该打印的象素值
nCharWidth:=printer.Canvas.TextWidth('A');
PixPerMX := trunc(GetDeviceCaps(Printer.Handle, LOGPIXELSX)/25.4);nCharWidth*PixPerMX
begin
printer.BeginDoc; printer.Canvas.Font.Name:='Ms Sans Serif';
printer.Canvas.Font.size:=12;
printer.Refresh ; sum:=2; nHorRes:=GetDeviceCaps(Printer.Handle, HORZRES);
nVerRes:=GetDeviceCaps(Printer.Handle, VERTRES); nCharWidth:=printer.Canvas.TextWidth('X');
nCharHeight:=printer.Canvas.TextHeight('X');
lineint:= nHorRes div nCharWidth;
for i:=0 to lineint do
begin
printer.Canvas.TextOut(sum,10,'X');
sum:=sum+ nCharWidth;
end;
printer.EndDoc;
end;
写在前面,就要选择映射模式
SetMapMode(Printer.Handle,MM_LOENGLISH);
效果是一样的;
总之是多谢zfmich了,有什么要帮忙的给我发邮件吧?
[email protected]