Laden...

Auf ListBox zeichnen

Erstellt von Nightmare vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.302 Views
N
Nightmare Themenstarter:in
20 Beiträge seit 2008
vor 12 Jahren
Auf ListBox zeichnen

Hallo Community!

Folgendes habe ich vor: Ich möchte einen Auswahlkasten in eine ListBox reinzeichnen bei bestimmten Mausaktionen.

Folgendes Problem habe ich bereits gefunden: Das ListBox Control besitzt kein eigenes Paint Event bzw. auch keine OnPaint Methode zum überschreiben. So habe ich kein Graphics objekt, auf welches ich beim Zeichnen der Box durch Windows selbst drauf zeichnen kann!

Mein Lösungsansatz bisher: Ich erstelle ein neues UserControl und lege hier eine ListBox rein. Hier fange ich die benötigten Mausevents der ListBox ab und löse irgendwann ein Invalidate auf das UserControl aus. In der Überladenen Paint Methode des UserControls zeichne ich dann auf das Graphicsobjekt der Paint Methode. Leider passiert hier, dass meine Zeichnung hinter der Windowszeichnung der ListBox liegt 😕

Hier noch kurz mein Code zum besseren Verständnis meines Anliegens 😉


public partial class UserControl1 : UserControl
    {
        private int _mDownX, _mDownY, _mUpX, _mUpY, _mAktX, _mAktY;
        private bool _isMouseDown;

        public UserControl1()
        {
            InitializeComponent();        
            for (int i = 0; i < 100; i++)
            {
                this.listBox1.Items.Add("test");
            }
            this.listBox1.MouseDown += new MouseEventHandler(listBox1_MouseDown);
            this.listBox1.MouseUp += new MouseEventHandler(listBox1_MouseUp);
            this.listBox1.MouseMove += new MouseEventHandler(listBox1_MouseMove);
        }

        void listBox1_MouseMove(object sender, MouseEventArgs e)
        {
            this._mAktX = e.X;
            this._mAktY = e.Y;
            if (this._isMouseDown)
                this.Invalidate();
        }

        void listBox1_MouseUp(object sender, MouseEventArgs e)
        {
            this._mUpX = e.X;
            this._mUpY = e.Y;
            this._isMouseDown = false;
        }

        void listBox1_MouseDown(object sender, MouseEventArgs e)
        {
            this._mDownX = e.X;
            this._mDownY = e.Y;
            this._isMouseDown = true;
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            //Auswahlkasten
            Pen p = new Pen(Brushes.Black, 1);
            p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
            e.Graphics.DrawRectangle(p, new Rectangle(this._mDownX, this._mDownY, (this._mAktX - this._mDownX), (this._mAktY - this._mDownY)));
        }
    }

Bitte den Logikfehler beim Zeichnen der Box überlesen (Die Box wird nur beim ziehen von links oben nach rechts unten gezeichnet 😃)

C
1.214 Beiträge seit 2006
vor 12 Jahren

Reicht dir das DrawItem Event nicht?

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Nightmare,

bzw. noch genereller: Für das Zeichnen auf eine ListBox ist einzig und alleine das Owner-Drawing (ListBox.DrawMode) gedacht.

herbivore

N
Nightmare Themenstarter:in
20 Beiträge seit 2008
vor 12 Jahren

Also hieße das für mich, dass ich den DrawMode meiner ListBox auf OwnerDrawVariable setzte und dann im DrawItem Event der Box zeichnen kann?

Scheinbar muss ich hierbei das Zeichnen der Listenitems selbst übernehmen! Oder sehe ich da was falsch?

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Nightmare,

das siehst du schon richtig, aber zumindest diese Nachfragen fallen unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1 und 1.1. Bitte lies dich erstmal selber ein.

herbivore