mfc - Windows C++-Dialog-Resizer-Klasse




(7)

Ich verwende ResizableLib (auch PropertySheets und Pages) von Codeproject, IIRC. Sie legen Ankerpunkte fest, die festlegen, wie das Dialogfeld und die Steuerelemente beim Verschieben des Dialogfelds ihre Größe oder ihre Größe ändern.

Sie können bis zu 2 Anker pro Steuerelement festlegen (links, rechts), damit Sie sie beim Bewegen des Dialogfelds verschieben oder ihre Größe ändern können. Es ist sehr leicht zu verstehen, wenn es schwierig ist, perfekt zu sein :)

Ich suche nach einer wirklich guten Dialog-Resizer-Klasse, die einzelne Elemente nach Bedarf dehnt und verkleinert, wenn die Größe des Bildschirms geändert wird. Stephan Keil hat einen guten (DlgResizeHelper), der im Grunde alles in einem festen Verhältnis skaliert, aber ich suche etwas Klügeres.

Beispielsweise:

  • Die Größe der Symbole sollte nicht geändert werden

  • Einzeilige Textfelder sollten nicht vertikal gestreckt werden

  • Tasten sollten wahrscheinlich gleich groß bleiben

Im Grunde suche ich nach etwas, das alle Steuerelemente betrachtet, herausfinden, dass ein statisches Textfeld mit einem Steuerelement next / below zusammenhängt und die beiden zusammen verankert und die Größe großer Steuerelemente auf eine "intelligente" Art und Weise so verändert, dass sie aussieht. gut.

Gibt es solche Frameworks da draußen? Ich habe an einem gearbeitet, aber etwas Konfektion wäre wahrscheinlich besser.

FOLLOW UP: Ich schaue mir die vorgeschlagenen Lösungen an. Bei vielen von ihnen müssen Sie jedes Steuerelement im Dialogfeld verankern. Ich suche nach etwas Klugem, das herausfinden wird, was die Anker sein sollten, mit der Fähigkeit, manuell zu verankern, wenn die Vermutungen falsch sind. Es scheint so, als ob es möglich sein sollte - die meisten Menschen würden zustimmen, dass ein statisches Textfeld neben einem Editierfeld zusammen verankert werden sollte. Ich glaube, ich bin fast auf der Suche nach einer kleinen KI hier :)


Sie können wxWidgets verwenden. Es ersetzt MFC vollständig, ist plattformübergreifend und bietet Ihnen einen layoutbasierten Dialogmechanismus.


Die Ultimate Toolbox MFC-Bibliothek ( hier in CodeProject) enthält einen Layout-Manager . Ich habe es nicht selbst benutzt, aber es sieht so aus, als würde es das tun, was Sie wollen.


Dies ist eine kostenlose Lösung auch von CodeProject
http://www.codeproject.com/KB/dialog/dlgresizearticle.aspx
Es handelt sich lediglich um eine Reihe einfacher Makros, die Steuerelemente beim Ändern der Größe des Dialogfelds positionieren.

Bearbeiten - Folgen Sie den Kommentaren des OPs. Ich kenne keine allgemeine Sizer-Unterstützung wie QT / WX für MFC, scheint es auch in neuen Frameworks wie Winforms nicht vorhanden zu sein.
Es ist in QT / WX, weil es für Multiplattform erforderlich ist, wo Widgets eine andere Größe haben können, was den Mangel an MS erklärt. Aber es ist auch wichtig für mehrsprachige Ports, z. wo der Deutsche für abbrechen 30 Zeichen lang ist.


Ich habe viele ausprobiert und mich schließlich auf http://www.codeproject.com/KB/dialog/layoutmgr.aspx geeinigt . Es ist nicht das "intelligente" Layout, das Sie vorschlagen. Ich habe das noch nie in einer Bibliothek gesehen, auf keiner Plattform - ich sehe nicht, wie es funktionieren würde, ohne viel unter der Haube Magie zu haben, die sowieso die Hälfte der Zeit überschrieben werden müsste.


Wir verwenden CResize-Klasse von CodeGuru, um alle Steuerelemente automatisch zu ändern. Sie sagen, wie die Größe jedes Steuerelements angepasst werden soll, und es erledigt die Aufgabe für Sie.

Das Größenanpassungsparadigma gibt an, wie stark sich jede Seite eines Steuerelements bewegen wird, wenn die Größe des Dialogfelds geändert wird.

SetResize(IDC_EDIT1, 0,   0,   0.5, 1);
SetResize(IDC_EDIT2, 0.5, 0,   1,   1);

Sehr praktisch, wenn Sie viele Dialogsteuerungen haben.

Quellcode


Das kannst du nicht, zumindest nicht direkt. Die einzige Möglichkeit, ein Token oder eine Serie von Tokens in ein String-Literal zu konvertieren, besteht darin, den Stringisierungsoperator ( # ) des Präprozessors innerhalb eines Makros zu verwenden.

Wenn Sie ein Zeichenfolgenliteral erhalten möchten, das den Typ darstellt, müssen Sie selbst etwas schreiben, indem Sie z. B. ein Makro verwenden, um die Vorlage zu instanziieren und den stringulierten Typnamen zu übergeben.

Ein Problem mit einem allgemeinen Ansatz ist: Welche Zeichenfolge sollte für die folgenden Verwendungszwecke angegeben werden:

Matrix<char> x;
typedef char MyChar;
Matrix<MyChar> y;

Sowohl x als auch y sind vom selben Typ, aber einer verwendet char direkt und der andere verwendet den typedef MyChar .







c++ windows mfc dialog resize