Прозрачный контрольный вопрос VB.net - PullRequest
0 голосов
/ 25 марта 2010
Public Class HighlightKey
    Inherits Control
    Private m_fillColor As Color = Color.White
    Private m_opacity As Integer = 100
    Private alpha As Integer
    Private m_image As Image

    Public Sub New()

        SetStyle(ControlStyles.SupportsTransparentBackColor, True)
        SetStyle(ControlStyles.Opaque, True)
        Me.BackColor = Color.Transparent
        Console.WriteLine("new Highlight key ")
    End Sub

    Public Property Image() As Image
        Get
            Return m_image
        End Get
        Set(ByVal value As Image)
            m_image = value
        End Set
    End Property

    Protected Overloads Overrides ReadOnly Property CreateParams() As CreateParams
        Get
            Dim cp As CreateParams = MyBase.CreateParams
            cp.ExStyle = cp.ExStyle Or &H20
            Return cp
        End Get
    End Property

    Protected Overloads Overrides Sub OnBackColorChanged(ByVal e As EventArgs)
        If Me.Parent IsNot Nothing Then
            Parent.Invalidate(Me.Bounds, True)
        End If
        MyBase.OnBackColorChanged(e)
    End Sub

    Protected Overloads Overrides Sub OnParentBackColorChanged(ByVal e As EventArgs)
        Me.Invalidate()
        MyBase.OnParentBackColorChanged(e)
    End Sub


    Protected Overrides Sub OnPaintBackground(ByVal pevent As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaintBackground(pevent)
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

        Dim g As Graphics = e.Graphics
        Dim brush As New SolidBrush(Me.ForeColor)
        Dim StringSize As New SizeF

        alpha = (m_opacity * 255) / 100

        If m_image IsNot Nothing Then
            StringSize = g.MeasureString(Me.Text, Me.Font)
            Dim x As Integer = (CInt(Me.m_image.Width) - CInt(StringSize.Width)) / 2
            g.DrawImage(m_image, 0, 0, m_image.Width, m_image.Height)
            g.DrawString(Me.Text, Me.Font, brush, x, 20)
        End If

        brush.Dispose()
        g.Dispose()
        MyBase.OnPaint(e)
    End Sub

    Public Function SetImgOpacity(ByVal imgPic As Image, ByVal imgOpac As Single) As Image


        Dim bmpPic As New Bitmap(imgPic.Width, imgPic.Height)

        Dim gfxPic As Graphics = Graphics.FromImage(bmpPic)

        Dim cmxPic As New ColorMatrix()
        cmxPic.Matrix33 = imgOpac

        Dim iaPic As New ImageAttributes()
        iaPic.SetColorMatrix(cmxPic, ColorMatrixFlag.[Default], ColorAdjustType.Bitmap)

        gfxPic.DrawImage(imgPic, New Rectangle(0, 0, bmpPic.Width, bmpPic.Height), 0, 0, imgPic.Width, imgPic.Height, _
         GraphicsUnit.Pixel, iaPic)

        gfxPic.Dispose()
        Return bmpPic
    End Function

    Private Sub HighlightKey_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChanged
        Me.Refresh()
    End Sub

    Private Sub HighlightKey_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.TextChanged
        Me.Refresh()
    End Sub
End Class

Я создал элемент управления, как указано выше, этот элемент управления позволяет мне импортировать png с альфа-каналом и произвольной формой. и затем он может отображаться поверх любого другого элемента управления, то есть текстового поля, графического окна и т. д. и фон всегда должен показывать то, что прямо под ним, а не просто показывать его родительский элемент управления.

это сработало, если это статический режим, т.е. стоит на месте в форме. но когда я попытался перетащить / переместить его, элемент управления не отображался должным образом, а также переходил под другие элементы управления.

1 Ответ

1 голос
/ 25 марта 2010

Фон больше не корректен при его перемещении. Элемент управления не знает об этом, вам придется сообщить об этом, вызвав его метод Invalidate ().

Это погружение под органы управления является проблемой Z-порядка. Это может быть трудно исправить, если форма содержит вложенные элементы управления контейнером, такие как Panels, UserControls или GroupBoxes. Вы не можете отобразить это поверх них. Но до тех пор, пока у всего есть форма, как у Parent, вызов BringToFront () для элемента управления будет гарантировать, что он всегда находится сверху.

Более общим решением является форма, которая накладывается на оригинал, и для свойства TransparencyKey установлено значение BackColor, чтобы она была полностью прозрачной. Любой элемент управления, который вы вводите в эту форму, всегда будет на высоте. Мой код в этой теме демонстрирует идею наложения.

Если вы создаете свой собственный дизайнер, вам нужно прочитать эту статью .

...