Dynamische Makierung in Picturebox
-
Hallo,
ich habe eine PictureBox in der eine kleine Karte geladen wird. Jetzt möchte ich ein Kreis,Kreuz oder sonstiges auf der Karte anzeigen lassen und zwar mit pixelgenauen Koordinaten. Diese Markierung wird im laufe des Programms noch ein paar mal die Position wechseln.Kann mir mal jemand ein einfaches Beispiel zeigen wie man das lösen kann? Zur Zeit startet mein Programm mit der Picturebox in der sich die Karte befindet.
Hab dann mal folgendes gefunden und getestet:
Graphics g = e.Graphics;
Pen pen = new Pen(Brushes.Black);
g.DrawRectangle(pen, 10, 10, 100, 100);Jetzt wird zwar ein kleiner Kreis gemalt, aber ich kann ihn nicht mehr löschen. Sobald eine neue Koordinate kommt muss ja die alte Position gelöscht werden.
Grüße Hannes.
-
Das Paint - Event sollte dir weiterhelfen.
Hinterleg in einer Membervariablen die Koordinaten (z. B. bei einem Buttonclick).
Im Paint Event Handler zeichnest du dann das Kreuz an die jeweilige Position.Um das Paint Event "von Hand" auszulösen, muss die Methode "Refresh()" der PictureBox aufgerufen werden.
myPictureBox.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; namespace foo { public partial class myPictureBox : PictureBox { Rectangle m_position; public myPictureBox() { InitializeComponent(); m_position = new Rectangle(0, 0, 10, 10); } private void myPictureBox_Paint(object sender, PaintEventArgs e) { Pen pen = new Pen(Brushes.Red); e.Graphics.DrawEllipse(pen, m_position); } private void myPictureBox_MouseClick(object sender, MouseEventArgs e) { m_position.X = e.X; m_position.Y = e.Y; // force paint event this.Refresh(); } } }
myPictureBox.Designer.cs
namespace foo { partial class myPictureBox { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Component Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { ((System.ComponentModel.ISupportInitialize)(this)).BeginInit(); this.SuspendLayout(); // // myPictureBox // this.Paint += new System.Windows.Forms.PaintEventHandler(this.myPictureBox_Paint); this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.myPictureBox_MouseClick); ((System.ComponentModel.ISupportInitialize)(this)).EndInit(); this.ResumeLayout(false); } #endregion } }