Vb.net 如何避免图形上不透明矩形的重叠。drawrectangle()?

Vb.net 如何避免图形上不透明矩形的重叠。drawrectangle()?,vb.net,system.drawing,mousemove,Vb.net,System.drawing,Mousemove,在谷歌搜索失败之后,我终于想到请这里的专家来帮助我解决这个问题,因为这个网站一直在帮助我 我想要什么? 我想为我的某种绘图应用程序创建一个荧光灯。我希望这是类似的荧光灯,你可以看到在窗口剪贴工具 我有什么问题? 问题是,尽管我可以使用代码,gfx.FillRectangle(新的SolidBrush(Color.FromArgb(100,Colors.GreenYellow)),x,y,width,height)绘制半透明或不透明的矩形,但是,如果我画另一个与之前的任何矩形重叠的矩形,颜色会变得

在谷歌搜索失败之后,我终于想到请这里的专家来帮助我解决这个问题,因为这个网站一直在帮助我

我想要什么?

我想为我的某种绘图应用程序创建一个荧光灯。我希望这是类似的荧光灯,你可以看到在窗口剪贴工具

我有什么问题?

问题是,尽管我可以使用代码,
gfx.FillRectangle(新的SolidBrush(Color.FromArgb(100,Colors.GreenYellow)),x,y,width,height)绘制半透明或不透明的矩形,但是,如果我画另一个与之前的任何矩形重叠的矩形,颜色会变得更暗,并降低它们重叠的矩形的透明度

代码:

Public Class Form1
    Dim drag As Boolean
    Dim mouseX, mouseY As Integer
    Dim prev As Point
    Dim initi As Point
    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        Dim grx As Graphics = Panel1.CreateGraphics
        grx.DrawString("+", New Font("Arial", 144, FontStyle.Regular), New SolidBrush(Color.FromArgb(100, Color.GreenYellow)), New Point(200, 200))
    End Sub

    Private Sub Panel1_MouseDown(sender As Object, e As MouseEventArgs) Handles Panel1.MouseDown
        drag = True
        mouseX = MousePosition.X - Me.Left - 8
        mouseY = MousePosition.Y - Me.Top - 34
        initi = New Point(mouseX, mouseY)
    End Sub

    Private Sub Panel1_MouseMove(sender As Object, e As MouseEventArgs) Handles Panel1.MouseMove
        If drag Then
            mouseX = MousePosition.X - Me.Left - 8
            mouseY = MousePosition.Y - Me.Top - 34
        End If
    End Sub

    Private Sub Panel1_MouseUp(sender As Object, e As MouseEventArgs) Handles Panel1.MouseUp
        drag = False
        prev = New Point(0, 0)
        Dim grx As Graphics = Panel1.CreateGraphics
        grx.FillRectangle(New SolidBrush(Color.FromArgb(100, Color.GreenYellow)), initi.X, initi.Y, (mouseX - initi.X), (mouseY - initi.Y))

    End Sub
End Class
应用程序的屏幕截图(显示问题)

  • 左“+”是我想画的那个
  • 右“+”是我画画时得到的

我尝试了这个方法,效果很好:没有边界,你甚至无法区分不同的框: 我更改了以下内容:

New SolidBrush(Color.FromArgb(100, Color.GreenYellow)), New Point(200, 200))
为此:

New SolidBrush(Color.GreenYellow), New Point(200, 200))
对于这两种情况:对于声明和
面板1\u MouseDown
这是因为这将通过使不可更改而将Alpha设置为1,因此重叠不会改变任何颜色、图层或可见性


当您要控制颜色的alpha值时,只应使用argb中的
,但在这种情况下,您可以让计算机为您完成这项工作。我从来没有真正使用过图形,但我唯一能想到的是创建一个要绘制的高光列表,然后每次启动鼠标事件时,创建一个新位图,逐像素绘制每个矩形,将半透明像素添加到位图,然后使用刷新面板时激发的面板绘制事件处理程序将生成的位图绘制到面板。这似乎是.net自动执行的内置alpha混合

将其添加到表单的变量声明中

Dim highlightsList As New List(Of Rectangle)
Dim bmp1 As Bitmap
将所显示的事件更改为

Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    bmp1 = New Bitmap(Panel1.Width, Panel1.Height)
End Sub 
添加此子项,该子项处理向列表中添加矩形和创建位图的操作

Private Sub addRectangle(gr As Graphics, x As Integer, y As Integer, v1 As Integer, v2 As Integer)
    Dim newRectangle As New Rectangle(x, y, v1, v2)
    highlightsList.Add(newRectangle)
    Using G As Graphics = Graphics.FromImage(bmp1)
        G.Clear(Color.White)
    End Using
    bmp1.MakeTransparent(Color.White)
    For Each rect As Rectangle In highlightsList
        For i As Integer = rect.X To rect.X + rect.Width - 1
            For j As Integer = rect.Y To rect.Y + rect.Height - 1
                bmp1.SetPixel(i, j, Color.FromArgb(100, Color.GreenYellow))
            Next
        Next
    Next
    Panel1.Refresh()
End Sub
为面板的绘制事件添加处理程序,以便在刷新面板时,位图绘制到面板上

Private Sub Panel1_Paint(sender As Object, e As PaintEventArgs) Handles Panel1.Paint
    e.Graphics.DrawImage(bmp1, 0, 0)
End Sub
并更改鼠标向上事件,以使用上面的子对象进行绘图

Private Sub Panel1_MouseUp(sender As Object, e As MouseEventArgs) Handles Panel1.MouseUp
    drag = False
    prev = New Point(0, 0)
    Dim grx As Graphics = Panel1.CreateGraphics
    'grx.Clear(Panel1.BackColor)
    addRectangle(grx, initi.X, initi.Y, (mouseX - initi.X), (mouseY - initi.Y))
End Sub

这似乎是可行的,但如果您将面板用于显示高光的任何其他对象,它可能无法按预期工作。

查看有关使用alpha混合绘制的链接。也许有些东西适合你。嗨,大卫,谢谢你的链接,非常有用。我了解了
ComposingMode.SourceCopy
。但问题是它通过选择单一颜色覆盖了背景,例如,如果我在图像上使用它,虽然绘制的线条不会改变其颜色以进行重叠,并保持绘制的线条颜色不变,但它仅从图像中选择一种颜色作为背景色,并最终与图像重叠,使其成为单一颜色或您自己的颜色可以说是在彩色背景上擦除图像或使用彩色橡皮擦擦除图像:P还有什么建议吗?也许你把我的问题搞错了,因为使用你的代码不会出现“重叠时改变颜色”的错误,但那是因为它会画一条实线,而不是半透明的**线,在我的情况下,我需要这条线。因为我想让它像我在问题中提到的那样起到荧光灯的作用。如果我误解了你的答案和概念,请纠正我。我认为有点误解。你的问题从来没有说过你想要任何类型的错误触发器,我已经测试了我的代码,给出了你在图片中要求的。请再读一遍我的答案。我的意思是你的代码
新的SolidBrush(颜色为绿黄色),新的Point(200200))
根据我的知识永远不会给出半透明的图形(如果我错了请纠正我)。但在我的问题中,我要求使用半透明图形。你的方法似乎很好,我计划了类似的东西,但没有得到代码
bmp1.MakeTransparent(Color.White)
,但问题是我实际上不会使用矩形,而是使用
FillEllipse
。在这里,我使用矩形来显示清晰的可视化效果。但不管怎样,我会把你的想法和我的想法结合起来,看看我是否能解决这个问题。非常感谢。