tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Alexander Schuc
ERLEDIGT
NEIN
ANTWORTEN
14
ZUGRIFFE
502
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von kuhlmaehn
    kuhlmaehn kuhlmaehn ist offline Mitglied Platin
    Registriert seit
    May 2003
    Beiträge
    634
    Hi!
    Ich hab beim Suchen nur gefunden wie ich eine Linie zeichnen kann.
    Mein Problem ist nun aber das ich gerne auf jede gezeichnete Linie und am besten auch auf die Eckpunkte zugreifen können möchte.
    Ich will also auf die Linie klicken können und zB die Farbe verändern. Oder auch vorhandene Linien verschieben können.
    Ich denke dabei an das Line-Steuerelement bei Visual Basic 6.0.

    Wie stell ich das am besten an?
    Danke!
     

  2. #2
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Wie stell ich das am besten an?
    Kommt drauf an was das Ziel sein soll. Wenn du das einfach nur benutzen willst, um eine Linie darzustellen, könntest du dir ein eigenes Steuerelement schreiben, welches die benötigte Linie darstellt.

    Wenns nur horizontal / vertikal sein soll, ohne irgendwelche Extras (diagonal.. runde Ecken bei dickeren Linien..) könntest ein Panel missbrauchen. Das wäre für dich am wenigsten Aufwand. *G*

    lg, Alex
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  3. #3
    Avatar von kuhlmaehn
    kuhlmaehn kuhlmaehn ist offline Mitglied Platin
    Registriert seit
    May 2003
    Beiträge
    634
    Danke für die schnelle Antwort
    Also um Grunde könnte ich sogar drauf verzichten, dass man die Linien bewegen kann. Mir reicht es, dass man auf eine Linie klicken kann und sie dann eine andere Farbe bekommt. Achso ja und ich will auch diagonale Linien.
    Die einzige Möglichkeit die mir einfällt ist, dass man die Koordinaten von der Form nimmt und immer überprüft ob der Klick auf Linie liegt. Aber dann müsste ich ja für jede Linie eine Funktion aufstellen oder? Das muss doch leichter gehen!?
     

  4. #4
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Zitat Zitat von kuhlmaehn Beitrag anzeigen
    Die einzige Möglichkeit die mir einfällt ist, dass man die Koordinaten von der Form nimmt und immer überprüft ob der Klick auf Linie liegt. Aber dann müsste ich ja für jede Linie eine Funktion aufstellen oder? Das muss doch leichter gehen!?
    Für jede Linie eine eigene Funktion ist nicht gnaz richtig. Einfach im MouseUp Event die Koordinaten prüfen. Die Daten deiner Linien müsstest dann halt speichern.. und bei Bedarf anpassen.

    Das ganze solltest dann aber wirklich in ein eigenes Control auslagern. Damit du erstens ohne Probleme mehrere Linien darstellen kannst, ohne das sich der Code in deiner Form vermehrt,..
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  5. #5
    Avatar von kuhlmaehn
    kuhlmaehn kuhlmaehn ist offline Mitglied Platin
    Registriert seit
    May 2003
    Beiträge
    634
    Mh sorry das ist mir irgendwie nicht ganz klar.
    Nehmen wir mal nur eine Linie.. dann müsste ich es doch (wie in der Schule ) machen, dass ich den Punkt in die Funktion einsetzt und wenn eine wahre Aussage rauskommt liegt er auf der Geraden. Oder wie könnt das einfacher machen?
    Und wenn ich dann mehere linien habe muss ich dann doch mehere Funktionen aufstellen und alle einzeln testen?
    Also anders kann ich mir das gerade nich vorstellen vielleicht kannst du mir gerade mal auf die Sprünge helfen .
    Und wie genau erstellt man Steuerelemente? Muss ich da auf was achten? Und muss da später was mit der exe mitgeliefert werden oder wird das dann reinkompiliert?
     

  6. #6
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Mit dem GraphicsPath könntest dir die Rechnerei sparen.. Das mal zur Vereinfachung.. (IsVisible bzw. IsOutlineVisible)

    Zum Control: Ist ja auch nur eine Klasse, die wird mit den anderen in dein Assembly reinkompiliert.

    Hier 2 vielleicht Hilfreiche Links:
    MSDN - Zeichnen und Ausgeben von benutzerdefinierten Steuerelementen

    C# OpenBook - 25.4 Ein eigenes Steuerelement entwerfen

    kuhlmaehn bedankt sich. 
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  7. #7
    Avatar von kuhlmaehn
    kuhlmaehn kuhlmaehn ist offline Mitglied Platin
    Registriert seit
    May 2003
    Beiträge
    634
    Super ich danke dir, dann werd ich mir das alles mal durchlesen
     

  8. #8
    Avatar von kuhlmaehn
    kuhlmaehn kuhlmaehn ist offline Mitglied Platin
    Registriert seit
    May 2003
    Beiträge
    634
    Mh ich hab jetzt mal das hier (http://msdn2.microsoft.com/de-de/lib...dt(VS.80).aspx) ausprobiert. Da ich nicht wusste wie man das nun verwendet habe ich den Inhalt einfach in Form_Paint kopiert.
    Das ist aber blöd. Ich würde gerne, dass es beim Klick auf einen Button erstellt wird.
    Außerdem muss ich ja den GraphicsPath() überalle verwenden können (zB in Form1_MouseDoubleClick).
    Irgendwie steig ich da nicht so ganz durch
     

  9. #9
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Ist jetzt nur ein ganz einfaches, nicht schönes Beispiel wie du das machen könntest, und ich hab jetzt auch nicht die Syntax und dergleichen geprüft.


    Es wird ein Button angenommen, bei dessen Betätigung ein neues zu zeichnendes Objekt erstellt wird. Die Infos zum Zeichnen werden in einem GraphicsPath gespeichert, und diese werden in einem Dictionary gemeinsam mit dem zu verwendenden Stift gesammelt.

    Bei jedem MouseUp werden die Pfade überprüft, und wenn einer "getroffen" wurde, wird dessen Stift "geändert".

    Nur kurz schnell runtergeschrieben.. Syntaxfehler vorbehalten.

    Code csharp:
    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
    
    using System.Collections.Generic;
    using System.Drawing.Drawing2D;
    using System.Drawing;
     
    public class Form1 : Form
    {
     
    // ...
     
      private int colorCount = 0;
      
      public int ColorCount // immer ne andere farbe.. bei jedem aufruf wird hochgezählt.. obere grenze: 255
      {
        get { ++colorCount > 255 ? return 0 : return colorCount; }
      }
      
      private Dictionary<GraphicsPath, Pen> drawings = new Dictionary<GraphicsPath, Pen>();
     
      private Pen drawingPen = Pens.Black;
      
      private void NewDrawingButton_OnClick(object sender, EventArgs ea)
      {
        GraphicsPath gp = new GraphicsPath();
        gp.AddLine(...);
        
        int color = ColorCount;
        
        drawings.Add(gp, new Pen(Color.FromArgb(color, color, color)));
        
        this.Invalidate();
      }
      
      protected override void OnPaint(object sender, PaintEventArgs ea)
      {
      
        foreach (GraphicsPath gp in drawings.Keys)
        {
          ea.Graphics.DrawPath(drawings[gp], gp);
        }
      
      }
      
      private void Form1_MouseUp(object sender, MouseEventArgs mea)
      {
        foreach (GraphicsPath path in drawings.Keys)
        {
          Pen pen = drawings[path];
          
          if (path.IsOutlineVisible(mea.X, mea.Y, pen))
          {
          // neue farbe setzen ....
            pen.Dispose();
            pen = null;
            int color = ColorCount;
            
            pen = new Pen(Color.FromArgb(color, color, color));
            drawings[path] = pen;
            Invalidate();
            return;
          }
        }
      }
    }
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  10. #10
    Avatar von kuhlmaehn
    kuhlmaehn kuhlmaehn ist offline Mitglied Platin
    Registriert seit
    May 2003
    Beiträge
    634
    Ach verdammt ich find C# irgendwie nicht logisch
    Vielen Dank auf jeden Fall ich werd das mal außprobieren und mich dann bestimmt nochmal melden.
    Wofür ist eigentlich diese Zeile:
    Code csharp:
    1
    
    private Dictionary<GraphicsPath, Pen> drawings = new Dictionary<GraphicsPath, Pen>();
     

  11. #11
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Warum ist C# nicht logisch? Was verwirrt dich so sehr?

    Code csharp:
    1
    
    private Dictionary<GraphicsPath, Pen> drawings = new Dictionary<GraphicsPath, Pen>();

    Erzeugt ein neues generisches Dictionary mit Schlüsseln vom Typ GraphicsPath und die Werte sind vom Typ Pen.

    (Geht aber .net 2.0 bzw. C# 2.0)
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  12. #12
    Avatar von kuhlmaehn
    kuhlmaehn kuhlmaehn ist offline Mitglied Platin
    Registriert seit
    May 2003
    Beiträge
    634
    Und wofür brauch ich das Dictonary?

    Weiss nich genau es sind immer so Kleinigkeiten
    Einmal les ich zB Irgendwas() bla = new Irgendwas(), dann war es ein anderes mal nur blu = new IrgendwAnderes(). Naja also im großen und ganzen ist es schon ok und macht auch Spaß nur oft les ich halt in der msdn nach und probier das dann anzuwenden und es klappt nie weil ich immer irgendwas nicht richtigmache.
    Bei Visual Basic 6 (nagut das zählt nicht ) oder php war irgendwie immer alles selbsterklärender bzw. so, dass man es anhand von Dokumentationenen alleine hinbekommen hat.
    Aber warscheinlich fehlt mir einfach noch der richtige Durchblick, bin ja noch nich lange dabei =)

    [Edit]
    Oder nochmal zu deinem Beispiel..
    Eine Linie zu zeichnen stell ich mir irgendwie eher so vor:
    PaintLine(x1,y1,y1,y2,farbe,objekt auf dem gezeichnet werden soll)
    Und gut ist naja manchmal ist es halt nicht so leicht wie man gerne hätte :S
    Geändert von kuhlmaehn (01.07.07 um 19:05 Uhr)
     

  13. #13
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Wennst dir den Code ansiehst, wirst vielleicht sehen, dass ich da immer einen GraphicsPath gemeinsam mit einer Pen reinspeichere.

    So gibts im Beispiel eine Zuordnung von GraphicsPath (der Linie z.b.) und einem Stift (Farbe, Breite..) mit welcher der Pfad gezeichnet wird.

    Einmal les ich zB Irgendwas() bla = new Irgendwas()
    Wo hast du "vorne" runde Klammern gesehen? In meinem Beispiel hab ich "Generics" benutzt. Damit programmiert es sich einfach leichter. (Und ist ja auch schneller)
    Wirst wohl noch nicht gekannt haben...

    7.4 Generics – Generische Datentypen

    Da kannst dich ein wenig einlesen wenn du magst.

    Bei Visual Basic 6 (nagut das zählt nicht ) oder php war irgendwie immer alles selbsterklärender bzw. so, dass man es anhand von Dokumentationenen alleine hinbekommen hat.
    Ein paar Grundlagen solltest schon können.

    "new" erzeugt ein neues Objekt. (Konstruktor aufruf, etc.) Das Objekt wird (meistens) einer Variable zugewiesen. Diese muss vom selben (oder einem kompatiblen, siehe Vererbung) Typ sein.

    Einmal les ich zB Irgendwas() bla = new Irgendwas(), dann war es ein anderes mal nur blu = new IrgendwAnderes().
    Im Falle von "bla" ists eine neue (lokale) Variable die noch nicht definiert wurde. (Klammern passen am Anfang halt nicht), bei "blu" wird einer bereits vorhandenen Variable ein neues Objekt zugewiesen. Deswegen fehlt der Typ vorm Variablennamen, bzw. wird nicht mehr benutzt.. (sosnt wäre es eine neue Variable...)

    Klarer?

    Schau dir vielleicht das OpenBook ein wenig an, hast eh schon ein paar Links von mir dorthin bekommen. Fragen darfst natürlich auch..


    Edit:

    Mhm.. da macht man sich die Mühe und schreibt, und dann editiert der Kerl noch was rein.. ;D

    Oder nochmal zu deinem Beispiel..
    Eine Linie zu zeichnen stell ich mir irgendwie eher so vor:
    PaintLine(x1,y1,y1,y2,farbe,objekt auf dem gezeichnet werden soll)
    Und gut ist naja manchmal ist es halt nicht so leicht wie man gerne hätte :S
    Funktioniert ja ähnlich, nur laufen manche Sachen halt nicht so einfach...

    Du kannst ja einfach im Paint-Event eine Linie zeichnen. Die passenden Methoden stellt dir die Graphics-Klasse bereit.

    Das Objekt auf dem gezeichnet werden soll, hast durch das Event schon festgelegt. (Je nachdem von welchem Objekt du das Paint-Event abonnierst..)

    Die Farbe ist durch das Pen oder durch die verschiedenen Brush klassen definiert. (Pen bei "Draw" Methoden, Brushes bei "Fill" Methoden - Hat den Grund: Füllen kann man auch mit Mustern etc. da braucht man bissl mehr Infos als ein Stift hergibt.. )

    Code csharp:
    1
    
    pea.Graphics.DrawLine(Pens.Black, x1, y1, x2, y2);

    So würde das ganze aussehen..

    Warums keine PaintLine-Methode gibt? Paint sagt erstens nicht viel über die Art wie gezeichnet werden soll aus. Draw/Fill ist da genauer..
    Warum diese Methoden nicht global existieren?
    Im Sinne von OOP ist das Erstens nicht schön, ausserdem kann man bei den Zeichen routinen noch einiges festlegen, das geschieht alles über das Graphics-Objekt. Alles schön gekapselt..

    Würd sagen, du solltest dir wirklich ein wenig Lektüre zu gemüte führen, und ein bissl verständnis Aufbauen..
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  14. #14
    Avatar von kuhlmaehn
    kuhlmaehn kuhlmaehn ist offline Mitglied Platin
    Registriert seit
    May 2003
    Beiträge
    634
    Super ich danke dir!
    Ja du hast absoulut recht, ich werd mir das Buch jetzt mal angucken bin noch nicht dazu gekommen. Hoffentlich baut sich dann langsam ein gewisses Grundverständis auf. =)
    Und sorry fürs Edit =D
     

  15. #15
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Zitat Zitat von kuhlmaehn Beitrag anzeigen
    Und sorry fürs Edit =D
    Macht nix ;D
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 21.06.09, 10:06
  2. Antworten: 5
    Letzter Beitrag: 24.05.08, 11:23
  3. Wie können 2 Programme kommunzieren?
    Von ProgFreak im Forum C/C++
    Antworten: 12
    Letzter Beitrag: 12.05.04, 14:08
  4. Können wir das überbieten!
    Von RedZack im Forum Smalltalk
    Antworten: 10
    Letzter Beitrag: 14.02.02, 18:37