Anfängerfrage: Werte im Fenster aktualisieren und Textausgabe ...



  • Hallo... zwei Fragen die nicht ganz neu sind und ich stöber auch schon den halben Tag im Forum und in der FAQ, konnte aber net schlau draus werden, ist auch leider meine erste GUI, deswegen muss ich mich mit sowas rumschlagen ...
    Ich habe ein Objekt einer Klasse dessen Werte sich ständig ändern und diese aktualisierten Werte sollen natürlich auch auf der Oberfläche geändert werden. Wenn ich die Werte aktuell nach Ausführen des Buttonevents und Einlesen der neuen Werte (aus einem Editfeld) in der WM_COMMAND ausgeben lasse, geht es wunderbar mit dem Problem, dass jedesmal wenn ich den Fokus auf das Fenster verliere, die ganzen mit TextOut geschriebenen Ausgaben weg sind. Wenn ich die Werte in der WM_PAINT ausgeben möchte bekommt er einfach keinen aktualisierten Wert, sondern immer nur die Startwerte. Ich hoffe, ich hab mein Problem ein wenig erläutern können...

    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
    { 
    static int cxChar, cxCaps, cyChar;
    HDC hdc; 
    PAINTSTRUCT ps;	
    TEXTMETRIC tm;
    
    Testklasse *NewTestklasse;
    NewTestklasse = new Testklasse();
    NewTestklasse->groesse=0;
    NewTestklasse->config();      // Legt anhand von "groesse" einige andere Werte fest
    
    switch (message) 
    { 
    case WM_CREATE:		
       hdc = GetDC(hwnd);
    
    		GetTextMetrics(hdc, &tm);
    		cxChar = tm.tmAveCharWidth;
    		cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;
    		cyChar = tm.tmHeight + tm.tmExternalLeading;
    
    		hGroup = CreateWindow("BUTTON","Konfiguration", 
    								WS_CHILD|WS_VISIBLE|BS_GROUPBOX, 
    								5,5,150,200,
    								hwnd,(HMENU)1, hInstGlobal,NULL);
    
    		hEdit = CreateWindow("EDIT","", 
    								WS_CHILD|WS_VISIBLE|WS_BORDER, 
    								10,30,(cxCaps*5),cyChar,
    								hwnd,(HMENU)2, hInstGlobal,NULL);
    
    		hButton1 = CreateWindow("BUTTON","Größe",
    								WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
    								65,30,(cxCaps*5),cyChar,
    								hwnd,(HMENU)2, hInstGlobal,NULL);
    
    		ReleaseDC(hwnd, hdc);
    		return 0;
    
    	case WM_PAINT:
    		//InvalidateRect(hwnd, NULL, TRUE);
    
    		char *string1, *string2;
    		string1 = new char[80];
    		string2 = new char[80];
    
    		_itoa(NewTestklasse->wert1, string2, 10);
    		lstrcpy (string1,"Wert1 (min): ");
    		lstrcat(string1, string2);
    
    		hdc = BeginPaint (hwnd, &ps);		
    
    		TextOut(hdc, 10, 50 , string1, lstrlen(string1)); /* Gibt des String: "Wert1 (min): 'wert1'" korrekt aus, wert1 wird aber nach Änderung nicht im Fenster aktualisiert*/	
    
    		EndPaint (hwnd, &ps);
    		delete [] string1;
    		delete [] string2;
    		DeleteDC(hdc);
    		break;
        return 0; 
    
    	case WM_COMMAND:
    		if(HIWORD(wParam) == BN_CLICKED)
    		{
    			if (LOWORD(wParam) == 2)
    			{
    				HDC hdc;
    				char *string1;
    				char *string2;
    				char *string3;
    				string1 = new char[80];
    				string2 = new char[80];
    				string3 = new char[10];				
    
    				hdc = GetDC(GetParent((HWND) lParam));
    
    				SendMessage(hEdit, WM_GETTEXT, 5, (LPARAM)string2);
    
    				int temp = atoi(string2);					// String in int konvertieren
    
    				NewTestklasse->groesse = temp;					// groeße initialisieren
    				NewTestklasse->config();							// neu konfigurieren scheint auch zu funktionieren
    
    				_itoa(NewTestklasse->wert1, string3, 10);
    				lstrcpy (string1,"Wert1 (min):");
    				lstrcat(string1, string3);
    				TextOut(hdc, 10, 70 , string1, lstrlen(string1)); //Diese Textausgabe gibt den eingelesenen Wert vollkommen korrekt aus, verschwindet jedoch, wenn ich z.B. minimiere - maximiere... 
    
    				delete [] string1;
    				delete [] string2;
    				delete [] string3;
    
    				ReleaseDC(hwnd, hdc);
    				//ValidateRect(hwnd, &rect); hab ich an der Stelle versucht, ging aber nicht				
    			}
    		}
    	return 0;
    	case WM_DESTROY: 
    		PostQuitMessage (0); 
    		return 0; 
    }
    

    Hoffentlich kann mir da jemand weiterhelfen... ich saß auch schon heute einfach zu lange dran 🙂 ...
    Aber 2 kleine Fragen habe ich noch...
    gibt es eine Möglichkeit einen Integerwert aus einem Editfeld auszulesen oder muss ich immer diese Umwandlung machen ?
    Kann man Werte in eine Textausgabe einbinden (Wie das bei Konsolenanwendungen mit dem Outputstream möglich ist) oder muss man dazu auch immer eine Typumwandlung machen ?
    Vielen Dank schonmal im Vorraus
    Navar



  • Oha, da ist noch ne Menge zu tun.

    Navar schrieb:

    Wenn ich die Werte in der WM_PAINT ausgeben möchte bekommt er einfach keinen aktualisierten Wert, sondern immer nur die Startwerte.

    Die WindowProc wird immer dann aufgerufen, wenn eine neue Message eintrifft - und das ist SEHR oft. Die Instantiierung deiner Testklasse befindet sich aber genau in der WindowProc, und da nicht etwa in einem case-Block. D.h., deine Klasse wird zigmal pro Sekunde neu instantiiert. Und das Schlimmste: nirgendwo wird Speicher freigegeben per "delete". Alle Variablen in deiner WindowProc sollten static sein - eben auch deine Testklasseninstanz.

    Navar schrieb:

    gibt es eine Möglichkeit einen Integerwert aus einem Editfeld auszulesen oder muss ich immer diese Umwandlung machen ?

    Nö, brauchst du nicht: GetDlgItemInt() ist die Lösung.

    Navar schrieb:

    Kann man Werte in eine Textausgabe einbinden (Wie das bei Konsolenanwendungen mit dem Outputstream möglich ist) oder muss man dazu auch immer eine Typumwandlung machen ?

    Schau dir mal wsprintf() an.



  • ok... manchmal ist es besser einfach nochmal von vorne anzufangen *gg*
    Ich habe die Instantiierung aus der WindowProc herausgenommen, das war echt net clever, dass ich da nicht dran gedacht habe. Aber irgendwie komme ich damit einfach nicht zurecht. Ich habe jetzt zum testen die Klasse mal wirklich auf das Einfachste reduziert und sie global instantiiert aber irgendwie klappt das alles nicht... naja... morgen geh ich das mal mit dem debugger durch, irgendwo habe ich bestimmt einen sau blöden fehler drinnen.
    Aber vielen dank für die Hinweise 😉


Anmelden zum Antworten