在vfp中实现表单的输出(二)2007-05-09输出选定区域行文至此,PrintForm 类提供的功能已经与 VB、Delphi 打平了。接着我们就开始讨论怎样输出一个特定的矩形区域。前文我们介绍调用 makebitmap(pnhWnd, pnBPP, pnTop, pnLeft, pnHeight, pnWidth)方法时,后四个参数不传递,表示输出整个表单。现在对这四个参数传值,就可以帮助我们完成特定区域输出的任务了。先让我们来分析一下怎样在表单中定位一个区域。这个问题看起来很简单,在计算机中确定一个矩形区域只要得到四个值就可以了:顶点坐标、高度、宽度。例如打印下图左边的图形(image1控件)只要得到关于它的这些值就行了,如下。顶点坐标B点 :(thisform.image1.top,thisform.image1.left)
高度:thisform.image1.height
宽度:thisform.image1.width。

注意:上图中,表单的 BorderStyle 属性设定为“3-可调边框”。如果要输出这一区域请在“输出”按钮的 Click 事件中写入如下代码:ThisForm.printform1.makebitmap(0 ,24,thisform.image1.top,;
thisform.image1.left,thisform.image1.height,thisform.image1.width)输出的图片图下:

可见并没有达到我们的预期目的。这是为什么呢?原来在本程序认为图片的顶点 O 为坐标原点,而我们认为点 A 为坐标原点,原点都认错了,取得的矩形当然不对。话说回来,认为点 A 为原点也是有根据的,点 A 是客户图形区域的原点。在示例图中,整个画面是有“客户区域”+“系统区域”构成的,“系统区域”包括四个“边框区域”(上、下、左、右)、一个“标题栏区域”,如果有菜单栏还要算上菜单区域。知道了这些,问题就明朗了,客户区域的确定是:顶点坐标 A:(边框高度+标题栏高度,边框宽度)
高度:thisform.height
宽度:thisform.width。用 Visual FoxPro 的语言表达这一区域,写作:顶点坐标 A:(SysMetric(4)+SysMetric(9),SysMetric(3))
高度:thisform.height
宽度:thisform.width。这里出现了一个很有用的函数 SysMetric(nScreenElement),如下:
nScreenElement | 屏幕元素 |
1 | 屏幕宽度 |
2 | 屏幕高度 |
3 | 可调整窗口的边框宽度 |
4 | 可调整窗口的边框高度 |
5 | 垂直滚动栏上滚动箭头的宽度 |
6 | 垂直滚动栏上滚动箭头的高度 |
7 | 水平滚动栏上滚动箭头的宽度 |
8 | 水平滚动栏上滚动箭头的高度 |
9 | 窗口标题的高度 |
10 | 不可调整的窗口边框的宽度 |
11 | 不可调整的窗口边框的高度 |
12 | DOUBLE 或 PANEL 窗口边框的宽度 |
13 | DOUBLE 或 PANEL 窗口边框的高度 |
14 | 文本编辑窗口中水平滚动栏上滚动框的宽度 |
15 | 文本编辑窗口中水平滚动栏上滚动框的高度 |
16 | 最小化窗口图标的宽度* |
17 | 最小化窗口图标的高度* |
18 | 最大化插入点宽度 |
19 | 最大化插入点高度 |
20 | 单线菜单栏高度 |
21 | 最大化窗口宽度 |
22 | 最大化窗口高度 |
24 | 最小化可调整窗口的宽度 |
25 | 最小化可调整窗口的高度 |
26 | 最小化窗口宽度 |
27 | 最小化窗口高度 |
28 | 窗口控件的宽度 |
29 | 窗口控件的高度 |
使用以上方法,我们写出示例图中有关区域,如下:
区域 | 顶点 | 高度 | 宽度 |
客户区域 | SysMetric(4)+SysMetric(9),SysMetric(3) | thisform.height | thisform.width |
Image1 | SysMetric(4)+SysMetric(9)+thisform.Image1.top,SysMetric(3)+thisform.Image1.left | thisform.Image1.height | thisform.Image1.width |
Container1 | SysMetric(4)+SysMetric(9)+thisform.Container1.top,SysMetric(3)+thisform.Container1.left | thisform.Container1.height | thisform.Container1.width |
Command1 | SysMetric(4)+SysMetric(9)+thisform.Command1.top,SysMetric(3)+thisform.command1.left | thisform.Command1.height | thisform.Command1.width |
如果要输出Image1所在区域,请在“输出”按钮的 Click 事件中写入如下代码:ThisForm.printform1.makebitmap(0,24,SysMetric(4)+SysMetric(9)+thisform.Image1.top,;
SysMetric(3)+thisform.Image1.left,thisform.image1.height,thisform.image1.width)表单孙对象区域的输出在示例图中的Container1对象中有一子对象Image1(thisform.container1.image1),如果用前文的计算方法我们是得不到正确的图形区域的(从略)。这是因为在 Visual FoxPro 中所有对象的TOP、LEFT属性均是相对于其父对象而言的,这个Image1的父对象是Container1对象而不是表单——新的问题产生了!以下是正确的结果:顶点坐标 A:(SysMetric(4)+SysMetric(9)+objtoclient(thisform.container1.image1,1),;
SysMetric(3)+objtoclient(thisform.container1.image1,2)
高度:thisform.container1.image1.height
宽度:thisform.container1.image1.width。objtoclient()有是一个很有用的函数,返回对象相对于表单的位置(客户区)。具体用法是如下:OBJTOCLIENT(ObjectName, nPosition),