Laden...

Forms Resize: PictureBox mit Bild als Background und dynamisch darüber gelegten Controls

Erstellt von AlexB0815 vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.757 Views
A
AlexB0815 Themenstarter:in
2 Beiträge seit 2013
vor 10 Jahren
Forms Resize: PictureBox mit Bild als Background und dynamisch darüber gelegten Controls

Hallo zusammen,

ich suche schon seit mehreren Tagen danach, komm aber selbst auf keine Lösung und finde (oder suche falsch) nichts dazu. Folgende Ausgangslage:

Ich habe eine PictureBox, welche den Docksytle Fill besitzt und dort ist ein Hintergrundbild drinnen (dieses wird per zoom in die Box reinskaliert). Dieses Bild wird vom User in Photoshop o.ä. gemalt und ins Programm geladen und dort lokal auf der Platte gespeichert.

Das Hintergrundbild beinhaltet bereits eine Visualisierung von Computer-Symbolen und dort stehen auch schon die passenden PC-Namen dabei. Die Aufgabe meines Programmes ist nun lediglich dynamisch die Statuszustände (OK/Kritisch) jeweils über dem Hintergrundbild an passender Stelle anzuzeigen (so ähnlich wie Nagios/Nagvis).

Der User kann nun per Mausklick sich einzelne PCs aus einer Liste auswählen und setzt somit weitere PictureBoxen, welche wie o.g. den jeweiligen Status anzeigen (grüner Haken und so). Ist der User fertig, klickt er auf speichern, die Location jeder einzelnen PictureBox wird gespeichert und gut. Öffnet der User das Programm erneut, werden diese geladen und die PictureBoxen an die jeweilige Stelle geschoben.

Nun das Problem: Wenn nun der User die Größe der Form ändert (kleiner Bildschirm o.ä.), dann passt die PictureBox bekanntlich die Größe des Bildes automatisch an und stellt das Bild unverzerrt da, fügt also ggf. Ränder oben/unten bzw. seitlich dar. Somit verschieben sich natürlich die Symbole der Rechner und Namen, welche im Hintergrundbild vorhanden sind und meine dynamisch drübergelegten PictureBoxen sind an komplett falscher Stelle. Ich müsste also irgendwie eine Art Deltawert oder sowas speichern, ich komme aber absolut nicht drauf wie das anzustellen wäre bzw. wie ich herausfinde wie groß denn nun eigentlich das gezoomte Bild in Wirklichkeit ist.

Die komplette Form auf fixed zu stellen würde ich ungern, der Nutzer sollte die Form sehr wohl zur besseren Übersicht maximieren dürfen, aber auch der Nutzer mit kleinem Bildschirm sollte nicht ewig scrollen müssen.

Ich hoffe mein Problem ist nachvollziehbar 😃

Vielen Dank schoneinmal!

Grüße
Alex

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo AlexB0815,

vergiss die PictureBoxen und zeichne besser alles selber, siehe [Artikel] Zeichnen in Windows-Programmen. Das ist viel einfacher als du vermutlich denkst. Wenn du dabei Graphics.ScaleTransform benutzt, brauchst du die Koordinaten gar nicht selbst umzurechnen. Du musst nur einmal aus der Original-Große und der neuen Größe den Zoomfaktor auszurechnen.

herbivore

A
AlexB0815 Themenstarter:in
2 Beiträge seit 2013
vor 10 Jahren

Hi herbivore,

danke für die Antwort .. das würde also bedeuten, ich male zuerst alles auf dem Originalbild und resize es erst dann?

Was mich dann aber Frage: Derzeit kann man auf die einzelnen grünen Haken draufklicken und bekommt auch einen Tooltipp, hab ich einfach die Referenzen der überlagerten PictureBoxen abgespeichert .. bleiben die bei deiner Methode erhalten oder ist am Ende alles "ein Bild" und ich muss hier das rechnen beginnen?

Grüße
Alex

S
145 Beiträge seit 2013
vor 10 Jahren

Du zeichnest direkt im Speicher mit OnPaint.
Bei den Hacken würde es sich wohl ev. dann anbieten diese selbst auch direkt zu zeichnen.

Das Rectangle struct bietet dir darüber hinaus paar einfache Methoden um zu prüfen ob sich Bereiche überschneiden oder sich ein Punkt innerhalb eines Bereiches sich befindet.

Im Grunde musst du dir nur die entsprechenden Koordinaten/Bereiche meckern.
Und diese entsprechend Abfragen.

771 Beiträge seit 2009
vor 10 Jahren

Hi Spyke

Bei den Hacken ...

Zwiebelfisch: Ich glaub, es hakt!

Hinweis von herbivore vor 10 Jahren

Siehe auch In CheckedListBox einen Haken setzen [außerdem: Haken vs. Hacken] ff.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo AlexB0815,

nein, du kannst alles direkt auf den Schirm zeichnen. So wie ichs beschrieben habe und wie es im Tutorial steht. Worauf geklickt wurde bzw. wo sich die Maus befindet kommst du auch leicht raus, siehe [Tutorial] Gezeichnete Objekte mit der Maus verschieben.

herbivore