tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
24
ZUGRIFFE
18252
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Alaitoc Alaitoc ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    115
    Hallo,
    wollte mal fragen ob es möglich ist so in etwa
    in ne Picturebox zu malen wie bei z.b. Paint.
    Habe hier und anderorts zwar ähnliche Themen gefunden,
    aber eher für Linien und Rechtecke.

    Schonmal Danke

    PS: Sprache ist egal C# oder VB.net
     

  2. #2
    Avatar von Spyke
    Spyke Spyke ist offline Capoeirista
    Registriert seit
    Oct 2002
    Beiträge
    931
    Hab hier mal was kleines gemacht ist zwar nicht ganz genau aber funktioniert zumindest

    Code :
    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
    62
    63
    64
    65
    66
    
    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
     
                this.list = new List<Point>(); //Liste für Koordinaten instanziieren
                this.bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
                pictureBox1.Image = bmp;
            }
     
            private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
            {
                mouseDown = true;
                list.Add(new Point(e.X, e.Y));
            }
     
            private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
            {
                if (mouseDown)
                {
                    mouseDown = false;
                    using (Graphics g = Graphics.FromImage(bmp))
                    {
                        Draw(g);
                        g.Flush(); 
                    }
                    list.Clear();
                    pictureBox1.Invalidate();
                }
            }
     
            private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
            {
                if (mouseDown)
                {
                    list.Add(new Point(e.X, e.Y));
                    pictureBox1.Invalidate();
                }
            }
     
            private void pictureBox1_Paint(object sender, PaintEventArgs e)
            {
                if (mouseDown)
                    Draw(e.Graphics);
            }
     
            /// <summary>
            /// zeichnen
            /// </summary>
            private void Draw(Graphics g)
            {
                using (SolidBrush sb = new SolidBrush(Color.Black))
                {
                    foreach (Point pt in list)
                    {
                        if (g.VisibleClipBounds.Contains(pt))
                            g.FillRectangle(sb, new Rectangle(pt.X, pt.Y, 2, 2));
                    }
                }
            }
     
            private bool mouseDown; //ob Maustaste gedrückt wird (zur Speicherung der Maus koordinaten)
            private readonly List<Point> list; //Mauskoordinaten
            private readonly Bitmap bmp; //Bitmap zum speichern des gezeichneten
        }
    denke mal ist eigentlich selbst erklärend
     
    www.iv-interactive.de - Projektewebsite
    WikiParser - aktuelles Projekt

  3. #3
    Avatar von Spyke
    Spyke Spyke ist offline Capoeirista
    Registriert seit
    Oct 2002
    Beiträge
    931
    Habs ein bissel verfeinert, jetzt sollten keine Freiräume beim zeichnen mehr erscheinen.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    /// <summary>
    /// zeichnen
    /// </summary>
    private void Draw(Graphics g)
    {
        if (list.Count > 0)
        {
            byte[] bs = new byte[list.Count];
            bs[0] = (byte)PathPointType.Start;
            for (int i = 1; i < list.Count; i++)
                bs[i] = (byte)PathPointType.Line;
     
            using (Pen p = new Pen(Color.Black, 2))
                g.DrawPath(p, new System.Drawing.Drawing2D.GraphicsPath(list.ToArray(), bs));
        }
    }
    Alaitoc bedankt sich. 
    www.iv-interactive.de - Projektewebsite
    WikiParser - aktuelles Projekt

  4. #4
    Alaitoc Alaitoc ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    115
    Danke sehr
     

  5. #5
    duke007 duke007 ist offline Rookie
    Registriert seit
    Dec 2004
    Beiträge
    5
    Hallo Spyke,

    ich habe dein oben geschriebenen Code verwendet und weiterentwickelt und bin auf ein Problem gestossen, wo du mir vielleicht helfen kannst.

    Ziel:
    Mein Ziel ist es ein Programm zu schreiben, dass beim öffnen einen Screenshot vom Desktop macht und diesen in der Picturebox anzeigt. (funktioniert) Anschließend will ich mit einem "Stift" auf die Picturebox mit dem geladenenen Bild malen (wie in Paint). Dabei dir dein Code verwendet. Zum Schluss soll dann wieder ein Screenshot erstellbar sein.

    Problem:
    Das Problem ist er zeichnet es wie gewünscht, nur wenn ich die Maus loslasse verschwindet meine gezeichnete Linie wieder und es ist nur das Bild sichtbar. Hast du ein Idee an dem es liegen könnte. Ich kann dir auch den Quellcode geben.

    Danke schonmal für deine Bemühungen.
     

  6. #6
    Avatar von Spyke
    Spyke Spyke ist offline Capoeirista
    Registriert seit
    Oct 2002
    Beiträge
    931
    Ich denke mal du hast vergessen das als im Bitmap zu "speichern"

    PHP-Code:
    using (Graphics g Graphics.FromImage(bmp))
                    {
                        
    Draw(g);
                        
    g.Flush(); 
                    } 
    Dort lasse ich mir das Graphics Objekt vom Bitmap zurückgeben (Bitmap wird auch für anzeige in PictureBox verwendet).
    Zeichne auf dem Graphics Objekt (Draw Funktion).
    Und mit Flush wird sozusagen das Zeichnen erzwungen.
    http://msdn2.microsoft.com/en-us/lib...ics.flush.aspx

    Ev. auch noch die Funktion Invalidate der PictureBox aufrufen damit Bild neu dargestellt wird.

    Spyke (www.iv-interactive.de)
     
    www.iv-interactive.de - Projektewebsite
    WikiParser - aktuelles Projekt

  7. #7
    duke007 duke007 ist offline Rookie
    Registriert seit
    Dec 2004
    Beiträge
    5
    Hallo Spyke,

    danke für deine Antwort. Ich habe aber

    Code :
    1
    2
    3
    4
    5
    
    using (Graphics g = Graphics.FromImage(bmp)) 
                    { 
                        Draw(g); 
                        g.Flush();  
                    }
    diesen Code drinnen. Ausserdem habe auch rausgefunden das der Aufruf

    pictureBox1.Invalidate();

    mir mein gezeichnetes löscht. Wenn ich den Funktionsaufruf rausschmeiße, dann ist die Linie da. Aber wenn ich eine zweite machen möchte löscht er mir dann die erste. Damit du dir das Problem besser anschauen kannst habe ich dir mein Projekt angehängt.

    Ich bedanke mich schonmal für deine Bemühnungen.
    Angehängte Dateien Angehängte Dateien
     

  8. #8
    Alaitoc Alaitoc ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    115
    Hm also ich musste mit ner Liste arbeiten, wo ich immer die neue Linie hinzugeschrieben habe und dann
    alle neu reingeladen habe.
     

  9. #9
    Avatar von Spyke
    Spyke Spyke ist offline Capoeirista
    Registriert seit
    Oct 2002
    Beiträge
    931
    Das Problem ist du übergibst zwar meine Bitmap aber lädst danach ein neues Bild, intern wird ein neues Bitmap geladen, womit mein bmp eigentlich überflüssig wurde.
    PHP-Code:
    pictureBox1.Image bmp;
                try
                {
                    
    pictureBox1.Load("c:/Dokumente und Einstellungen/All Users/Anwendungsdaten/tmp.bmp");
                   
                    
                }
                catch (
    Exception x)
                {
                    
    MessageBox.Show("Exception " +x.Message);
                } 
    so funktionierts
    PHP-Code:
    this.bmp = new Bitmap("c:/Dokumente und Einstellungen/All Users/Anwendungsdaten/tmp.bmp");
                
    pictureBox1.Image bmp
    Spyke (www.iv-interactive.de)
     
    www.iv-interactive.de - Projektewebsite
    WikiParser - aktuelles Projekt

  10. #10
    duke007 duke007 ist offline Rookie
    Registriert seit
    Dec 2004
    Beiträge
    5
    Danke für deine Antwort. Es funktioniert.
     

  11. #11
    duke007 duke007 ist offline Rookie
    Registriert seit
    Dec 2004
    Beiträge
    5
    Hallo Spyke,

    weisst du auch noch wie man die Deckkraft/Durchsichtikeit der Line verändern kann?

    Danke schonmal für deine Bemühungen.
     

  12. #12
    xela123 xela123 ist offline Mitglied
    Registriert seit
    Jun 2007
    Beiträge
    11
    Hallo duke007,

    Die Transparenz kannst du einstellen indem du den Alpha-wert änderst.

    Code :
    1
    
    Color.FromArgb(128,0,255,0)

    Der erste Wert ist der Alpha-Wert, dann kommt der rotanteil, dann grün, dann blau.

    Mein Beispiel würd jetzt ein halbtransparentes grün ergeben.

    mfg xela123
     

  13. #13
    duke007 duke007 ist offline Rookie
    Registriert seit
    Dec 2004
    Beiträge
    5
    Hallo xela123,

    danke für deine Hilfe es funktioniert.
     

  14. #14
    TobsDi TobsDi ist offline Rookie
    Registriert seit
    May 2008
    Beiträge
    6
    Hi!
    Ich als Anfänger wollt bloß mal fragen (da ich grad ein Koordinatensystem zeichnen muss, und den Inhalt ständig als BMP speichern, damit er nicht verloren geht), wie es eigentlich funktioniert, dass die Variablen list und bmp, die ja nicht (zumindest das bmp) als globale Variablen deklariert werden können, eigentlich z.B. im MouseDown - Ereignis verfügbar sind?
    Ich tipp einfach mal, dass es was mit this. zum tun hat - aber wie schaut des dann in VB aus?

    Edit:
    Vielleicht sollt ich noch hinzufügen, dass die Height und Width Eigenschaft eines Bitmaps schreibgeschützt ist.
    Geändert von TobsDi (26.05.08 um 18:50 Uhr)
     

  15. #15
    Avatar von Spyke
    Spyke Spyke ist offline Capoeirista
    Registriert seit
    Oct 2002
    Beiträge
    931
    Wie du schon sagst sie sind global, aber halt global innerhalb ihrer eigenen Objektinstanz.

    this ist dabei der Zeiger auf das eigene Objekt.
    Kann man eigentlich auch weglassen und steht nur der Lesbarkeit halber da.

    zu VB:
    zumindest kann ich sagen das es in VB 6 dafür me gab und glaube in VB.Net auch so sein müsste. me sollte man genauso wie this weglassen können

    also entweder
    Code :
    1
    
    me.list.Add
    oder nur
    Code :
    1
    
    list.Add

    Edit:
    dein Satz war entwas verwirrend, aber nur nochmal zum klarstellen list und bmp sind global
    Geändert von Spyke (26.05.08 um 19:29 Uhr)
     
    www.iv-interactive.de - Projektewebsite
    WikiParser - aktuelles Projekt

Ähnliche Themen

  1. Haare malen
    Von McStanley im Forum Photoshop
    Antworten: 12
    Letzter Beitrag: 17.05.07, 22:46
  2. Unsichtbar malen ?
    Von Alex BDX im Forum Photoshop
    Antworten: 7
    Letzter Beitrag: 04.09.06, 15:12
  3. pictureBox auf PictureBox oder Label
    Von shn im Forum .NET Windows Forms
    Antworten: 1
    Letzter Beitrag: 31.08.05, 16:37
  4. PictureBox über PictureBox
    Von JK_net im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 14.03.05, 09:03
  5. Malen in Picturebox rückgängig machen?
    Von daDom im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 06.06.04, 15:58