快捷搜索:

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

感悟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。

您可能还会对下面的文章感兴趣: