Laden...

[gelöst] Fliegende/Fixe Formelemte auf Panel

Erstellt von Birne vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.089 Views
B
Birne Themenstarter:in
67 Beiträge seit 2009
vor 14 Jahren
[gelöst] Fliegende/Fixe Formelemte auf Panel

Hallo Community,

ich Suche eine Lösung für das folgende Problem.

Auf einem Panel habe ich 4 Formelemente: 3 Buttons, eine Picturebox.
Die AutoScroll Eigenschaft des Panels ist auf true gesetzt.
Wird die Picturebox größer als das Panel, erscheinen wie erwartet die Scrollbars.
Betätige ich diese so scrollen aber nicht nur die Picturbox, sondern auch die 3 Buttons mit.

Wie realisiere ich "fliegende/fixe" Buttons welche sich stets auf ein und derselben Position relativ zum Bildschrim oder der gesamten Form befinden ?

Ich bin für jeden Lösungsansatz/Workaround dankbar 😃

Birne

23 Beiträge seit 2009
vor 14 Jahren

Hi Birne,

ich bin derzeit auch am Experimentieren mit ähnlichen Dingen, und will auch eine dynamische Messagebox erstellen, die sich je nach angezeigter Nachricht und angezeigten Elementen selbst ändert.

Um so etwas wirklich gut hinzubekommen ist, denke ich, viel Erfahrung, oder viel Geduld notwendig. Ich empfehle dir, mit den Eigenschaften "Anchor" und "Dock" zu experimentieren.

Mit Ankern kannst du Steuerlemente an dem übergeordneten Container, also zB. einem Panel, verankern. Die verankerten Elemente haben dann zu den Kanten, zu den sie verankert sind (oben, unten, links oder recht) immer den selben Abstand.

Dock bewirkt, dass ein Steuerlement den gesamten Rand, an dem es angedockt wird einnimmt. Du kannst auch daher immer nur eine Kante zum andocken wählen.

Ich hoffe, ich sage dir etwas Neues. Falls ja, experimentier ein wenig.. und viel Erfolg dabei 😃

Gaahl

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Birne,

pack die Buttons auf eine anderen Panel als die PictureBox.

herbivore

B
Birne Themenstarter:in
67 Beiträge seit 2009
vor 14 Jahren

Hallo,

Die Buttons liegen nicht auf der Picturebox.
Sie liegen genau wie die PictureBox auch, auf einem Panel.

[PANEL]
[BUTTON]
[BUTTON]
[BUTTON]
[PICTUREBOX]
[/PANEL]

Wird die PictureBox zu groß, so erscheinen die Scrollbalken und wie erwartet kann gescrollt werden.
Jedoch sollen die Buttons ihre Position in Bezug auf die Formkoordinaten nicht ändern.
Die Position auf dem Panel ist ja nach wie vor die Selbe, ob gescroltl wird oder nicht.

Resultat, die 3 Buttons verschwinden beim scrollen mit Teilen der Picturebox ggf. in den nicht sichtbaren und somit nicht nutzbaren Bereich.

Schwer zu erklären, aber die Buttons sollen ähnlich wie fliegendes Menü einer Website sein, diese Menüs befinen sich stets auf der selben position in bezug auf das Browserfenster, egal wo sich der SeitenContent durch das scrollen gerade befindet.

Danke schonmal für Antworten bisher.

H
81 Beiträge seit 2008
vor 14 Jahren

Das kann so aber nicht funktionieren. Wenn die Buttons nicht mit gescrollt werden sollen muss das so aussehen:

[PANEL]
[BUTTON]
[BUTTON]
[BUTTON]
[/PANEL]
[PANEL]
[PICTUREBOX]
[/PANEL]

B
Birne Themenstarter:in
67 Beiträge seit 2009
vor 14 Jahren

Genau diese Struktur möchte ich vermeiden :\

Darum meine Frage, ob es eine Möglichkeit gibt die Buttons fix zu positionieren.
Eine Möglichkeit wäre es, sich an die Scrollevents dranzuhängen und abhängig von der aktuellen Scrollposition die Buttons in ihrer Position auf dem Panel zu ändern.

Ich schätze diese Variante jedoch selbst als suboptimal ein, denn ich glaube kaum, dass dies Performant umzusetzen ist.

H
81 Beiträge seit 2008
vor 14 Jahren

Nun rein theoretisch kann man die Buttons immer wieder neu positionieren. Ist aber viel zu viel Aufwand. 2 Panels sind da eindeutig die bessere Lösung.

B
Birne Themenstarter:in
67 Beiträge seit 2009
vor 14 Jahren

Ich könnte in der Tat ein weiteres Transparentes Panel hinzufügen, so dass die Struktur wie folgt ausschaut:

[FORM]
[PANEL]
[BUTTON]
[BUTTON]
[BUTTON]
[/PANEL]
[PANEL]
[PICTUREBOX]
[/PANEL]
[/FORM]

Nur weiss ich aus Erfahrung, das TransparenteControls, GDI und Performance sich überhaupt nicht vertragen :S

Wäre alles so trivial, hätte ich in diesem Fall nicht nachgefragt.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Birne,

Genau diese Struktur möchte ich vermeiden

warum? Das ist die einfachste und beste Lösung.

herbivore

B
Birne Themenstarter:in
67 Beiträge seit 2009
vor 14 Jahren

Hmm letzlich nur wegen der Steuerstruktur.

Ich habs nun so gelöst wie ihr es mir geraten habt, nur befriedigt mich das auf keinster Weise.

Panel mit Buttons ruft Methode auf Panel(Conatiner) auf, dieses wiederrum die entsprechende Methode auf der Picturebox.

Beispiel LoadImage:

Button, ClickEvent -> Panel(Conatiner), LoadImage -> ImageBox, LoadImage.

Natürlich äußerst funktional aber unhübsch wie ich finde.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Birne,

dein Form kennt doch alle seine Controls, egal ob diese nun direkt oder indirekt im Form enthalten sind (eine Ausnahme sind die Controls, die in einer eigenen Klasse z.B. einem UserControl gekapselt sind, aber das trifft ja hier nicht zu).

Insofern kann das Form direkt das Click-Event des Buttons abonnieren und im entsprechenden EventHandler direkt die PictureBox setzen. Da muss mal also nicht mehrere Methoden involvieren, sondern kann alles direkt machen.

herbivore

B
Birne Themenstarter:in
67 Beiträge seit 2009
vor 14 Jahren

dein Form kennt doch alle seine Controls, egal ob diese nun direkt oder indirekt im Form enthalten sind (eine Ausnahme sind die Controls, die in einer eigenen Klasse z.B. einem UserControl gekapselt sind, aber das trifft ja hier nicht zu).

Naja doch ^^
Der Container ist von Panel abgeleitet und die Picturebox ist eben auch ein UserControl abgeleitet von PictureBox.

Ich habs nicht mit angegeben, weil ich dem bei der Lösung des Problems keine Bedeutung zugestanden habe >_>

Entschuldigt bitte :\

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Birne,

die Picturebox ist eben auch ein UserControl abgeleitet von PictureBox

Das spielt für das von mir Gesagte keine Rolle. Es geht ja nur darum, dass man das Image setzen kann und dazu muss man nur bis zum UserControl kommen, nicht tiefer.

Der Container ist von Panel abgeleitet

Ok, das würde eine Rolle spielen, aber warum ist das so?

Und selbst wenn das so ist, sehe ich kein Problem. Denn du wolltest ja sowieso am liebsten alles in einem Panel haben. Wenn diese Panel nun eine eigene Klasse UserPanel sein soll, gut. Das hindert das UserPanel ja nicht daran, selbst wieder zwei Panels zu enthalten, einen für den statischen und einen für den scrollbaren Teil. Dann gilt das, was ich oben gesagt habe genauso, nur dass du Form durch UserPanel ersetzen musst.

herbivore

B
Birne Themenstarter:in
67 Beiträge seit 2009
vor 14 Jahren

Nun ja warum ist dies so.
Die Picturebox enthält in meinem Fall eine Karte, auf dieser können markierungen und andere Geometrische Figuren hinzugefügt werden.
Ebenso gibt es die Möglichkeit herein und heraus zu zoomen, die Markiereungen mit der Maus zu verschieben usw usf. Ähnlich wie google Maps.

Das Panel(Container) dient nur dazu die Karte zu scrollen.
Das heisst wird in die Picturebox gezoomt wird auch das Control selbst, also die Picturebox entsprechend größer. Ich wollte keine eigenen Scrollbars implementieren also habe ich das ganze Control(PictureBox) in ein Panel(mein Container) gepackt, und dort aus verschiedenen Gründen die OnMouseWheel Methode überschrieben -> Deshalb eben das User Control.

Ich hoffe es ist halbwegs verständlich :\

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Birne,

um die MouseWheel-Ereignisse mitzubekommen, musst du ja nun nicht gleich das Panel überschreiben. Du kannst vom Form aus einfach einen EventHandler registrieren. Aber selbst wenn du ein "SpecialMouseWheelPanel" hättest, wäre das immer noch eher vergleichbar mit einem normalen Panel als mit einem echten UserControl. So wie ein Form wissen darf, welche Elemente auf einem Panel enthalten sind, dürfte es das auch bei einem "SpecialMouseWheelPanel" wissen.

Und dass du die Picturebox überschrieben hast, stört - wie schon gesagt - nicht.

Es bleibt also dabei:

Insofern kann das Form direkt das Click-Event des Buttons abonnieren und im entsprechenden EventHandler direkt die PictureBox setzen. Da muss mal also nicht mehrere Methoden involvieren, sondern kann alles direkt machen.

herbivore

B
Birne Themenstarter:in
67 Beiträge seit 2009
vor 14 Jahren

Danke, so werde ich vorgehen.