分享

在vfp中实现表单的输出(一)

 happyngkmw 2012-09-08

在vfp中实现表单的输出(一)

时间:2007-05-09
-

说在前面

VB、Delphi 都为 Form 对象封装了 PrintForm 方法,允许用户方便的将 Form 转换成为 BMP。这是一个不错的功能,在实际开发过程中是经常有这种需求的,比如把统计图表作为图片保存下来……

然而很不幸的是 Visual FoxPro(包括即将登场的 7.0) 并没有为我们封装此种功能。这个问题一定困扰着不少狐友吧,包括我。虽然我们知道使用 Win API 就可以解决问题,实际编程却又谈何容易?

很高兴得到了 George Tasker 编写的“OBJ2BMP”工具,并得到了所有原始代码。George Tasker 为我们提供了一个 Visual FoxPro 版的抓图工具,但我认为这个工具不见得实用——总不能在我们的应用程序中老是要调用一个工具才能完成 PrintFrom 的工作吧,这样既不专业也不美观。于是我利用 George Tasker 提供的源代码作了简单的二次开发,重新封装了部分功能,希望能这个很棒的工具更合适开发人员使用。

原始代码版权属于 George Tasker,本文及二次开发的版权属于 BOE 数据网络工作室。该软件属于免费软件,您可以随意使用,但如果造成什么不良后果,我们不承担任何责任。

 以下所有讨论均以“象素”为单位!!!

使用 OBJ2BMP 工具

先让我们来看看怎样使用 George Tasker 为我们提供的 OBJ2BMP 工具吧!

编译项目成为 obj2bmp.app

使用 obj2bmp.app 工具

新建一个表单,设定表单的 alwaysOnTop属性为 .t.或者设定 alwaysOnBottom 属性为.t.,运行表单。

在“命令窗口”中键入如下命令,并执行:

oObjPicker=.null.
DO Obj2Bmp.app WITH oObjPicker

如下图:

右面的表单就是抓图工具,请注意它下方的按下拉式列表框中列示了两个对象:“抓图”和“Select Object”(目的表单的Caption 属性)。“抓图”是指左面的表单,“Select Object”就是它自己。由于我们在下拉式列表框中选择了“抓图”表单,所以列表框中就列示了“抓图”中的所有可视控件:表单、Olecontrol、Command,您可以选择要抓拍的控件的名称,按下“Capture”按钮,您将得到该控件的当前模样的图片。

对于画面的质量您也可以控制,24 Bit Color 质量最好。

FormPrint 类的使用详解

从开发人员的角度看“obj2bmp”工具,好像实用性不大,于是我对源代码进行了简单的封装。

必备的支持文件

  1. 类文件:Obj2bmp.vcx、Obj2bmp.vct

  2. 类引用的头文件:rgb_256.h

  3. API 库:Foxtools.fll

  4. 其他的 API 库,我想这对 Windows 32 位系统是不成问题的

关于 Foxtools.fll 的说明。Foxtools.fll 是 Visual FoxPro 自带的 API 库,默认存放在 Home() 目录下。在建立 FormPrint 类实例时(init 事件)检测是否已对 Foxtools.fll 引用,如果没有则执行如下命令:

set library to (home()+"foxtools.fll") addi

请务必保证 Home() 目录下有此文件,如果您想把 Foxtools.fll放在其它地方,请修改以上语句。

引用 Foxtools.fll 的目地在于得到表单的句柄,在 Visual FoxPro 7 中每个表单都有句柄属性,就不用麻烦 Foxtools.fll 了。

FormPrint 类的用户接口

  1. cFileName 属性:图片输出目录及名称。

  2. makebitmap(pnhWnd, pnBPP, pnTop, pnLeft, pnHeight, pnWidth)方法:实现图片输出。

有关 cFileName 属性的说明。在使用 makebitmap 方法前设定此属性,可指定图片文件的名称及输出路径。如:

obj.cFileName="C:\BMP\abc.bmp" 将图片文件保存在C:\BMP目录下,文件名称是abc.bmp。

如果执行makebitmap方法时,目标文件已经存在,程序将在不通知的情况下覆盖它;如果执行 makebitmap 方法时文件不能建立(可能是目录不存在、路径无效、无法覆盖已存在的文件……),程序将重新设定图片文件的名称及保存目录,新文件名及目录是这样确定:

sys(5)+sys(2003)+"\"+left(sys(2015),8)+".bmp"

如果事先不设定 cFileName 属性,使其保持默认值 .null. 或设定 cFileName 为 .null. 值,程序也将使用“sys(5)+sys(2003)+"\"+left(sys(2015),8)+".bmp"”确定图片的名称及保存目录。

每次图片生成完毕,cFileName 属性自动设定为 .null. 值。

有关 makebitmap(pnhWnd, pnBPP, pnTop, pnLeft, pnHeight, pnWidth)方法的说明。

所有六个参数均可省略,但我建议调用时不要省略前两个参数。

——pnhWnd 代表被输出表单的句柄。如果 PrintForm 实例化以后其父对象是被输出表单的话,传递 0 即代表打印当前表单;如果要打印其他表单的话,请使用如下代码得到它的句柄,并以此句柄作为 pnhwnd 传递:

_WhTohWnd(_WFindTitl(cCaption)) && cCaption 代表被输出表单的 Caption 属性。

——pnBPP 代表输出图片的质量。有三种选择:4,8,24,数字越大质量越好。

输出整个表单

新建表单(实例一),添加控件。别忘了把 PrintForm 类加入表单,使之成为表单的子对象。如图:

A.最简单的应用,在“输出”按钮的“Click”事件中加入如下代码:

ThisForm.printform1.makebitmap(0,24)
* 显示:F:\OBJ2BMP\_0CU0FYF.BMP。表明图面文件的名称和位置。

B.指定输出目的地,在“输出”按钮的“Click”事件中加入如下代码:

Thisform.printform1.cFileName="C:\ABC.BMP"
ThisForm.printform1.makebitmap(0,24)
* 显示:C:\ABC.BMP。表明图面文件的名称和位置。

Thisform.printform1.cFileName="Z:\ABC.BMP"
ThisForm.printform1.makebitmap(0,24)
* 显示:F:\OBJ2BMP\_0CU0FYT.BMP。因为Z盘不存在,图片文件无法建立,改用默认目录及文件名称。

C.输出其他表单。

建立一新表单(实例二),加入控件,运行。

在“实例一”表单的“输出”按钮的“Click”事件中加入如下代码,运行:

ThisForm.printform1.makebitmap(_WhTohWnd(_WFindTitl("实例二")) ,24)
*"实例二"是后一个建立的表单的caption属性值。

如图:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多