用C#怎样限定鼠标移动范围只能在一窗体内
发布网友
发布时间:2022-05-11 21:15
我来回答
共1个回答
热心网友
时间:2023-10-20 19:43
Option Explicit'注意在API都是使用坐标系统为Pixel(像素),所以我们必须先确定我们返回的是
'像素还是缇单位,一般默认的就是缇,所以这里我们就使用缇'作用:限定光标范围(这里用到了一个结构,在MSND上有,一个矩形区域)
Private Declare Function ClipCursor Lib "user32" (lpRect As Any) As Long'作用:取得标题栏的高度
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long'矩形区域结构
Private Type RECT
Left As Long '左上角X坐标
Top As Long '左上角Y坐标
Right As Long '右上角X坐标
Bottom As Long '右上角Y坐标
End TypePrivate Const SM_CYCAPTION = 4 ' Height, in pixels, of a normal caption area
'高度,用像素表示:一个正常标题栏区域的高度Private Sub Command1_Click()
Dim rec As RECT
Dim Heigth_Caption As Long '标题栏的高度,在这里是返回的像素,注意!
Heigth_Caption = GetSystemMetrics(SM_CYCAPTION) '得到系统标题栏的高度
'把默认的缇单位转换为像素单位
With rec
'左上角X坐标:等于按钮的left的坐标加上窗体的坐标(按钮的坐标只是相对窗体本身来说) '为什么要加标题栏的高度?我们可以把其去掉,这样我们运行程序时,总发现光标的移动范围 '总在控件的上方,于是得到肯定坐标不准确,但是X坐标是准确的,就是Y坐标不准确,而且就 '在上方,仔细发现其大致高度就和标题栏的高度相当,于是大胆猜测可能是由于标题栏引起的, '于是加上这个标题栏高度,哇,成功了!
.left= (Command1.Left + Me.Left) / Screen.TwipsPerPixelX
.Top = ((Command1.Top + Me.Top) / Screen.TwipsPerPixelY) + Heigth_Caption
.Right = (Command1.Width + Command1.Left + Me.Left) / Screen.TwipsPerPixelX
.Bottom = ((Command1.Height + Command1.Top + Me.Top) / Screen.TwipsPerPixelY) + Heigth_Caption
End With
'限定光标范围
ClipCursor rec
End Sub
'限定光标在窗体里面移动,而不是在窗体的控件里
With rec
.Left = me.Left / Screen.TwipsPerPixelX
.Top = me.Top / Screen.TwipsPerPixelY
.Right = (me.Left + me.Width) / Screen.TwipsPerPixelX
.Bottom = (me.Top +me.Height) / Screen.TwipsPerPixelY
End With
ClipCursor rec'恢复光标的移动范围(全屏都可以)
With rec
'左上角X坐标:等于按钮的left的坐标加上窗体的坐标(按钮的坐标只是相对窗体本身来说)
.Left = 0
.Top = 0
.Right = Screen.Width / Screen.TwipsPerPixelX
.Bottom = Screen.Height / Screen.TwipsPerPixelY
End With
'限定光标范围
ClipCursor rec 重生神犬最新章节在线阅读 http://www.xslxb.cn/files/article/html/23/23701/index.html