在屏幕上画一个点

时间:2008-12-06 15:28:35

标签: .net graphics cursor

我需要读取颜色并绘制到屏幕上的计算点

旧版本的VB中旧的Peek和Poke,或PointSet和PointGet命令的VB.NET等价物是什么。

或者替代方法是,有没有办法将标签用作Cursor对象,这样当我移动它时它不会擦除我的图片框内容。我不能只制作一个光标图标,因为标签中的文字必须随着我移动光标而改变

1 个答案:

答案 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方法分别从表单转换为屏幕,屏幕转换为表格坐标。

请注意,您设置的任何像素一旦重新绘制,就会被覆盖。请注意,这些也会在您的表单之外读/写,所以要小心。