| Autor |
Beitrag |
mkRE 
      
Beiträge: 98
|
Verfasst: Do 03.12.15 22:10
Hallo zusammen,
hat jemand ggf. eine Idee wo ich einen Fehler mache?
Leider Falckern die gezeichneten Element so wie oben beschrieben auch mir Vererbung.
Viele Grüße
|
|
Th69
      

Beiträge: 4805
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 04.12.15 08:55
Setze dann mal in deinem UserControl
C#-Quelltext 1:
| this.DoubleBuffered = true; |
(steht ja auch so in dem verlinkten Artikel)
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 04.12.15 10:57
Die DoubleBuffered Property macht das gleiche wie SetStyle. Bei DoubleBuffered fehlt nur das setzen von UserPaint. DoubleBuffered würde als nur die Flags setzen die man eh bereits gesetzt hat.
Wenn es flackert muß ja irgendetwas ein Neuzeichnen ausgelöst haben und wenn du irgendwie eine Bewegung darstellen willst drehst du vermutlich an den benutzen Variablen im Paint Event. Den Code solltest du vielleicht mal zeigen. Nebenbei solltest du vielleicht noch ResizeRedraw bei SetStyle aufnehmen damit beim resizen neugezeichnet wird (sollte aber nix mit dem flackern zu tun haben).
|
|
mkRE 
      
Beiträge: 98
|
Verfasst: Fr 04.12.15 13:47
Hallo Ralf,
ja genau es wird eine Bewegung durchgeführt. Die dazugehörigen Werte werden vom tTimer neu beschrieben und dahinter löse ich das Invalidate aus.
Vielleicht ist in meiner Unordnung durch das viele testen ein unüberlegter Wurm, jedoch erkenne ich grad nicht wo er sitzt.
Bitte beachte es handelt sich um ein Test Projekt  .
Hier einmal der Code:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Drawing.Extended;
namespace Pressen {
public partial class fForm : Form {
public float xWidth; public float yHight; public float xPos; public float yPos; public float rRadius; public float angleWidth; public float angleHight; public float LeftangleWidth; public float LeftangleHight; public int xPosOben; public int yPosOben; public int xPosUnten; public int yPosUnten; public float anglePosX; public float anglePosY; public float LeftanglePosX; public float LeftanglePosY; public float Target;
public fForm() { InitializeComponent(); }
private void fForm_Load(object sender, EventArgs e) { xWidth = 200.0f; yHight = 150.0f; angleWidth = 1.0f; angleHight = 151.0f; LeftangleWidth = 1.0f; LeftangleHight = 151.0f; xPos = 245.0f; yPos = 100.0f; xPosOben = 30; yPosOben = 80; xPosUnten = 30; yPosUnten = 250; anglePosX = 445.0f; anglePosY = 99.0f; LeftanglePosX = 245.0f; LeftanglePosY = 99.0f; Target = (float)Convert.ToDouble(txtTarget.Text); }
private void btnStart_Click(object sender, EventArgs e) { tTimer.Enabled = true; txtTarget.ReadOnly = true; }
private void tTimer_Tick(object sender, EventArgs e) {
if (Target <= yHight) {
xPos -= 1.4f; yPos += 1.0f; xWidth += 3.0f; yHight -= 1.0f; angleWidth += 2.0f; angleHight -= 1.0f; anglePosY += 1.0f; anglePosX += 0.5f;
LeftangleWidth += 2.0f; LeftangleHight -= 1.0f; LeftanglePosY += 1.0f; LeftanglePosX -= 2.3f;
yPosOben += 1;
UserControl1.Invalidate(); } else { tTimer.Enabled = false; txtTarget.ReadOnly = false; xWidth = 200.0f; yHight = 150.0f; angleWidth = 1.0f; angleHight = 151.0f; LeftangleWidth = 1.0f; LeftangleHight = 151.0f; xPos = 245.0f; yPos = 100.0f; xPosOben = 30; yPosOben = 80; xPosUnten = 30; yPosUnten = 250; anglePosX = 445.0f; anglePosY = 99.0f; LeftanglePosX = 245.0f; LeftanglePosY = 99.0f; } }
private void btnStop_Click(object sender, EventArgs e) { tTimer.Enabled = false; }
private void txtTarget_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == Convert.ToChar(Keys.Return)) {
if (txtTarget.Text != "") { try { Target = (float)Convert.ToDouble(txtTarget.Text);
if ((Target >= yHight) || (Target < 55.0)) { Target = 60.0f; txtTarget.Text = Convert.ToString(60); MessageBox.Show("Target value not valid!!!"); } else { MessageBox.Show("New Target set."); } } catch { MessageBox.Show("Not a valid value"); Target = 60.0f; txtTarget.Text = Convert.ToString(60); } } else { MessageBox.Show("Please input a number!"); Target = 60.0f; txtTarget.Text = Convert.ToString(60); } } }
private void UserControl1_paint(object sender, PaintEventArgs e) { lblStrokeValue.Text = angleHight.ToString(); e.Graphics.FillRectangle(Brushes.Black, xPosOben, yPosOben, 650, 20); e.Graphics.FillRectangle(Brushes.Black, xPosUnten, yPosUnten, 650, 20); e.Graphics.FillPie(Brushes.Green, anglePosX, anglePosY, angleWidth, angleHight, -90.0f, 180.0f); e.Graphics.FillPie(Brushes.Green, LeftanglePosX, LeftanglePosY, LeftangleWidth, LeftangleHight, 90.0f, 180.0f); e.Graphics.FillRectangle(Brushes.Green, xPos, yPos, xWidth, yHight); } } } |
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;
namespace Pressen { public partial class UserControl1 : Panel {
public UserControl1(): base() { this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true); } } } |
Algemein danke für eure Hilfe.
TH69 ich habe trotzdem mal versucht nur das
C#-Quelltext 1:
| this.DoubleBuffered = true; |
zu verwenden ohne den SetStyle Flags
C#-Quelltext 1:
| this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true); |
aber keine Änderung.
Habe SetStyle verwendet weil es bei den Links und Unterlinks empfohlen wurde zu verwenden.
Viele Grüße
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 04.12.15 14:10
Würde da kein Flackern erwarten.
Du meinst aber echtes Flackern?
Und nicht nur ein wenig Kantenflimmern oder zuckeligen Ablauf der Animation?
Dann muß ich sagen es ist halt nur Winforms und ein normaler Timer hat num mal kein garantiertes Syncing. Das neuzeichnen erfolgt so nicht in annähernd in gleichen Abständen.
Wenn du das brauchst müßtest du dich mit Multimedia Timern auseinander setzen. Die währen entsprechend akkurat.
Für diesen Beitrag haben gedankt: mkRE
|
|
Th69
      

Beiträge: 4805
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 04.12.15 15:13
Welchen Wert hast du denn für den Timer.Tick eingestellt?
Da der WinForms-Timer nur eine Auflösung von ca. 15ms hat, sind kleinere Werte unsinnig.
PS: Und im Paint solltest du nur zeichnen, keine Controls ansprechen (d.h. z.B. lblStrokeValue.Text = angleHight.ToString() besser im Timer o.ä. setzen).
|
|
mkRE 
      
Beiträge: 98
|
Verfasst: Fr 04.12.15 15:49
Hallo Ralf,
achso ja genau die Frage ist ob wir vom selben Flackern reden.
Die bzw. zwei der gezeichneten Objekte im Bild blitzen kurz weiß auf aber wenn ich es richtig betrachte passt die Größe jedoch ist in dem Moment die vorgegebene Farbe weg
und für ein Augenzwinkern weiß. Das ist der Effekt der dort ensteht. Das kommt aber bei einer Bewegung von 90 nur maximal 5 mal vor.
Wie ist den das Flimmern von euch gedacht?
Multimedia Timer schaue ich mir an und vielleicht hilft das ja "Vom Naming" hört es sich passend an.
Wie realisiert man den eigentlich "Reale Bewegungen" z.B. von Maschinen dort würden so eine Art Flackern auch nicht gerade schön aussehen?
Dort werden die Intervalle ggf. nicht vom Timer aber von einer externen Signal Flanke ausgelöst.
Viele Grüße
|
|
mkRE 
      
Beiträge: 98
|
Verfasst: Fr 04.12.15 15:53
Hallo Th69,
ja das ansprechen des Controls im Paint habe ich entfernt danke für den Tipp.
Der Timer ist auf Intervall von 200 eingestellt hatte ihn auch schon auf 100 und auch kleiner gehabt bei meinen ersten versuchen.
Ich hab leider keine Unterschiede erkannt. Das passiert einfach sporadisch mindestens ein mal blinken die Objekte auf  .
Viele Grüße
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 04.12.15 15:54
Weiß blitzen hört sich nach ~richtigem~ Flackern an
Das kann auch Graphiktreiber/Karten abhängig sein. Vielleicht hilft es dir wenn du in Paint auch den Control Hintergrund einmal komplett zeichnest.
Also z.B ein
C#-Quelltext 1:
| e.Graphics.FillRectangle(Brushes.Gray, e.ClipRectangle.X, e.ClipRectangle.X, e.ClipRectangle.Width, e.ClipRectangle.Width); |
mit einem passenden Brush.
|
|
mkRE 
      
Beiträge: 98
|
Verfasst: Fr 04.12.15 20:04
Hallo Ralf ich hab es vorhin auch mit dem Hintergrund versucht leider ohne Änderung.
Lese mich gerade in den Multimedia Timer ein und versuche mal ob es besser wird.
Viele Grüße
|
|
mkRE 
      
Beiträge: 98
|
Verfasst: Sa 05.12.15 11:19
Hallo Ralf,
der Multimedia Timer funktioniert ohne Flackern und sonstiges habe es gestern noch probiert aber nicht mehr geschafft zu schreiben.
Kein Flackern!!  Super!!! Der Stauchprozess läuft Flackerfrei.
Aber ich kann im Timer Tick keine Steuerelemente ansprechen da bricht das Program ab mit folgender Meldung:
| Zitat: | System.InvalidOperationException
{"Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement txtTarget erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."}
|
Da schaue ich noch nach was es sein kann. Habt ihr eine Idee?
Moderiert von Th69: Quote-Tags hinzugefügt
|
|
Th69
      

Beiträge: 4805
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Sa 05.12.15 12:01
Für diesen Beitrag haben gedankt: mkRE
|
|
mkRE 
      
Beiträge: 98
|
Verfasst: Sa 05.12.15 18:51
Hallo Th69,
danke für den Tipp meine Frage nicht bösen nehmen  .
Jetzt muss ich es hinkriegen meine Steuerelemente anzusprechen.
Viele Grüße
|
|
mkRE 
      
Beiträge: 98
|
Verfasst: Di 08.12.15 00:42
Hallo zusammen  .
Also jetzt geht auch die Anzeige des Labels wiedermal viel von euch dazu gelernt und das Threading aufgefrischt  .
Danke euch beiden Ralf Jansen und Th69!!
Das flackern kommt trotzdem ab und an noch vor es wird wohl tatsächlich an der Grafikkarte oder sonstigem liegen.
Morgen versuche ich mal die Applikation auf einem anderen PC laufen zu lassen und beobachten ob es an verschiedenen PC auch flackert.
Bei 5 versuchen Flackerte es nur einmal auf, jedoch wenn ich den Timer Interval erhöhe z.B. 200 anstatt 100 dann wird das Flackern mehr.
Ich habe bei dem Multimedia Timer noch nicht verstanden wie die Auflösung bzw. Resolution funktionieren soll. Hab ihr eine Ahnung?
Viele Grüße
|
|