horizontales und vertikales Lineal

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von PrinzCharly.

    horizontales und vertikales Lineal

    Hallo Leute...
    Finde trotz google keinen Ansatz.
    Ich möchte über und links neben einem scrollbaren Panel (mit PictureBox = 'BildPanel') ein Lineal (als Bild - ebenfalls in einer PictureBox) anzeigen. Wenn ich das BildPanel horizontal scrolle, muss sich das obere Bild 'mitscrollen', wenn ich vertikal scrolle, das linke. Habe gerade mal überhaupt keine wirkliche Idee, wie ich das elegant realisiere...

    Ein denkbarer Ansatz: das obere Linieal ebenfalls in ein Panel setzen und die horizontale Bildlaufleiste mit dem 'BildPanel' synchronisieren. Ebenso das vertikale. Sieht aber nicht schön aus, weil ich dann ja unnötigerweise die Scrollleisten oben zwischen 'Linieal' und 'BildPanel' stehen habe. Gleiches links.

    Jemand einen eleganteren Ansatz?

    Danke
    PrinzCharly
    @PrinzCharly Hast Du bereits eine richtig scrollende PictureBox?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Was ist eine 'richtig scrollende PictureBox'?
    Ich habe ein Panel mit einer PictureBox drin. In der lasse ich meine Seekarten anzeigen. Aus diesen Seekarten kopiere ich die dort vorhandenen 'Linieale' für Längen und Breitengrade heraus und will diese fix über und neben der Seekarte anzeigen. Je nach Position für vertikalen und horizontalen Scroll des Panels sollen sich diese dann mit verschieben.
    In der Grafik im Dateianhang kannst du die obere - die horizontale Bildlaufleiste schon erkennen. Darunter die in der Seekarte vorhandene. Im ScreenShot selbst liegt das obere Lineal noch mit im Panel. Das heißt, wenn ich dieses (die Seekarte) jetzt nach unten scrolle, verschwindet auch das Linial nach oben. Es soll dort aber stehen bleiben und nur horizontal mit scrollen...
    Hoffe, ich habe es ausreichend erklärt.
    Bilder
    • ScreenShot.jpg

      463,59 kB, 1.920×1.050, 299 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „PrinzCharly“ ()

    PrinzCharly schrieb:

    eine 'richtig scrollende PictureBox
    ist eine PictureBox, die ScrollBars generiert, wenn nicht das gesamte Bild in ihr angezeigt wird.
    Wenn Du so was hast, reden wir über die Lineale.
    Falls (noch) nicht, löse dieses Problem zunächst in einem kleinen Testprogramm.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Hmm...
    Eine PictureBox hat im Standard keine Bildlaufleisten. Müsste man also irgendetwas selbst herstellen. Keine Ahnung, ob ich mich da jetzt zu in der Lage sehe, das so auf die Schnelle zu realisieren...
    Sehe auch noch nicht so ganz den Sinn - da ich doch über den Umweg: PictureBox in einem Panel - welches über AutoSroll verfügt - das gleiche erreiche?
    Zudem hängt das jetzt schon ziemlich alles in dem Projekt derart drin, dass es vermutlich recht aufwändig würde, dass alles anzupassen. Besonders, da ich von dem Panel ein zweites Fenster mit den gleichen Hinhalten (Referentenfenster, Präsentationsfenster für Beamer) steuere, synchronisiere.

    Kannst du mir kurz erläutern, warum die PictureBox selbst die Bildlaufleisten haben muss und ich nicht das Panel dazu nehmen kann.

    PrinzCharly schrieb:

    zu realisieren
    Da gibt es fertige Lösungen.
    Suche nach PictureBox mit ScrollBar oder so was.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    PrinzCharly schrieb:

    So in etwa?
    Nö.
    AutoScroll-Panel mit ner Fill-PictureBox drin. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    oh man(n) - schwierige Geburt diesesmal...
    Die habe ich doch. Das war doch meine Ausgangssitutation!!! Siehe ScreenShot oben. Die 'Seekarte' liegt in der PictureBox, die Scrollleisten rechts und unten sind die vom AutoScroll-Panel.
    Panel mit Autoscroll. An Location(0, 0) liegt die PictureBox. Diese wird auf die Größe der Seekarte eingestellt. Ist dann die PictureBox größer wie das Panel, werden automatisch die Scrollbalken angezeigt. Das habe ich, läuft!
    Jetzt brauche ich aber oben und links jeweils eine schmale PictureBox, die Lineale aufnehmen und mitscrollen, wenn ich das Panel scrolle. Also sind wir wieder am Ausgang. Und da komme ich nicht weiter und erhoffe mir Hilfe.

    PrinzCharly schrieb:

    mitscrollen
    Vielleicht malst Du die auch bei Änderung der Scrollposition und Vergrößerung.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Wenn das dein Vorschlag ist, werde ich darüber nachdenken!
    Grafikbearbeitung, wie ich sie hier anwende, ist für mich relatives Neuland. Sammle gerade erst die anfänglichen Erfahrungen. Aber ist sicherlich ein Lösungsansatz - den ich ja gesucht habe. Werde es mal umsetzen. Im Prinzip sind es ein paar Codzeilen und ein paar Anpassungen im Designer; keine Ahnung, warum ich davor scheue.
    Danke dir auf jeden Fall für den praktischen Ansatz...
    lg
    PrinzCharly
    Jo, einfach im Picturebox_Paint-Event das Lineal richtig skaliert mit einzeichnen.
    Dann ist das Lineal in der Picturebox, und wenn du das Panel mit der PB drinne scrollst, dann ist das Lineal mit-gescrollt.

    Das Problem ist, dass du beim Zeichnen des waagerechten Lineals Panel.AutoScrollPosition.Y mit einbeziehen musst. Weil wenn AutoScrollPosition.Y < 0 ist, dann würdest du dein Lineal ausserhalb des angezeigten Bereiches malen.
    Für vertikale Lineale gilt selbiges entsprechend.
    Vielleicht so:
    Male das vollständige Lineal in einen GraphicsPath (ggf. mehrere für verschiedene Vergrößerungen => Strichabstände) und stell den dann gestreckt und verschoben (Elementartransformationen von GraphicsPath) dar.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo...
    Schaut euch noch mal die obige Grafik aus meinen Projekt an. Jede Seekarte beinhaltet diese 'Koordinaten-Lineale'. Sie sind elementarer Bestandteil und für die Navigation zur Positions- und Entfernungsbestimmung notwendig. In der Seekarte selbst könnt ihr das horizontale Linieal sehen, und am oberen Rand bereits in einer 2ten PictureBox das 'ausschnittkopierte' Lineal.

    Da diese Linieale auch nicht 'linear' sind (was sich bei kleinen Maßstäben besonders zeigt) zeichne ich die nicht selbst. Ich kopiere das Lineal aus der Seekarte - nachdem ich diese gezoomt habe - heraus und füge dann die Grafik in die 'Lineal-Pictuerboxen'. Ursprünglich wollte ich das für das horizontale Linieal über die gesamte Kartenbreite und für das vertikale Linieal über die gesamte Kartenhöhe machen.
    Anschließend beim Scroll der Karte dann die beiden Pictureboxen einfach 'mitscrollen' lassen.
    Jetzt werde ich mit jedem Scroll den Ausschnitt neu berechnen und das Linial neu kopieren müssen. Muss mal testen, wie und ob das 'optisch' aussieht (Bildflackern).

    PrinzCharly schrieb:

    einfach 'mitscrollen' lassen
    Wie wäre es. wenn Du 3 PictureBoxen hast. Links eine PB konstanter Breite und übernommener Höhe (vertikales Lineal),
    unten eine PB konstanter Höhe und übernommener Breite (horizontales Lineal),
    rechts oben eine PB (die Seekarte).
    Da musst Du beim Scroll nur die Größe und die Position übernehmen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die 3 Pictuerboxen war ja mein Ansatz. In dem ScreenShot sind ja schon 2 drin (Karte unten und am oberen Rand die für das horizontale Lineal - kann man aber nicht wirklich erkenne, weil das Linial da noch in dem Panel der Seekarte liegt. Habe das nachher daraus entfernt und oberhalb des Panels gesetzt). Die PB oben wird auch schon passend scaliert (wenn der Maßstab sich verändert, muss sich auch die Dimension der Linieal PB ändern).
    Nur - da bin ich wieder am Anfang - wie scrolle ich eine PB? Die PB der Seekarte liegt auf einem AutoScroll-Panel. Ich scrolle ja nicht die Seekarte sondern das Panel dazu!
    Simpel, wie ich gedacht habe, wäre es, auch die Lineal-PB in ein AutoScroll-Panel einzubetten, welches dann genau oberhalb des Seekarten-Panel liegt. Scrolle ich dann die Seekarte, übergebe ich die Scroll-Value an die Scroll-Value des Linieal-Panels. Das ganze funktioniert auch super - habe es am laufen. Brauche das Lineal nur beim Zoom anzupassen. ABER: Optisch stören nun die sichtbaren Bildlaufleisten der Lineale.
    Als 'Trick' kann man nun noch das Panel der Seekarte so positionieren, dass es exakt die Bildlaufleisten der Linieal abdeckt - Geht zu machen, wenn das eine Lineal oben ist (hat nur horizontale Laufleiste - ist also unter dem Bild) und das andere links neben der Seekarte ist (hat nur vertikale Laufleiste - ist somit rechts des Bildes). Gefällt mir aber nicht wirklich - ist halt 'optisches Getrickse'.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „PrinzCharly“ ()