Einblenden

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Hallo Commi. :)
    Ich habe eine TextBox und eine PictureBox
    Wenn ich auf die PictureBox drauf klicke, soll
    die TextBox sich einblenden, hat jemand eine
    ahnung wie das geht in VB 10?

    Edit by ~blaze~:
    *Thema verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()

    Doch Doch, das mit Fisible und Valso, und die Grundbefehle weiss ich ja^^
    bloß ich beine das es langsam ein Gebledet wird! z.b. bei einer Form:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Me.Opacity = 0.0F
    3. Timer1.Start()
    4. End Sub
    5. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    6. Me.Opacity += 0.1F
    7. If Me.Opacity = 1.0F Then
    8. Timer1.Stop()
    9. End If
    10. End Sub

    Nur Das ich das mit ner TextBox möchte
    Dann muss ich mich dafür entschuldigen, dass ich dir unterstellt habe, kein VB zu können.
    Das geht bei einer TextBox nicht so einfach. Problematisch ist z.B. auch das Caret, da es verhindert, dass du die Paint-Methode aufrufen kannst. Du kannst dir aber eine eigene TextBox erstellen. Das hier kannst du als Vorlage nehmen:

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class CustomControl1
    3. <DllImport("gdi32.dll")> _
    4. Private Shared Function SetPixel(ByVal hdc As IntPtr, ByVal x As Integer, ByVal y As Integer, ByVal value As APIColor) As APIColor
    5. End Function
    6. <DllImport("gdi32.dll")> _
    7. Private Shared Function GetPixel(ByVal hdc As IntPtr, ByVal x As Integer, ByVal y As Integer) As APIColor
    8. End Function
    9. Private sngAlpha As Single
    10. Public Property Opacity() As Single
    11. Get
    12. Return sngAlpha
    13. End Get
    14. Set(ByVal value As Single)
    15. If value < 0.0F OrElse value > 1.0F Then
    16. Throw New ArgumentOutOfRangeException("Opacity")
    17. Else
    18. sngAlpha = value
    19. Me.Refresh()
    20. End If
    21. End Set
    22. End Property
    23. Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    24. Dim bg As BufferedGraphics = BufferedGraphicsManager.Current.Allocate(e.Graphics, e.ClipRectangle)
    25. Dim px(e.ClipRectangle.Width - 1, e.ClipRectangle.Height - 1) As APIColor
    26. Dim hdc As IntPtr = bg.Graphics.GetHdc
    27. Dim ghdc As IntPtr = e.Graphics.GetHdc
    28. Dim eve As New PaintEventArgs(bg.Graphics, New Rectangle(0, 0, e.ClipRectangle.Width, e.ClipRectangle.Height))
    29. Dim cpx As APIColor
    30. For y As Integer = 0 To e.ClipRectangle.Height - 1
    31. For x As Integer = 0 To e.ClipRectangle.Width - 1
    32. cpx = GetPixel(ghdc, x + e.ClipRectangle.Left, y + e.ClipRectangle.Top)
    33. px(x, y) = cpx
    34. SetPixel(hdc, x, y, cpx)
    35. Next
    36. Next
    37. bg.Graphics.ReleaseHdc()
    38. e.Graphics.ReleaseHdc(ghdc)
    39. TextBoxRenderer.DrawTextBox(bg.Graphics, New Rectangle(-e.ClipRectangle.Left, -e.ClipRectangle.Top, Me.ClientSize.Width, Me.ClientSize.Height), VisualStyles.TextBoxState.Normal)
    40. MyBase.OnPaint(eve)
    41. hdc = bg.Graphics.GetHdc
    42. For y As Integer = 0 To e.ClipRectangle.Height - 1
    43. For x As Integer = 0 To e.ClipRectangle.Width - 1
    44. SetPixel(hdc, x, y, APIColor.Blend(sngAlpha, GetPixel(hdc, x, y), px(x, y)))
    45. Next
    46. Next
    47. bg.Graphics.ReleaseHdc()
    48. bg.Render()
    49. End Sub
    50. <StructLayout(LayoutKind.Sequential)> _
    51. Private Structure APIColor
    52. Public R As Byte
    53. Public G As Byte
    54. Public B As Byte
    55. Private Reserved As Byte
    56. Public Shared Function Blend(ByVal foreColorAlpha As Single, ByVal foreColor As APIColor, ByVal backColor As APIColor) As APIColor
    57. Dim na As Single = 1.0F - foreColorAlpha
    58. Return New APIColor(CByte(na * backColor.R + foreColorAlpha * foreColor.R), CByte(na * backColor.G + foreColorAlpha * foreColor.G), CByte(na * backColor.B + foreColorAlpha * foreColor.B))
    59. End Function
    60. Public Sub New(ByVal r As Byte, ByVal g As Byte, ByVal b As Byte)
    61. Me.R = r
    62. Me.G = g
    63. Me.B = b
    64. End Sub
    65. End Structure
    66. End Class


    Sinn des Ganzen ist, dass die Pixel der TextBox, die mit dem TextBoxRenderer erstellt werden, mit dem Hintergrund geblendet werden. Für das Alphablending ist dann die Blend-Funktion der APIColor zuständig. Gezeichnet wird erst in einen Buffer (BufferedGraphics), der mit den Werten, die bisher gezeichnet wurden (z.B. in PaintBackground), befüllt wurde und die auch im px-Array zwischengespeichert werden. Dann werden die Zeichenprozesse des Users eingeschoben (OnPaint) und die TextBox gerendert. Anschließend werden die aktuellen Werte mit dem Hintergrund geblendet (dazu dient der sngOpacity-Wert). Dein eigenes Caret kannst du z.B. über einen Timer und das Invalidieren des Bereiches, in dem sich das Caret befindet und dem Invertieren des dortigen Rectangles umsetzen (das Invertieren von Farbwerten ist einfach über New APIColor(CByte(255- R), CByte(255- G), CByte(255-B)) zu bewerkstelligen).

    Also, wenn du jetzt noch Lust darauf hast, das zu machen, hast du ja ne Vorlage. ;) Mir wäre jetzt keine API-Funktion bekannt, über die man die Transparenz einfach einstellen kann. Ist eine unschöne umständliche Methode, die aber funktioniert.

    Gruß
    ~blaze~