winapi addition
-
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- oderkommt 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: 8Sollte 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_EDIT1ankommen
-
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_EDIT1ankommen
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"+1schreibst, 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 xxxLaut 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_EDIT1schreibst 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 dasAlso 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

-
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
-
Sorry, hab deinen Beitrag nicht mehr gesehen

Und welche Funktion meinst du? Die GetDlgItem? Die steht doch in der MSDN, hier die Signatur:
// The GetDlgItem function retrieves a handle to a control in the specified dialog box. HWND GetDlgItem( HWND hDlg, int nIDDlgItem );
-
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; } // ... if(...) { std::string text = GetEditText(GetDlgItem(hDlg, IDC_EDIT1)); MessageBox(NULL, text.c_str(), "..", NULL); }Hm?
-
Badestrand schrieb:
Sorry, hab deinen Beitrag nicht mehr gesehen

Und welche Funktion meinst du? Die GetDlgItem? Die steht doch in der MSDN, hier die Signatur:
// The GetDlgItem function retrieves a handle to a control in the specified dialog box. HWND GetDlgItem( HWND hDlg, int nIDDlgItem );Ja, ich hab es leider wieder falsch gemacht und dann bei hustbaer abgeschaut und da bin ich draufgekommen,dass eine funktion in einer anderen aufgerufen wird .. sorry,dass ich daran nicht gedacht habe.
DANKE an Badestrand und hustbaer für ihre nette Hilfe!
Nun weiß ich wie man Strings,etc.. ausgibt.
Danke!
mfg
Adv. Tech. TOa