十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
Private Declare Function GetCursorPos Lib "user32" (ByRef lpPoint As POINTAPI) As Long '全屏坐标声明
网站建设哪家好,找创新互联公司!专注于网页设计、网站建设、微信开发、成都小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了丰宁免费建站欢迎大家使用!
Private Declare Function ScreenToClient Lib "user32.dll" (ByVal hwnd As Int32, ByRef lpPoint As POINTAPI) As Int32 '窗口坐标声明
Private Structure POINTAPI '声明坐标变量
Public x As Int32 '声明坐标变量为32位
Public y As Int32 '声明坐标变量为32位
End Structure
'以上是声明部分
'以下是窗口部分
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick '用时钟控件来取坐标,窗口上放个Timer组件,Enabled为允许,周期为10到100毫秒均可
Dim P As POINTAPI '声明坐标变量
Dim xx, yy '声明转换要用到的变量
GetCursorPos(P) '获取鼠标在屏幕中的位置
ScreenToClient(Me.Handle.ToInt32, P) '转换为本窗体的坐标
xx = P.x.ToString '把X转换成能显示到文本框的字符串格式
yy = P.y.ToString '把Y转换成能显示到文本框的字符串格式
TextBox1.Text = xx + "和" + yy '文本框的内容为X坐标和Y坐标
End Sub
代码写起来可能比较麻烦,给你个思路,就是用GraphicsPath来绘制,然后通过绘制目标的鼠标移动事件来获取当前鼠标在绘制目标中的实际位置,再通过GraphicsPath的IsVisible()方法来确认鼠标是否包含在GraphicsPath中。
DrawLine直线比较容易处理,只要得到Line的坐标点,然后比较当前鼠标坐标就好。
VB.NET里
如果要向非托管函数传递函数地址,需要传递一个委托对象,封送拆收器会自动把它转化为非托管函数指针。
所以,
首先要根据要传递的函数——WndMessage定义对应的委托类型:
(注意vb.net里面的Integer是32位,相当于vb6的Long)
Public Delegate Function WndProceDelegate(hwnd As Integer, msg As Integer, wp As Integer, ip As Integer) As Integer
然后SetWindowLong最后一个参数的类型要改成上面定义的委托类型:
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (hwnd As Integer, nIndex As Integer, dwNewLong As WndProceDelegate) As Integer
调用的时候创建委托对象:
SetWindowLong(handle,GWL_WNDPROC,New WndProceDelegate(AddressOf WndMessage))
不过这里还有一个问题,封送拆收器只保证在平台调用期间委托对象不会被回收。所以一旦SetWindowLong执行完毕,你创建的委托对象就有可能被回收掉。可以用一个非局部变量(比如字段,静态变量)来引用要传递的委托对象,这样就不会被回收。
--------------------------------------------------------------------------------------------------------
另外,你可以直接继承要接受相关消息的空间,重写WndProce。
Public Class MyPanel : Inherits Panel
Protected Overrides Sub WndProc(ByRef m As Message)
Select Case m.Msg
Case WT_PACKET
Case Else
MyBase.WndProc(m)
End Select
End Sub
End Class
me.Cursor.ToString()
或者可以枚举
me.cursor=Cursors.WaitCursor之类的
不过有以下局限:
自定义指针无法识别
窗口处于非激活状态可能无效
与其他控件可能冲突
通过窗体的MouseDown事件的e.X和e.Y属性获取。通过e.Location属性获取Point类型的坐标。
下面的代码示例使用 Location 属性跟踪鼠标左键单击,并绘制一系列直线段作为对用户输入的响应。如果隐藏窗体然后重新显示它,此示例不保留已绘制的线段,该代码为简单起见而被省略了。
Dim FirstPoint As Point
Dim HaveFirstPoint As Boolean = False
Sub Form1_MouseDownDrawing(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
If HaveFirstPoint Then
Dim g As Graphics = Me.CreateGraphics()
g.DrawLine(Pens.Black, FirstPoint, e.Location)
HaveFirstPoint = False
Else
FirstPoint = e.Location
HaveFirstPoint = True
End If
End Sub