e.Graphics immer Updaten?

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von Chinafreak.

    e.Graphics immer Updaten?

    Hallo Ihr Lieben,

    Ich bin hier neu, da auf anderen unpassende Forum nicht mir weiterhelfen kann...
    Ich habe aber viele Erfahrungen bei andere Sprache wie GML, PHP und CSS und daher will ich VB.NET und in Zukunft C# lernen. Ich hoffe mal, das ich auch bald eine teil der Community von dieser Forum gehöre.

    Da ich eine Level Editor für mein Spiel brauche, habe ich mir gedacht, das ich mir eins in Visual Basic erstellen werde. Zwar habe ich viele Erfahrungen mit Textdateien/INI-Dateien mit Visual Basic, aber mit Grafiken zeichen jedoch noch nicht :D Ich habe zirka 1 Woche lang um dieser Problen gekümmert und leider habe ich es nicht geschafft. Daher Frage ich mal hier.


    Frage Nummer Eins: Wie kann ich e.Graphics.DrawRectangle und e.Graphics.FillRectangle immer updaten, wenn ich mittere Mausbutton klicke? Zwar habe ich es mit Refresh gemacht und es funktioniert zwar, aber dann kommt dieser "Transparent/Weißer" Flackern:



    Auch Invalidate() und Update() bringt nicht weiter.
    Hinter dieser Box ist eine "Panel" versteckt. Panel sollte mir nur als Hilfswerkzeug für dieser Grafik helfen. Mir ist es schon klar, das ich auch das ganzer in Variable speichern kann. Aber bei mehreren Tabs ist es schon etwas blöd.

    Code:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Timer1.Interval = 1
    3. Timer1.Start()
    4. Panel1.Visible = False
    5. End Sub
    6. Private Sub TabPage1_MouseDown(sender As Object, e As EventArgs) Handles TabPage1.MouseDown
    7. If MouseButtons = Windows.Forms.MouseButtons.Middle Then
    8. GlobalVariables.PanelX = Panel1.Location.X - Form1.MousePosition.X
    9. GlobalVariables.PanelY = Panel1.Location.Y - Form1.MousePosition.Y
    10. End If
    11. End Sub
    12. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    13. If MouseButtons = Windows.Forms.MouseButtons.Middle Then
    14. Dim XX As Integer = GlobalVariables.PanelX + Form1.MousePosition.X
    15. Dim YY As Integer = GlobalVariables.PanelY + Form1.MousePosition.Y
    16. Panel1.Location = New Point(XX, YY)
    17. End If
    18. End Sub
    19. Private Sub TabPage1_Paint(sender As Object, e As PaintEventArgs) Handles TabPage1.Paint
    20. Dim c As Color = Color.FromArgb(75, 0, 0, 0)
    21. Dim graphic As Graphics = Me.CreateGraphics
    22. With e.Graphics
    23. Dim ShadowPen As New Pen(c, 16)
    24. .DrawRectangle(ShadowPen, New Rectangle(Panel1.Location.X + 16, Panel1.Location.Y + 16, Panel1.Width - 16, Panel1.Height - 16))
    25. Dim myBrush As New System.Drawing.SolidBrush(System.Drawing.Color.DodgerBlue)
    26. .FillRectangle(myBrush, New Rectangle(Panel1.Location.X, Panel1.Location.Y, Panel1.Width, Panel1.Height))
    27. Dim blackPen As New Pen(Color.Black, 3)
    28. .DrawRectangle(blackPen, New Rectangle(Panel1.Location.X, Panel1.Location.Y, Panel1.Width, Panel1.Height))
    29. End With
    30. End Sub



    Frage Nummer Zwei: Für Level Editor habe ich mehrere Tabs zur Verfügung. Wie kann ich beim neue Tab erstellen neue Grafiken erstellen? Ich würde gern für jeden Tab eine neue Grafiken (siehe oben bei Animations-Bild) einfügen

    Code, zum neue Tab erstellen:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim myTabPage As New TabPage()
    3. myTabPage.Text = "Unsaved Level " & (TabControl1.TabPages.Count + 1)
    4. TabControl1.TabPages.Add(myTabPage)
    5. myTabPage.BackColor = Color.White
    6. myTabPage.BackgroundImage = My.Resources.background
    7. myTabPage.ImageIndex = "0"
    8. Dim mypanel As New Panel()
    9. mypanel.Parent = myTabPage
    10. End Sub


    Frage Nummer Drei: Wie kann ich ein Code bei einer aktiven Tab ausführen? Bislang habe ich nur mit einer Tab gearbeitet.

    Code:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub TabPage1_MouseDown(sender As Object, e As EventArgs) Handles TabPage1.MouseDown
    2. If MouseButtons = Windows.Forms.MouseButtons.Middle Then
    3. GlobalVariables.PanelX = Panel1.Location.X - Form1.MousePosition.X
    4. GlobalVariables.PanelY = Panel1.Location.Y - Form1.MousePosition.Y
    5. End If
    6. End Sub
    7. Private Sub TabPage1_Paint(sender As Object, e As PaintEventArgs) Handles TabPage1.Paint
    8. Dim c As Color = Color.FromArgb(75, 0, 0, 0)
    9. With e.Graphics
    10. Dim ShadowPen As New Pen(c, 16)
    11. .DrawRectangle(ShadowPen, New Rectangle(Panel1.Location.X + 16, Panel1.Location.Y + 16, Panel1.Width - 16, Panel1.Height - 16))
    12. Dim myBrush As New System.Drawing.SolidBrush(System.Drawing.Color.DodgerBlue)
    13. .FillRectangle(myBrush, New Rectangle(Panel1.Location.X, Panel1.Location.Y, Panel1.Width, Panel1.Height))
    14. Dim blackPen As New Pen(Color.Black, 3)
    15. .DrawRectangle(blackPen, New Rectangle(Panel1.Location.X, Panel1.Location.Y, Panel1.Width, Panel1.Height))
    16. End With
    17. End Sub


    Blöderweiße gibt es wie "TabControl1.SelectedTab.MouseDown" oder "TabControl1.SelectedTab.Paint" gar nicht :/


    Frage Nummer Vier: Wie kann ich beu neu erstellten Panel (die bei jeden Tab vorkommen) mit Grafiken verknüpfen?
    Nennen wir mal eine Beispiel:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. With e.Graphics
    2. Dim ShadowPen As New Pen(c, 16)
    3. .DrawRectangle(ShadowPen, New Rectangle(TabControl1.SelectedTab.Panel.Location.X + 16, TabControl1.SelectedTab.Panel.Location.Y + 16, TabControl1.SelectedTab.Panel.Width - 16, TabControl1.SelectedTab.Panel.Height - 16))
    4. End With


    dieser "TabControl1.SelectedTab.Panel." soll Panel herausfinden, die auf dem TabPage erstellt wurde. Leider gibt es ja dieser Funktion praktisch auf VB.NET nicht.


    Wenn ihr nicht verstanden habt - fragt mich nochmal. Ich werde nochmal die Mühe geben, erneut zu Erklären/Fragen.
    Rechtschreibung könnt ihr jedoch behalten. :P


    Liebe fette Grüße,

    Chinafreak

    Zum Flackern:
    Dir scheint da das zu fehlen im Konstruktor:

    VB.NET-Quellcode

    1. SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.UserPaint Or ControlStyles.ResizeRedraw, True)
    2. UpdateStyles()
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Wo soll das hin? In Timer1_Tick oder Form1_Load? Form1_Load ganz sicher nicht... Aber auf Timer1_Tick hat es nicht geklappt...
    Das Problem besteht also weiterhin!

    Danke für deiner Antwort!


    Edit by LaMa5:
    - Das vollständige Zitieren von Beiträgen ('Fullquotes'), die direkt über dem eigenen stehen, ist völlig unnötig und daher nicht erlaubt. (Boardregeln §4.3f)
    --> Vollzitat entfernt.

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

    In den Konstruktor der Klasse.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Chinafreak schrieb:

    Also doch.

    Hö? Davor haben wir noch nicht vom Konstruktor geredet? Du weißt aber, was ein Konstruktor ist, oder? Nicht das Form_Load-Event.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Oh, ich dachte, das "Konstruktor" mit "Form" zu tun hat. Mein Fehler. Nein, leider kenne ich Konstruktor in VB.NET doch nicht. *sich schäm*
    Ist das, wo die Grafik erstellt wird? :S

    Edit by Manschula: Unnötige Vollzitate sind (noch immer) zu unterlassen!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Manschula“ ()

    Irgendwie so?

    VB.NET-Quellcode

    1. Public Sub New()
    2. MyBase.New()
    3. ' Dieser Aufruf ist für den Designer erforderlich.
    4. InitializeComponent()
    5. ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
    6. SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.UserPaint Or ControlStyles.ResizeRedraw, True)
    7. UpdateStyles()
    8. DoubleBuffered = True
    9. End Sub
    Ja 8o
    Nächstes Mal einfach ausprobieren.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Das blöde: Auch das funktioniert es nicht :D Ob das keine Wirkung für e.Graphics gibt?

    Edit by Manschula: Unnötige Vollzitate sind (noch immer) zu unterlassen!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Manschula“ ()

    Ach ja, warum rufst Du DoubleBuffered dann nochmal auf? Das wird ja durch das Snippet erledigt.
    Also mit Invalidate sollte es eig gehen :S
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    DoubleBuffered wurde entfernt
    Also mit Invalidate sollte es eig gehen :S
    Und das mit dem Invalidate funktioniert es leider auch nicht :S
    Hier ist mal die komplette Code:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Sub New()
    3. MyBase.New()
    4. ' Dieser Aufruf ist für den Designer erforderlich.
    5. InitializeComponent()
    6. ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
    7. SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.UserPaint Or ControlStyles.ResizeRedraw, True)
    8. UpdateStyles()
    9. End Sub
    10. Public Class GlobalVariables
    11. Public Shared PanelX As Integer = 0
    12. Public Shared PanelY As Integer = 0
    13. End Class
    14. Private Sub ToolStripComboBox1_Click(sender As Object, e As EventArgs) Handles ToolStripComboBox1.Click
    15. End Sub
    16. Private Sub ExitToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ExitToolStripMenuItem.Click
    17. Me.Close()
    18. End Sub
    19. Private Sub Form1_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel
    20. If e.Delta > 0 Then
    21. Panel1.Width = Panel1.Width + Panel1.Width / 10
    22. Panel1.Height = Panel1.Height + Panel1.Height / 10
    23. TabPage1.Invalidate()
    24. Else
    25. If Panel1.Width > 16 Or Panel1.Height > 16 Then
    26. Panel1.Width = Panel1.Width - Panel1.Width / 10
    27. Panel1.Height = Panel1.Height - Panel1.Height / 10
    28. TabPage1.Invalidate()
    29. End If
    30. End If
    31. End Sub
    32. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    33. Dim myTabPage As New TabPage()
    34. myTabPage.Text = "Unsaved Level " & (TabControl1.TabPages.Count + 1)
    35. TabControl1.TabPages.Add(myTabPage)
    36. myTabPage.BackColor = Color.White
    37. myTabPage.BackgroundImage = My.Resources.background
    38. myTabPage.ImageIndex = "0"
    39. Dim mypanel As New Panel()
    40. mypanel.Parent = myTabPage
    41. End Sub
    42. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    43. If TabControl1.TabCount > 0 Then
    44. 'TabControl1.TabPages.Remove(TabControl1.SelectedTab)
    45. End If
    46. 'Remove all Tab "TabControl1.TabPages.Clear()"
    47. End Sub
    48. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    49. Timer1.Interval = 1
    50. Timer1.Start()
    51. Panel1.Visible = False
    52. End Sub
    53. Private Sub TabPage1_MouseDown(sender As Object, e As EventArgs) Handles TabPage1.MouseDown
    54. If MouseButtons = Windows.Forms.MouseButtons.Middle Then
    55. GlobalVariables.PanelX = Panel1.Location.X - Form1.MousePosition.X
    56. GlobalVariables.PanelY = Panel1.Location.Y - Form1.MousePosition.Y
    57. End If
    58. End Sub
    59. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    60. If MouseButtons = Windows.Forms.MouseButtons.Middle Then
    61. Dim XX As Integer = GlobalVariables.PanelX + Form1.MousePosition.X
    62. Dim YY As Integer = GlobalVariables.PanelY + Form1.MousePosition.Y
    63. Panel1.Location = New Point(XX, YY)
    64. TabPage1.Invalidate()
    65. End If
    66. End Sub
    67. Private Sub TabPage1_Paint(sender As Object, e As PaintEventArgs) Handles TabPage1.Paint
    68. Dim c As Color = Color.FromArgb(75, 0, 0, 0)
    69. With e.Graphics
    70. Dim ShadowPen As New Pen(c, 16)
    71. .DrawRectangle(ShadowPen, New Rectangle(Panel1.Location.X + 16, Panel1.Location.Y + 16, Panel1.Width - 16, Panel1.Height - 16))
    72. Dim myBrush As New System.Drawing.SolidBrush(System.Drawing.Color.DodgerBlue)
    73. .FillRectangle(myBrush, New Rectangle(Panel1.Location.X, Panel1.Location.Y, Panel1.Width, Panel1.Height))
    74. Dim blackPen As New Pen(Color.Black, 3)
    75. .DrawRectangle(blackPen, New Rectangle(Panel1.Location.X, Panel1.Location.Y, Panel1.Width, Panel1.Height))
    76. End With
    77. End Sub
    78. End Class


    Das Lustige daran ist: Wenn ich dieser Streifen-Hintergrund entferne, flackert es deutlich weniger. Aber es ist immer noch nervig...

    Edit by Manschula: Unnötige Vollzitate sind (noch immer) zu unterlassen!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Manschula“ ()

    Oh, ich habe gerade eben herausgefunden, das unter "Form1" flüssig läuft, aber unter "TabPage1" gar nicht! Wie kann ich das in "TabPage1" flüssig hinkriegen? :/

    Edit by Manschula: Unnötige Vollzitate sind (noch immer) zu unterlassen!

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

    Invalidate hat Überladungen, mit der du Region zum Updaten angeben kannst, probier das mal.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Wie gesagt, ich bin noch ein totaler noob von dieser Zeichnen-Kram in Visual Basic. Kannst du mir erklären, wie genau ich das machen soll? :D

    Edit by Manschula: Unnötige Vollzitate sind (noch immer) zu unterlassen!

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

    Indem du "Invalidate" aufrufst und als Parameter die Region angibst.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Das will ich sehen, ne richtige Programmiersprache leichter als VB.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: