Problem mit GetWindowText



  • hi,
    ich habe vor nen kleinen übersetzer zu schreiben und mache mich im Vorfeld mit allen unbekannten Funktionen vertraut. Dazu gehört auch GetWindowText().
    Ich bin jetzt soweit das mein kompiler nicht mehr reklamiert und FAST alles klappt wie es soll. Wenn ich in mein Eingabefeld schreibe und dann auf den button drücke sollte der Text ausgelesen und ausgegeben werden und da ist das problem ich sehe nämlich nix.

    switch (message)                  /* handle the messages */
        {
    
            case WM_CREATE:
                 hwndEdit1= CreateWindow (TEXT ("edit"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL , 0, 0, 200, 100, hwnd, (HMENU) ID_EDIT1,((LPCREATESTRUCT) lParam)-> hInstance, NULL) ;
    			 hwndButton= CreateWindow ( TEXT("button"),TEXT("Übersetzen"), WS_CHILD | WS_VISIBLE ,45,45,100,40,hwnd,(HMENU) 1,((LPCREATESTRUCT) lParam)-> hInstance, NULL) ;
    			 return 0;
    
    		case WM_KEYDOWN:
    			switch(wParam)
    			{
    			case VK_RETURN:
    			case VK_SPACE:
    				InvalidateRect(hwnd,NULL,TRUE);
    				break;
    			}
    			return 0;
    
    		case WM_SIZE:
                 MoveWindow (hwndEdit1, 45, 10, 200, 20 ,TRUE) ;
    			 MoveWindow (hwndButton, 45, 45, 100, 40 ,TRUE) ;
                 return 0;
    
            case WM_PAINT:
                 hdc = BeginPaint (hwnd, &ps);
                 GetClientRect (hwnd, &rect);
    
    				 TextOut (hdc, 0, 10, TEXT("Wort:"),5);
    				 TextOut (hdc, 200, 200, test.lpString, 5);
    
                 EndPaint (hwnd, &ps);
    
                 return 0;  
    
    		case WM_COMMAND:
    			GetWindowText(hwndEdit1,test.lpString,5);
    			InvalidateRect(hwnd,NULL,TRUE);
    			return 0;
    

    kann mir das jemand erklären?? mfG noha



  • Wie ist test.lpString definiert, wie initialisiert, und erwartest du wirklich nur 5 Zeichen?



  • Ich tippe mal drauf, dass static fehlt.



  • vorläufig erwarte ich nur 5 Zeichen sollen später etwas mehr werden.
    ich habe test in einer Struktur so deklariert und zwar direkt unter
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

    static struct
    {
    	int i;
    	LPTSTR lpString;
    }test;
    


  • Für GetWindowText (und viele andere ähnliche Windows-API-Funktionen) mußt du selbst ein genügend großes Puffer bereitstellen. Wenn du die Maximallänge kennst, kannst du ein Puffer statischer Länge nehmen:

    static struct
    {
      int i;
      TCHAR text[6]; // 5 Zeichen + eins für den nul-terminator
    
    } test;
    

    Aber Vorsicht! Hier ist die Gefahr eine Pufferüberlaufs gegeben, da muß man die Doku immer ziemlich genau lesen, un einen solchen zu vermeiden.

    Im anderen Fall mußt du das Puffer dynamisch allozieren. Für Windows Controls bekommst du die Länge des Textes/Titels (in Zeichen) mit WM_GETTEXTLENGTH raus.

    Am besten ist natürlich, soetwas mittelfristig in einer "ordentlichen" Routine zu isolieren. Ich verwende eine Hilfsroutine CString GetWindowText(HWND wnd) - es gibt auch CString-replacements, die du ohne MFC-Abängigkeit verwenden kannst.

    Ansonsten könntest du noch einen std::vector<TCHAR> verwenden. (std::string ist eher nicht zu empfehlen, da std::string schlecht zur Win32 API paßt und du oft über einen std::vector gehen mußt)

    Wenn das alles etwas verwirrend ist: Für Zeiger, Puffer usw. gibt es im C++ Magazin (hier im Forum) eine sehr gute Einleitung.

    warum verwende ich TCHAR statt char? ==> umstellbar auf UNICODE.



  • Das mit dem TCHAR text[6]; funktioniert
    Vielen Dank noha 🙂


Anmelden zum Antworten