当前位置:主页   - 电脑 - 程序设计 - VFP
在vfp中实现表单的输出(二)
来源:网络   作者:    更新时间:2010-09-26
收藏此页】    【字号    】    【打印】    【关闭

输出选定区域

行文至此,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、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明