Laden...

Wie erstellt man sowas? (mit Bild)

Erstellt von Beren vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.008 Views
B
Beren Themenstarter:in
163 Beiträge seit 2008
vor 16 Jahren
Wie erstellt man sowas? (mit Bild)

Hallo Community

Unten angehängt seht Ihr ein Bild, wie ich mir den Aufbau der Benutzeroberfläche meines Programms vorstelle. Die Form ist in 3 Teile untergliedert: Links oben Signale, rechts oben Signalstreifen und unten Analysevorschriften.

Die drei Panels(?) in der Form sind per Drag & Drop automatisch in Ihrer Größe zu verändern. Man zieht dafür nur den Rahmen der Form mit gedrückter Maustaste.

Ist sowas überhaupt in der Optik mit Forms möglich? Ich habe mal ein bisschen rumgespielt, habe aber irgendwie nicht die richtige Idee, wie man sowas auf die Beine stellt...

Gruß
Beren

Das Leben ist beschissen. Aber die Grafik ist geil! 😁

F
323 Beiträge seit 2007
vor 16 Jahren

Wie wäre es mit SplitContainer bzw. Splitter?

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Beren,

bitte beachte [Hinweis] Wie poste ich richtig? Punkt 6.1 ==> Bild angehängt.

herbivore

B
Beren Themenstarter:in
163 Beiträge seit 2008
vor 16 Jahren

herbivore, mir war auch aufgefallen, daß der Link nicht funktioniert hat. Wollte es gerade korrigieren, aber Du warst schneller...

Beren

Das Leben ist beschissen. Aber die Grafik ist geil! 😁

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Beren,

es geht nicht darum, ob der Link funktioniert oder nicht (klar sollten Links funktionieren), sondern dass du für Bilder bitte gar keinen Link verwendest, sondern sie anhängst.

herbivore

B
Beren Themenstarter:in
163 Beiträge seit 2008
vor 16 Jahren

Entschuldige, kommt nicht wieder vor.

Beren

Das Leben ist beschissen. Aber die Grafik ist geil! 😁

915 Beiträge seit 2006
vor 16 Jahren

Das Problem an der Geschichte es gibt zu viele Wege das zu Lösen 😉

Im Moment fallen mir nur total übertriebene Varianten ein, die sich alle auf Windows API Lösungen beziehen. Würde mit den Gedanken spielen nen UserControl zu entwerfen und es zu einen Widget umzugestallten. Das geht indem man die WinProc überschreibt grade was WM_NCHITTEST angeht da hier ein Sizen nur in eine Logische richtung abhängig vom Parent erlaubt werden dürfte und man die CreateParam überschreibt und nur die passenden Styles einbindet. Dann würde ich nen intervall mit nen Timer einbauen um für die LinkeMaustaste bei der Left Mouse Down NonClient Area ein Docking zu realisieren. Den nur nach 2 Sekunden gedrückter Maustaste kommt meistens das typische Docking symbol. Die darstellung des Dockingsymbols übernimmt nen SubClassing einer Komponente die ich dann später aufs MainForm binde, dort wird nur via GDI die WM_PAINT angeschmissen mit den Abbild fürs Docken je nach Mauskoordinaten.

Das Parent wäre natürlich in deinen Fall ein normales Form. Die Menüs und aktionen würde ich über Command Pattern realisieren, würde die Sache vereinfachen.

Um nun die Speziellen Controls innerhalb der Widgeds zu relisieren würde ich den am nähesten kommenden Controls ableiten und Komponenten bzw. Controls / UserControls entwerfen die den gewünschten am nähesten kommen. Und diese dann auf den Widgeds platzieren.

Die Widgeds geben also die Logik für das Verhallten der Anordnung und das Docking vor während die UserControls spezialisiert sind und die jeweiligen spezialisierten Custom-Controls beinhalten. Und das Command Pattern kümmert sich um die verarbeitung und verteilung der Nachrichten zwischen den Widgeds den Controls usw. Ebenso kannst dann die Commands besser mitloggen falls das für Fehelrbehandlungen interessant sein könnte. Überschreibe dafür einfach in dne jeweiligen Command Klassen die ToString() Methode so kannst wie deren verarbeitung in einer Zentralen stelle wo diese über einen EventHandler verarbeitet werdne mitdokumentieren (oder Fehlerausgeben). Somit hätte deine ganze Anwendung grade mal ein try / catch drinnen.

Also kurz:
Widget => UserControl
DockingControler -> Component
Singleton -> CommandAction
Form -> Main Ansicht
SpecialControls => UserControls und vorhandene Controls

Nur mal ein Weg von vielen, denke nach ner Zigarette würden mir noch andere einfallen 😉

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

B
Beren Themenstarter:in
163 Beiträge seit 2008
vor 16 Jahren

Danke für den Tipp mit den Split Container. Das war genau das, was ich brauchte. Funktioniert hervorragend. Jetzt habe ich nur wieder das Flackerproblem, da ich die SplitContainer aus der Toolbox genommen habe und die Panels daher nicht Doublebuffered sind... 8o
Mal sehen, wie ich das in den Griff bekomme. Bleibt mir wohl nichts anderes übrig, als eine eigene Klasse SplitContainer zu bauen...

Ich frage mich, wieso es in der Splitcontainerklasse keine Doublebuffered Eigenschaft gibt. Ist doch total wichtig für eine vernünftige Verwendung...

Beren

Das Leben ist beschissen. Aber die Grafik ist geil! 😁

B
Beren Themenstarter:in
163 Beiträge seit 2008
vor 16 Jahren

Hallo Andreas

Ehrlich gesagt kann ich Dir nicht so recht folgen... Bin noch lange nicht auf Deinem Level 😉

Gruß
Beren

Das Leben ist beschissen. Aber die Grafik ist geil! 😁

B
Beren Themenstarter:in
163 Beiträge seit 2008
vor 16 Jahren

Ich habe jetzt eine eigene Klasse MySplitContainer abgeleitet, mit Doublebuffer aktiviert, um das Flackerproblem abzustellen.

class MySplitContainer : SplitContainer
    {
        private static MySplitContainer splitContainer;

        public MySplitContainer()
        {
            this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer, true);
        }

        public static MySplitContainer getSplitContainer()
        {
            if (splitContainer == null)
            {
                splitContainer = new MySplitContainer();
            }
            return splitContainer;
        }
    }

Jetzt kann ich aber nicht mehr auf den Panels der Container zeichnen! 8o Woran mag das liegen? Fehlermeldungen gibt es keine. Nur erscheint nichts Gezeichnetes auf den Panels...

Beren

Das Leben ist beschissen. Aber die Grafik ist geil! 😁

X
2.051 Beiträge seit 2004
vor 16 Jahren

hm...tut er ganz normal (bei mir zu mindest mit deinem splitter abgespeckten code);

aber kannst du mal verraten, wofür diese methode gut sein soll:

        public static MySplitContainer getSplitContainer()
        {
            if (splitContainer == null)
            {
                splitContainer = new MySplitContainer();
            }
            return splitContainer;
        }

B
Beren Themenstarter:in
163 Beiträge seit 2008
vor 16 Jahren

Die Methode ist überfüssig... Hab sie gerade gelöscht. Ist noch ein Artefakt von Rumprobiererei...

War gerade Rasen mähen. Werd mich mal auf Fehlersucher machen.

Das Leben ist beschissen. Aber die Grafik ist geil! 😁

B
Beren Themenstarter:in
163 Beiträge seit 2008
vor 16 Jahren

Fehler gefunden. Hatte vergessen das OnPaint neu zu registrieren... Was so ein bisschen Abstand vom Code (Rasenmähen) nicht so hilft...

Nur leider flackerts immer noch. Gilt das Doublebuffer auf die Splitcontainer etwa nicht für die Panels?`Kann das sein?

Beren

Das Leben ist beschissen. Aber die Grafik ist geil! 😁

915 Beiträge seit 2006
vor 16 Jahren

Jup 😉

Leider ist das ganze noch komplizierter und das Flackern wirst wahrscheinlich nicht komplett wegbekommen. Kannst mal versuchen und alle auf DoubleBuffer = true stellen und schauen ob es geht oder nicht.

Denn ControlStyles.AllPaintingInWmPaint ist ne gute Idee aber das gilt nur für die WindowsNachricht WM_PAINT nicht für das wofür DoubleBuffer eigentlich wirklich (meistens) gut ist. Die NonClientArea, also WM_NCCALCSIZE (hier passiert der Fehler) und die damit verbundende Nachricht WM_NCPAINT, diese wird nicht korrekt dargestellt und nicht gezeichnete Bereiche werden als schwarz gerendert - daher BitBlit um diese bereiche als ScreenCopy zu füllen.

Aber wie gesagt versuch einfach mal das mit DoubleBuffer bei allen Controls.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

Gelöschter Account
vor 16 Jahren

ich würde es so ähnlich wie andreas lösen, nur ohne winapi (also ohne irgendwelche winproc overrides)

im prinzip bietet dir das framework mit seinen standard controls schon einen vernünftigen weg zu deiner lösung, jedoch wirst du nicht um das erben und anpassen etlicher controls herumkommen. dir dann einige usercontrols zu erstellen, die bestimmte zusammengefasste visualisierungen beinhalten, kann ich dir nur ans herz legen.

ps: die sache mit dem commandpattern würde ich mir an deiner stelle mal genauer ansehen, denn es macht durchaus sinn diesen einzusetzten. vor allem wenn man später mal redo/undo implementieren möchte.

und versuch mal den optimizeddublebuffer.

B
Beren Themenstarter:in
163 Beiträge seit 2008
vor 16 Jahren

Ich lese gerade unter Google, daß OptimizedDoublebuffer wohl für SplitContainers nicht funktioniert... Nerv.

Das Leben ist beschissen. Aber die Grafik ist geil! 😁

B
Beren Themenstarter:in
163 Beiträge seit 2008
vor 16 Jahren

Jack30lena. Hm. Das krieg ich Moment wohl noch nicht selbst auf die Reihe. Nächsten Monat werde ich mir das Visual C# 2008 Buch bestellen und durchackern (1800 Seiten). Ich hoffe, dann platzt bei einigen Dingen (z.B. Controls) der Knoten...
Auf Win32API hab ich nciht wirklich lust... Ist ja sowieso ein Ausläufermodell, habe ich erst kürzlich gelesen.

Das Leben ist beschissen. Aber die Grafik ist geil! 😁

915 Beiträge seit 2006
vor 16 Jahren

Na ja, eigentlich baut trotzdem im Hintergrund vieles auf der Win API auf, Egal ob C++, Java oder C# sobalds Plattformabhingigkeiten gibt ist schluss mit der unbegrenzten Freiheit.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

B
Beren Themenstarter:in
163 Beiträge seit 2008
vor 16 Jahren

Jack30lena: Ich habe gerade nochmal über die Basisklasse Control gelesen. Meinst Du das so, daß ich eine eigene Klasse von Control ableiten soll, in der mein ganzes "Panel Set" instanziiert werden kann? Das erscheint mir sehr kompliziert...

Das Leben ist beschissen. Aber die Grafik ist geil! 😁

Gelöschter Account
vor 16 Jahren

nein. du gehst in dein projekt und machst hinzufügen -> neues element -> benutzersteuerelement/usercontrol (je nach spracheinstellung) und dann stehst du erstmal vor einer grauen randlosen "form" dort ziehst du dann die controls rein, die du in einem set haben willst. machst ein rebuild und gehst dann auf deine hauptform, die den splitcontainer enthält. dann gehst du in die toolbox und ziehst dein usercontrol heraus auf das panel.

B
Beren Themenstarter:in
163 Beiträge seit 2008
vor 16 Jahren

Jack30lena: Danke für die ausführliche Erklärung. Aber das Problem mit dem Flimmern kann ich so doch auch nicht umgehen... oder übersehe ich da etwas?

Das Leben ist beschissen. Aber die Grafik ist geil! 😁

B
Beren Themenstarter:in
163 Beiträge seit 2008
vor 16 Jahren

Vielleicht habe ich eine Lösung gefunden: "...add Panel control to the SplitContainer panels, and make the Panel control double buffer."

Bedeutet das, daß man zwei normale Panels auf die Panels des Splitscreen legen soll? Wenn ja, wie verknüpft man diese, daß sie sich kongruent verhalten?

Oh, ich hab da gerade was gefunden: Andocken... Mal sehen obs funktioniert....

Es läuft! Ohne Flackern!

Habe eine MyPanel Klasse abgeleitet und Controls dem jeweiligen Panel der SplitContainers geaddet (im FormDesigner über andocken).

    class MyPanel : Panel
    {
        public MyPanel()
        {
            this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
        }
    }

Das Leben ist beschissen. Aber die Grafik ist geil! 😁

5.299 Beiträge seit 2008
vor 16 Jahren

Hi!

Du kannst womöglich auch eine Picturebox nehmen, die ist von Haus aus doublebuffered.
(allerdings kannste da keine Controls im Designer draufziehen... falls du das vorhattest)

Der frühe Apfel fängt den Wurm.

Gelöschter Account
vor 16 Jahren

ja das hat er definitv vor(siehe bild im ersten beitrag).