我需要读取颜色并绘制到屏幕上的计算点
旧版本的VB中旧的Peek和Poke,或PointSet和PointGet命令的VB.NET等价物是什么。
或者替代方法是,有没有办法将标签用作Cursor对象,这样当我移动它时它不会擦除我的图片框内容。我不能只制作一个光标图标,因为标签中的文字必须随着我移动光标而改变
答案 0 :(得分:1)
您不能将标签本身用作光标,但您可以将Label组件添加到表单中,并使用消息过滤器与光标同步移动它,如下所示:
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Application.AddMessageFilter(New LabelMoveFilter)
End Sub
Private Class LabelMoveFilter
Implements IMessageFilter
Public Function PreFilterMessage(ByRef m As Message) As Boolean _
Implements IMessageFilter.PreFilterMessage
'If the message is &H200 (WM_MOUSEMOVE), reposition the label to
'where the cursor has moved to
If m.Msg = &H200 Then
Form1.Label1.Location = Form1.PointToClient(Cursor.Position)
End If
'Return false so that the message is passed on to the form
Return False
End Function
End Class
End Class
Label组件(在此示例中为Label1)不会覆盖表单上的任何内容,它只会位于顶部。只需确保Label位于表单上所有其他组件的前面,这样它就不会在其他任何组件后面滑动。然后,您可以在适当的时候将标签文本设置为您需要的任何内容。
编辑:回答问题的其他部分......
要在屏幕上获取和设置任意像素,您可以使用Windows GDI GetPixel和SetPixel函数。像这样导入它们:
Private Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hwnd As Integer) As Integer
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Integer, ByVal x As Integer, ByVal y As Integer) As Integer
Private Declare Function SetPixel Lib "gdi32" (ByVal hdc As Integer, ByVal x As Integer, ByVal y As Integer, ByVal crColor As Integer) As Integer
然后将这些称为:
color = ColorTranslator.FromOle(GetPixel(GetDC(0), x, y))
和
SetPixel(GetDC(0), x, y, ColorTranslator.ToOle(color))
其中x和y是屏幕(非形式)坐标,颜色是要读取/设置的颜色。您可以使用Cursor.Position.X和Cursor.Position.Y获取光标的X / Y,如果这是您想要的X和Y.您可以使用PointToScreen和PointToClient方法分别从表单转换为屏幕,屏幕转换为表格坐标。
请注意,您设置的任何像素一旦重新绘制,就会被覆盖。请注意,这些也会在您的表单之外读/写,所以要小心。