Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

mit c# zeichnen (hat wiklich keiner Rat?)

Diskussion: mit c# zeichnen (hat wiklich keiner Rat?) im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Ihr dürft mich später schlagen, ich weis auch das es eine beginnneraufgabe ist, aber ich habe hier irgendwie arge ...

Antwort
Alt 08.07.08, 15:49   #1 (permalink)
 
Registriert seit: 30.03.07
ByteSurfer Leistung: Facit NTK
Likes: 17
mit c# zeichnen (hat wiklich keiner Rat?)

Anzeige

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();
        }
ByteSurfer ist offline   Mit Zitat antworten
Alt 14.07.08, 15:55   #2 (permalink)
 
Registriert seit: 31.03.08
MrSpider Leistung: Facit NTK
Likes: 0
Standard

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?
MrSpider ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 15.07.08, 08:28   #3 (permalink)
Themenstarter
 
Registriert seit: 30.03.07
ByteSurfer Leistung: Facit NTK
Likes: 17
Standard

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();
        }


Zitat:
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.

Zitat:
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
ByteSurfer ist offline   Mit Zitat antworten
Alt 15.07.08, 14:12   #4 (permalink)
 
Registriert seit: 31.03.08
MrSpider Leistung: Facit NTK
Likes: 0
Standard

Könntest du mal nen screenshot und das fertige Programm hochladen?
Hab keine bock jetzt nen c# compiler zu suchen....
MrSpider ist offline   Mit Zitat antworten
Alt 17.07.08, 06:49   #5 (permalink)
Themenstarter
 
Registriert seit: 30.03.07
ByteSurfer Leistung: Facit NTK
Likes: 17
Standard

So hier die kleine Applikation. kein Grafisches Highlight. Nur um die Sache ansich zu testen..
Angehängte Dateien
Dateityp: rar DrawCircle.rar (8,9 KB, 12x aufgerufen)
ByteSurfer ist offline   Mit Zitat antworten
Alt 17.07.08, 13:11   #6 (permalink)
 
Registriert seit: 20.03.07
System.I/O Leistung: Facit NTK
System.I/O eine Nachricht über ICQ schicken
Likes: 0
Standard

Hi,

Zitat:
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   

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
System.I/O ist offline   Mit Zitat antworten
Alt 18.07.08, 07:34   #7 (permalink)
Themenstarter
 
Registriert seit: 30.03.07
ByteSurfer Leistung: Facit NTK
Likes: 17
Standard

Zitat:
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...

Zitat:
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?
ByteSurfer ist offline   Mit Zitat antworten
Alt 22.07.08, 23:07   #8 (permalink)
haX
 
Registriert seit: 02.12.03
haX Leistung: Facit NTK
Likes: 0
Standard

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.
haX ist offline   Mit Zitat antworten
Alt 23.07.08, 07:28   #9 (permalink)
Themenstarter
 
Registriert seit: 30.03.07
ByteSurfer Leistung: Facit NTK
Likes: 17
Standard

Zitat:
Edit: Ups, hatte den Code von System net gesehen (verdammter Show/Hide Button :-/). Hat sich ja dann erledigt.
Ne freue mich über jede art von hilfe...

Danke
ByteSurfer ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » mit c# zeichnen (hat wiklich keiner Rat?)
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Mit der WinAPI zeichnen nookstar Code Kitchen 9 24.07.09 19:19
C++ | Convert bmp to jpg | Keiner ne Ahnung? slightlyNERD Code Kitchen 0 11.05.09 16:14
Wenn man will das ja keiner was ließt: Stein Fun Section 7 02.01.09 19:54
Linien zeichnen :::Lük::: (Web-) Design und webbasierte Sprachen 5 18.02.08 18:19
Kennt keiner den BOFH??? cpt.jonti Fun Section 15 24.06.06 08:52


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