Autor Beitrag
Talemantros
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Sa 23.11.13 00:36 
Hallo zusammen,
ich habe ein Feld

ausblenden C#-Quelltext
1:
        Pen stift;					


Dieses wird im Laufe des Programms mit diversen .Width etc und Farbe verändert.

An einem Button möchte ich in einem neuen Form den aktuellen Zustand anzeigen lassen
Dazu rufe ich ein neues Form auf und wollte unter anderem den Stift überegben

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
        private void tsm_info_Click(object sender, EventArgs e)
        {
            Info infoFenster = new Info(stift,pinsel,musterPinsel);
            infoFenster.Show();
        }


Und nun wollte ich im Konstruktor des neuen Form diese Angaben verarbeiten und eine Linie im aktuellen Zustand übergeben
Dazu habe ich eine PictureBox als Zeichenfläche gewählt.

Leider zeigt er nichts an, aber auch keinen Fehler
weiß nicht mehr weiter und würde mich über einen lösungsansatz freuen

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
namespace Zeichnen_neu
{
    public partial class Info : Form
    {
        Graphics infoZeichenflaeche;
                
        public Info(Pen infoStift, SolidBrush infoPinsel, System.Drawing.Drawing2D.HatchBrush infoMusterPinsel)
        {
            InitializeComponent();

            infoZeichenflaeche = pb_info.CreateGraphics();

            infoZeichenflaeche.DrawLine(infoStift, new Point(10,10),new Point 10,50));
        }
    }
}
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 23.11.13 00:43 
Du must im Paint Event des Form zeichnen. Wenn du an anderer Stelle zeichnest geht das ins nichts oder es ist zumindest sofort wieder weg wenn ein neuzeichnen der Form ansteht(dabei wird Paint ausgelöst und wenn du da nicht deine Linie zeichnest existiert die danach auch nicht mehr da eben nicht gezeichnet).
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 23.11.13 00:44 
Zusätzlich zu dem, was Ralf sagte: Du brauchst auch noch eine parameterlosen Konstruktor, wenn der Designer im Visual Studio weiterhin funktionieren soll.
Stimmt nicht, wie Ralf richtig anmerkt.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".


Zuletzt bearbeitet von Christian S. am Sa 23.11.13 15:07, insgesamt 1-mal bearbeitet
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Sa 23.11.13 00:56 
Hi,
also das mit dem Paint habe ich versucht, aber leider kennt er dann mein übergebenes Feld nicht mehr

Und die Antwort von Christian verstehe ich leider nicht :-(

Sorry

lg

Edit:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
namespace Zeichnen_neu
{
    public partial class Info : Form
    {
        Graphics infoZeichenflaeche;
                
        public Info(Pen infoStift, SolidBrush infoPinsel, System.Drawing.Drawing2D.HatchBrush infoMusterPinsel)
        {
            InitializeComponent();
        }
        public Info()
        {

        }

        private void pb_info_Paint(object sender, PaintEventArgs e)
        {
            infoZeichenflaeche = pb_info.CreateGraphics();

            infoZeichenflaeche.DrawLine(infoStift, new Point(1010), new Point(1050));
        }
    }
}


So, als grobe Richtung?

Edit2:
ausblenden C#-Quelltext
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:
namespace Zeichnen_neu
{
    public partial class Info : Form
    {
        Graphics infoZeichenflaeche;

        Pen neuStift;
                
        public Info(Pen infoStift, SolidBrush infoPinsel, System.Drawing.Drawing2D.HatchBrush infoMusterPinsel)
        {
            InitializeComponent();
            neuStift = (Pen)infoStift.Clone();
        }

        public Info()
        {

        }

        private void pb_info_Paint(object sender, PaintEventArgs e)
        {
            infoZeichenflaeche = pb_info.CreateGraphics();

            infoZeichenflaeche.DrawLine(neuStift, new Point(1010), new Point(1050));
        }
    }
}

Habe es jetzt noch mit einem Feld versucht in das ich in dem Konstruktor den übergebenen Wert clone.
Leider wieder ohne Erfolg.
Vermutlich wie immer eine Kleinigkeit, die ich nicht verstehe.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 23.11.13 01:14 
In e den EventArgs steckt schon ein Graphics Object. Es hilft nicht ein neues zu erzeugen.

Hängt dein Event an einer PaintBox auf der Form (der pb Präfix läßt das vermuten) oder an der Form?

Edit:

Zitat:
Und die Antwort von Christian verstehe ich leider nicht :-(


Er meint das dir der Standardkonstruktor fehlte. Also dieser

Zitat:
public Info()
{
}


wie in deinem jetzt gezeigten Code. Damit der Winforms Designer die Form zum designen in Visual Studio auch zum designen anzeigen kann. Das ist aber so nicht richtig. Der Vorfahr der zu designen Form braucht den den die wird vom Designer instanziiert und die InitializeComponent Methode der eigentlichen Form quasi manuell ausgeführt. Wenn die zu designende Form instanziiert werden würde wäre das ein Problem den die ist ja während dem designen vermutlichlich meist nicht kompilierbar und jede Änderung müsste jedesmal zu einem direkten neukompilieren und neuinstanziieren führen. Den Hinweis kannst du also ignorieren außer du willst nochmal von Info ableiten.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Sa 23.11.13 01:41 
Bei mir heißt das Steuerelemt nicht Paintbox, sondern PictureBox?!

Vermutlich aber dasselbe, da ich eine Paintbox so erst mal nicht finde.

Leider steige ich noch nicht dahinter.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Sa 23.11.13 11:12 
Guten Morgen zusammen,
also ich habe jetzt mal eine Messagebox ausgeben lassen im Konstruktor des InfoFensters mit dem übergebenen Wert infoStift.Width

Das funktioniert. Die Übergabe ist als nicht mein Problem.
Verstehe gerade nur nicht wie ich in der PaintMethode darauf zugreifen kann.

Vielen Dank schonmal für die Hilfe

Viele Grüße

EDIT:

Juhu er zeichnet!!!
Jetzt nur noch mal meine Frage, ob dies eine gute Lösung ist, oder eher schlechten Programmierstil beinhaltet?!

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
namespace Zeichnen_neu
{
    public partial class Info : Form
    {
        Pen neuStift;
                        
        public Info(Pen infoStift, SolidBrush infoPinsel, System.Drawing.Drawing2D.HatchBrush infoMusterPinsel)
        {
            InitializeComponent();
            neuStift = (Pen)infoStift.Clone();
        }

        private void pb_info_Paint(object sender, PaintEventArgs e)
        {

            e.Graphics.DrawLine(neuStift, new Point(1010), new Point(1050));
        }
    }
}
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 23.11.13 12:07 
:gruebel: Stimmt, das mit dem parameterlosen Konstruktor braucht man bei Forms nicht. Muss ich wohl irgendwie mit den UserControls verwechselt haben. War ja schon spät :oops:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 23.11.13 14:40 
Zitat:
Bei mir heißt das Steuerelemt nicht Paintbox, sondern PictureBox?!


Hab ich durcheinandergeworfen. Sorry.


Du brauchst doch nur eine Oberfläche auf der du zeichnen kannst? Da ist PictureBox, wenn du nichts von den Fähigkeiten der PictureBox brauchst, glaube ich ein wenig übertrieben. Ein Panel würde da reichen.

Und das geclonte Pen Object solltest du dann wenn du es nicht mehr brauchst auch wieder disposen. Z.B. im disposed Event der Form.