屏幕坐标系和窗口客户区坐标系的区别
编号: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,进行缇和像素的转换,在你的这个函数中,前两种情况都进行了这样的转换。
此问题由李海回答。
| |
|
|
| |
|
|