热情软件屋

 

屏幕坐标系和窗口客户区坐标系的区别


编号:QA003874
建立日期: 2001年2月13日 最后修改日期:2001年2月13日
所属类别:

戴志钢:
    本问题涉及的操作系统:NT4.0
    本问题涉及的编程工具:VB6.0
    本人对于下面代码中的一些语句不太理解,特向各位高手请教。
    代码如下:
    Public Sub ClipTo(ToCtl As Object)
     On Error Resume Next
     Dim tmprect As RECT
     Dim pt As POINTAPI
     With ToCtl
     If TypeOf ToCtl Is Form Then
     tmprect.Left = (.Left / Screen.TwipsPerPixelX)
     tmprect.Right = (.Right / Screen.TwipsPerPixelY)
     tmprect.Top = (.Left + .Width) / Screen.TwipsPerPixelX
     tmprect.Bottom = (.Right + .Height) / Screen.TwipsPerPixelY
     ElseIf TypeOf ToCtl Is Screen Then
     tmprect.Left = 0
     tmprect.Right = 0
     tmprect.Top = (.Width / Screen.TwipsPerPixelX)
     tmprect.Bottom = (.Height / Screen.TwipsPerPixelY)
     Else
     pt.X = 0
     pt.Y = 0
     Call ClientToScreen(.hwnd, pt)
     tmprect.Left = pt.X
     tmprect.Top = pt.Y
     pt.X = (.Width / Screen.TwipsPerPixelY)
     pt.Y = (.Height / Screen.TwipsPerPixelX)
     Call ClientToScreen(.hwnd, pt)
     tmprect.Bottom = pt.Y
     tmprect.Right = pt.X
     End If
     Call ClipCursor(tmprect)
     End With
    1、我COMMAND按钮名来调用该语句时,对于代码中的pt.X = 0,pt.Y = 0不太理解,我认为应该设为控件的左上角的坐标值,而不是零,因为需要的是把鼠标锁定在该按钮的矩形区域内。
    2、本人对于屏幕坐标系和窗口客户区坐标系的区别不甚清楚,不知何时需要进行两者的转换,特请教
    3、是不是API函数需要的都是像素值,有哪些方法可以实现度量单位的转换(由缺省值缇变为像素)。

回答:

    屏幕坐标系和窗口客户区坐标系最明显的区别在于坐标原点,屏幕坐标系的坐标原点在整个屏幕的左上角,而窗口客户区坐标系的坐标原点在窗口客户区的左上角,通常这两个点是不重合的。要回答你的第一个问题,首先需要明确ClientToScreen函数的第一个参数是谁的句柄。对于你这个例子,这个参数是Ctl.hWnd,也就是说是控件的句柄,就是Command控件的句柄。如果按照Command控件的坐标系说,左上角当然是(0, 0),所以原函数是正确的。而你说的“左上角的坐标值”大概是以窗口客户区为坐标系了,当然,如果采用窗口客户区为坐标系的话,就需要修改ClientToScreen函数的第一个参数为窗口的句柄了。
    大多数API函数默认的单位是像素值。你可以使用 Screen.TwipsPerPixelX和Screen.TwipsPerPixelY,进行缇和像素的转换,在你的这个函数中,前两种情况都进行了这样的转换。

此问题由李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio