LPWSTR in float umwandeln
-
hi leute.
undzwar habe ich das Problem dass ich in WINAPI ein Dialogfenster habe, in dem man in ein Textfeld eine Kommazahl eingeben soll und diese wird dann gespeichert (in float).
Ich lese den inhalt der Textbox mit GetDlgItemText ein. (habe es aber auch schon mit GetDlgItemInt versucht).
Mein problem ist jetz die (korrekte) umwandlung des Inhaltes (LPWSTR) in ein float mit Nachkommastellen!!
Ich habe schon alle möglichen sachen die mir google ausgespuckt hat versucht, aber die die gingen haben die Kommazahl entweder weggeschnitten oder ein falsches ergebniss ausgegeben

Weis da einer eine gute lösung oder ist die Lösung mit GetDlgItemInt bzw GetDlgItemText sowieso schon vom ansatz falsch

Hier der Codeauszug (mit GetDlgItemInt):
float Minx; Minx = GetDlgItemInt(hDlg, IDC_LO, NULL, true);DANKE

lg
-
Falls du C++ nutzt, boost::lexical_cast bzw wstringstream.
-
GetDlgItemInt liefert dir halt ein int, wie der Name schon vermuten lässt. Da ist nix mit Nachkommastellen. Du musst also eher GetDlgItemText benutzen und den String dann umwandeln. C++-Möglichkeiten wurden genannt, in C könnte man z.B. sscanf, atof/atodbl oder strtod benutzen.
-
Ja C++ stimmt schon

wie funktioniert das mit wstringstream??
Habe sstream schon included, zumindest meint MSDN dass ich das braucht, aber wie wende ich das an? OoDanke

-
_wscanf!?
-
Jochen Kalmbach schrieb:
_wscanf!?
Das wäre natürlich ein guter und bequemer Weg (wobei du eher swscanf meinst, oder?), aber dann wird man direkt wieder angepöbelt, warum man denn nicht den einzig wahren C++-Puristen-Weg geht und über mehrere Zeilen was in einen Stream rein- und wieder rausschiebt...

@C0dR: Probier mal in etwa so (ungetestet):
TCHAR buffer[256]; GetDlgItemText(hDlg,IDC_LO,buffer,256); float f=0.f; swscanf(buffer,_T("%f"),&f);Die Rückgabe von swscanf solltest du vielleicht noch prüfen...
-
Funktioniert

Ihr seid klasse
Allerdings habe ich gemerkt dass ich das beim Einlesen in die Felder auch falsch gemacht habe (also aus den selben variablen soll auch eingelesen werden,beim aufrufen des dialogs).
Und da habe ich jetz wieder das problem mit den Datentypen. Im moment habe ich das so gelöst:
std::stringstream sstr; LPCWSTR ptr1; sstr << Minx; str1 = (wchar_t*)(sstr.str().c_str()); SetDlgItemText ( hDlg, IDC_LO, ptr1);Allerdings tauchen dann nur Asiatische und sonstige Zeichen auf

Ich nehme an falscher Zeichensatz?
-
Du kannst nicht einfach von char* nach wchar_t* casten und dann erwarten, dass du noch was vernünftiges rausbekommst. Sowas müsstest du per Funktion richtig umwandeln. Aber warum nimmst du denn std::stringstream und nicht std::wstringstream, wo du doch offensichtlich ein Unicode-Projekt hast? Probier es mit std::wstringstream und lass den Zwischenschritt über ptr1 weg (also übergib direkt die Rückgabe von c_str() an SetDlgItemText). Das klappt wahrscheinlich besser.
-
hm..ok.
Es sind keine Asiatischen zeichen mehr da, aber die Ergebnisse sind falsch
der macht aus -2 eine 1 und aus 1.5 auch eine 1.
-
C0dR schrieb:
hm..ok.
Es sind keine Asiatischen zeichen mehr da, aber die Ergebnisse sind falsch
der macht aus -2 eine 1 und aus 1.5 auch eine 1.Zeig mal den aktuellen Code.
-
wow das ging ja schnell

std::wstringstream sstr; sstr << Minx; SetDlgItemText ( hDlg, IDC_LO, sstr.str().c_str());und bei der Abfrage:
TCHAR buffer[256]; GetDlgItemText(hDlg,IDC_LO,buffer,256); float f=0.f; swscanf(buffer,_T("%f"),&f); Minx = f;//EDIT: AHH Mein Fehler! Hatte mich mit den Variablen vertan! Funktioniert alles prima

Ihr seid die besten, vielen Dank
Jetz noch eine Frage, sofern ihr noch lust habt mir zu helfen

Gibt es eine möglichkeit den Inhalt des Fensters als BMP / Jpeg / sonstiges auszugeben? Habe gegoogelt aber die möglichkeiten die ich gefunden habe haben mir nur eine schwarze Ausgabe direkt auf den Bildbuffer gegeben oO
-
C0dR schrieb:
Gibt es eine möglichkeit den Inhalt des Fensters als BMP / Jpeg / sonstiges auszugeben? Habe gegoogelt aber die möglichkeiten die ich gefunden habe haben mir nur eine schwarze Ausgabe direkt auf den Bildbuffer gegeben oO
Dazu musst du einen Screenshot vom Fenster machen. Dazu gibt es hier einige Threads (z.B. http://www.c-plusplus.net/forum/viewtopic-var-p-is-950658.html).
EDIT: Oder schau mal besser hier nach, der will dasselbe wie du: http://www.c-plusplus.net/forum/viewtopic-var-t-is-64339-and-start-is-20-and-postdays-is-0-and-postorder-is-asc-and-highlight-is--and-printview-is-1-and-start-is-0.html