在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”工具,好像实用性不大,于是我对源代码进行了简单的封装。必备的支持文件
- 类文件:Obj2bmp.vcx、Obj2bmp.vct
- 类引用的头文件:rgb_256.h
- API 库:Foxtools.fll
- 其他的 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 类的用户接口
- cFileName 属性:图片输出目录及名称。
- makebitmap(pnhWnd, pnBPP, pnTop, pnLeft, pnHeight, pnWidth)方法:实现图片输出。
有关 cFileName 属性的说明。在使用 makebitmap 方法前设定此属性,可指定图片文件的名称及输出路径。如:obj.cFileName="C:BMPabc.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属性值。如图: