2016-11-22 19 views
-2

Also im Grunde get Text von Textfeld Ich versuche, wie ich Sie Zeiger von GetWindowText bin mir richtig machen verstehen? Ich konnte diesen Text nicht in langen char platzieren, also musste ich int verwenden und das Meldungsfeld nimmt keine Ints, also musste ich in ein langes Zeichen umwandeln und dann den Zeiger umkehren (&)? den Text in einem Meldungsfeld angezeigt werden und dass die gedruckte mich nur ein Haufen UnsinnAbrufen von Text aus einem Edit-Control mit WinAPI

Fall WM_CREATE:

textbox1 = CreateWindow(L"EDIT", 
      L"X0", WS_BORDER | WS_CHILD | WS_VISIBLE, 
      50, 120, 50, 20, 
      hwnd, NULL, NULL, NULL); 

Fall WM_COMMAND:

case 111:{   
TCHAR buff[1024]; 
int text = GetWindowText(textbox1, buff, 1024); 
TCHAR textS = (TCHAR)text; 
MessageBox(hwnd, &textS, &textS, MB_OKCANCEL | MB_ICONEXCLAMATION);} 
+1

Entfernen 'TCHAR TEXTE = (TCHAR) Text; 'und einfach' buff' verwenden. –

+0

[Von MSDN] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms633520 (v = vs.85) .aspx): "Wenn die Funktion erfolgreich ist, ist der Rückgabewert die Länge in Zeichen der kopierten Zeichenfolge, ohne das abschließende Nullzeichen. " Wo hast du gesehen "du bekommst einen Zeiger von GetWindowText"? – andlabs

+0

oh ich benutzte diese Funktion anders herum, da Richard sagte, ich brauchte nur "buff" drucken, was für mich unerwartet war, jetzt macht alles Sinn – sanxe

Antwort

1

Der Rückgabewert von GetWindowText() ist die Länge des kopierten Textes (ohne den Nullabschluss). Sie geben diesen Wert an ein einzelnes TCHAR-Zeichen um und übergeben dann die Speicheradresse dieses einzelnen Zeichens an MessageBox(). Das ist einfach falsch. MessageBox() erwartet einen Zeiger auf einen nullterminierten Zeichenfolge, so sollten Sie stattdessen Ihre kopiert TCHAR[] Puffer werden vorbei:

TCHAR buff[1024] = {0}; 
GetWindowText(textbox1, buff, 1024); 
MessageBox(hwnd, buff, TEXT("text"), MB_OKCANCEL | MB_ICONEXCLAMATION); 

Alternativ können Sie einen dynamisch zugewiesenen Puffer statt:

int len = GetWindowTextLength(textbox1) + 1; 
TCHAR *buff = new TCHAR[len]; 
len = GetWindowText(textbox1, buff, len); 
buff[len] = 0; 
MessageBox(hwnd, buff, TEXT("text"), MB_OKCANCEL | MB_ICONEXCLAMATION); 
delete[] buff; 
1

Verwenden Sie den (wchar_t/TCHAR) nur Puffer:

int cTextLength; // text length 
cTextLength = GetWindowTextLength(hWndEdit);// get text length 
wchar_t * textS = new wchar_t[cTextLength + 1]; //dynamically allocate buffer 
// get text from an edit and store it into a buffer variable 
GetWindowText(hWndEdit, textS, cTextLength + 1); 
// display the message 
MessageBox(NULL, textS, textS, MB_OKCANCEL | MB_ICONEXCLAMATION); 
delete[] textS; // free the allocated memory 
+0

'GetWindowTextLength()' gibt ein 'int' zurück, kein' size_t'. Und dieser Code wird den Puffer überlaufen, wenn der Text größer als 1023 Zeichen ist. Wenn Sie 'GetWindowTextLength()' verwenden, dann ordnen Sie 'textS' entweder basierend auf der tatsächlichen Länge dynamisch zu oder verwenden mindestens '' min() ', um den Wert von' cTextLength' auf 1023 max zu beschränken. –

+0

Richtig du bist Remy. Ich habe die Antwort gemäß Ihren Anweisungen aktualisiert. Ich bin mir nicht sicher, ob es "new wchar_t [cTextLength];" oder "new wchar_t [cTextLength + 1];" –

+0

Die von 'GetWindowTextLength()' zurückgegebene Länge enthält nicht den Null-Terminator, aber die an 'GetWindowText()' übergebene Größe ist falsch, also ist die Zuweisung von 'cTextLength'-Zeichen und die Übergabe von' cTextLength + 1' falsch. Vergessen Sie auch nicht, den Speicher freizugeben, den Sie zuweisen. –

Verwandte Themen