输出选定区域
行文至此,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),
nPosition |
位置 |
1 |
顶边 |
2 |
左边 |
版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明!