WINDOWS操作系统的打印机制如下图所示:
? 首先,应用程序应首先获得指向打印机设备描述表的一个句柄,使得打印机驱动程序被加载到内存,并进行打印机的初始化;
? 其次,应用程序程序调用GDI函数进行绘图(画出条码),GDI模块一般将这些绘图调用存储在元文件中;
? 打印机驱动程序将元文件中的各种绘图指令翻译成打印机能够识别的指令集;
? 打印机进行打印。
在这个打印机的流程当中,不难看出,在应用程序当中我们要作的就是绘图,其余的工作就交给操作系统以及打印机驱动程序去做。对于我们要进行的条码打印来说,关键就集中于如何绘制条码,下面之例子即为CODE39之绘制程序,读者了解后不难举一反三:
//此程序是基于C++BUILDER5.0之语法;已在此环境下编译通过
//此程序仅实现绘制CODE39的最原始/最基本的功能
//读者在编写程序前应先了解条所要绘制之条码的详细规格;
{
…………
TPrinter *printer;
printer=Printer(); //得到一个操纵打印机类的实例,
String print_code;
print_code=return_logicCODE('*'); //code39的起始符及终止符均为”*”;
for (int i=1; i<=MaskEdit1->Text.Length(); i++)
{
char *code;
String temp;
temp=MaskEdit1->Text.SubString(i,1);
code=temp.c_str();
print_code+="0"; //CODE39的每个数据用一条空来分隔
temp=return_logicCODE(*code);//得到每一个数据的在CODE39中逻
//辑码
if (temp=="0") return;
print_code+=temp;
}
print_code+="0";
print_code+=return_logicCODE('*');
printer->BeginDoc();
printer->Canvas->Pen->Width=2; //CODE39每一个逻辑位元的宽度,此处设为2个//像素
printer->Canvas->MoveTo(100,60);
int x;
x=100;
for (int k=0;k<print_code.Length();k++)
{
if (print_code.SubString(k+1,1)=="0" )
{
printer->Canvas->Pen->Color=clWhite; //如果逻辑位元为“0”画条白线
}
else
{
printer->Canvas->Pen->Color=clBlack; //如果逻辑位元为“1”画条黑线
}
printer->Canvas->LineTo(x,120);
x=x+printer->Canvas->Pen->Width;
printer->Canvas->MoveTo(x,60);
}
printer->EndDoc();
}
String return_logicCODE(char code) //将每个数据转换为CODE39的逻辑码,若不
//再CODE39字符集内的数据则返回“0”
{
switch(code)
{
case '0': return "101001101101"; //code--0
case '1': return "110100101011"; //code--1
case '2': return "101100101011"; //code--2
case '3': return "110110010101"; //code--3
case '4': return "101001101011"; //code--4
case '5': return "110100110101"; //code--5
case '6': return "101100110101"; //code--6
case '7': return "101001011011"; //code--7
case '8': return "110100101101"; //code--8
case '9': return "101100101101"; //code--9
case '+': return "100101001001"; //code--+
case '-': return "100101011011"; //code---
case '*': return "100101101101"; //code--*
case '/': return "100100101001"; //code--/
case '%': return "101001001001"; //code--%
case '$': return "100100100101"; //code--$
case '.': return "110010101101"; //code--.
case ' ': return "100110101101"; //code--空白
case 'A': return "110101001011"; //code--A
case 'B': return "101101001011"; //code--B
case 'C': return "110110100101"; //code--C
case 'D': return "101011001011"; //code--D
case 'E': return "110101100101"; //code--E
case 'F': return "101101100101"; //code--F
case 'G': return "101010011011"; //code--G
case 'H': return "110101001101"; //code--H
case 'I': return "101101001101"; //code--I
case 'J': return "101011001101"; //code--J
case 'K': return "110101010011"; //code--K
case 'L': return "101101010011"; //code--L
case 'M': return "110110101001"; //code--M
case 'N': return "101011010011"; //code--N
case 'O': return "110101101001"; //code--O
case 'P': return "101101101001"; //code--P
case 'Q': return "101010110011"; //code--Q
case 'R': return "110101011001"; //code--R
case 'S': return "101101011001"; //code--S
case 'T': return "101011011001"; //code--T
case 'U': return "110010101011"; //code--U
case 'V': return "100110101011"; //code--V
case 'W': return "110011010101"; //code--W
case 'X': return "100101101011"; //code--X
case 'Y': return "110010110101"; //code--Y
case 'Z': return "100110110101"; //code--Z
default: return "0";
}
……….