winapi addition



  • wieso funktioniert das nicht so:

    MessageBox(NULL, static_cast<std::string>(IDC_EDIT2) + static_cast<std::string>(IDC_EDIT1), "..", NULL);
    
    error C2440: 'static_cast': 'int' kann nicht in 'std::string' konvertiert werden
    1>        Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig
    

    mfg



  • #include <string>
    #include <sstream>
    #include <ostream>
    #include <iostream>
    
    int main()
    {
        int foo = IDC_EDIT1 + IDC_EDIT2;
        std::stringstream myStream;    
        myStream << foo;
        std::string myString(myStream.str());
        MessageBox(NULL, myString.c_str(), "..", NULL);
    }
    

    So gehts 😉



  • Was willst du überhaupt ausgeben lassen (IDC_EDIT1 und IDC_EDIT2 sind einfach nur Ids)?
    Ich nehme an, du willst die vom Anwender eingegebenen Texte (der beiden Editboxen) anzeigen lassen? Dafür gibt es die WinAPI-Message WM_GETTEXT.
    Am besten, du läßt dich ins WinAPI-Forum verschieben...



  • Ja, die WinAPI kann ein Krampf sein - mein Vorschlag: Schreib dir eine Funktion, die dir den Text des Editfeldes als std::string zurückgibt, etwa so:

    string GetEditText( int id )
    {
        int len = GetWindowTextLength(...) + 1; // +1 wegen der abschließenden '\0'
        char* raw = new char [len];
        GetWindowText( ... );
        string ret = raw;
        delete[] raw;
        return ret;
    }
    

    Dann kannst du die strings auch bequem "addieren": MessageBox( ..., GetEditText(ID1)+GetEditText(ID2), ... );



  • Badestrand schrieb:

    Ja, die WinAPI kann ein Krampf sein - mein Vorschlag: Schreib dir eine Funktion, die dir den Text des Editfeldes als std::string zurückgibt, etwa so:

    string GetEditText( int id )
    {
        int len = GetWindowTextLength(...) + 1; // +1 wegen der abschließenden '\0'
        char* raw = new char [len];
        GetWindowText( ... );
        string ret = raw;
        delete[] raw;
        return ret;
    }
    

    Dann kannst du die strings auch bequem "addieren": MessageBox( ..., GetEditText(ID1)+GetEditText(ID2), ... );

    Klappt leider auch nicht @Scorcher, Th und Badestrand.

    Ich hab einen DIALOG, dann eine Textbox gemacht.

    Dann:

    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	UNREFERENCED_PARAMETER(lParam);
    	switch (message)
    	{
    	case WM_INITDIALOG:
    		return (INT_PTR)TRUE;
    
    	case WM_COMMAND:
    		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
    		{
    			EndDialog(hDlg, LOWORD(wParam));
    			return (INT_PTR)TRUE;
    		}
    		if(LOWORD(wParam) == IDSUM) // IDSUM ist ein COMMANDBUTTON
    		{
    	        // IDC_* sind Textfelder
    						MessageBox(NULL, IDC_EDIT1.c_str(), "..", NULL); // Hier wollte ich nur mal das mit nur einer Textbox ausprobieren, trodzdem nichts.
    		}
    		break;
    	}
    	return (INT_PTR)FALSE;
    }
    

    Folge:

    error C2228: Links von ".c_str" muss sich eine Klasse/Struktur/Union befinden.

    mit freundlichen grüßen



  • Das was du geschrieben hast, kann nicht funktionieren. Ausserdem war deine Fragestellung auch fast nicht so zu verstehen. Du solltest das nächste mal mehr Infos rüberkommen lassen.
    Du möchtest aus dem Textfeld mit der ID IDC_EDIT1 einen Text haben. Gut. Nur ist IDC_EDIT1 nur eine Zahl. Eine sogeannte ID. Das ist keine Klasse. Du musst eben wie Badestrand zeigt, GetWindowText() verwenden, um den Text aus IDC_EDIT1 zu erhalten.

    string GetEditText( HWND hWnd )
    {
        int len = GetWindowTextLength(hWnd) + 1; // +1 wegen der abschließenden '\0'
        char* raw = new char [len];
        GetWindowText(hWnd, raw, len);
        string ret = raw;
        delete[] raw;
        return ret;
    }
    
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
        UNREFERENCED_PARAMETER(lParam);
        switch (message)
        {
        case WM_INITDIALOG:
            return (INT_PTR)TRUE;
    
        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
            {
                EndDialog(hDlg, LOWORD(wParam));
                return (INT_PTR)TRUE;
            }
            if(LOWORD(wParam) == IDSUM) // IDSUM ist ein COMMANDBUTTON
            {
                // IDC_* sind Textfelder
                            MessageBox(NULL, GetEditText(hDlg).c_str(), "..", NULL); // Hier wollte ich nur mal das mit nur einer Textbox ausprobieren, trodzdem nichts.
            }
            break;
        }
        return (INT_PTR)FALSE;
    }
    

    So sollte das gehen, habs allerdings nicht getestet.
    rya.



  • 'GetWindowTextW': Konvertierung des Parameters 2 von 'char *' in 'LPWSTR' nicht möglich
    1>        Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder
    

    kommt dabei bei
    GetWindowText(hWnd, raw, len);

    mfg



  • *seufz*
    Dann stell dein Programm auf MultiByte um, oder nimm statt char wchar_t oder gleich LPCWSTR, wobei LPCWSTR == wchar_t ist.
    Du kompilierst im UniCode Modus, was wir hier allerdings nicht riechen können. Und statt std::string auch gleich std::wstring.
    rya.



  • Scorcher24 schrieb:

    *seufz*
    Dann stell dein Programm auf MultiByte um, oder nimm statt char wchar_t oder gleich LPCWSTR, wobei LPCWSTR == wchar_t ist.
    Du kompilierst im UniCode Modus, was wir hier allerdings nicht riechen können. Und statt std::string auch gleich std::wstring.
    rya.

    aso danke^^
    hab geglaubt,dass das die ganze Zeit auf Multibyte war, danke 😃

    nur noch eine ganz kurze und einfache Frage:

    Wie kann ich aus der Textbox den Inhalt, also das was ich dort eingegeben hab in einer MessageBox ausgeben, wenn ich auf einen Commandbutton geklickt hab?

    Das mit der Funktion hat irgendwie nicht geklappt,

    if(LOWORD(wParam) == IDSUM)
    		{
    			MessageBox(NULL, "Summe lautet: ", "..", NULL); 
    		}
    

    Da sollte halt dann die entsprechende Summe rauskommen, nur klappt das irgendwie nicht.

    Sorry,dass ich solche einfachen Fragen stelle.

    mfg



  • hi

    sry für doppelposting.

    kann mir aber bitte jemand helfen?
    ich habe bereits gesagt,dass die Funktion zwar ohne Fehler zu kompilieren war, aber sobald ich den Sum Button angeklickt hatte, passierte trodzdem nichts.

    aus diesem beispiel

    if(LOWORD(wParam) == IDSUM)
            {
                MessageBox(NULL, "Summe lautet: ", "..", NULL); 
            }
    

    würde ich noch gerne sowas wie

    if(LOWORD(wParam) == IDSUM)
            {
                MessageBox(NULL, "Summe lautet: " + IDC_EDIT1, "..", NULL); 
            }
    

    ausgeben, also

    wenn in der Txtbox "8" steht und man auf den Button klickt ..

    Summe lautet: 8
    

    Sollte auch mit Strings,etc. funktionieren 😉

    mfg



  • Das Problem ist nicht, dass du einfache Fragen stellst.. Das Problem ist, dass du die Grundlagen nicht beherrschst (lies dir mal ein Tutorial durch, dass du wenigstens den Unterschied zwischen einem String und einem Integer kennst) und dass du unsere Antworten anscheinend nicht beachtest.. Hier wird dir (hoffentlich) keiner den kompletten Quellcode dafür hinlegen, so dass du nur noch rüberzukopieren brauchst. Wir haben schon alles geschrieben, was du brauchst, mit zwei Minuten nachdenken kannst du das locker und bequem in dein Programm einbauen. Aber nein, lieber nochmal mit "Summe lautet: " + IDC_EDIT1 ankommen 🙄



  • Badestrand schrieb:

    Das Problem ist nicht, dass du einfache Fragen stellst.. Das Problem ist, dass du die Grundlagen nicht beherrschst (lies dir mal ein Tutorial durch, dass du wenigstens den Unterschied zwischen einem String und einem Integer kennst) und dass du unsere Antworten anscheinend nicht beachtest.. Hier wird dir (hoffentlich) keiner den kompletten Quellcode dafür hinlegen, so dass du nur noch rüberzukopieren brauchst. Wir haben schon alles geschrieben, was du brauchst, mit zwei Minuten nachdenken kannst du das locker und bequem in dein Programm einbauen. Aber nein, lieber nochmal mit "Summe lautet: " + IDC_EDIT1 ankommen 🙄

    hi badestrand!

    also ich wollte zuerst nur einen Integer als Ergebnis in der Msgbox bekommen, sollte doch gehen.

    Die Funktion

    std::string GetEditText( HWND hWnd ) 
    { 
        int len = GetWindowTextLength(hWnd) + 1; // +1 wegen der abschließenden '\0' 
        char* raw = new char [len]; 
        GetWindowText(hWnd, raw, len); 
    	std::string ret = raw; 
        delete[] raw; 
        return ret; 
    }
    

    erlaubt nur,dass man int in string umwandeln kann.

    Und die MessageBox:

    if(LOWORD(wParam) == IDSUM)
    		{
    			MessageBox(NULL,  GetEditText(hDlg).c_str(), "..", NULL); 
    		}
    

    Gibt nur folgendes aus:

    "Dialog"

    mehr nicht.

    Deswegen möchte ich euch nur darum bitten, mir zu sagen, wie ich da ein IDC_EDIT1 anhängen kann, damit das auch so funktioniert, wie ich es möchte?

    mfg



  • ATt schrieb:

    Deswegen möchte ich euch nur darum bitten, mir zu sagen, wie ich da ein IDC_EDIT1 anhängen kann, damit das auch so funktioniert, wie ich es möchte?

    Das ist mit der Formulierung aber Unsinn! Du willst den Text anhängen, der im Editfeld steht, dass in deinem Fenster die ID IDC_EDIT1 hat.

    Ich hab wirklich das Gefühl, dass du die Grundlagen nicht verstehst. Ist ja nix schlimmes, aber dir bringt es gar nix, wenn wir dir einfach fertigen Code hinsetzen, den du bei dir einfügst.
    Ich versuche dir mal die Grundlagen zu erklären:

    Grundlage: Der Unterschied zwischen einem String und einem Integer
    Ein String ist eine Zeichenkette, die folglicherweise einen oder mehrere Zeichen enthält. Das kann sowas sein wie "Peter" oder "Dies ist ein Satz". Wenn du sowas in Hochkommas hast, ist das aber kein String-Objekt, sondern ein Zeiger auf den ersten Buchstaben der Zeichenkette. String-Objekte gibts in C++ nur mit der Klasse string aus dem Namensraum std.
    Wenn du "Peter"+1 schreibst, was passiert dann? Dann passiert das, was man Zeigerarithmetik nennt. Im Arbeitsspeicher reiht sich Byte an Byte. Jedes Zeichen wie das 'P' von "Peter" wird dabei von einem Byte repräsentiert, ein Byte mit dem Wert (nicht dem Buchstaben) Null schließt die Zeichenkette ab.
    Nehmen wir an du hast folgendes Programm:

    int main(...)
    {
        const char* meine_zeichenkette = "Peter";
        return 0;
    }
    

    Wenn dein Programm ausgeführt wird (die Exe-Datei), dann wird das Programm als Prozess in den Arbeitsspeicher geladen. Jeder Prozess hat dabei auch einen Datenbereich, in dem konstante Sachen drin stehen, wie z.B. auch die Zeichenkette "Peter".
    Das hier ist dann z.B. ein Ausschnitt aus dem Arbeitsspeicher, Byte neben Byte, welches je eine der Zahlen 0 bis 255 beinhalten kann; 'xxx' steht dabei für irgendeine zufällige Zahl:
    xxx xxx xxx 80 101 116 101 114 0 xxx xxx

    Laut der ASCII-Tabelle repräsentiert ein Byte mit dem Wert 80 z.B. den Buchstaben 'P'. So. Und jedes Byte kann durch eine Adresse angesprochen werden, so wie jedes Haus durch seine Anschrift. Relativ von unserem Arbeitsspeicherausschnitt hat unsere Zeichenkette "Peter" die Adresse 3 (Zählung beginnt mit 0).

    Modifizieren wir das Programm von oben ein wenig:

    int main(...)
    {
        const char* meine_zeichenkette = "Peter";
        const char* var2 = meine_zeichenkette + 1;
        printf( var2 );
        return 0;
    }
    

    Was wird ausgegeben? "eter"! Und warum? Weil die Variable var2 die Adresse von "Peter" plus ein Byte weiter enthält. Die Adresse adressiert also das Zeichen hinter dem 'P', also das 'e'.

    Und wenn du schreibst var2 = "Peter" + "Annelise" , was passiert dann? Jedenfalls nicht das, was du dir wünschst! Es sind einfach zwei Zeiger und dein Programm weiß nicht, was es mit den zwei Zeigern machen soll; sagen wir, "Peter" hat die Adresse 981273 und "Annelise" hat die Adresse 192387, was erwartest du dir dann von der Addition? Kommt jedenfalls nix sinnvolles dabei raus, der Zeiger zeigt sonstwohin..

    Dein IDC_EDIT ist ein Integer, das heißt eine Zahl. Kapito, eine Zahl! Das heißt, wenn du "Peter" + IDC_EDIT1 schreibst und IDC_EDIT1 den Wert 4 hat, kriegst du einen Zeiger dabei raus, der nur noch auf das 'r' von "Peter" zeigt.

    Um das Ganze handlicher zu machen und Sachen wie "Peter"+"Annelise" sinnvoll abwickeln zu können, gibts eben die string-Klasse. Klassen haben den Vorteil, dass man bestimmen kann, was bei der Operation mit "+" geschehen soll. Bei der string-Klasse werden die Zeichenketten aneinandergehangen, es entsteht also "PeterAnnelise".

    So, nun zur WinAPI. Darin werden Fenster wie folgt verwaltet:
    Jedes Fenster (Editfelder oder Buttons sind auch Fenster) hat ein Zugriffshandle, das ihm zur Laufzeit von Windows zugewiesen wird. Weil du aber in deinem Code jedes Fenster auch ansprechen können musst, vergibst du an deine Editfelder, Buttons usw eindeutige IDs, also auch Zahlen. Mit einem Aufruf der WinAPI-Funktion "GetDlgItem" bekommst du das Zugriffshandle für das Fenster zu der entsprechenden ID. Das Handle brauchst du, um z.B. den Text aus dem Editfeld zu bekommen.

    Also wandelt die "GetEditText"-Funktion ganz bestimmt nicht einfach eine Zahl in einen string um, sondern fragt von Windows passend zur übergebenen ID das Handle des Editfelds ab und holt sich mit dem Aufruf "GetWindowText" den Text von dem Editfeld.

    So, nachdem du den Text gelesen und verstanden hast, wirst du das wohl alleine lösen können 😉 Wenn nicht, dann stell haargenaue Fragen wo es hapert und kein generelles "Will Apfel in Korb werfen, klappt nicht", sondern eher sowas wie "Ich weiß nicht wo der Korb steht wo der Apfel rein soll, kann mir jemand helfen?". Ok? Hab echt Mühe und Zeit geopfert für den Text, jetzt zeig du auch mal ein wenig Eigeninitiative!



  • @Badestrand, manchmal kann man schon verzweifeln an den Fragestellern (und deren Fragen), aber ich glaube trotzdem nicht, daß der Threadersteller auch nur ein Wort verstanden hat.

    @ATt: Lass es erst einmal mit WinAPI, GUI und sonstigem Gedöns. Lern erstmal die Grundlagen mit Hilfe einer einfachen Konsolenanwendung... In ein paar Monaten kannst du dann nochmal Fragen zur WinAPI stellen (aber hoffentlich nicht dieselben) -)



  • hallo badestrand!

    Der Funktionsaufruf

    GetEditText(hDlg).c_str()
    

    tut mich nur ein wenig verwirren, da es immer nur den Titel des HWND's, also Fensters ausgibt.

    http://img85.imageshack.us/img85/3788/prbldd3.jpg

    Ich danke dir auf jeden Fall für deine Mühe, also für deinen ganzen Text 😉
    Ich hab alles andere außer das

    Also wandelt die "GetEditText"-Funktion ganz bestimmt nicht einfach eine Zahl in einen string um, sondern fragt von Windows passend zur übergebenen ID das Handle des Editfelds ab und holt sich mit dem Aufruf "GetWindowText" den Text von dem Editfeld.

    verstanden 😞

    Weil da
    GetWindowTextLength(hWnd) + 1 steht 😕

    mfg



  • ich bin mir nicht sicher, was ich nun machen soll.
    Ich verstehe zwar wo die Unterschiede zwischen String und Integer liegen, aber weiß leider nicht, wie ich das in mein Programm hineinintepretieren soll.

    Ich bitte dich/euch um Hilfe.

    mfg Adv. Tech. TOa



  • Vielleicht solltest du mal dein Ziel überlegen 😉

    Also, dein Ziel ist es ja gerade, den Text aus dem Editfeld auszulesen und in einer MessageBox (mit noch etwas Text davor) auszugeben.
    Spaßeshalber gehen wir einfach mal back-to-front (oder so :D) vor. Aaaaaaaaaaalso, wir fangen hinten an, mit der MessageBox.

    string msg, edittext;
    // Text aus dem Editfeld auslesen in edittext
    // msg soll aus "Irgendwas" plus dem edittext bestehen
    MessageBox( hDlg, msg.c_str(), "", MB_OK );
    

    ->

    string msg, edittext;
    // Text aus dem Editfeld auslesen in edittext
    
    // msg soll aus "Irgendwas" plus dem edittext bestehen
    msg = string("Irgendwas") + edittext;
    MessageBox( hDlg, msg.c_str(), "", MB_OK );
    

    ->

    string msg, edittext;
    // Text aus dem Editfeld auslesen in edittext
    edittext = LoadMyEditFieldContent( hDlg, IDC_EDIT1 );
    // msg soll aus "Irgendwas" plus dem edittext bestehen
    msg = string("Irgendwas") + edittext;
    MessageBox( hDlg, msg.c_str(), "", MB_OK );
    

    Die "LoadMyEditFieldContent"-Funktion kannst du dir selber schreiben. Auf Grundlage der Funktion "GetEditText( HWND hWnd )" von vorhin und der Funktion "GetDlgItem", die du bei der MSDN nachschlagen kannst 🙂

    MSDN: http://msdn2.microsoft.com/en-us/library/default.aspx



  • Oh... danke Badestrand, dass du mir noch immer helfen möchtest 😉

    Zum Thema:

    std::string GetEditText( HWND hWnd ) 
    { 
    	GetDlgItem(hWnd, IDC_EDIT1);
        int len = GetWindowTextLength(hWnd) + 1; // +1 wegen der abschließenden '\0' 
        char* raw = new char [len]; 
        GetWindowText(hWnd, raw, len); 
    	std::string ret = raw; 
        delete[] raw; 
        return ret; 
    }
    
    if(LOWORD(wParam) == IDSUM)
    		{
    			std::string msg, textIn;
    			textIn = GetEditText(hDlg);
    			msg = std::string("TEST") + textIn;
    			MessageBox(hDlg,  msg.c_str(), "..", NULL); 
    
    		}
    

    so, nun gibt es aber das Problem, dass da nun "TEST" und der Titel vom Fenster angezeigt wird.

    Irgendetwas hab ich noch falsch gemacht und ich bin mir nicht sicher,dass es das ist,weil ich ja eine Art verlinkung zum eingegebenen Text machen soll und nicht zum Fenster(vllt deswegen die ausgabe vom titel)

    oder die funktion stimmt nicht, evtl. die parameteranzahl bei der def. der funktion 🙂

    mfg



  • Ich geb dir nen Tipp: Die Funktion "GetEditText" bekommt ja ein Fensterhandle und gibt dir den Text von eben diesem Fenster zurück. Du übergibst ihr ja das Fensterhandle zu deinem Hauptfenster (hDlg), also bekommst du den Text vom Hauptfenster. Da du ja den Text vom Editfeld willst, musst du der Funktion das Fensterhandle vom Editfeld übergeben. Und da kommt nunmal die Funktion GetDlgItem ins Spiel 🙂

    ATt schrieb:

    Oh... danke Badestrand, dass du mir noch immer helfen möchtest 😉

    Du zeigst ja auch, dass du es wenigstens versuchst.. 🙂



  • hi

    kannst du mir bitte die funktion aufschreiben, ich will mal noch ein bisschn versuchen, bevor ich schlafen gehe und morgen werd ich mir die Lösung anschauen?;)

    ich bin jetzt zwar sehr müde, versuch es trodzdem noch ein bisschen.

    mfg


Log in to reply