时间: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.heightthisform.width
Image1SysMetric(4)+SysMetric(9)+thisform.Image1.top,SysMetric(3)+thisform.Image1.leftthisform.Image1.heightthisform.Image1.width
Container1SysMetric(4)+SysMetric(9)+thisform.Container1.top,SysMetric(3)+thisform.Container1.leftthisform.Container1.heightthisform.Container1.width
Command1SysMetric(4)+SysMetric(9)+thisform.Command1.top,SysMetric(3)+thisform.command1.leftthisform.Command1.heightthisform.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),
nPosition
位置
1
顶边
2
左边