用C++Builder轻松创建票据套打组件

来源:互联网 发布:centos安装idea 编辑:程序博客网 时间:2024/06/05 18:07

在网页中实现票据套打的方法很多,但开放源代码的并不多,在这里提供一种简单的方法实现简单的票据打印供大家参考。

开发工具:Borland C++Builder 6.0

1、打开C++Builder,点击菜单File>>Close All关闭系统自动创建的Application,当然,这一步也可以不需要,直接进行下面的一步;

2、点击菜单File>>New>>Other,在NewItems对话框中点击ActiveX标签页,点击ActiveX Library,接着点击OK,就完成了ActiveX库的建立;

3、点击菜单File>>New>>Other,在NewItems对话框中点击ActiveX标签页,点击Automation Object,接着点击OK,弹出New Automation Object对话框,在CoClassName中输入TestPrint,Threading Model选择Apartment,在Description中填入对于这个ActiveX的描述,点击OK,这样就完成了自动化对象的建立;

4、把上面所建立的项目保存,项目暂且叫做TestPrint,CoClass的命名千万不能和项目名一致,暂且命名为CCTestPrint,保存后的界面大致如下图: 

在左边导航栏中点击CCTestPrint(TestPrint的CoClass),右边的GUID便是由C++Builder自动生成的该接口的全球唯一标识;

5、在左边导航栏中点击ITestPrint,点击上面工具栏中的New Method,命名为PrintOpen,如此炮制PrintText、PrintClose两个方法,点击工具栏中Refresh Implementation,这时在CCTestPrintImpl.cpp文件中会相应地出现三个方法的定义;

6、分别为上面创建的三个方法添加参数,点击PrintOpen方法,右边会出现Parameters标签页,Return Type为HRESULT,Parameters>>Name填入PrintTitle,Parameters>>Name填入BSTR,Parameters>>Modifier填入[in],最后点击工具栏中的Refresh Implementation并保存,就完成了PrintOpen方法的参数定义,三个方法参考如下定义:
PrintOpen(BSTR PrintTitle);
PrintText(long PrintX, long PrintY,
  BSTR PrintFontName, long PrintFontSize, BSTR PrintText);
PrintClose();

定义完成后在即可在CCTESTPRINTIMPL.CPP文件中看到增加了如下代码段:

STDMETHODIMP TCCTestPrintImpl::PrintOpen(BSTR PrintTitle)
{
}

STDMETHODIMP TCCTestPrintImpl::PrintText(
long PrintX, long PrintY,
  BSTR PrintFontName, 
long PrintFontSize, BSTR PrintText)
{
}

STDMETHODIMP TCCTestPrintImpl::PrintClose()
{
}

7、定义方法完成后,即可实现该方法了,在CCTESTPRINTIMPL.CPP文件中对照相应的方法写入如下代码:

 

STDMETHODIMP TCCTestPrintImpl::PrintOpen(BSTR PrintTitle)
{
        Printer()
->Title = PrintTitle;//打印标题
        Printer()->BeginDoc();//开始打印
        return S_OK;
}

STDMETHODIMP TCCTestPrintImpl::PrintText(
long PrintX, long PrintY,
  BSTR PrintFontName, 
long PrintFontSize, BSTR PrintText)
{
        Printer()
->Canvas->Font->Name = PrintFontName;//打印字体,名称
        Printer()->Canvas->Font->Size = PrintFontSize;//打印字体大小
        Printer()->Canvas->Brush->Style = bsClear;//打印背景透明
        Printer()->Canvas->TextOut(PrintX,PrintY,PrintText);//打印文本,PrintX为打印横坐标,PrintY为打印纵坐标,PrintText为需要打印的文本
        return S_OK;
}

STDMETHODIMP TCCTestPrintImpl::PrintClose()
{
        Printer()
->EndDoc();//结束打印
        return S_OK;
}

8、点击C++Builder主菜单上的Project>>Options,选择Packages标签页,将Build with runtime packages前面的勾去掉,再点击Linker标签页,将Use Dynamic RTL前面的勾去掉,点击OK并保存项目,这样做是为了让生成的ActiveX组件能够脱离C++Builder的开发环境而运行,最后点击主菜单上的Project>>Build TestPrint,在项目文件夹下会找到TestPrint.dll文件,这个就是套打的ActiveX组件;

9、ActiveX组件生成了,如何调用呢?首先在DOS下注册上面生成的TestPrint.dll文件,即输入命令regsvr32 d:/TestPrint.dll,注册成功后可以在HTML文件中写入如下JavaScript代码:

 

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>TestPrint Control</title>
<object classid="clsid:********-****-****-****-************" id="TestPrint">
</object>
</head>
<script language="javascript" type="text/javascript">
function TestPrint()
{
 
try
 {
  TestPrint.PrintOpen(
"打印测试");
  TestPrint.PrintText(
100,100,"宋体",10,"你好!世界!这是套打测试!Hello World!");
  TestPrint.PrintText(
100,200,"黑体",15,"你好!世界!这是套打测试!Hello World!");
  TestPrint.PrintText(
100,300,"楷体_GB2312",20,"你好!世界!这是套打测试!Hello World!");
  TestPrint.PrintText(
100,400,"华文行楷",45,"你好!世界!这是套打测试!Hello World!");
  TestPrint.PrintText(
100,500,"华文彩云",50,"你好!世界!这是套打测试!Hello World!");
  TestPrint.PrintText(
100,600,"隶书",35,"你好!世界!这是套打测试!Hello World!");
  TestPrint.PrintClose();
 }
 
catch(e)
 {
  alert(e);
 }
}
</script>
<body>
<form id="form1" name="form1" method="post" action="">
<input type="button" name="Test" value="打印" onclick="TestPrint()" />
</form>
</body>
</html>

然后打开这个HTML文件并点击按钮,打印是不是成功了?

注意:<object classid="clsid:********-****-****-****-************" id="TestPrint">中的星号就是前面说到的C++Builder自动生成的GUID;

10、在打印的时候IE会弹出一个对话框说ActiveX不安全,那就在CCTestPrintImpl.h文件中添加一段“脚本安全”和“初始化安全”代码:

 

/*这段代码是原有的*/
BEGIN_COM_MAP(TCCTestPrintImpl)
  COM_INTERFACE_ENTRY(ICCTestPrint)
  COM_INTERFACE_ENTRY2(IDispatch, ICCTestPrint)
END_COM_MAP()

/*这段代码是添加的*/
BEGIN_CATEGORY_MAP(TCoClassCPrintImpl)
  IMPLEMENTED_CATEGORY(CATID_SafeForScripting)
  IMPLEMENTED_CATEGORY(CATID_SafeForInitializing)
END_CATEGORY_MAP()

然后重新编译并注册TestPrint.dll这个文件,最后再试试,是不是打印成功了?如果打印成功了,那你就可以利用这个ActiveX组件进行简单的票据套打了,如果需要发布成cab文件便于客户端更新和下载,可以使用IEXPRESS进行打包,这里就不详细介绍了。