• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

感悟VB细水长流话API(四-2)

发布: 2007-6-21 21:57 | 作者: 张鸿  | 来源: 电脑爱好者  | 查看: 16次 | 进入软件测试论坛讨论

领测软件测试网

   感悟VB细水长流话API(四-2)

第五话 坐标系

  在前一话中我们初次接触到了坐标的问题,那么当 VB在使用API时应该如何正确使用坐标系呢?这看起来似乎没什么特别的,不过事实并非如此。

  VB中的坐标系统比较丰富,有Twip、Point、Pixel、 Character、Inch、Millimeter、Centimeter和User。很复杂吧?在这里我要说的是Twip和Pixel,至于剩下的,由于和本文所说的应用无多大关系,请参考MSDN或相关书籍。

  VB中最常用的是Twip的坐标系统,按照微软的说法, Twip是一种与屏幕无关的测量单位,就是说,当我们使用Twip作为单位时,(在打印时)不需要担心屏幕的分辨率。看起来是挺方便的测量单位,但是在API应用中,它却显得有点多余,因为在API中使用的坐标系统是Pixel。Pixel是以像素为单位的测量单位,像素是构成屏幕的最小元素,因此它也是常用的一种测量单位。

  下面让我们来看看如何在API中应用这两个常用的坐标系统。我把上一话的示例扩展了一下,将要用到一个新的 API:ScreenToClient。

Private Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long

  ScreenToClient的作用是把屏幕中的坐标转换为客户区的坐标(关于什么是客户区,请参考前面的文章)。hwnd是客户区对象的句柄,而lpPoint则是已经存放着屏幕坐标的 POINTAPI类型,执行该函数后,lpPoint的内容将被转换为客户区坐标值。

参考图1,它显示了当Form1的坐标系(ScaleMode)设置为Twip时:

1.鼠标在屏幕中的坐标

2.鼠标在Form1中的坐标(即由VB计算出来的客户坐标)

3.把鼠标的屏幕坐标转换为Form1的客户坐标

4.把以Pixel为单位的客户坐标转换为以Twip为单位的客户坐标

看看我是如何计算这4对坐标值的:

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

Dim tC As POINTAPI

GetCursorPos tC

Label1 = "1. Cursor Position: " & tC.X & Space(5) & tC.Y '注意这里是在屏幕中的坐标

Label2 = "2. Cursor on Form Coordinate: " & X & Space(5) & Y

ScreenToClient Me.hwnd, tC
Label3 = "3. ScreenToClient: " & tC.X & Space(5) & tC.Y '这里把屏幕中的坐标转换为在 Form1 中的坐标
Label4 = "4. Coordinate after transform: " & tC.X * Screen.TwipsPerPixelX & Space(5) & tC.Y * Screen.TwipsPerPixelY
End Sub


  然后对比图2,和上面同样的代码,把Form1的ScaleMode设置为 Pixel 时计算出来的坐标值。
  在图1中,Form1的ScaleMode是Twip,当把鼠标的屏幕坐标转换为客户坐标时,我们发现它和Form1本身提供的X、Y值不同(2和3不同),这是因为此时VB程序给我们的坐标值是以Twip为单位的。所以这里我提供了一个方法来把以像素为单位的客户坐标转换为以Twip为单位,即把水平和竖直方向的坐标值分别乘以Screen.TwipsPerPixelX和Screen.TwipsPerPixelY(所以2和4相同)。

  Screen.TwipsPerPixelX和Screen.TwipsPerPixelY是由VB本身提供的,它们的作用是得到屏幕中在水平和竖直方向上每个像素各等于多少个Twip。你也可以使用另一个VB提供的方法:ScaleX()和ScaleY(),它们可以帮你把某一坐标系的值转换成另一坐标系的值。然而,作为一种习惯,我还是建议选择第一种方法,它显得直观一些,并且许多时候当看到这样一段代码时,我们可以马上就理解它的作用。

  再看图2,Form1的ScaleMode是Pixel,因此Form1本身提供的X、Y和我们用API计算出来的值是相同的(2和3相同),而不是图1中和被转换为Twip的4相同。

  看了上面的示例,我想你应该知道如何在API中使用 Twip和Pixel了。另外我还想补充一句,在一般应用中,我们使用得最多的还是Twip,原因之一是VB默认是使用它的,之二是用它来控制长度比用Pixel更准确,特别是在涉及到打印时——1 Point等于1/72英寸,1 Twip等于1/20 Point即1/1440英寸,每厘米有567 Twips; 而Pixel却因屏幕显示范围的不同而改变,这必将使得难以掌握打印长度。

  程序在Windows98/2000+VB6下调试通过。工程文件下载地址是:
  http://www.cfan.net.cn/qikan/cxg/0204gwv.zip。

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网