各位高手快来帮帮忙(300分)

Z

ZRY

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾,你们好。小弟最近遇上了一个很麻烦的问题,想请各位帮个
忙。
我正在帮一位朋友写一个程序,需要打印输出最后的结果。由于该程序
将在这位朋友工作的单位使用,而那里的机子最好的机子是486,所装的
软件是DOS6.22和UCDOS6.0,我的程序因使用了SVGA显示模式,与UCDOS
有点不和,无法在UCDOS下运行,也就无法使用UCDOS的打印功能,所以
我打算自己在程序中实现打印功能。 但因现在都是用的Windows,我不
知道DOS下如何控制打印机输出。 哪位高手有这方面的经验、资料或源
码,请帮个忙。

 我想知道如何解决以下几方面的问题:
  1)如何输出图形,例如不同粗细的直线、点阵图形等。
  2)如何控制打印输出的图形在纸上的实际尺寸。
  3)如何在纸上打印出上标及下标形式的字符(主要是数字及英文字母)。
  4)如何换页。
 实际上我是需要将计算的结果打印成一份A4纸张大小的论证报告,要
有封面(只是大字标题和一个表格),每一页都有边框,其中需要打印数
学公式及计算的过程。若能实现像UCDOS中那样的打印功能就最好了。

 *打印机是普通的24针打印机。
 *我写这个程序用的是Borland Pascal 7.0和TASM,因为只有DOS。

这个问题与Delphi没什么关系,但还望各位大虾不吝指教,小弟愿出300
分。I'm waiting...
 
DOS?!
多年未用了,还记得一些.
输出图形还是用bgi什么的吧,初始化图形视配器,然后就可以使用一些图形函数了,现
在用的话还真得找书看看,图形函数的名字与用法与现在用的差不多.
:)我觉得tasm就用不着了吧.
关于打印只要找到那台打印机的手册就行了,指令都有,直接向打印机送就行了,如图形
打印就是设置打印方式为图形方式,然后逐行输出数据,最后给个结束符就行了.换页一般就是直接送27就行,手册上都应该有的.
 
刚才怎么给删掉了?

1.UCDOS好像有SVGA的驱动.我记得以前UCDOS5.0都有的;
2.DOS下操作打印机,必须知道具体的打印机的接口,其实就是给打印机发送一些
特殊的打印控制符,一般在打印机的使用手册上都有打印命令说明;
(每种打印机有自己不同的命令集,你必须查看它的使用手册)
3.24针的打印机恐怕不能实现你的打印要求;

 
可以用ucdos的特显功能。
很久没用过了,
你可以先看看ucdos所带的特显的例子,
可以满足你的要求。
 
升级吧,升到586不需多少钱
 
menxin:
我没有使用bgi,所有的屏幕图形输出都是自己实现的。至于打印机,好象是
LQ-1600之类的,这种老古董的手册现在很难找的。

cAkk:
我其实是想使这个程序能单独运行,而不依靠任何其余的程序,所以我自己写
了SVGA的驱动部分。另外我有找到几篇文章,所介绍的方法与你所说的一样,
但不很详细,所以才向大家请教。至于24针打印机,它打出来的效果确实是很
差,但我也没办法:-(
*刚才问题发出后才记起分数选错了,我怕大家答完后分分数时有麻烦,所以
 删掉重新发了。
 BTW:不知提问时分数选错后分分数时是否可以改变(例如我刚才选了100分,
    但实际上我是要给300分)?


两位这么晚还没休息吗? :)
 
urus:
  如果是我的机子,早就升级了。但要让别人的单位的头头付钱升级,
恐怕不行。我试试吧:)
 
为何不用bgi呢?不是能方便很多吗?能升级当然最好了,其实不升级也能用delphi 1+windows 3.2.

BTW:真是一个比一个能熬啊. :)
 
menxin:
  不用bgi是为了界面能更美观一些:)
  Delphi 1.0我现在找不到了,我是从Delphi2.0开始的,而且那台机器上没
有Windows 3.2。

  BTW:我快熬不住了,但我没时间了,平常要工作,只好利用双休日。
     好想睡觉...
 
1. 先将要打印的文字转换成图形.
2. 打印机转图形打印方式(ESC($27)+'K'?)
3. 然后将图形按24个点高度为1行发送到打印机, 不过图象点阵需要处理,
每列(1点宽)的24点生成3个字节(垂直的每8个点生成一个字节). 一行(24点高)
的数据发送完后发送回车与换行控制符. 然后重复3直到所有数据打印完毕.
4. 打印机转回文本方式
因此, 上下标, 行间距, 字间距等都不成问题. 中文打字驱动程序都是这么干的
 
赞同Another_eYes的观点
不过得考虑操作系统和驱动程序的问题
 
使用拷屏打印方式,不过若一1:1的大小,打印出来的仅火柴盒大小,所以必须
放大,下面我贴出一段C代码希望对你有用:

void Initprn(void);//初始化打印机
void PrintScreen(int X1,int Y1,int X2,int Y2);//拷屏打印,水平放大3倍,垂直2倍
void PrintLn(int);//打印机换行
int WaitPrinter();//等待打印机正常

void Initprn(void)
{
char code[7];

code[0]=27;
code[1]='@';
write(4,code,2);

code[0]=27;
code[1]='U';
code[2]=1;
write(4,code,3);

code[0]=27;
code[1]='-';
code[2]=0;
write(4,code,3);

}
void PrintLn(int n)
{
int i;
for (i=1;i<=n;i++) fprintf(stdprn,"/n");
}

void PrintScreen(int X1,int Y1,int X2,int Y2)
{
int i,j,k,mab,lab,maxx,maxy;
union
{ long a;
unsigned char b[4];
} m;

maxx=X2-X1;
maxy=Y2-Y1;

setviewport(X1,Y1,X2,Y2,0);
fprintf(stdprn,"%c%c%c",27,'+',32);

lab=(maxx*3) &amp;
0xff;
mab=(maxx*3) >> 8;
for (j=0;j<=maxy/8;j++)
{
fprintf(stdprn,"%c%c%c%c%c",27,'*',40,lab,mab);
for (i=0;i<maxx;i++)
{
m.a=0;
for (k=0;k<8;k++)
{
m.a=m.a<<2;
if (getpixel(i,j*8+k))
{putpixel(i,j*8+k,2);
m.a+=3;}
}
for (k=0;k<3;k++) fprintf(stdprn,"%c%c%c",m.b[1],m.b[0],0);
}
fprintf(stdprn,"%c%c",0x0d,0x0a);
}
setviewport(0,0,getmaxx(),getmaxy(),0);

}

int WaitPrinter()
{
char c=0;
// return 1;
do
{
switch(biosprint(2,0,0))
{
case 0x80:
box(140,140,390,226,LIGHTGRAY,WHITE,DARKGRAY,1);//自定义函数,画框
ccouttext16(160,150,0,"请检查打印机是否打开",BLACK,1,1,0);//自定义函数画汉字
break;
case 0x38:
box(140,140,390,226,LIGHTGRAY,WHITE,DARKGRAY,1);
ccouttext16(160,150,0,"请检查打印机是否缺纸",BLUE,1,1,0);
break;
case 0x18:
box(140,140,390,226,LIGHTGRAY,WHITE,DARKGRAY,1);
ccouttext16(160,150,0,"请检查打印机是否联机",BLUE,1,1,0);
break;
case 0x90:
return 1;
default:
box(140,140,390,226,LIGHTGRAY,WHITE,DARKGRAY,1);
ccouttext16(160,150,0,"请检查打印机是否联机",BLUE,1,1,0);
break;
}
ccouttext16(160,185,0,"中止打印按N,否则继续",RED,1,1,0);
clearkey();
c=waitforinput();
if(c=='N'||c=='n')
return 0;
} while(1);
}


 
请查看源文件
 
哈哈,tp 7的问题去Ex-Ex问问吧.
 
menxin: What is Ex-Ex?
 
Another_eYes:你所说的方法我会去试试,但我怎样才能控制打印出的图形的
实际尺寸呢?换句话说,就是24针打印机的分辨率是多少?72DPI?
 
不知道?

http://www.experts-exchange.com/

你可知大富翁的来源?

:)
 
menxin:多谢了。小弟刚加入论坛不久,还望大虾多多指教。
 
没什么,希望对你有帮助.
 
现在的打印机都无法直接输出图形(Dos下),因为打印机都内置了汉字库。
因此我建议,收购一台Epson FX-100/RX-100 9针打印机或Brother 1724打印机,
但在Turbo Pascal环境下,还是使用前者最好。其它别无更好的办法。
要么象以上诸位的建议升级。
 
顶部