Visual Studio C++: Problem mit Dialog Eingabe-Feld



  • Hallo,
    ich habe mit Visual Studio 2022 eine Desktopanwendung (C++) mit entsprechenden Menues erstellt.
    Für die Menue-Punkte habe ich entsprechende Dialoge erstellt.
    Mein erstes Problem ist: wie kann ich eine Eingabe aus einem Eingabe-Feld (Edit Control) in eine Variable speichern und z.B. in einem Text-Feld (Group Box) anzeigen ?

    Mein Versuch:

    int n = int(IDC_LB_ABSTAND_START_1);                         // das ist das Eingabe-Feld
                                                                                                   // Text-Feld = IDC_LB_ERGEBNIS
    

    Juergen



  • @jbaben sagte in Visual Studio C++: Problem mit Dialog Eingabe-Feld:

    Der Code passt nicht zu deiner Frage. Dein Code deklariert einen int, da gibt es kein Control.

    Ich würde vermuten, dass du irgendwo den MFC Wizard ausgeführt hast und da irgendwelche Controls zusammen geschoben hast.
    Angenommen es handelt sich um ein CEdit Control würde ich mir die Funktionen GetWindowTextW oder GetLine anschauen.

    Aber, da ist viel geraten und ich fürchte, für dein Vorhaben (was ist eigentlich dein Vorhaben?) ist das nicht sonderlich zielführend.

    Wenn du C++ lernen möchtest, würde ich dir empfehlen, erstmal mit Terminal Anwendungen zu starten.

    Wenn es GUI sein muss, würde ich dir eine Bibliothek empfehlen, die MFC weg abstrahiert (wie z.B. wxWidgets) oder Controls selber rendert (wie z.B. Qt).



  • Für MFC s. Dialogdatenaustausch.

    Aber @Schlangenmensch hat Recht, daß andere GUI-Framework besser sind.



  • @Schlangenmensch sagte in Visual Studio C++: Problem mit Dialog Eingabe-Feld:

    @jbaben sagte in Visual Studio C++: Problem mit Dialog Eingabe-Feld:

    Der Code passt nicht zu deiner Frage. Dein Code deklariert einen int, da gibt es kein Control.

    Das war ja nur ein Beispiel, Versuch von mir um zu zeigen was ich benötige (war aus dem Internet).

    Ich würde vermuten, dass du irgendwo den MFC Wizard ausgeführt hast und da irgendwelche Controls
    zusammen geschoben hast.

    Das ist nicht richtig vermutet, der Code wurde ja von Visual Studio 2022 C++ erstellt.
    Leider muss ich noch dazu sagen: der Code wurde nicht mit MFC sondern mit dem Windows-Desktopanwendung erstellt (Sorry).
    Ich habe auch mit MFC eine Desktopanwendung erstellt, da werden aber eine Menge Dateien erstellt und ist für mich im Moment leider "too much".

    Angenommen es handelt sich um ein CEdit Control würde ich mir die Funktionen GetWindowTextW oder GetLine anschauen.

    Muss ich noch machen.

    Aber, da ist viel geraten und ich fürchte, für dein Vorhaben (was ist eigentlich dein Vorhaben?) ist das nicht sonderlich zielführend.
    Mein Vorhaben: Ich möchte eine WINDOWS-Desktopanwendung mit mehreren Menüs und Menüeintragen
    erstellen und über die einzelen Menüeintrage entsprechen verarbeiten (Eingabe, speichern, ausführen).
    Anbei mein Projekt erstellt mit: Windows-Desktopanwendung.
    Für den Menüeintrag "Leimbild-Eingabe" habe ich einen Dialog erstellt (Klebesteuerung_Neu_3.zip).
    Geht leider nicht.

    Wenn du C++ lernen möchtest, würde ich dir empfehlen, erstmal mit Terminal Anwendungen zu starten.

    Das habe ich schon gemacht.

    Wenn es GUI sein muss, würde ich dir eine Bibliothek empfehlen, die MFC weg abstrahiert (wie z.B. wxWidgets) oder Controls selber rendert (wie z.B. Qt).

    Qt muss ich noch testen.

    Vielen Dank für Deine Hinweise
    Juergen



  • Um ehrlich zu sein, weiß ich nicht, wo drauf du hinaus möchtest. Ich lass mal das hier: BITTE LESEN: Du brauchst Hilfe?. Vlt hilft dir das, die Frage so zu formulieren, dass wir wissen, wo genau das Problem ist.
    Die eine Codezeile die du da gepostet hast, hat nichts mit MFC oder GUI zu zun, da wird nur ein Int mit einem Wert initialisiert.

    P.S. Das Forum hier unterstützt keine Anhänge, weder Bilder noch Zip Dateien oder sonst was. Wenn man ganze Projekte teilen möchte, würde ich zu einem Github Account raten um das darüber zu teilen.



  • @Schlangenmensch
    Hallo,
    vielen Dank für Deine Hinweise.
    Ich habe mein Projekt auf GitHub erstellt (mein erster Versuch) [https://github.com/jbaben/juergen]

    Klebesteuerung_Neu_3.cpp:

    // Meldungshandler für Leimbild-Eingabe.
    INT_PTR CALLBACK Leimbild_Eingabe(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
       // In dieser Funktion möchte ich die Eingaben aus dem Menue-Punkt "Leimbild-Eingabe" speichern.
       // z.B. Eingabefeld ID= IDC_LB_ABSTAND_START_1 usw.  
    
    
        UNREFERENCED_PARAMETER(lParam);
        switch (message)
        {
        case WM_INITDIALOG:
            return (INT_PTR)TRUE;
    
        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK_EINGABE || LOWORD(wParam) == ID_LB_EINGABE_CANCEL)
            {
                EndDialog(hDlg, LOWORD(wParam));
                return (INT_PTR)TRUE;
            }
            if (LOWORD(wParam) == IDC_LB_WERTE_SENDEN)
            {
                EndDialog(hDlg, LOWORD(wParam));
                return (INT_PTR)TRUE;
            }
            break;
        }
        return (INT_PTR)FALSE;
    })
    

    Das ist mein Problem.
    Juergen



  • @jbaben
    Hallo,
    Sorry mein GitHub-Projekt war auf "Privat" gestellt, habe es nun auf "Public" geändert.
    Juergen



  • Lies dir mal ein WinAPI-Tutorial dazu durch, z.B. Editboxen erstellen und benutzen (suche nach GetWindowTextLength und GetWindowText).

    Und zum Anzeigen eines Textes dann entsprechend SetWindowText verwenden.

    Um an das Window-Handle für ein Steuerelement eines Dialogs zu gelangen, mußt du vorher die Funktion GetDlgItem mit der Ressource-Id des Steuerelements aufrufen (bei dir also z.B. mit IDC_LB_ABSTAND_START_1).

    Auch die anderen Tutorials dürften dich weiterbringen (wenn du bei der WinAPI bleiben willst, anstatt ein einsteigerfreundlicheres GUI-Framework zu verwenden).

    Edit:
    Hier noch ein englisches Win32 API Programming Tutorial.

    PS:
    Solltest du doch die MFC benutzen wollen, dann lies zum Dialogdatenaustausch zusätzlich noch MFC: Avoiding GetDlgItem.



  • Du hast mehrere Möglichkeiten, um effizient weiterzukommen:

    1. Du verwendest reines WinAPI. Ich empfehle hierbei die Unterstützung durch einen KI-Assistenten, z.B. chatGPT-o1, denn dann musst du dich nicht um alle Sprachfeinheiten selbst kümmern. Zum Grundverständnis ist vielleicht mein altes WinAPI-Tutorial brauchbar: https://www.henkessoft.de/C++/WinAPI/WinAPI Kapitel 1 bis 6/api1.htm und https://www.henkessoft.de/C++/WinAPI/WinAPI_GDI/WinAPI_7_GDI.htm
    2. Du verwendest MFC, die im Visual Studio dabei sind. Zum Grundverständnis: https://www.henkessoft.de/C++/MFC/MFC Tutorials.htm
      Auch hier ist die KI überaus hilfreich.
    3. Du steigst auf C#/Windows Forms um: https://www.henkessoft.de/Windows Forms/Windows Forms Csharp - 1.htm


  • Hallo,
    so ich bin ein wenig weiter gekommen (Dank Eurer Hinweise)
    Ich möchte im Moment mit Visual Studio C++ Desktopanwendung weiter machen.
    Ich kann mit:

    int Abstand_Start_1 = GetDlgItemInt(hDlg, IDC_LB_ABSTAND_START_1, &bSuccess, FALSE);
    

    den Eingabewert speichern.
    Nun möchte ich den Integer Wert "Abstand_Start_1" in eine Datei speichern.
    Mit:

     HANDLE hFile;
     const wchar_t* filename = L"E:\\Test.txt";
    char DataBuffer[] = "This is some test data to write to the file.";
     DWORD dwBytesToWrite = (DWORD)strlen(DataBuffer);
     DWORD dwBytesWritten = 0;
     BOOL bErrorFlag = FALSE;
    hFile = CreateFile(filename, 
        FILE_APPEND_DATA | FILE_GENERIC_READ, 
        FILE_SHARE_READ,
        NULL, 
        OPEN_ALWAYS, 
        FILE_ATTRIBUTE_NORMAL,
        NULL);
    bErrorFlag = WriteFile(
        hAppend,           // open file handle
        DataBuffer,      // start of data to write
        dwBytesToWrite,  // number of bytes to write
        &dwBytesWritten, // number of bytes that were written
        NULL);      
    CloseHandle(hFile);
    

    kann ich den String DataBuffer in die Datei speichern.
    Wie aber muss ich den Integer-Wert konvertieren (Integer to LPCVOID ?) um ihn zu speichern?

    Juergen



  • @jbaben Warum nutzt du denn nicht die c++ Mittel? Sowohl für Strings, wie auch für Files?
    Das ist ein Problem, dass man mit ein bisschen eigener Recherche auch super selbst lösen kann.

    int number{42};
    std::ofstream ofile("example.txt", std::ios::app);
    ofile << number;
    

    Ich habe das gerade auf dem Handy getippt, daher ungetestet, aber sollte funktionieren. Du wirst dafür nur #include<fstream> machen müssen.



  • @Schlangenmensch sagte in Visual Studio C++: Problem mit Dialog Eingabe-Feld:

    @jbaben Warum nutzt du denn nicht die c++ Mittel? Sowohl für Strings, wie auch für Files?
    Das ist ein Problem, dass man mit ein bisschen eigener Recherche auch super selbst lösen kann.

    int number{42};
    std::ofstream ofile("example.txt", std::ios::app);
    ofile << number;
    

    Ich habe das gerade auf dem Handy getippt, daher ungetestet, aber sollte funktionieren. Du wirst dafür nur #include<fstream> machen müssen.

    Danke für den Hinweis, damit kann ich meine Daten (mit Daten-Struktur) speichern.
    Ich habe natürlich recherchiert, bin aber zu CreateFile gelangt.
    Das mit "ofstream" gefällt mir aber gut (weil es funktioniert).

    Juergen



  • @jbaben Ich vermute, dass du nach MFC Möglichkeiten gesucht hast, oder nach Visual C++ oder so.

    Ich würde dir empfehlen, nach C++ Lösungen zu suchen, sobald es nicht mehr um irgendwelche Fenster geht. Die C++ Standard Library ist sehr mächtig (https://en.cppreference.com/w/) und bietet für vieles angenehme Lösungen.


Log in to reply