Laden...

Forenbeiträge von olik Ingesamt 12 Beiträge

04.04.2011 - 18:54 Uhr

Danke!

Dachte ich mir fast, aber dann wird diese beim zweiten Aufruf (zweiter Klick) doch erneut deklariert und "resettet", oder? Es soll ja die erste Zeile erhalten bleiben und nur die zweite ergänzt werden.

Edit:
Aaaah, ich glaube, der Fehler ist, dass die Funktion den gleichen Namen hat...

Edit2:
So klappt es nun:

        int[][] endpunkt = new int[2][];
        public void endpunkte(object sender, MouseEventArgs e) // aufruf beim klicken auf bild
        {
            
            if (!klick) // definition und eintrag der koordinaten von punkt 1 nach erstem klick
            {
                endpunkt[0] = new int[] { e.X * 2 - 1, e.Y * 2 - 1 };
                klick = true;
            }

            else if (klick) // definition und eintrag der koordinaten von punkt 1 nach erstem klick
            {
                endpunkt[1] = new int[] { e.X * 2 - 1, e.Y * 2 - 1 };
                klick = false;
                label1.Text = endpunkt[0][0] + endpunkt[0][1] + endpunkt[1][0] + endpunkt[1][1];
            }

            
        }

Danke!

04.04.2011 - 18:47 Uhr

Hallo,

habe leider ewig nicht mehr mit C gearbeitet und weiß eifnach nicht, was ich hier falsch gemacht habe:

        
public void endpunkte(object sender, MouseEventArgs e) // aufruf beim klicken auf bild
        {
            if (!klick) // definition und eintrag der koordinaten von punkt 1 nach erstem klick
            {
                int[][] endpunkte = new int[2][];
                endpunkte[0] = new int[] { e.X * 2 - 1, e.Y * 2 - 1 };
                klick = true;
            }

            else if (klick) // eintrag der koordinaten von punkt 2 nach zweitem klick
            {
                endpunkte[1] = new int[] { e.X * 2 - 1, e.Y * 2 - 1 };
                klick = false;
                label1.Text = endpunkte[0][0] + endpunkte[0][1] + endpunkte[1][0] + endpunkte[1][1];
            }
        }

endpunkte[1] geht schon nicht, da endpunkte[][] bis dahin schon wieder weg ist. Wie müsste ich hier korrekt vorgehen?

Danke!

07.05.2010 - 16:07 Uhr

Das ist mir klar, ich meinte, warum es ohne Live-Funktion auch OHNE DoEvents klappt.

Sobald ich die Maus bewege, startet er das MouseEvent, gibt zu allererst die Koordinaten aus und macht sich dann an das Live-Bild. Ist das Live-Bild fertig, merkt er, dass die Maus sich immer noch bewegt und fängt von vorne an - und zwar wieder mit
den Koordinaten.

Wo ist hier der Denkfehler? Denn so scheint es ja scheinbar nicht zu laufen... Und warum kann ich nicht in der for-Schleife den Status ausgeben lassen, also pro Pixel-Abruf direkt die Statusleiste aktualisieren?

Deinen Link werde ich mir mal anschauen - kennst du auf Anhieb also auch keine einfache Lösung? Denn eins von beidem haben wir ja nun jeweils umgesetzt, nur beides zusammen klappt noch nicht...

Danke!

07.05.2010 - 15:40 Uhr

Tatsächlich - leider bricht er aber an der Stelle die MouseMove-Methode ab, baut das Live-Bild also garnicht erst auf...

Warum klappt es denn ohne Live-Funktion auch ohne das DoEvents()? Würde gerne verstehen, was dahinter steckt...

07.05.2010 - 15:24 Uhr

Sorry Leute, habe völlig vergessen, dass an einer anderen Stelle noch bei jedem MouseMove der Bildausschnitt, über den die Maus gerade fährt, in einer anderen PB vergrößert wird:

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            //Berechnet Koordinaten für PB1 und übergibt an Status_ausgeben
            x = e.X * bmp.Width / pictureBox1.Width;
            y = e.Y * bmp.Height / pictureBox1.Height;
            Status_ausgeben(x, y);

            //Live-Bild von PB1 in PB2, solange live-Flag gesetzt
            if (live)
            {
                if (x > 100 && x < bmp.Width - 100)
                {
                    if (y > 100 && y < bmp.Height - 100)
                    {
                        //Abmessungen festlegen: PB2: 200 x 200
                        for (int i = 0; i < 200; i++)
                        {
                            for (int j = 0; j < 200; j++)
                            {
                                bita.SetPixel(i, j, bmp.GetPixel(x + i - 100, y + j - 100));
                            }
                        }
                    }
                }

                pictureBox2.Refresh();
            }
        }

Ohne dies ist die Anzeige tatsächlich vollkommen flüssig.

Was mich aber dann wundert: Das Live-Bild ist vollkommen ruckelfrei und flüssig - warum sind es die Koordinaten dann nicht? Jemand eine Idee, was ich am Code ändern könnte? Es ist nichtmal flüssig, wenn ich die Koordinatenzuweisung und Status_ausgeben(x, y); mit in die for-Schleife nehme, er die also eigentlich ständig ausführen müsste?

07.05.2010 - 15:15 Uhr

Hm, auch toolStripStatusLabels können kein .Refresh! 😦

Und zum Thema kostspieliege Aktionen: Auch, wenn ich nur


toolStripStatusLabel1.Text = "X: " + x + " / Y: " + y;

drinstehen habe, ist es nicht live... Und selbst wenn es so gehen würde - eine schnellere Methode als GetPixel gibt es ja leider nicht, um die aktuelle Farbe abzugreifen. Programme wie Photoshop schaffen das doch auch live, also woran hängt es? Sicherlich nicht an der CPU 😉

07.05.2010 - 13:42 Uhr

Also echt niemand eine Idee? Kann doch normal nicht so schwer sein...

06.05.2010 - 19:44 Uhr

@herbivore: Das war nur eine alternative Idee von mir, die natürlich nicht funktionierte!

@Cat: Das macht Sinn, aber dein Code liefert mir

System.Windows.Forms.ToolStripStatusLabel' does not contain a definition for 'Refresh' and no extension method 'Refresh' accepting a first argument of type System.Windows.Forms.ToolStripStatusLabel' could be found (are you missing a using directive or an assembly reference?)

Edit: Scheint kein Refresh zu geben bei StatusLabels...

06.05.2010 - 18:46 Uhr

Status_ausgeben haut einfach nur die Koordinaten unten in die Leiste rein, je nachdem, was man gerade möchte:


private void Status_ausgeben(int x, int y)
        {
            if (status == "koordinaten")
            {
                toolStripStatusLabel1.Text = "X: " + x + " / Y: " + y;
            }

            else if (status == "farbe")
            {
                int ro = bita.GetPixel(x, y).R;
                int gr = bita.GetPixel(x, y).G;
                int bl = bita.GetPixel(x, y).B;
                toolStripStatusLabel1.Text = "R: " + ro.ToString() + " / G: " + gr.ToString() + " / B: " + bl.ToString();
            }

...

        }

Das klappt wie gesagt auch einwandfrei, aber die Neuberechnung erfolgt halt immer nur, wenn ein "MouseMove" abgeschlossen ist... Das heißt solange ich wild herumfuchtel passiert nichts, wenn ich ganz kurz anhalte sind die Koordinaten da!

06.05.2010 - 12:34 Uhr

Hallo,

per

       
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            //Berechnet Koordinaten für PB1 und übergibt an Status_ausgeben
            x = e.X * bmp.Width / pictureBox1.Width;
            y = e.Y * bmp.Height / pictureBox1.Height;
            Status_ausgeben(x, y);
        }

gebe ich live meine Koordinaten in die Statusbar.

Problem: Er updated immer nur, wenn die Maus gerade wieder steht, nich aber live beim Bewegen. Wenn ich das Stück Code per while-Schleife laufen lasse, während die Maus sich bewegt, schmiert das Programm ab.

Gibt es dafür eine Lösung?

Danke!

22.04.2010 - 10:53 Uhr

Hallo,

ich habe nun schon alles versucht, aber mein Programm schlägt einfach nicht auf KeyDown in einem Formularfeld an. Der Code dazu:


        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.A)
            {
                this.button1.Visible = false;
            }
        }

Rufe ich this.button1.Visible = false; über einen Button auf, gibt es keine Probleme. Ich vermute, dass es irgendwas mit dem Focus zu tun hat, da ich darüber eine Imagebox habe, die ständig ein Live-Bild einer anderen Imagebox liefert und somit vielleicht irgendwie den Focus stört?

Selbst, wenn ich beide Imageboxen vorher dispose, funktioniert es aber nicht... Leider reichen meine Kenntnisse an der Stelle nicht aus, um den Fehler finden zu können... Kann ich irgendwie genauer rausfinden, warum das ganze nicht funktioniert, kann ich bspw. erkennen, wo gerade der Fokus liegt bzw. kann ich den Focus irgendwie immer auf mein Formular legen?

Vielen Dank!

12.04.2010 - 20:24 Uhr

Hallo,

ich komme von C++ und damit in C# noch gänzlich neu.

Mein Ziel:
Ich bekomme ein Bild geliefert, dazu eine Textdatei, die pro Zeile drei Werte für einen Kreis erhält: X, Y, Radius. Davon so etwa 2000 Zeilen. Werte extrahieren usw. alles kein Problem.

Nun soll ich diese Kreise alle auf das Bild legen. Vorher wurde dies einfach durch ein Übermalen der originalen Bilddatei gelöst - Problem: Operationen wie das Verschieben einzelner Kreise war damit nicht möglich.

Meine Idee war daher, pro Kreis eine einzelne ImageBox zu erstellen und diese alle auf die Haupt-ImageBox mit dem Hauptbild zu legen. Doch schon beim Versuch von zwei ImageBoxen musste ich feststellen, dass das mit der Transparenz alles nicht so einfach ist wie erwartet...

Kann mir da jemand weiterhelfen, ggf. bessere Vorschläge posten, zu Tutorials verlinken oder im Idealfall einen Codeschnipsel posten, damit ich irgendeinen Anfang habe?

Besten Dank!