<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[GUI-Objektdesign]]></title><description><![CDATA[<p>Hi,<br />
ich bin dabei ein GUI zu implementieren (ja, ich weiss es gibt bereits Bibliotheken dieser Art, aber ich moechte mich selbst versuchen). Jetzt ist die Frage, wie ich die einzelnen Steuerelemente implementiere. Derzeit mache ich es etwa so (pseudo):</p>
<pre><code class="language-cpp">class Control
{
// ganze Stange Methoden und Attribute
};

class StaticText: public Control
{
  SetHAlignment(HorizontalAlignment);
  SetVAlignment(VerticalAlignment);
};

class Button: public Control
{
  StaticText m_text;
};

class CheckBox: public Control
{
  Button m_button;
  StaticText m_text;
};
</code></pre>
<p>Also im Prinzip durch Komposition.<br />
Mein Problem ist jetzt, dass ich beispielsweise in Button alle Funktionen von StaticText quasi neu fuer den Button implementieren muss:</p>
<pre><code class="language-cpp">Button::SetVAlignment(VerticalAlignment va)
{
  m_text.SetVAlignment(va);
}
</code></pre>
<p>Das ist irgendwie nicht das Wahre.</p>
<p>Mir würden folgende Alternativen einfallen:<br />
1.</p>
<pre><code class="language-cpp">StaticText&amp; Button::GetStaticText()
{
  return m_text;
}
</code></pre>
<p>Jetzt kann man alles ordentlich aendern, aber ich gebe damit Implementationsdetails preis. Das kann es irgendwie auch nicht sein, zumal ein anderer Button anders implementiert sein kann (ohne StaticText).</p>
<p>2. private Vererbung und einfach using &lt;Methodenname&gt;. Hier bin ich mir nicht ganz sicher, ob es dann bei CheckBox (wuerde von Button und StaticText erben) zu Komplikationen fuehren wuerde (wegen den identischen Membern von Control). Gibt es bei private Mehrfachvererbung die selben Probleme wie bei public Mehrfachverbung?</p>
<p>Fallen jemanden noch andere Moeglichkeiten ein? Wie wuerdet ihr das machen?<br />
Ich habe auch noch an identische Basisklassen gedacht (also eine tiefere Klassenhirarchie; Control-&gt;TextControl-&gt;StaticText; TextControl-&gt;Button z.B.), aber damit komme ich auch auf keinen gruenen Zweig.</p>
<p>Gruss,<br />
DeSoVoDaMu</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/204324/gui-objektdesign</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 13:47:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/204324.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 01 Feb 2008 16:09:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to GUI-Objektdesign on Fri, 01 Feb 2008 16:09:49 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich bin dabei ein GUI zu implementieren (ja, ich weiss es gibt bereits Bibliotheken dieser Art, aber ich moechte mich selbst versuchen). Jetzt ist die Frage, wie ich die einzelnen Steuerelemente implementiere. Derzeit mache ich es etwa so (pseudo):</p>
<pre><code class="language-cpp">class Control
{
// ganze Stange Methoden und Attribute
};

class StaticText: public Control
{
  SetHAlignment(HorizontalAlignment);
  SetVAlignment(VerticalAlignment);
};

class Button: public Control
{
  StaticText m_text;
};

class CheckBox: public Control
{
  Button m_button;
  StaticText m_text;
};
</code></pre>
<p>Also im Prinzip durch Komposition.<br />
Mein Problem ist jetzt, dass ich beispielsweise in Button alle Funktionen von StaticText quasi neu fuer den Button implementieren muss:</p>
<pre><code class="language-cpp">Button::SetVAlignment(VerticalAlignment va)
{
  m_text.SetVAlignment(va);
}
</code></pre>
<p>Das ist irgendwie nicht das Wahre.</p>
<p>Mir würden folgende Alternativen einfallen:<br />
1.</p>
<pre><code class="language-cpp">StaticText&amp; Button::GetStaticText()
{
  return m_text;
}
</code></pre>
<p>Jetzt kann man alles ordentlich aendern, aber ich gebe damit Implementationsdetails preis. Das kann es irgendwie auch nicht sein, zumal ein anderer Button anders implementiert sein kann (ohne StaticText).</p>
<p>2. private Vererbung und einfach using &lt;Methodenname&gt;. Hier bin ich mir nicht ganz sicher, ob es dann bei CheckBox (wuerde von Button und StaticText erben) zu Komplikationen fuehren wuerde (wegen den identischen Membern von Control). Gibt es bei private Mehrfachvererbung die selben Probleme wie bei public Mehrfachverbung?</p>
<p>Fallen jemanden noch andere Moeglichkeiten ein? Wie wuerdet ihr das machen?<br />
Ich habe auch noch an identische Basisklassen gedacht (also eine tiefere Klassenhirarchie; Control-&gt;TextControl-&gt;StaticText; TextControl-&gt;Button z.B.), aber damit komme ich auch auf keinen gruenen Zweig.</p>
<p>Gruss,<br />
DeSoVoDaMu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1447681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1447681</guid><dc:creator><![CDATA[DeSoVoDaMu]]></dc:creator><pubDate>Fri, 01 Feb 2008 16:09:49 GMT</pubDate></item><item><title><![CDATA[Reply to GUI-Objektdesign on Fri, 01 Feb 2008 17:24:43 GMT]]></title><description><![CDATA[<p>Hab nicht so wirklich verstanden, warum Button alle Funktionen von Text nochmal implementieren muss, aber schau dir mal Templates an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1447719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1447719</guid><dc:creator><![CDATA[qwertzui]]></dc:creator><pubDate>Fri, 01 Feb 2008 17:24:43 GMT</pubDate></item><item><title><![CDATA[Reply to GUI-Objektdesign on Fri, 01 Feb 2008 18:29:26 GMT]]></title><description><![CDATA[<p>Ok, die Erklaerung kam etwas kurz. Wenn ich einen Button habe will ich natuerlich auch irgendwie diesem sagen koennen, dass der Text zentriert, rechtsbuendig oder linksbuendig angeordnet werden soll (SetHAlignment im Beispiel). Und das wuerde halt auf zahlreiche weitere Methoden zutreffen.<br />
Also muss irgendwie der Zugriff auf die Methoden von StaticText sichergestellt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1447743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1447743</guid><dc:creator><![CDATA[DeSoVoDaMu]]></dc:creator><pubDate>Fri, 01 Feb 2008 18:29:26 GMT</pubDate></item><item><title><![CDATA[Reply to GUI-Objektdesign on Sat, 02 Feb 2008 12:52:25 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>wenn du eine wirklich gute GUI-Lib erstellen willst, dann mußt du erst einmal verschiedene Abstraktionsebenen als Grundlage nehmen.<br />
Ich habe für das (hoffentlich in diesem Jahr noch erscheinende) Spiel &quot;Sacred2&quot; an dessen GUI-Lib mitgearbeitet.<br />
Diese GUI-Lib unterscheidet zwischen 3 verschiedenen Ebenen:<br />
1. Controls<br />
2. Layout<br />
3. Render-Engine</p>
<p>Du solltest insbesondere zwischen Controls und Layout (d.h. grafische Darstellung eines Controls) unterscheiden.</p>
<p>Ein Control sollte nur Angaben über (relative) Position und Größe sowie Maus- und Tastaturbehandlung besitzen.<br />
Das Layout eines Controls sollte möglichst unabhängig vom eigentlichen Control sein (z.B. mittels Adapter-Pattern). Du könntest dann verschiedene Standard-Layouts (z.B. Text, Grafik, Gradienten-Rechteck oder auch HTML o.ä) anbieten, die dann einfach mit dem Control verknüpft werden (alternativ sogar als Liste, welche nacheinander gerendert werden - falls du z.B. Transparenz einsetzen willst bzw. kannst).</p>
<p>Und die Render-Engine sollte dann als einzige Ebene direkt mit der verwendeten Grafik-Engine (z.B. DirectX, OpenGL oder eine andere) interagieren.</p>
<p>Die einzelnen Ebenen agieren dabei über Interface-Klassen miteinander, d.h. sie sollten nicht abhängig von bestimmten Klassen sein.</p>
<p>Dein Hauptfehler ist schon, daß deine Controls (z.B. der Button) selber wieder aus anderen (festdefinierten) Controls bestehen. Aber du hast ja selber erkannt, daß dies ein Design-Fehlern ist und zu unübersichtlichem Code führt.<br />
Mach' nicht denselben Fehler, wie ihn schon andere GUIs gemacht haben...</p>
<p>Falls du mehr Infos brauchst, kannst du mir ja eine E-Mail schreiben: TBentrup (at) <a href="http://bitel.net" rel="nofollow">bitel.net</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1448010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1448010</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Sat, 02 Feb 2008 12:52:25 GMT</pubDate></item><item><title><![CDATA[Reply to GUI-Objektdesign on Sat, 02 Feb 2008 16:56:29 GMT]]></title><description><![CDATA[<p>Hi Th und vielen Dank fuer Deine Antwort.<br />
Natuerlich moechte ich eine Top-Gui-Bibliothek erstellen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Aber ich bin Realist...so viel Erfahrung bringe ich nicht mit.<br />
Ich habe eine Abstraktion eingebaut. Das sieht so aus, dass quasi alles aus Sprites aufgebaut ist. Ein Sprite enthält eine SpriteImplementation (eigene Klasse), welche fuer die jeweilige API implementiert ist (OpenGL, SDL, Windows GDI, D3D, etc...) (Bridge Pattern).<br />
So aehnlich sieht das auch fuer die Events und die Schrift zur Textdarstellung aus.<br />
Ich denke damit fahre ich ganz gut.<br />
Eine Unterscheidung zwischen Layout und Control habe ich nicht (mehr) in dem Sinne. Es gibt fuer jedes Control eine abstrakte Basisklasse zum Bsp. Button, welche noch keinen Render-Code besitzt. Fuer ein &quot;Theme&quot; (ich nenne es mal so, ist quasi ein Look and Feel Standard) wird dann eine abgeleitete Klasse erstellt, welche das eigentliche Rendern uebernimmt (mit Hilfe der besagten Sprites).<br />
Aber das ist auch eigentlich nicht mein Anliegen.</p>
<p>Das Problem ist wie gesagt, dass ich nicht so recht weiss, wie ich die einzelnen Controls implementiere, ohne gross Code-Dopplungen zu haben. Ich wuerde es schon als logisch empfinden, wenn etwa ein Button mit einem StaticText implementiert ist. Was spricht deiner Meinung nach dagegen? Es ist ja auch nicht so, dass das Control direkt festgelegt ist, denn es wird ueber eine Factory erstellt (welche nur Controls eines Themes erstellt).<br />
Mich wuerde interessieren, wie Du das loesen wuerdest / geloest hast, da Du ja offensichtlich Erfahrung auf dem Gebiet mitbringst.</p>
<p>Wenn Du einen Blick in den bisherigen Stand werfen willst:<br />
<a href="http://www.desovodamu.de/downloads/gui.rar" rel="nofollow">http://www.desovodamu.de/downloads/gui.rar</a> (ist natuerlich noch nicht fertig, einige Sachen werden noch komplett ueberarbeitet, mehr kommentiert etc.; kompilieren wirst Du es nicht koennen, derzeit werden noch einige weitere Bibliotheken vorausgesetzt).</p>
<p>Gruß,<br />
DeSoVoDaMu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1448119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1448119</guid><dc:creator><![CDATA[DeSoVoDaMu]]></dc:creator><pubDate>Sat, 02 Feb 2008 16:56:29 GMT</pubDate></item></channel></rss>