Mehr Controls?



  • Hallo,

    ich möchte mich in nächster Zeit mit MFC beschäftigen, und habe gestern in VC++ 2008 ein erstes Projekt angelegt, nur um mal reinzuschnuppern. Dabei habe ich auch ein Dialogfenster mit den verfügbaren Controls gestaltet, wobei mir aufgefallen ist, dass da scheinbar recht wenige Controls sind, verglichen z.B. mit den Controls eines CLR Projekts. Im Wesentlichen sollten das die hier gewesen sein:
    http://msdn.microsoft.com/en-us/library/47xcww9x(VS.80).aspx
    (bin gerade auf Arbeit und kanns daher nicht prüfen)

    Gibt es "nur" so wenige Controls bei MFC, oder gibt es noch irgendwo mehr? Z.B. scheint es kein Spinbox Control zu geben, lediglich den Spinbutton. Und ist es prinzipiell möglich, eigene Controls zu erstellen?
    Ausserdem habe ich in den Eigenschaften der Controls nur sehr wenige Einstellungsmöglichkeiten, im Vergleich mit z.B. einem CLR Projekt (Z.B. keine Änderung der Schriftart für Labels aka "Static Text").

    Kann mir da jemand auf die Sprünge helfen?
    Ich stehe wie gesagt noch ganz am Anfang (Buch habe ich gestern bestellt), und komme (beruflich) auch eher aus der Unixwelt, daher ist meine Frage vielleicht etwas laienhaft formuliert 🙂


  • Mod

    1. Ja die Liste, die Du gefunden hast ist ein Teil der Controls.
    2. Ja man kann eigene erzeugen und vor allem modifizieren. Das das fast kein Ende hat kannst Du in www.codeproject.com sehen
    3. Die MFC und Windows API arbeitet kaum über solche Properties. Du musst hier leider mehr Hand alegen was Fonts (WM_SETFONT, SetFont) und Farben (OnCtlColor) betrifft.

    In einem CLR Prjekt zerlegt Dir der Formulareditor alles gleich in entsprechenden Code aus den WinForms. Dies sieht einfach anders aus und ist zum Teil komplizierter in der MFC.

    BTW: Es gibt massenweise Erweiterungen von Controls für die MFC. Siehe MFCNext, siehe BCG-Library und viele anndere (zum Teil OpenSource Projekte).



  • Martin Richter schrieb:

    1. Ja die Liste, die Du gefunden hast ist ein Teil der Controls.

    Heisst, es gibt von hause aus schon mehr (die mir nicht angezeigt werden), oder heisst es gibt mehr über andere Erweiterungen und Libs? (3rd party?) Falls 1, wo finde ich eine Liste bzw. Doku dazu?


  • Mod

    Es gibt noch WIndows7 und Vista Controls z.B. die als Fensterklasse extistieren aber zum Teil keine Wrapper in der MFC haben (siehe VS-2008 SP1/MFCNext und VS-2010).

    BTW: Der Link stammt aus VS-2005.

    Was vermisst Du?



  • Also auf den ersten Blick eine checkbare Groupbox und eine Spinbox. Allerdings hab ich in der Zwischenzeit rausgefunden, dass man sich sowas (mehr oder weniger) einfach selbst basteln kann, Spinbox habe ich mittlerweile auch hinbekommen. Von daher ist die Frage wohl beantwortet 🙂

    Um nicht noch ein Topic aufzumachen:

    Per Doppelklick auf ein Editfeld wurde mir in meinen Quellcode eine OnEnChange-Methode eingebaut. In dieser möchte ich den Inhalt des Editfelds anpassen (konrekt: an den Text ein "h" für hours anhängen).
    Die Methode an sich funktioniert; wenn ich eine MessageBox einfüge kommt sie beim Programmstart sowie beim Ändern des Inhalts.

    Problem: Wenn ich den Code zum anhängen des "h" einfüge, stürzt das Programm beim Start direkt ab. Auch wenn ich nur z.b. "1" einfüge, stürzt es ab.

    void MyClass::OnEnChangeEdit5()
    {
       edit5.SetWindowTextW(L"1");
    }
    

    Was mach ich falsch?



  • Die Spinbox ist die Kombination aus EditCtrl und SpinCtrl. Das EditCtrl muss in der Reihenfolge vor dem Spin sein, bei Spin muss Auto-Buddy=true gesetzt werden (siehe MFC-Examples).

    Was willst Du mit OnEnChange erreichen? Die Methode zieht bei jeder Eingabe eines Zeichens im Edit-Ctrl. Wann möchtest Du den Inhalt des Editfelds verändern? Beim Verlassen des Feldes wäre OnKillFocus die richtige Wahl.



  • Tester2 schrieb:

    Was willst Du mit OnEnChange erreichen? Die Methode zieht bei jeder Eingabe eines Zeichens im Edit-Ctrl. Wann möchtest Du den Inhalt des Editfelds verändern? Beim Verlassen des Feldes wäre OnKillFocus die richtige Wahl.

    Ich hab mir, wie du schon beschrieben hast, per EditCtrl + SpinCtrl eine Spinbox gebaut. Das EditCtrl ist dabei readonly, und kann nur übers SpinCtrl verwendet werden. Es darf ein Wert zwischen 0 und 23 eingestellt werden. Wenn per SpinCtrl ein Wert geändert wird (OnEnChange) möchte ich das Suffix "h" für Stunden an den gewählten Wert hängen.


  • Mod

    Dir muss klar sein, dass auch SetWindowText wieder einen OnEnChange auslöst.
    Was Du hier machst ist ein schönes Beispiel für eine nicht gewünschte Rekursion 😉

    Schau Dir mal fertige COntrols wie "Masked Edit" auf CodeProject an...



  • Martin Richter schrieb:

    Dir muss klar sein, dass auch SetWindowText wieder einen OnEnChange auslöst.
    Was Du hier machst ist ein schönes Beispiel für eine nicht gewünschte Rekursion 😉

    Schau Dir mal fertige COntrols wie "Masked Edit" auf CodeProject an...

    Ah, das klingt einleuchtend. Danke 🙂


Anmelden zum Antworten