Announcement

Collapse
No announcement yet.

Probleme mit Shape Rectangle/Oval

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit Shape Rectangle/Oval

    Hallo,

    ich habe mir für ein Mühlebrett nur die Standardcontrolls für Linie, Rechteck und Ellipse genommen (siehe Bild 1 unten).

    Sobald ich das Spiel mit einem beliebigen anderen Programm verdecke und dann wieder sichtbar mache, sind allerdings die Steine (Ellipse), die verdeckt wurden (und nur die), hinter die Rechtecke/Linien gerutscht (siehe Bild2). Im Beispiel waren nur die 2 dunklen Steine der 4 vollständig verdeckt, ein heller nur zur Hälfte.

    Ich habe keinen Event gefunden, um das Brett sinnvoll neu zu malen. Hat jemand einen Tipp für mich.
    Rainer

    Zuletzt editiert von NetAktiv; 30.06.2011, 17:18.

  • #2
    Die Controls haben eine Invalidate Methode die ein Neuzeichnen forcieren.

    Nebenbei ich würde das Spielbrett eher selbst zeichnen. Ein neues Control von z.B. Panel ableiten dessen OnPaint Methode überschreiben und dort das Zeichnen über das Graphics Object das an diese Methode übergeben wurde erledigen. Im veröffentlichten Paint Event dieses Panels kannst du dann zusätzlich die Spielsteine zeichnen. Damit hast du auf Jedenfall eine eindeutige Reihenfolge in der Spielfeld und Spielsteine gezeichnet werden und keinerlei Reihenfolgeprobleme die vermutlich zu deinem beobachteten Problem führen.

    In den Beispielen der Hilfe zu OnPaint kann man eigentlich recht gut sehen wie ich das meine. Zufällig wird da auch Invalidate (aber aus anderen Gründen) verwendet

    Comment


    • #3
      Hallo Ralf,
      nach Invalidate-Events habe ich geforscht, aber die sorgen scheinbar nicht für das Neuzeichnen. Nun habe ich einfach mal versucht, das Brett durch eine Grafik (Picturebox) darzustellen. Dann passiert aber das gleiche, man kann die Steine sogar 'ausradieren', wie das Bild zeigt.

      Das ist mein erster Versuch mit Grafiken und da möchte ich eigentlich vermeiden, extra eigene Klassen zu definieren und Methoden zu überschreiben. Es muss doch eine einfache Möglichkeit geben, ein paar Kreise vor einem Brett-Bild zu verschieben. Was ich komisch fand war, dass Steine und Brettelemente in unterschiedlichen Shape-Containern enthalten sind.

      Comment


      • #4
        Das ist mein erster Versuch mit Grafiken und da möchte ich eigentlich vermeiden, extra eigene Klassen zu definieren und Methoden zu überschreiben.
        Eigentlich kein schlechter Gedanke. Aber das Visual Basic PowerPack enthält reinen Legacy Mist (meine Meinung) damit alte VB Entwickler ihren vorhanden Code bzw Codierstil in VB.Net weiter benutzen können. Da du scheinbar ein VB.Net Einsteiger bist würde ich dir raten etwas mehr .Net-Like vorzugehen. So lernst du nur wie man damals in VB vorgegangen wäre obwohl du VB.Net benutzt. Der Nutzwert des Wissens das du dir dabei aneignest geht daher gefühlt gegen null.

        nach Invalidate-Events habe ich geforscht,
        Methode nicht Event. Shapes scheinen keine richtigen Controls zu sein (Ich hatte glaube ich schon erwähnt das die Mist sind ). Ich vermute mal das man dann Invalidate am ShapeContainer aufrufen müsste.

        Comment


        • #5
          Hallo Ralf,
          OK, die Invalidate-Methode gibt es natürlich neben dem von mir untersuchten Invalidated-Event auch. Nur hilft die mir nichts, da ich nicht weiß, wann ich die aufrufen soll. Derzeit mache ich den Repaint manuell (nicht durch die Invalidate-Methode sondern die Refresh-Methode) durch einen Click auf das Board :-). Wie eingangs gesagt, mir fehlt ein sinnvoller Event, der mir automatisch meldet, dass ich das Brett (oder einen Stein) neu Malen muss.
          Grüße, Rainer
          Zuletzt editiert von NetAktiv; 30.06.2011, 20:37.

          Comment


          • #6
            Wie eingangs gesagt, mir fehlt ein sinnvoller Event, der mir automatisch meldet, dass ich das Brett (oder einen Stein) neu Malen muss.
            Wenn das System erkennt das ein Neuzeichnen nötig ist wirft es keinen Event sondern zeichnet eben neu Wäre ja ziemlich dumm den User damit zu belästigen. Es sind nur Methoden (wie Invalidate() oder Refresh()) veröffentlicht damit man manuell das Neuzeichnen anstoßen kann für denn Fall das das System eben nicht selber merken kann das ein Neuzeichnen nötig ist. Das man Fenster übereinander schiebt gehört sicherlich nicht zu dem Fall den man manuell berücksichtigen muss das gibt das System natürlich von selbst her.

            Das es bei dir scheinbar manchmal schief läuft liegt dann vermutlich daran das du mehrere ShapeContainer hast und nicht immer alle neugezeichnet werden. Du solltest also dieses Problem lösen dann löst sich dein Zeichnenproblem wahrscheinlich von selbst.

            Comment


            • #7
              Originally posted by Ralf Jansen View Post
              Du solltest also dieses Problem lösen dann löst sich dein Zeichnenproblem wahrscheinlich von selbst.
              Hab ich schon versucht, indem ich für die Steine das Shape.Add von einem Container auf den anderen verlegt habe. Dann bekomme ich keine Fehlermeldung, aber ich sehe auch keine Steine mehr

              Hätte ja sein können, dass zumindest manche Events geworfen werden wie Activate oder Focus, wenn die Form wieder nach vorne kommt, aber selbst das ist nicht der Fall. Bissl versuch ich noch und dann lebe ich einfach mit dem Click auf die Main-Form. Schließlich soll es nur ein Hilfsmittel für mich sein, um schnell Screenshots von Mühlestellungen zu machen und diese in die Zwischenablage zu kopieren oder als Datei zu speichern. Beides klappt schon hervorragend, wie die Beispiele hier ja zeigen

              Comment


              • #8
                Hab ich schon versucht, indem ich für die Steine das Shape.Add von einem Container auf den anderen verlegt habe. Dann bekomme ich keine Fehlermeldung, aber ich sehe auch keine Steine mehr
                Ruf mal nach dem Add BringToFront() des Shapes auf. Ich denke mal deine Steine liegen nur einfach hinter den anderen Shapes. Aber wieso hast du überhaupt mehrere Shapecontainer programmiert? Es ist dein Programm du hast denn Sourcecode warum schmeißt du nicht alle anderen Container außer einem weg?

                Comment


                • #9
                  Originally posted by Ralf Jansen View Post
                  Ruf mal nach dem Add BringToFront()
                  Das habe ich schon, sonst wären die Steine von Anfang an hinter dem Spielfeld. Ich muss auch einen Refresh/Invalidate aller Steine machen, wenn ein neuer in das Feld gelegt wird, da sonst die anderen hinter dem Brett verschwinden.

                  Ich bin wie folgt vorgegangen: Erst Brett mit der VS2010 GUI erstellen, wobei VS alles in Container1 gelegt hat. Dann ein paar Steine erstellt und neben das Brett gelegt, wobei mir VS in der Designer-Datei den 2. Container angelegt. Dann habe ich die manuell erstellten Steine gelöscht und VS hat dabei auch den leeren Container2 gelöscht. Danach habe ich die Steine beim Load dynamisch im verbleibenden Container1 angelegt (und habe sie auf der Oberfläche nicht gefunden). Erst nachdem ich wieder einen Container2 angelegt habe und die Steine darin ablege, sehe ich sie auch.

                  Nun habe ich das Brett (vorher 1Panel, 3 Rechtecke und 4 Linien) durch eine Grafik ersetzt und das Problem ist damit weg. Ich habe etwas weiter gemacht um auch die Steine mittels Drag und Drop bewegen zu können und dazu muss ich das Brett immer nach einem MouseMove-Event neu zeichnen, sonst sehe ich den Weg des Steins. Das flimmert zwar irgendwie, aber damit kann ich nun leben.

                  Grüße, Rainer
                  Zuletzt editiert von NetAktiv; 01.07.2011, 13:18. Reason: Problem teilweise gelöst

                  Comment

                  Working...
                  X