Laden...
Avatar #avatar-3271.jpg
rollerfreak2 myCSharp.de - Member
Software Architekt Dabei seit 14.07.2008 916 Beiträge
Benutzerbeschreibung
Man lernt nie aus...

Forenbeiträge von rollerfreak2 Ingesamt 916 Beiträge

31.05.2009 - 14:44 Uhr

A steht für Alpha Wert. Sprich die "Transparenz der Farbe".

Kleine Frage am Rande. Du bist ein Fachinformatiker und weist nicht wie man einen RGB Wert in einen HEX Wert umrechnet...?

29.05.2009 - 13:48 Uhr

Ok, das ist doch schon mal was. Dazu folgendes. Das Studio hat eine Art internen Cache, der die Enviroment Variablen irgendwie behält. Schließe mal alle Instanzen deines Studios und öffne es erneut. Wenn das nicht hilft, System neu starten. Dann sind alle Variablen aus dem Cache raus.

29.05.2009 - 13:34 Uhr

Hast du dir denn mal angeschaut was


GetEnvironmentVariable(var.Replace("%", null));

zurück liefert?

29.05.2009 - 12:20 Uhr

Dann wirst du wohl erst den Focus setzen müssen und dann 3 mal Key "->" (Pfeilaste) ans system schicken. Was anderes fällt mir auf die schnelle nicht ein.

29.05.2009 - 10:33 Uhr

einfach via


this.dateTimePicker.Select();

selectieren...

29.05.2009 - 00:09 Uhr

Du musst das focused event abfangen und dort kannst du das dann beeinflussen.

28.05.2009 - 16:32 Uhr

Also wenn ich einen standart DateTimePicker nehme, dann funzt das genauso wie du sagst. Sprich ich tippe den Tag ein, und er springt eigenständig danach in den Monatsbereich usw.

28.05.2009 - 13:16 Uhr

Jepp und


double B = 5d / 10d;
double C = (double) 5 / 10;
double D = 5.0 / 10.0;

nun...?

28.05.2009 - 13:12 Uhr

Du musst auf das SelectedIndexChanged Event reagieren und dann einfach checken, welcher Index ausgewählts wurde.

28.05.2009 - 13:09 Uhr

Manchmal fragt man sich ob die Leute auch ihren eigenen Code lesen.


int A = 5;
A = 5 / 10;

Quizfrage, was steht danach in A?


int A = 5;
double B = 5 / 10;

Quizfrage, was steht danach in B?

28.05.2009 - 11:58 Uhr

Wieso suchst du?
Wenn du dir die Schnittstellen mal angeschaut hättest wärst du vielleicht selber drauf gekommen.


void.TrackBar.SetRange(int minValue, int maxValue);

Ergo: Die Range ist auf ganze Zahlen begrenzt.

Fazit: Wenn du dennoch um 0,1 weiter scrollen willst dann mach deinen bereich um den Faktor 10 Größer und teile danach durch 10.

Beispiel: Deine gewollte Range liegt zwischen 0-5. Das heißt du musst SetRange(0,50) aufrufen, und dann bei TrackBar.Value / 10 Teilen.

Oder du überschreibst eine TrackBar und änderst die so ab das sie auch double kann.

28.05.2009 - 10:45 Uhr

Hier mal eine Lösung welche die Checkboxes in Abhängikeit des ListViewItem.Tag Objektes zeichnet.


protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        pen.Dispose();
        brush.Dispose();
    }
    base.Dispose(disposing);
}

protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e)
{
    if (e.ColumnIndex != 0 || e.Item.Tag != null && ( e.Item.Tag.ToString() == "token"))
    {
        e.DrawDefault = true;
    }
    else
    {
        if (this.SelectedItems.Contains(e.Item))
        {
            e.Graphics.FillRectangle(brush, e.Bounds);
        }
        else
        {
              using (Brush b = new SolidBrush(e.Item.BackColor))
                   e.Graphics.FillRectangle(b, e.Bounds);
        }
        if (e.Item.Focused)
        {
            Pen p = new Pen(Brushes.Black);
            p.DashStyle = DashStyle.Dot;
            e.Graphics.DrawLine(p, new PointF(e.Bounds.Left, e.Bounds.Top), new PointF(e.Bounds.Right, e.Bounds.Top));
            e.Graphics.DrawLine(p, new PointF(e.Bounds.Left, e.Bounds.Top), new PointF(e.Bounds.Left, e.Bounds.Bottom));
        }
        e.DrawText(TextFormatFlags.Left);
    }
    base.OnDrawSubItem(e);

}

protected override void OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e)
{
    e.DrawDefault = true;
    base.OnDrawColumnHeader(e);
}

28.05.2009 - 09:46 Uhr

Danke das hat mir echt geholfen, dieses Flag hab ich ganz übersehen. Dadurch wird es eigentlich recht einfach. Ich poste die Lösung dann hier.

27.05.2009 - 15:05 Uhr

Gute Idee, daran hab ich noch gar nicht gedacht.

Zum Überschreiben der OnDrawSubItem und OnDrawItem.
Das Problem hier besteht darin das man erst OwnerDraw setzen muss, damit man in den Events landet. Auch wenn man die Überschreibt und OwnerDraw nicht gesetzt ist, dann wird die Methode nicht aufgerufen. Soweit so gut, nur jetzt besteht das Problem darin das man wirklich alles selber zeichnen muss, sprich nicht einfach das base... weg lassen kann, und die SubItems der CheckBox columns selber zu zeichnen. Hab ich da was übersehen?

27.05.2009 - 13:54 Uhr

Wird der DoubleClick Event vorher ausgeführt? Also vor einem Drag&Drop Vorgang?
Wird der DoubleClick nach dem Drag&Drop Vorgang wieder ausgeführt?

27.05.2009 - 13:51 Uhr

Falls es einen interessiert. Ich habe eine Lösung gefunden:

Und zwar kann man eine Range angeben. Beachten muss man das bei einem Update die Range immer so aussehen muss:


UPDATE [List$A4:A5] SET F1 = @id;

Dieser Befehl würde die 4te Zeile der Excel Datei ändern, daher genau die erste Spalte der 4ten Zeile.

27.05.2009 - 12:43 Uhr

Dafür: Ich hab meherere Elemente in einer Listview. Alle Elemente sind Daten, jedoch einige nicht. Diese Stellen header da, und gruppieren die Daten. Das geht auch nicht zu ändern ,weil die so angezeigt werden müssen (Listview besitzt ja Gruppen) aber wie gesagt die müssen so angezeigt werden.

Nun Kann man die Daten verlinken, entsprechend mit den CheckBoxen. Die Header jedoch kann man nicht gruppieren, deshalb wollt ich dort die Checkboxen gar nicht mit anzeigen...

26.05.2009 - 22:33 Uhr

Leider nix passendes gefunden. Ich hab mir schon überlegt das OnDrawSubItem zu überschreiben und so einfach das zeichnen der CheckBox in Abhängigkeit des Tag Objectes ändern. Fällt jemand noch etwas anders ein...?

26.05.2009 - 13:40 Uhr

Du hast schon recht, das es nicht komplizierter ist, nur ist das ein HelperTool zum Entwickeln. Und da es sich beim Drag&Drop sowieso nur um Text handelt ist der "Bug" das man auch Text aus einem Text Editor dragen kann eher ein Feature als ein Bug 😃

26.05.2009 - 13:30 Uhr

Gibt es eine Möglichkeit, wenn man CheckBoxen anzeigen lässt, das man jedem Item sagen kann ob es die Checkbox anzeigen soll oder nicht. Sprich nicht jedes Item soll die Checkbox haben, sondern nur bestimmte?

26.05.2009 - 11:06 Uhr

Jo das hab ich auch grad mit bekommen, das da keine Exception geworfen werden. Aber für meine Zweke reicht es. Hier mal die Lösung.


/// <summary>
/// Handles the DragDrop event of the lv_link control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Windows.Forms.DragEventArgs"/> instance containing the event data.</param>
private void lv_DragDrop(object sender, DragEventArgs e)
{
    Point p = lv.PointToClient(new Point(e.X, e.Y));
    lv.GetItemAt(p.X, p.Y).SubItems["id"].Text = e.Data.GetData(typeof(string)).ToString();
}

/// <summary>
/// Handles the DragEnter event of the lv_link control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Windows.Forms.DragEventArgs"/> instance containing the event data.</param>
private void lv_DragEnter(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.Copy;
}

/// <summary>
/// Handles the ItemDrag event of the lv_link control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Windows.Forms.ItemDragEventArgs"/> instance containing the event data.</param>
private void lv_ItemDrag(object sender, ItemDragEventArgs e)
{
    this.lv.DoDragDrop(((ListViewItem)e.Item).SubItems["id"].Text, DragDropEffects.Copy);
}


Jetzt könnte man noch auf das SubItem prüfen, sprich nur das Drag&Drop erlauben wenn der User ncith nur auf das Item sondern auch auf die richtige Spalte klickt.

26.05.2009 - 09:56 Uhr

Ok Danke dir, ich glaub so langsam macht es klick. Ich werd die Lösung dann posten.

26.05.2009 - 09:49 Uhr

Ok noch mal kurz zum Verständnis. Das DragOver Event wird automatisch gewurfen, sobald ich was "in der hand" habe? Was muss ich dann im DragOver implementieren? Mich interessiert ja nur die Aktion an sich, daher wenn der User "das in der hand" habende "los lässt"? Ein einfaches Besipiel wäre mal ganz hilfreich, denn irgendwie bekomm ich das im Kopf nicht geregelt wie der Ablauf ist.

26.05.2009 - 09:35 Uhr

Ich glaub ihr habt micht falsch verstanden. Noch mal kurz zum Scenario:

Ich habe EINE listview. Dort will ich von einer ROW per drag&drop etwas in eine andere Row kopieren. Jetzt häng ich mich ans DragItem Event. Das funzt auch Problemlos, sprich ich merk mir das ListViewItem welches angefasst wurde. Nur wie soll ich jetzt auf das Drop Event reagieren? Das ist mir irgendwie nicht klar?

Kann mir da jemand helfen? Mir ist irgendwie nicht klar wie die Events DragDrop und DragOver zusammenhängen, wenn es um EIN Control geht und nicht von einem Control in eine anderes operiert wird.

25.05.2009 - 17:01 Uhr

verwendetes Datenbanksystem: <OLEDB>
Ich habe ein Problem bezüglich eines Excel Files und der Änderung der enthaltenen Daten. Und zwar lese ich ein Excel File per OLEDB aus und stelle es in einer ListView dar. Funzt Problemlos. Nun sind aber in einigen Zeilen entsprechene Spalten leer! Z.B wie nachfolgend dargestellt.

xxx, xxxx, xxxx, xxx
yyy, yyyy, , yyy
zzz, ,zzzzz,

etc...

Wenn ich nun also eine Zeile geändert habe, dann will ich das Excel File updaten. Problem nur ist, wie identifiziere ich die Spalte. Es kann nämlich sein die Spalte ist z.B. komplett leer. Kann ich die Spalte mit ihrem Index ansprechen?


UPDATE [List$] SET F1 = @id where index = @index;

Ich müsste jetzt nur den Syntax für index wissen, denn so funzt es nicht. Ich hatt e auch schon daran gedacht immer das ganze Excel File neu zu schreiben, aber dies enthält noch zusätzlich Macros und das wäre daher viel zu aufwändig.

Ich hoffe Ihr habt mein Problem verstanden und könnt mir helfen.

ps.: Ich hätte gleich noch eine 2te Frage. Vielleicht weis jemand von euch, wie ich per INSERT statement eine Zeile einfügen kann, ebenfalls an einer Speziellen ZEILENNUMMER bzw. ZEILENINDEX.

25.05.2009 - 15:59 Uhr

DragEnter geht meines wissens nach nicht, weil das nur reagiert wenn man DragDrop aus einen anderen Control heraus macht. Mit dem MouseUp Event ist doch logisch, weil nur dann ist die DragDrop Aktion abgeschlossen, sprich erst dann wird die Aktion Ausgeführt. Da brauch ich mich doch nicht ans MouseMove hängen?

Kurz mal meine Lösung:


/// <summary>
/// Handles the ItemDrag event of the lv_link control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Windows.Forms.ItemDragEventArgs"/> instance containing the event data.</param>
private void lv_link_ItemDrag(object sender, ItemDragEventArgs e)
{
    this.isdraganddrop = true;
    this.Cursor = Cursors.Hand;
    dragdropstring = ((ListViewItem)e.Item).SubItems["id"].Text;
}

/// <summary>
/// Handles the MouseUp event of the lv_link control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Windows.Forms.MouseEventArgs"/> instance containing the event data.</param>
private void lv_link_MouseUp(object sender, MouseEventArgs e)
{
    if (isdraganddrop)
    {
        lv_link.GetItemAt(e.X, e.Y).SubItems["id"].Text = dragdropstring;
        this.Cursor = Cursors.Default;
    }
    this.isdraganddrop = false;
}

/// <summary>
/// Handles the MouseLeave event of the lv_link control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
private void lv_link_MouseLeave(object sender, EventArgs e)
{
    this.isdraganddrop = false;
    this.Cursor = Cursors.Default;
}


Wie sähe den die Lösung mit dem DragDrop Events aus?

25.05.2009 - 14:58 Uhr

Ich hab jetzt eine Lösung gefunden, jedoch ist die suboptimal.

Ich reagiere auf das ItemDrag Event und merk mir in einem Flag das ein Drag&Drop Vorgang gestartet wurde. Dann reagiere ich auch das OnMouseUp Event und check ob das Flag gesetzt ist. Nun kann ich via ListView.GetItemAt(int x, int y) das aktuelle ListViewItem holen und den Text der entsprechenden Spalte ändern. Einzig das Drag & Drop "Icon" fehlt jetzt noch. Kann ich das irgendwie künstlich darstellen? Bei den Cursor ist das nicht mir drin...

25.05.2009 - 14:46 Uhr

Naja mit Add und Remove machst du die ja nicht wirklich sichtbar und unsichtbar, sondern du entfernst sie und fügst sie hinzu. Damit hängt es nicht zusammen. Auch die Anzahl der TabPages ist völlig egal.

25.05.2009 - 14:25 Uhr

Ich hab eine ListView mit mehreren Spalten und Zeilen. Nun wollt ich per Drag&Drop z.B. die 2te Zeile in die 5 Zeile übernehmen. Dabei soll es immer eine Spalte Übernehmen, nicht die ganze zeile. Nun weis ich aber nicht wie ich das DragEnter event anstoße weil ich ja nicht von einem anderen Control Drag & Drop mache, sondern vom dem LV selber. Steh bisschen auf dem Schlauch, hat jemand einen Tipp für mich?

25.05.2009 - 13:15 Uhr

Hast du die Conotrls über den Designer hinzugefügt? Wenn ja schau mal ob im *.Designer.cs die Größe geändert wurde oder ob den die Dock bzw. Die Anchor Eigenschaft irgendwie verstellt ist.

23.05.2009 - 17:25 Uhr

Das mit den Rectangle hab ich jetzt geschnallt. Das gibt einfach den malbereich an, und die nachfolgenden Parameter ist dann immer auf das Rectangle bezogen.

Aber der Wertebereich des Alphawertes haut bei mir nicht hin. Wenn ich den auf 1280 oder 2560 stelle wird gar nix gezeichnet => Volltransparent

Ich muss das noch nachschauen wie der Wertebereich tatsächlich ist, aber ich tippe auf 0-1!

23.05.2009 - 12:13 Uhr

Das mit dem alphawert ist mir jetzt klar. zwischen 0-1 abbilden.

Aber warum das bild nicht exakt bei x,y und mit width und height gezeichnet wird ist mir nicht klar...

23.05.2009 - 11:57 Uhr

Das scheint so nicht zu gehen. Ich hatte aus dem hier:


Image img = new Icon(Resources.icon, 16, 16).ToBitmap();
int x = 10;
int y = 20;
e.Graphics.DrawImageUnscaled(img, x, y);

Das funktionierte logischerweise einwandfrei.

Nun wollt ich das mal mit dem alpha wert testen alos folgendes:


Image img = new Icon(Resources.icon, 16, 16).ToBitmap();
int alpha = 120;
int x = 10;
int y = 20;
ImageAttributes attr = new ImageAttributes();

// Standard-ColorMatrix für Transparenz
ColorMatrix matrix = new ColorMatrix(
   new float[][]
   {
       new float[] {1, 0, 0, 0, 0},
       new float[] {0, 1, 0, 0, 0},
       new float[] {0, 0, 1, 0, 0},
       new float[] {0, 0, 0, alpha, 0},
       new float[] {0, 0, 0, 0, 1}
   });

// matrix an ImageAttribute-Objekt übergeben
attr.SetColorMatrix(matrix);

g.DrawImage(img_sponti, new Rectangle(x, y, img.Width, img.Height), x, y, img.Width, img.Height, GraphicsUnit.Pixel, attr);

//dispose
attr.Dispose();


Es wird nun erstens an einer völlig falschen stelle und auch noch NICHT halbdurchsichtig gezeichnet. Für was ist eigentlich der 2te Parameter (DestRectangle) ???

Was mach ich falsch?

23.05.2009 - 08:13 Uhr

Ich habe eine eigenes Control was von Panel erbt und dort werden einzelne Bilder gezeichnet. Gibt es eine Möglichkeit beim zeichnen den Alpha-Kanal der Bilder einzeln zu beeinflussen? Eventuell mit einer Color-Matrix?

18.05.2009 - 23:44 Uhr

1. Es gibt Code Felder, schreib dein Code dort rein, dann ist der lesbarer.

  1. Was du brauchst ist die Zeilennummer der entsprechenden Row die du löschst. Die hättest du mit bisschen suchen auch selber finden können...

int position = specList.SelectedRows[0].Index;

18.05.2009 - 23:36 Uhr

Präzisiere dein Problem mal bitte ein bisschen genauer. Zur unterschiedlichen Geschwindigkeit generell:

Füge der Klasse Fahrzeug noch einen Value int speed hinzu. Bei jedem Timer Tick tust du dann jedes Auto um die entsprechende speed weitersetzen. (wie herbivore bereits sagte)

Zum Bremsen:
Füge der Fahrzeugklasse noch einen weiteren value bool isSimulate hinzu. Und dann tust du im Timer Event nur alle Fahrzeuge die isSimulate == true erfüllen weiter setzen. Das Flag kannst du dann an die Bremsbutton binden.

Hilfst dir das?

15.05.2009 - 12:39 Uhr

Danke für die Info. Da Check ich mal ob der auf dem System ausgeschalten ist, bzw. gar nicht installiert. Und mal sehen ob es dann klappt, danke für eure hilfe. ICh poste die Ergebnisse dann hier...

15.05.2009 - 12:37 Uhr

Ich weis, mit binden meinte ich ja auch nur das man die neu erstellte List der ListView zuweist. Aber für eine ListViewItemCollection braucht man eine LV als owner, von daher wird das eher umständlich, da hab ich nicth dran gedacht.

15.05.2009 - 11:10 Uhr

Heißt der wirklich Design-Dienst? Ich find nämlich den Dienst hier unter einem XP System (welches die styles darstellen kann) nicht.

15.05.2009 - 08:58 Uhr

Dafür gibt es einen Dienst? Gut dann schau ich mal ob der in dem System standartmäßig ausgeschaltet ist. Wenn einer noch anderen Ideen bzw. Vermutungen hat, dann immer her damit

15.05.2009 - 08:55 Uhr

Genau sonst gibt es eine Exception. Speicher dir die Collection ab, und schiebe alle die du nicht löschen willst in eine neue Collection. Dann die neue Collection an die ListView binden, dies ist eine von 1000 Lösungen...

15.05.2009 - 08:32 Uhr

Für solche Zwecke gibt es übrigens Undo und Redo

14.05.2009 - 23:28 Uhr

So ich hatte jetzt mal zu schaun woran das liegt, das die Applikation nach dem fuscaten nicht mehr funzt. Also vor dem fuscaden hab ich die dlls in die exe gemerged. Danach funzt es bestens. JEtzt kommt der Phoenix, und ändert die namespaces, funktionen etc. Und danach kommt folgende Exception.

14.05.2009 - 23:09 Uhr

Folgendes Problem. Ich hab ein Control welches unter anderem Icons zeichnet, diese aber nur wenn Application.RenderWithVisualStyles == true ist. Um dies zu gewehrleisten hab ich vor dem erzeugen der ersten Form folgendes aufgerufen:


Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

Jetzt kommt aber das Problem. Führe ich die Anwendung auf einem Vista System auf, dann funzt es bestens. Jetzt habe ich das auf 2 XP Rechnern geteset, bei einem ging es, bei dem anderen nicht.

Jetzt zur Frage(n): Ich dachte es wäre ab WinXP standart das die VisualStyles anzuschalten gehen? Sollte das nicht so sein, warum können die Styles auf diesen einen Rechner nicht angeschalten werden bzw. verwendet werden.

Google wusste nicht wirklich viel dazu, zumindets wusst ich nicht nach was ich zusätzlich zu VisualStyles suchen sollte.

Danke für eure Hilfe...

14.05.2009 - 20:04 Uhr

Jo das hab ich mir schon gedacht. Wollt nur sicher gehen, nicht das einer ne bessere Idee hat 😃

14.05.2009 - 20:03 Uhr

Debug doch einfach mal auf einer neueren Maschine bzw. auf einen Laptop. Dann siehst du doch was nicht funzt.

14.05.2009 - 16:29 Uhr

Jo kleines_eichhoernchen schon klar, den brauche ich ja in meinem Fall nicht. Aber noch eine Interessante Sache. Folgendes Scenario. Der Thread wird gestartet, und ruft eine funktion start() auf. In der start werden dann die eigentlichen Operationen/Rechnungen etc. aufgerufen. Angenommen jede funktion dauert 2-3 Sekunden, und ich frage nach jeder Funktion auf die isaborted ab, dann dauert das beenden des Threads im worst case 3 sekunden. Ist es jetzt wirklich notwendig die abfrage auch auf die Calc1,... zu beziehen, daher auch in diesen Funktionen auf die regelmäßig auf die isaborted abzufragen, oder gibt es da eine "einfachere" bzw. "schnellere" Lösung?


private void Start()
{
        if (!isaborted)
            this.Calc1();
        if (!isaborted)
            this.Calc2();
        if (!isaborted)
            this.Calc3();
}

14.05.2009 - 12:16 Uhr

Hier mal eine kurze Lösung. Als erstes die Fahrzeug und die RennStrecken Klasse.


public class Fahrzeug
{
    private Pen p;
    private Color farbe;
    private int xpos;
    private int ypos;

    public Fahrzeug(int x, int y, Color farbe)
    {
        p = new Pen(farbe, 2);
        this.farbe = farbe;
        xpos = x;
        ypos = y;
    }

    public Pen GetPen() 
    { 
        return this.p; 
    }

    public Color GetFarbe() 
    { 
        return this.farbe; 
    }

    public int GetXPos() 
    { 
        return this.xpos; 
    }

    public int GetYPos() 
    { 
        return this.ypos; 
    }

    public void SetPen(Pen p) 
    { 
        this.p = p; 
    }

    public void SetFarbe(Color farbe) 
    { 
        this.farbe = farbe; 
    }

    public void SetXPos(int xpos) 
    { 
        this.xpos = xpos; 
    }

    public void SetYPos(int ypos) 
    { 
        this.ypos = ypos; 
    }

    public void Draw(Graphics car)
    {

        //Reifen
        car.DrawRectangle(p, xpos, ypos, 10, 10);
        car.DrawRectangle(p, xpos + 50, ypos, 10, 10);
        car.DrawRectangle(p, xpos, ypos + 50, 10, 10);
        car.DrawRectangle(p, xpos + 50, ypos + 50, 10, 10);

        //Achsen
        car.DrawLine(p, xpos + 5, ypos + 10, xpos + 5, ypos + 20);
        car.DrawLine(p, xpos + 55, ypos + 10, xpos + 55, ypos + 20);
        car.DrawLine(p, xpos + 5, ypos + 40, xpos + 5, ypos + 50);
        car.DrawLine(p, xpos + 55, ypos + 40, xpos + 55, ypos + 50);

        //Chassis
        car.DrawRectangle(p, xpos, ypos + 20, 70, 20);


        //Helm
        car.DrawEllipse(p, xpos + 35, ypos + 25, 10, 10);
    }
}

public class RennStrecke : Panel
{
    private List<Fahrzeug> autos;
    private Timer timer;

    public RennStrecke()
    {
        this.DoubleBuffered = true;
        this.autos = new List<Fahrzeug>();
        timer = new Timer();
        timer.Interval = 2;
        timer.Tick += new EventHandler(timer_Tick);
    }

    protected override void OnCreateControl()
    {
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        this.SetStyle(ControlStyles.ResizeRedraw, true);
        this.SetStyle(ControlStyles.UserPaint, true);
        this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);

        base.OnCreateControl();
    }

    void timer_Tick(object sender, EventArgs e)
    {
        foreach (Fahrzeug auto in autos)
        {
            if (auto.GetXPos() < this.Width - 80)
            {
                auto.SetXPos(auto.GetXPos() + 1);
            }
        }
        this.Invalidate();
    }

    public void Start()
    {
        this.timer.Start();
    }

    public void Stop()
    {
        this.timer.Stop();
    }

    public void Reset()
    {
        foreach (Fahrzeug auto in autos)
        {
            auto.SetXPos(10);
        }
        Invalidate();
    }

    public List<Fahrzeug> Auto
    {
        get
        {
            return this.autos;
        }

        set
        {
            this.autos = value;
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        foreach (Fahrzeug auto in autos)
        {
            auto.Draw(e.Graphics);
        }
    }
}

Nun die Rennstrecke in eine Form rein tun, dann ein paar Autos erzeugen und die Methode Start() der Rennstreckle aufrufen.


rennstrecke = new RennStrecke();
rennstrecke.Auto.Add(new Fahrzeug(10, 10, Color.Blue));
rennstrecke.Auto.Add(new Fahrzeug(10, 150, Color.Red));
rennstrecke.Auto.Add(new Fahrzeug(10, 310, Color.Green));

rennstrecke.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
rennstrecke.Width = this.Width;
rennstrecke.Height = this.Height - 20;
rennstrecke.Location = new Point(0, 20);
this.Controls.Add(rennstrecke);
this.rennstrecke.Start();

Und dann fahren die Autos los....

14.05.2009 - 11:10 Uhr

So macht man das nicht. Du Zeichnest auf die Form. Ich würd mir noch eine Klasse erstellen die Rennstrecke heißt und von bsp. Panel erbt.

Die Klasse Rennstrecke enthält dann alle deine Autos. In der OnPaint der Rennstreck und damit des Panels, kannst du dann die OnPaint deiner Autos aufrufen, und gleich das Graphics Object mitgeben. Du erzeugst nämlich jedesmal ein neues, das sollte man nicht tun. Generell sollte man kein eigenes Graphic Object erzeugen, nur in speziallfällen...

14.05.2009 - 11:01 Uhr

Ok Danke euch, ich werd das also mit dem Flag implementieren.