2010-03-25 7 views
0
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 

J'ai créé un contrôle comme ci-dessus, ce contrôle me permet d'importer un png avec un canal alpha et une forme aléatoire. et puis il peut s'afficher au-dessus de tout autre contrôle, c'est-à-dire, une zone de texte, une zone d'image, etc. et l'arrière-plan devrait toujours montrer ce qui se trouve juste en dessous, au lieu de simplement montrer le contrôle de ses parents.VB.net problème de contrôle transparent

cela a fonctionné si c'est le mode statique, à savoir rester immobile dans le formulaire. mais quand j'ai essayé de le faire glisser, le contrôle ne se rendrait pas correctement, et passe également sous d'autres contrôles.

Quelqu'un peut-il me donner un coup de main s'il-vous-plaît?

Répondre

1

L'arrière-plan n'est plus correct lorsque vous le déplacez. Le contrôle ne le sait pas, vous devrez le dire en appelant sa méthode Invalidate().

L'immersion sous les contrôles est un problème d'ordre Z. Cela peut être difficile à corriger si le formulaire contient des contrôles de conteneur imbriqués comme des panneaux, UserControls ou GroupBoxes. Vous ne pouvez pas l'afficher au-dessus de ceux-ci. Mais tant que tout a la forme en tant que Parent, l'appel de BringToFront() sur le contrôle fera en sorte qu'il soit toujours au sommet.

Une solution plus générique est une forme qui recouvre l'original et dont la propriété TransparencyKey est définie sur son BackColor pour être complètement transparente. Tout contrôle que vous mettez sur ce formulaire sera toujours au sommet. Mon code dans this thread illustre l'idée de superposition.

Si vous créez votre propre concepteur, vous devez lire this article.

+0

Ou une fenêtre en couches. – SLaks

+0

Oui, le fond de page * est * une fenêtre en couches. –

+0

oui, en fait j'ai déjà fait la solution de superposition, pourquoi im faire ceci est, j'utilise la forme superposée comme une touche highligh sur une interface clavier tactile (comme l'iPhone et le clavier d'un autre écran tactile) et ça pose problème avec SendKey.send – user294720