Benutzer mit den meisten Antworten
Grafik wird abgeschnitten

Frage
-
Hallo zusammen!
Mein Erster Eintrag und als Vorwarnung, mein Name ist Programm. Ich bin absolut neu in C#
Ich möchte gerne direkt auf ein Form zeichnen und zwar eine Art Schachbrettmuster in Abhängigkeit davon wie was der User in einem UpDownControl für eine Zahl eingibt. Der User gibt z.B. 5 ein, also erhält mein Muster 5x5=25 Felder. Ich bin schon eine Weile am "chnorzen" :). Zeichnen tuts zwar aber ab einer gewissen Grenze wird die Grafik abgeschnitten.
Ich komm einfach nicht drauf.
Gruss
So sieht mein Versuch bisher aus:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Game_of_Live { public partial class Form1 : Form { //public int fields; Grid myGrid = new Grid(); public Form1() { InitializeComponent(); this.Controls.Add(myGrid); } public void UpdateCustomComponents(Grid aGrid, int fields) { aGrid.Fields = fields; myGrid.Invalidate(); } private void btnInit_Click(object sender, EventArgs e) { } private void btnStartStopp_Click(object sender, EventArgs e) { } private void numericUpDown1_ValueChanged(object sender, EventArgs e) { int fields = Convert.ToInt32(numericUpDown1.Value); UpdateCustomComponents(myGrid, fields); }//end of numericUpDown1_ValueChanged private void Form1_Paint(object sender, PaintEventArgs e) { } }//end of Form1 public class Grid : UserControl { //Properties public int Fields { get; set; } public Grid() { } protected override void OnPaint(PaintEventArgs e) { int s = 20; base.OnPaint(e); using (Pen myPen = new Pen(Color.Black, 3)) { for (int i = 0; i < Fields; i++) { for (int j = 0; j < Fields; j++) { e.Graphics.DrawRectangle(myPen, 10 + j * s, 120 + i * s, s, s); } } } } }//end of Grid }//end of Game_of_Live
- Typ geändert TheGreenhorn Freitag, 4. März 2011 19:54
Antworten
-
Hallo,
ändere die Zeile:
e.Graphics.FillRectangle(new SolidBrush(this.myColor), xCoord, yCoord, sidewidth, sidewidth);
zu:
e.Graphics.FillRectangle(new SolidBrush(this.myColor), 0, 0, sidewidth, sidewidth);
oder:
e.Graphics.FillRectangle(new SolidBrush(this.myColor), 0, 0, this.ClientSize.Width, this.ClientSize.Height);
Das Zeichnen des Controls geschieht auf dem Control (nicht etwa der Form die das Control enthält - die zeichnet später...), somit sind die Koordinaten im Paint-event relativ zum Koordinatenursprung des Controls welches gezeichnet wird.
Wenn Du also beispielsweise das Koordinatensystem des Cell-Controls "verschiebst", kommen entsprechend andere Ergebnisse heraus: (die hier aber verdeutlichen, dass eben das Control die Zeichenfläche ist)
protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); //nur als Beispiel gedacht e.Graphics.TranslateTransform(10, 10); e.Graphics.FillRectangle(new SolidBrush(this.myColor), 0, 0, sidewidth, sidewidth); }
Viele Grüße,
Thorsten
- Als Antwort vorgeschlagen Frank Dzaebel Montag, 7. März 2011 10:53
- Als Antwort markiert Robert BreitenhoferModerator Montag, 14. März 2011 17:22
Alle Antworten
-
Hi,
setze die Grösse des Grids und seine Position - oder lasse die Grösse sich automatisch anpassen ...
(die Unterstriche vor den klassenweiten Variablen "mag" nicht jeder, kannst Du ja umbenennen)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Game_of_Live { public partial class Form1 : Form { Grid myGrid = new Grid(); public Form1() { InitializeComponent(); myGrid.Location = new Point(0, 0); myGrid.Size = new Size(413, 314); this.Controls.Add(myGrid); } public void UpdateCustomComponents(Grid aGrid, int fields) { aGrid.Fields = fields; myGrid.Invalidate(); } private void numericUpDown1_ValueChanged(object sender, EventArgs e) { int fields = Convert.ToInt32(numericUpDown1.Value); UpdateCustomComponents(myGrid, fields); } } public class Grid : UserControl { //Properties private int _s = 20; private float _myPenWidth = 3; private int _fields = 0; public int Fields { get { return _fields; } set { _fields = value; if (this.AutoSize) SetSize(); } } private void SetSize() { if (Fields > 0) { this.ClientSize = new Size(Fields * _s + (int)_myPenWidth, Fields * _s + (int)_myPenWidth); } } public Grid() { //zum Testen this.AutoSize = true; } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); using (Pen myPen = new Pen(Color.Black, _myPenWidth)) { for (int i = 0; i < Fields; i++) { for (int j = 0; j < Fields; j++) { e.Graphics.DrawRectangle(myPen, j * _s, i * _s, _s, _s); } } } } } }
Viele Grüße,Thorsten
-
Wow da wird einem geholfen, cool.
Danke das hat mein Problem vorerst behoben, jetzt wird das Grid so dargestellt wie es sollte. Ich hab das zwar noch nicht ganz verstanden mit den "custom usercontrols", wieso was wie wo gezeichnet wird. Wie kann ich z.B. ein beliebiges Objekt (UserControl) an einem x-beliebigen Platz auf dem Form zeichnen und vor allem wie ist es, wenn ich mehrere z.B. aus einer Liste an verschiedenen Orten zeichnen will. Aber da muss ich mir wohl zuerst noch ein bisschen Grundlagenwissen aneigenen.
Auf jeden Fall Herzlichen Dank, das hat mich schon wieder einen Schritt weiter gebracht.
Gruss
- Als Antwort markiert TheGreenhorn Montag, 28. Februar 2011 09:48
-
Hi,
der Ort, an dem Controls gezeichnet werden, heißt tatsächlich auch so (auf englisch): Location.
Setze diese Eigenschaft bei beliebigen Controls und schaue, wo sie sich auf der Form befinden. (Location ist relativ zum RenderingOrigin des darunterliegenden Steuerelementes - nämlich das, welches das neue Control beherbergt).
Auf Controls wird dann genauso gezeichnet - relativ zur oberen linken Ecke des Controls (normalerweise).
Viele Grüße,
Thorsten
-
Hi,
Mit dieser ganzen GDI+ Geschichte hab ich so meine liebe Mühe. Ich scheine mich speziell blöd anzustellen.
Ok, das mit Location ist verständlich.
Aber folgendes, ich krigs nicht gebacken. Ich möchte links oben ganz einfach ein rotes Feld neben ein weisses Feld auf ein Form Zeichnen. Das weisse wird gezeichnet, das rote aber nicht.
Ich habe dafür habe ich eine Klasse Cell geschrieben, in der ich OnPaint überschreibe. Irgendwann hab ich nicht mehr weiter gewusst und angefangen Messages auszugeben und siehe da: ClipRectangel befindet sich für das eine Feld ausserhalb der Position des Feldes das ich zeichnen will. Ergo: das Feld wird nicht gezeichnet.
Was mache ich falsch?
Cell:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace TestGameOfLive { class Cell : UserControl { #region Variablen private int sidewidth = 20; private int xCoord; private int yCoord; Color myColor; #endregion #region properties public int SideWidth { get { return sidewidth; } set { sidewidth = value; } } public int XCoord { get { return xCoord; } set { xCoord = value; } } public int YCoord { get { return yCoord; } set { yCoord = value; } } #endregion public Cell(Color myNewColor, int myXCoord, int myYCoord) { this.AutoSize = true; this.Location = new Point(myXCoord, 0); this.Size = new Size(sidewidth, sidewidth); this.ClientSize = new Size(sidewidth, sidewidth); this.myColor = myNewColor; this.xCoord = myXCoord; this.yCoord = myYCoord; } //Methode von UserControl überschreiben, das PaomtEvemtArgs wird vom Form geliefert protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); { MessageBox.Show(this.myColor.ToString()+" posX:"+xCoord+" posY:"+yCoord); System.Text.StringBuilder messageBoxCS = new System.Text.StringBuilder(); messageBoxCS.AppendFormat("{0} = {1}", "ClipRectangle", e.ClipRectangle); messageBoxCS.AppendLine(); messageBoxCS.AppendFormat("{0} = {1}", "Graphics", e.Graphics); messageBoxCS.AppendLine(); MessageBox.Show(messageBoxCS.ToString(), "Paint Event"); e.Graphics.FillRectangle(new SolidBrush(this.myColor), xCoord, yCoord, sidewidth, sidewidth); } } } }
und die Implementationen der Zellen im Form:
namespace TestGameOfLive { public partial class Form1 : Form { //private bool cellSwitch=false; Cell cell1;// = new Cell(Color.White); Cell cell2;// = new Cell(Color.Red); public Form1() { InitializeComponent(); cell1 = new Cell(Color.White, 0, 0); cell2 = new Cell(Color.Red, 20, 0); this.Controls.Add(cell2); this.Controls.Add(cell1); } } }
Danke für die Geduld
Greene
-
Hallo,
ändere die Zeile:
e.Graphics.FillRectangle(new SolidBrush(this.myColor), xCoord, yCoord, sidewidth, sidewidth);
zu:
e.Graphics.FillRectangle(new SolidBrush(this.myColor), 0, 0, sidewidth, sidewidth);
oder:
e.Graphics.FillRectangle(new SolidBrush(this.myColor), 0, 0, this.ClientSize.Width, this.ClientSize.Height);
Das Zeichnen des Controls geschieht auf dem Control (nicht etwa der Form die das Control enthält - die zeichnet später...), somit sind die Koordinaten im Paint-event relativ zum Koordinatenursprung des Controls welches gezeichnet wird.
Wenn Du also beispielsweise das Koordinatensystem des Cell-Controls "verschiebst", kommen entsprechend andere Ergebnisse heraus: (die hier aber verdeutlichen, dass eben das Control die Zeichenfläche ist)
protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); //nur als Beispiel gedacht e.Graphics.TranslateTransform(10, 10); e.Graphics.FillRectangle(new SolidBrush(this.myColor), 0, 0, sidewidth, sidewidth); }
Viele Grüße,
Thorsten
- Als Antwort vorgeschlagen Frank Dzaebel Montag, 7. März 2011 10:53
- Als Antwort markiert Robert BreitenhoferModerator Montag, 14. März 2011 17:22