Probleme mit System.Drawing (Objekt wird nicht gezeichnet)



  • Hallo,

    ich muß eine interaktive Eingabe realisieren, über die ein Gegenstand gezeichnet wird. Ich habe dabei das Problem, das mein Fadenkreuz in einer PictureBox nicht angezeigt wird, erst wenn ich das manuell tue, über einen Button-Click. Ich möchte aber, das ich das Fadenkreuz sofort nach der Initialize()-Methode in der Picturebox angezeigt wird. Wie mach ich das? Hab das Forum schon durchgegrast? Ich habe mal den Code beigestellt:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace Zerspanungsberechnung
    {
        public partial class Hauptfenster : Form
        {
            // Graphics-Instanz global erstellen
            private Graphics graph;
    
            // weitere globale Variablen zum Zeichnen
            private int stiftstärke;
            private Color stiftfarbe;
            private Pen pen;
    
            // globale Variablen für Fadenkreuz
            private Point fadenkreuz_X_start;
            private Point fadenkreuz_X_end;
            private Point fadenkreuz_Y_start;
            private Point fadenkreuz_Y_end;
    
            // globale Daten für Körperoutline
            private Point Startpunkt;
            private Point Endpunkt;
            private Point Ziwschenspeicherpunkt;
    
            // Pos-Daten für Startbedingung Fadenkreuz
            private int mittellinie_fadenkreuz_X;
            private int linie_fadenkreuz_Y;
    
            private bool prüf = false;
    
            public Hauptfenster()
            {
                InitializeComponent();
    
                graph = Graphics.FromHwnd(picBox.Handle);
    
                graph.PageUnit = GraphicsUnit.Pixel;
    
                mittellinie_fadenkreuz_X = picBox.Height / 2;
                linie_fadenkreuz_Y = 30;
    
                fadenkreuz_X_start = new Point(0, picBox.Height / 2);
                fadenkreuz_X_end = new Point(picBox.Width, picBox.Height / 2);
                fadenkreuz_Y_start = new Point(linie_fadenkreuz_Y, 0);
                fadenkreuz_Y_end = new Point(linie_fadenkreuz_Y, picBox.Height);
    
                stiftstärke = 2;
                stiftfarbe = Color.Green;
    
                ZeichneFadenkreuz();
    
            }
    
            private void ZeichneFadenkreuz()
            {
                //    graph.TranslateTransform((linie_fadenkreuz_Y * (1)), (mittellinie_fadenkreuz_X * (1)));
    
                graph.PageUnit = GraphicsUnit.Pixel;
                pen = new Pen(stiftfarbe, stiftstärke);
    
                graph.PageUnit = GraphicsUnit.Pixel;
                graph.DrawLine(pen, fadenkreuz_X_start, fadenkreuz_X_end);
                graph.DrawLine(pen, fadenkreuz_Y_start, fadenkreuz_Y_end);
    
                // Nullpunktverschiebung durchführen, auf Fadenkreuz
                graph.TranslateTransform(linie_fadenkreuz_Y, mittellinie_fadenkreuz_X);
            }
    }
    }
    


  • Eigene Zeichenfunktionen müssen innerhalb der OnPaint-Funktion implementiert werden.



  • Wieso sollte das so nicht funktionieren? Ich denke da arbeitet noch irgend etwas im Hintergrund ab, deshalb funzt das nicht. Die OnPaint() gibts doch gar nicht.



  • loks schrieb:

    Eigene Zeichenfunktionen müssen innerhalb der OnPaint-Funktion implementiert werden.

    Oder als Reaktion auf das Paint Ereignis.

    moehrle schrieb:

    Wieso sollte das so nicht funktionieren? Ich denke da arbeitet noch irgend etwas im Hintergrund ab, deshalb funzt das nicht. Die OnPaint() gibts doch gar nicht.

    Doch die OnPaint(..) Methode gibts, und zwar in der Basis Klasse, die kann überschrieben werden.

    Warum das nicht funktioniert?
    Weil das OS bestimmt WANN gezeichnet werden soll. Und das ist genau dann, wann die OnPaint(..) Methode aufgerufen bzw. das Paint Ereignis gefeuert wird.

    Simon



  • Ich habe in meiner Form eine PictureBox, in der in zu Beginn das Fadenkreuz legen will. Dann muß ich eine Methode bauen die mir die beiden Linien in die PictureBox zeichnet. Diese Methode dann im Form_Load() Ereignis aufrufen, korrekt?
    Noch was. Kann ich dieses Zeichenprogramm später als DLL in anderen .Net-Programmen verwenden und einfach importieren?



  • Wenn sich das Fadenkreuz nicht ändert reicht auch ein Bild über die PictureBox.Image-Eigenschaft.
    Sonst wie immer die PictureBox.OnPaint-Methode.

    moehrle schrieb:

    Noch was. Kann ich dieses Zeichenprogramm später als DLL in anderen .Net-Programmen verwenden und einfach importieren?

    Ja.



  • Diese Methode dann im Form_Load() Ereignis aufrufen, korrekt?

    Nein. Wie gesagt (von Rhombi... und mir), OnPaint(..) überschreiben oder Paint Ereignis abfangen.

    Simon


Log in to reply