MFC Anwendung programmieren, Kleiner Einheiten Umrechner - diverse Fragen eines Anfängers



  • Nach Stundenlanger Google suche u.a. auch hier im Forum habe das ganze endlich hinbekommen.

    Der korrekte Code lautet:

    void CUmrechnerMFCv2Dlg::OnBnClickedkminm()
    {
    	CString Tmp;			
    
    	GetDlgItem(IDC_Eingabe)->GetWindowText(Tmp);
    	Tmp.Format("%f",atof(Tmp)/1.609344); 
    	GetDlgItem(IDC_Ausgabe)->SetWindowText(Tmp);
    }
    

    Ich hab ewig gebraucht um dieses GetDlgItem zu finden... damit wähl ich halt das eingabe bzw. ausgabe feld aus und darauf folgt dann das GetWindowText.
    Den Befehl kannte ich nicht mal und etwas suchen wenn man nicht weiß wie es heißt oder aussieht ist irgendwie doof...

    Naja jetzt funktionierts. - Und ich bin froh kein Programmierer zu sein, und hoffentlich nie beruflich einer sein zu müssen 😃

    Ein paar kleine Fragen hab ich auch noch, ich bedanke mich trotzdem schonmal für die bisherige Hilfe, auch wenn ich noch öfter hier rein gucken werde 😉

    1. Wie formatier ich jetzt das Ergebnis oder stell ein das er nur 2 oder 3 Nachkommastellen anzeigt ? Momentan sinds 5, das sind etwas viele.

    2. Wenn man im Programm Enter drückt ist standardmäßig die beenden taste ausgewählt, so das man das programm leicht versehentlich schließt, wie kann ich die priorität der buttons verändern so das z.B. der Kilometer in Meilen Button normalerweise ausgewählt ist ?

    3. Wie veränder ich die Schriftgröße der label bzw. des "static textes" ? Will oben im Programm nen Namen bzw. ne Überschrift haben und bisher habe ich nur etwas gefunden wie ich die gesamte Schrift des Programms vergrößert wird.

    4. Ich würde gerne die Anzahl an Ziffern welche man eingeben kann begrenzen, z.B. auf maximal 6 stellen (100000 sollte reichen) - wie mach ich das am besten ?
      Gibts da eine Option zu, ähnlich wie man einstellen kann das nur Ziffern.



    1. mit "%.2f"
      2)hab deine Romane nicht durchgelesen - weiss nicht wie du es beiher gelöst hast, aber für sowas eignen sich Radio-Buttons
    2. Du musst eine eigene Schrift definieren (CFont)
    3. hab ich noch nicht gemacht, aber mit dem Meldungstyp "EN-Change" müsste es klappen. (Ereignishandler).

    Noch was grundsätzliches: versuche deine Fragen präziser zu stellen und verzichte auf diese Romane. Die Hauptfunktion des Forums ist übrigens unmengen an Fragen und zugehörignn Antworten zu liefern. Alle Fragen die du hier gestellt hast sind bereits mehrfach beantwortet worden. Zunächst immer fleißig auf die Suche machen...



  • 2. im Dialogeditor für den OK-Button unter den Eigenschaften Standartschaltfläsche oder DefaultButton auf false setzen und bei dem Button deiner Wahl wieder setzen
    3. du mußt ein CFont als Meber der Klasse erstellen, mit Create(....) erzeugen und dem CStatic zuweisen SetFont(), das CFont objekt muß solange wie das Static leben sonnst ändert sich der Font nicht (machen die meisten falsch und wundern sich



  • Flockig schrieb:

    2)hab deine Romane nicht durchgelesen

    LOL, auch ich hab' nur eine begrenzte Lebensspanne und deshalb keine Zeit und Lust posts von epischer Breite durchzulesen.

    Ein Großteil der Fragen wäre sowieso auch einfach von google oder google/codesearch beantwortet worden.



  • PhilippW schrieb:

    Ist es kontraproduktiv wenn ich das Projekt auf Multibyte umstelle und zusätzlich das "L" in der Tmp.Format zeile eingebe ?

    Ziemlich, ja. Es hieß ja auch entweder oder. Nicht beides. Welche Lösung du wählst, ist davon abhängig, was du machen willst. Soll dein Projekt Unicode unterstützen, dann aktivier es und pack vor Stringliterale ein "L". Ansonsten stell auf MBCS um.

    Btw, du solltest deine Beiträge wirklich kürzer fassen. Es ist zwar löblich, dass du dein Problem sehr ausführlich beschreiben willst, aber das ist dann doch zuviel des Guten (auch mit vielen unwichtigen Infos) und wird sicher viele verschrecken. 🙂



  • Hmm okay, dankeschön.

    Ja ich komme aus der Hardware/Serverecke, und da regt man sich zu 90% über die Leute auf die keine detallierte Fehlerbeschreibung abgeben können oder nicht aufschreiben was sie geändert / ausprobiert haben.

    Daher dachte ich, ich schreibe lieber alles mit auf, wobei das bei der Programmierung durch das Fehlerlog des Compilers vllt. etwas übertrieben ist.

    In Zukunft werde ich mich kürzer fassen, das mit Google ist allerdings sone sache, allein für dieses GetDlgItem hab ich ca. 4 Stunden gesucht.
    Ganz einfach aus dem Grund das immer irgendwelche anderen Methoden genannt werden, da finden man unmengen an C und C# Hinweisen und haufenweise anderer Probleme. Ich dachte ja vorher die ganze zeit ich kann einfach die Variable vor .GetWindow schreiben...

    Normalerweise habe ich kein problem mit Google, doch finde ich auch hier wieder das es im Hardware / Serverbereich deutlich einfacher ist... meistens findet man bei dem einfachen übernehmen einer fehlermeldung nach sekunden bis minuten etwas.. mit der gleichen Methode hat man bei C++ tausende Seiten.
    Mag auch daran liegen das ich mich mit Hardware und Servern seit Jahren beschäftige und dort weiß wonach ich suchen muss.

    Aber vielen dank für die Antworten

    Gruß Philipp



  • PhilippW schrieb:

    Ja ich komme aus der Hardware/Serverecke, und da regt man sich zu 90% über die Leute auf die keine detallierte Fehlerbeschreibung abgeben können oder nicht aufschreiben was sie geändert / ausprobiert haben.

    Daher dachte ich, ich schreibe lieber alles mit auf, wobei das bei der Programmierung durch das Fehlerlog des Compilers vllt. etwas übertrieben ist.

    Wie gesagt, ist ja auch löblich, nur eben etwas zuviel des Guten. 😉 Das ist mir aber allemal lieber als jemand, der gar keine Fehlerbeschreibung liefert (oder etwas, was man kaum so nennen kann), ehrlich.

    Das Problem, als Anfänger mit den Google-Ergebnissen oder der MSDN leicht überfordert zu sein, verstehe ich sehr gut. Man muss sich in die ganze Materie erst mal einlesen. Das geht nicht in 5 Minuten.

    Dafür gibt es (u.a.) ja dieses Forum. Man soll Eigeninitiative zeigen, klar. Aber wenn jemand schon Stunden investiert hat und nicht weiterkommt, dann soll er selbstverständlich hier fragen. Das kann dir keiner vorwerfen.



  • Gut danke - ab sofort kürzer 😉

    1. %.2f" scheint zu printf zu gehören und ist somit "C" und nicht "C++" ?
      Außerdem nutze ich ja GetWindow und SetWindow zur Ausgabe in einem Textfenster, wo soll ich da nen printf einbauen?

    @ ctecs: Danke, defaultbutton klappt.

    Okay, dachte das mit der Schriftart geht vllt. einfacher, hab jetzt die allgemeine Schriftart größer eingestellt und werde es so lassen.

    Den Ereignishandler hab ich gesehen, nur weiß ich nicht welcher Code da rein muss - werds mal bei google weitersuchen.



  • PhilippW schrieb:

    1. %.2f" scheint zu printf zu gehören und ist somit "C" und nicht "C++" ?
      Außerdem nutze ich ja GetWindow und SetWindow zur Ausgabe in einem Textfenster, wo soll ich da nen printf einbauen?

    Du meinst SetWindowText, ne. sprintf (nicht printf, sprintf für Strings) ist auch Bestandtel von C++, wenn auch die Herkunft bei C liegt. Du kannst sehr wohl einen char* erzeugen und mit sprintf befüllen. Du kannst aber auch genausogut einen CString nehmen und Format()/AppendFormat() benutzen. Die Syntax ist übrigens die gleiche (vielleicht bis auf minimale Ausnahmen, bin da nicht ganz sicher).

    EDIT: Kleines Beispiel:

    CString cs;
    float f=.5;
    cs.Format("%.2f",f);
    


    1. EditCtlr im Dialog erstellen, rechte Mousetaste->Ereignishandler hinzufügen, Meldungstyp "EN_CHANGE" einstellen, OK. Der Wizzard erstellt dir nun u.a. die Methode, die bei jeder Änderung des EditCtrls aufgerufen wird. Dort kommen dann die Dinge rein, die du bei jeder Änderung durchführen lassen willst. In deinem Fall wäre hier eine Überprüfung der eingegebenen Zahl durchzuführen.


  • danke matze hat geklappt 😉 - jetzt hab ichs auch verstanden

    hab das ".2f" mit in meine rechnung/umwandlung reingeschrieben.

    void CUmrechnerFinalDlg::OnBnClickedkminm()
    {
    	CString Tmp;
    
    	GetDlgItem(IDC_Eingabe)->GetWindowText(Tmp);
    	Tmp.Format("%.2f",atof(Tmp)/1.609344);
    	GetDlgItem(IDC_Ausgabe)->SetWindowText(Tmp);
    }
    

Anmelden zum Antworten