mit c# zeichnen (hat wiklich keiner Rat?)

Ihr dürft mich später schlagen, ich weis auch das es eine beginnneraufgabe ist, aber ich habe hier irgendwie arge schweirigkeiten...

Zorn.... X(

Möchte gerne über die MouseMove Methode mir eine Kries malen. Das ganze funktioniert insoweit nicht das der Krei nicht mit meiner Mouse übereintsimmt...

Würde mich freuen wenn jemand die muze hat eventuell den Code durchzusehen...
Wahrscheinlich ein Problem in meinem Kopf X(

Code:
 Bitmap bmp;
        System.Drawing.Graphics gr;
        System.Drawing.Point startingpoint;
        System.Drawing.Size size;
        System.Drawing.Pen stift = new System.Drawing.Pen(Color.Black);
        System.Drawing.SolidBrush mybrush = new SolidBrush(Color.Black);
        System.Drawing.Font drawFont = new Font("Arial", 9, FontStyle.Regular);
        System.Drawing.Pen pen = new Pen(Color.DarkRed,2);
        System.Drawing.SolidBrush myImagebrush = new SolidBrush(Color.Orange);
        System.Drawing.Font drawImageFont = new Font("Arial", 12, FontStyle.Regular);

        bool mouseClick = false;
        int breite;
        int hoehe;

        public Form1()
        {
            InitializeComponent();
            this.pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.paint_MouseDown);
            this.pictureBox1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.paint_MouseUp);
            this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.paint_MouseMove);
           
            bmp = new Bitmap(400, 400);
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            pictureBox1.Image = bmp;
            gr = Graphics.FromImage(bmp);
            // Name des Mitarbeiter mit einzeichnen
            gr.DrawString("Blas Blaa", drawFont, mybrush, 0, 0);

            pictureBox1.Refresh();
        }

        private void paint_MouseDown(object sender, MouseEventArgs e)
        {
            mouseClick = true;
            size = new System.Drawing.Size();
            startingpoint = new System.Drawing.Point();
            startingpoint = MousePosition;
        }
        private void paint_MouseMove(object sender, MouseEventArgs e)
        {
            if(mouseClick == true)
           {
               bmp = new Bitmap(300, 300);
               pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
               pictureBox1.Image = bmp;
               gr = Graphics.FromImage(bmp);
               pictureBox1.Refresh();

               breite = e.X - startingpoint.X;
               hoehe = e.Y - startingpoint.Y;
               size.Height = hoehe;
               size.Width = breite;
               Rectangle kreis = new Rectangle(startingpoint, size);
               
               if(rdCircle.Checked == true)
               {
               gr.DrawEllipse(pen, kreis);
               }
               else if(rbRectangle.Checked == true)
               {
               gr.DrawRectangle(pen, kreis); 
               }
            pictureBox1.Refresh();
            }
        }

        private void paint_MouseUp(object sender, MouseEventArgs e)
        {
            mouseClick = false;
            size.Width = 0;
            size.Height = 0;
            breite = 0;
            hoehe = 0;
        }       
       
         private void button1_Click_1(object sender, EventArgs e)
        {
            rdCircle.Checked = false;
            rbRectangle.Checked = false;

            bmp = new Bitmap(300, 300);
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            pictureBox1.Image = bmp;
            gr = Graphics.FromImage(bmp);
            pictureBox1.Refresh();
        }
 
Wie stimmt nicht überein? Meinst du das der Kreis an der falschenStelle ist?
Beim Programmieren ist es ja so, dass Pos. Daten immer von der oberen linken Ecke ausgehen, nicht von der Mitte. Bei Kreisen eben dann von der Ecke des Quadrats, das den Kreis umfassen könnte.

Weiß nicht ob du das meintest

Was ist den mit dieser Mthode:
private void button1_Click_1(object sender, EventArgs e)
Click_1 wird die überhaupt aufgerufen?
 
Erstmal Danke für Deine RE Post.

Fange mal an...
Im gegensatz zu Java wird bei C# der Kreis in einem Rechteck dargestellt. hierzu gebe ich die linke obere ecke des Rechtecks mit.
Merke mir das agnze im startingPoint in der Methode
Code:
 private void paint_MouseDown(object sender, MouseEventArgs e)
        {
            mouseClick = true;
            size = new System.Drawing.Size();
            startingpoint = new System.Drawing.Point();
            startingpoint = MousePosition;
        }

Jetzt lese ich mir nur noch die aktuelle Koordinate der mouse aus und stelle das Bild dann immer wieder mit dem aktuellen Kreis neu da.

Code:
private void paint_MouseMove(object sender, MouseEventArgs e)
        {
            if(mouseClick == true)
           {
               bmp = new Bitmap(300, 300);
               pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
               pictureBox1.Image = bmp;
               gr = Graphics.FromImage(bmp);
               pictureBox1.Refresh();

               breite = e.X - startingpoint.X;
               hoehe = e.Y - startingpoint.Y;
               size.Height = hoehe;
               size.Width = breite;
               Rectangle kreis = new Rectangle(startingpoint, size);
               
               if(rdCircle.Checked == true)
               {
               gr.DrawEllipse(pen, kreis);
               }
               else if(rbRectangle.Checked == true)
               {
               gr.DrawRectangle(pen, kreis); 
               }
            pictureBox1.Refresh();
            }
        }
Dieser Code istr einen ResetButton sein
Code:
 private void button1_Click_1(object sender, EventArgs e)
        {
            rdCircle.Checked = false;   //Radio Button für Kreis zeichnen
            rbRectangle.Checked = false; // Radio Button für Rechteck zeichnen

            bmp = new Bitmap(300, 300);
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            pictureBox1.Image = bmp;
            gr = Graphics.FromImage(bmp);
            pictureBox1.Refresh();
        }



Wie stimmt nicht überein? Meinst du das der Kreis an der falschenStelle ist?
Also die linke obere Ecke stimmt nicht mit dem von mir gesetzten Punkt überein.
Wenn ich die Mouse dann bewege wird der Kreis zwar gezeichnet und das Bild auch immer wieder neu dargestellt, jedoch ist der Abstand der Mouse beim ziehen immer weiter vom Kreis entfernt. Könnte mir letzteres so erklären das wir ja von einem Rechteck ausgehen und hier läuft der Kreis ja nicht in dei Ecke rein. Sozusagen ein leeraum im Breich der Ecken.
Bin da wirklich etwas überfragt.

Was ist den mit dieser Mthode:
private void button1_Click_1(object sender, EventArgs e)
Click_1 wird die überhaupt aufgerufen?
Habe die CloseMethode rausgenommen... Danke für den Hinweis.
die noch vorhanden Methode dint dazu die oberfläche zu erneuern. sprich wenn der Benutzer das Bild einmal neu darstellen will ohne irgendwelche Drawings...

kann das ganze gerne zippen und dir geben...

Merci & Greetz
 
Könntest du mal nen screenshot und das fertige Programm hochladen?
Hab keine bock jetzt nen c# compiler zu suchen....
 
Hi,

Wenn ich die Mouse dann bewege wird der Kreis zwar gezeichnet und das Bild auch immer wieder neu dargestellt, jedoch ist der Abstand der Mouse beim ziehen immer weiter vom Kreis entfernt. Könnte mir letzteres so erklären das wir ja von einem Rechteck ausgehen und hier läuft der Kreis ja nicht in dei Ecke rein. Sozusagen ein leeraum im Breich der Ecken.
Genau das trift auch zu.

Ansonsten währe es vom Style her schöner die Funktionalität in einer von System.Windows.Panel abgeleuiteten Klasse zu kapseln.
Mag aber auch geschmacks Sache sein.

Code:
using System;
using System.Windows.Forms;
using System.Drawing;

namespace habo_help
{
	/// <summary>
	/// Description of DrawPanel.
	/// </summary>
	public class DrawPanel : Panel
	{
		private bool mouseIsClicked = false;
		private Point startPoint;
		private Point drawPoint;
		private Pen pen = Pens.Red;
		
		public DrawPanel() : base ()
		{
		}
		
		
		protected override void OnMouseDown(MouseEventArgs e)
		{
			base.OnMouseDown(e);
			this.mouseIsClicked = true;	    
			this.startPoint = e.Location;
			this.drawPoint = e.Location;
			this.Invalidate();
		}
	
		protected override void OnMouseMove(MouseEventArgs e)
		{	    
			base.OnMouseMove(e);
			if (this.mouseIsClicked) {
				this.drawPoint = e.Location;
				this.Invalidate();	           
			}
		}
	
		protected override void OnMouseUp(MouseEventArgs e)
		{	    	
			base.OnMouseUp(e);
			this.mouseIsClicked = false;
		}
	    
	    
		protected override void OnPaint(PaintEventArgs e)
		{    	
			base.OnPaint(e);
			if(mouseIsClicked) {
				int breite = drawPoint.X - this.startPoint.X;
				int hoehe = drawPoint.Y -  this.startPoint.Y;	        
				Size size = new Size(breite, hoehe);	       		        
				Rectangle rect = new Rectangle(startPoint, size);	        
				e.Graphics.DrawEllipse(this.pen, rect);	  
			}   
		}		
	}
}
Was mir in deiner hochgeladenen exe auffällt:
Code:
private void paint_MouseDown(object sender, MouseEventArgs e)
{
        this.mouseClick = true;
        this.size.Width = 0;
        this.size.Height = 0;
        this.breite = 0;
        this.hoehe = 0;
        this.startingpoint.X = 0;
        this.startingpoint.Y = 0;
        this.size = new Size();
        this.startingpoint = new Point();
        this.startingpoint = Control.MousePosition;
}
Warum setzt du für startingpoint und size die Werte für X und Y auf 0 wenn beide eh ein neues Object zugewiesen bekommen ?
Aber viel interessanter ist " this.startingpoint = Control.MousePosition;", denn Control.MousePosition gibt laut MSDN Bildschimrkoordianten zurück.
Brauchen würden wir aber Clientkoordinaten.
Nutz lieber vom MouseEventArgs die Location Eigenschaft.

Hoffe das hilf ein wenig weiter ;)

MfG
 
Warum setzt du für startingpoint und size die Werte für X und Y auf 0 wenn beide eh ein neues Object zugewiesen bekommen ?

In meiner verzweifelung habe ich alles gegeben... =)

Hoffe das hilf ein wenig weiter

Werde ich mal ausprobieren, danke für die Hilfe!

Greetz...

P.S. gibt es keine möglichkeit die Lücken der Ecken auszugleichen?
Wenn der Kreis nicht Oval ist könnte man sich das ableiten anhand der seiten bzw. den Radius des Kreises und sich hin rechnen also
seite des rechteckes a/2
2. seite des rechteckes b/2
Betrachten vom Mittelpunkt könnte ich mir die länge bis zur ecke vom Mittelpunkt ausrechnen.
kleine subtraktion hinterher und man hätte die differenz!!! Mmmmh...
Ist bei einem Ovalen aber dezent anders??? Hat jemand eine andere Idee?
 
Hi!
Ich hoffe, dass ich dein Problem richtig verstanden habe...

Guck dir mal die pictureBox1_MouseMove Methode an. Du musst einfach die aktuelle Mausposition mit der Startposition subtrahieren. Das ist dann die Höhe bzw. Breite, die zu deinem bisherigem Kreis addiert werden muss (der Wert kann auch Minus sein, wenn du die Maus Links von der Startposition bewegst, drawEllipse zeichnet dann den Kreis halt andersrum).

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        private Point p;
        private int ellipseHeight;
        private int ellipseWidth;
        private bool mouseDown;

        public Form1()
        {
            InitializeComponent();
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            p.X = e.X;
            p.Y = e.Y;
            mouseDown = true;
            pictureBox1.Refresh();
        }

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (mouseDown)
            {
                ellipseWidth = (e.X - p.X); 
                ellipseHeight = (e.Y - p.Y);
                //Ruft Paint() von der PictureBox auf
                pictureBox1.Refresh();
            }
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            if (mouseDown)
            {
                g.DrawEllipse(Pens.Red, p.X, p.Y, ellipseWidth, ellipseHeight);
            }
        }

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            mouseDown = false;
            p = new Point();
            ellipseWidth = 0;
            ellipseHeight = 0;
        }
    }
}

Hilft dir evtl. ein bisschen weiter.

Grüße
haX


Edit: Ups, hatte den Code von System net gesehen (verdammter Show/Hide Button :-/). Hat sich ja dann erledigt.
 
Zurück
Oben