Autor |
Beitrag |
kaskus
Hält's aus hier
Beiträge: 13
WIN 2000; WIN XP
Delphi 7
|
Verfasst: Do 03.12.09 19:41
Hallo Forum
ich weis, dass es hier einige Themen auch im Netz schon dafür gibt, hab auch manche Infos zur Hilfe gezogen, aber irgendwie helfen die mir nicht weiter bzw. ich bekomm es nicht hin.
Mein Problem ist, dass ich es mit der PictureBox einfach nicht hinbekomme, dass die Linien gezeichnet werden.
Zu meiner Idee:
Ich habee einen Start Button, einen Stop Button, einen Clear Button und ne Scrollbar, die bestimmt, wie groß das Feld sein soll. Minimum ist 25.
Und sobald die Scrollbar bewegt worden ist, soll das Feld dafür gezeichnet werden mit dem entsprechenden Value.
Mein Code bisher sieht dafür so aus:
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:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Windows.Forms;
namespace GameOfLife {
public partial class Form1 : Form { private Boolean[,] viewarray; private Boolean[,] dataarray; private int size; private int generation;
public Form1() { InitializeComponent(); }
private void button3_Click(object sender, EventArgs e) { if (viewarray == null) { label2.ForeColor = Color.Red; label4.ForeColor = Color.Red; label2.Text = ("nothing to"); label4.Text = ("clear"); } else { for (int i = 0; i < viewarray.GetLength(0); i++) { for (int j = 0; j < viewarray.GetLength(1); j++) { viewarray[i, j] = false; dataarray[i, j] = false; }
} hScrollBar1.Value = 25; generation = 0; size = 25; label2.Text = Convert.ToString(size); label4.Text = Convert.ToString(generation);
} }
private void hScrollBar1_Scroll(object sender, ScrollEventArgs e) { label2.ForeColor = Color.Black; label4.ForeColor = Color.Black; label2.Text = hScrollBar1.Value.ToString(); label4.Text = Convert.ToString(generation); initArrays(hScrollBar1.Value);
}
private void initArrays(int size) { dataarray = new Boolean[size, size]; viewarray = new Boolean[size, size];
for (int i = 0; i < viewarray.GetLength(0); i++) { for (int j = 0; j < viewarray.GetLength(1); j++) { viewarray[i, j] = false; dataarray[i, j] = false; }
} }
}
} |
Hinzu kommt, wenn ich den Code für die PictureBox schreiben möchte, wie geh ich da am besten vorran ? Click ich doppelt in die PctureBox oder schreib ich manuell
private void drawGrid()
....
...
...
!?
Gruß
kaskus
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 04.12.09 12:04
kaskus hat folgendes geschrieben : | Click ich doppelt in die PctureBox oder schreib ich manuell |
Wenn du ein Ereignis zuweisen willst, dann solltest du auch unter Ereignisse (im Visual Studio standardmäßig rechts unten, das Symbol mit dem Blitz über den Eigenschaften) das entsprechende Ereignis auswählen und es gezielt zuweisen. Dort geht dann auch ein Doppelklick auf das Ereignis.
|
|
kaskus 
Hält's aus hier
Beiträge: 13
WIN 2000; WIN XP
Delphi 7
|
Verfasst: Do 10.12.09 17:50
Hi,
es geht nicht darum, dass die PictureBox erst auf Click in die Box gezeichnet werden soll,
sondern direkt bei start das erste mal mit 25 * 25 feldern und bei bewegung der scrollbar, das nächste mal.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 10.12.09 18:33
Eben. Deshalb schau unter Ereignisse einmal nach, dann wirst du das Ereignis Paint finden, das ausgelöst wird, wenn der Inhalt der Box neugezeichnet werden muss.
|
|
kaskus 
Hält's aus hier
Beiträge: 13
WIN 2000; WIN XP
Delphi 7
|
Verfasst: Do 10.12.09 18:37
ahh okay..
habs !
werd mich dann jetzt mal an die Graphics Container wenden.
Gibts dafür irgendwelche hilfreiche Tipps, die du immer wieder zur Hand nimmst ?
Graphics Components find ich nicht leicht zu lernen !
die sind blöd ^^
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 10.12.09 19:14
Naja, viel zu lernen ist da im Grunde nicht. Visual Studio zeigt ja die möglichen Befehle und deren Parameter an.
Beispiel: C#-Quelltext 1:
| e.Graphics.DrawLine(new Pen(Color.Red), new Point(1, 1), new Point(300, 400)); |
|
|
kaskus 
Hält's aus hier
Beiträge: 13
WIN 2000; WIN XP
Delphi 7
|
Verfasst: Do 10.12.09 20:26
Hi,
bin damit soweit zu Recht gekommen, aber nur bei initilaisierung.
Mein Vorhaben ist ja, dass der Schieberegler (Scrollbar) mir die Felder angibt und dafür muss ich ja die Asbtandsberechnung haben..
Ich würd gern nach der Betätigung von hscollbar1 die Paintmethode aufrufen, aber die Signatur erwartet 2 Attribute.
Woher weis ich die ?In den anderen CS dataien wird die ohne Signatur aufgerufen.
Hier meine Scrollbar:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| private void hScrollBar1_Scroll(object sender, ScrollEventArgs e) { label2.ForeColor = Color.Black; label4.ForeColor = Color.Black; label2.Text = hScrollBar1.Value.ToString(); label4.Text = Convert.ToString(generation); initArrays(hScrollBar1.Value); abstand = hScrollBar1.Value; pictureBox2_Paint( ?????????????);
} |
C#-Quelltext 1: 2: 3: 4: 5: 6:
| private void pictureBox2_Paint(object sender, PaintEventArgs e) { Graphics blub = e.Graphics; Pen p1 = new Pen(Color.Black,5); abstand = pictureBox2.Width / abstand; label4.Text = Convert.ToString(abstand); |
Wie rufe ich von scrollbar die paint method. auf?
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 10.12.09 23:50
Es reicht bereits das Neuzeichnen einfach auszulösen. Dazu sagt man der Komponente entweder, dass sie sich auffrischen soll oder dass der aktuelle Inhalt ungültig ist: C#-Quelltext 1: 2:
| pictureBox1.Refresh(); pictureBox1.Invalidate(); | Wobei in diesem Fall das Invalidate ausreicht, da Refresh auch nur das aufruft und bei Container-Komponenten wie Panels dafür sorgt, dass das selbe auch mit den Komponenten darin passiert (das kann man bei Invalidate auch angeben).
Du kannst an Invalidate auch einen Rechteck-Parameter übergeben, wenn nur ein Teil neu gezeichnet werden muss.
|
|
kaskus 
Hält's aus hier
Beiträge: 13
WIN 2000; WIN XP
Delphi 7
|
Verfasst: Fr 11.12.09 19:59
Da ich nun, denke ich mal, meine halbn grafischen Probleme erledigt habe, würd ich jetzt gern meine GUI vorstellen, damit und meinen kompletten Code.
Die Gui ist zu sehen unter meienn Anhängen.
Label5 ist nur zu testzwecken da.. also keine bedeutung eigentlich..
was ich jetzt gern machen wrüde ist, zum einen bei mausklick in eines der kästschen soll das schwarz markiert werden und falls es schon schwarz ist, halt wieder in weis.
und diese position soll dann natürlich auch in das data und viewarray als true markiert werden.
dafür müsste ich dann wenn ich soweit richtig denke, für jede eigene größe eine if bzw. case abfrage schreiben, das ist aber zu aufwendig und ich finde nicht wirklich sinnvoll. gibts dafür irgendwelche hilfen in csharp ?
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:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Windows.Forms;
namespace GameOfLife {
public partial class Form1 : Form { private Boolean[,] viewarray; private Boolean[,] dataarray; private int size; private int maxW = 600; private int anzahl = 25; private int abstand = 25; Graphics g1; private int generation;
public Form1() { InitializeComponent(); pictureBox2.Refresh(); initArrays(anzahl); }
private void button3_Click(object sender, EventArgs e) { if (viewarray == null) {
label2.ForeColor = Color.Red; label4.ForeColor = Color.Red; label2.Text = ("nothing to"); label4.Text = ("clear"); pictureBox2.Refresh(); } else { for (int i = 0; i < viewarray.GetLength(0); i++) { for (int j = 0; j < viewarray.GetLength(1); j++) { viewarray[i, j] = false; dataarray[i, j] = false; }
} hScrollBar1.Value = 25; generation = 0; size = 25; label2.Text = Convert.ToString(size); label4.Text = Convert.ToString(generation);
} }
private void hScrollBar1_Scroll(object sender, ScrollEventArgs e) { label2.ForeColor = Color.Black; label4.ForeColor = Color.Black; label2.Text = hScrollBar1.Value.ToString(); label4.Text = Convert.ToString(generation); anzahl = hScrollBar1.Value; initArrays(hScrollBar1.Value); pictureBox2.Refresh(); }
private void initArrays(int size) { dataarray = new Boolean[size, size]; viewarray = new Boolean[size, size];
for (int i = 0; i < viewarray.GetLength(0); i++) { for (int j = 0; j < viewarray.GetLength(1); j++) { viewarray[i, j] = false; dataarray[i, j] = false; }
} }
private void swapArrays() {
}
private void pictureBox2_Paint(object sender, PaintEventArgs e) { g1 = e.Graphics; Pen p1 = new Pen(Color.Black,1); g1.DrawLine(p1, 599, 0, 599, 599); g1.DrawLine(p1, 0, 599, 599, 599); abstand = maxW / anzahl; for (int i = 0; i < maxW+1; i = i+abstand) { g1.DrawLine(p1, 0, i, maxW, i); g1.DrawLine(p1, i, 0, i, maxW); } }
private void pictureBox2_MouseClick(object sender, MouseEventArgs e) { coordinate(e.X, e.Y); label5.Text = Convert.ToString(e.X);
}
}
} |
Einloggen, um Attachments anzusehen!
|
|
|