Probleme mit Textausgaben



  • hi leute,

    ich habe immer probleme mit text ausgaben...

    z.b wenn ich einen text mit TextOut im fenster ausgeben, später dann ein rechteck drüber male ist der text erstmal weg. doch wenn ich dann das fenster minimiere ist der text wieder da, obwohl er da nicht sein soll.

    alle text ausgaben mach ich im WM_PAINT.

    gibts da vllt noch bessere funktionen für die Textausgabe? oda nur TextOut und DrawText?



  • metapoint2011 schrieb:

    alle text ausgaben mach ich im WM_PAINT.

    Dann ist aber doch auch klar dass der Text wieder gezeichnet wird wenn das Fenster neu gezeichnet wird oder? Versteh nicht warum dich wundert dass der Text wieder gezeichnet wird wenn dus doch genau so programmiert hast dass das passiert 😕



  • hab doch aba was drüber gemalt?

    und mann soll doch auch nur in WM_PAINT zeichen, oder gilt das nicht für Text?

    und wie kann ich denn Text ausgeben und den dann später wieder rauslöschen?



  • metapoint2011 schrieb:

    hab doch aba was drüber gemalt?

    Wenn du dein Rechteck drübermalst schön und gut, aber wenn du im nächsten WM_PAINT dann wieder den Text über das Rechteck malst dann bekommst du eben genau das was du offenbar beobachtest!?

    metapoint2011 schrieb:

    [...] und wie kann ich denn Text ausgeben und den dann später wieder rauslöschen?

    Hier mal ne ganz verrückte Idee: Statt den Text zu zeichnen und dann was drüberzumalen zeichne ihn doch einfach gar nicht wenn er nicht gezeichnet werden soll^^

    Mir scheint du hast da ein kleines Missverständnis was die Funktionsweise von GDI angeht: Wenn du mit GDI was zeichnest dann tust du einfach nur genau das, du zeichnest Hier und Jetzt Text, ein Rechteck, whatever. Du erstellst damit kein Text, Recheckt, whatever Objekt welches von Windows dann verwaltet wird sodass es sicht merkt was, wann, wie, wo und in welcher Reihenfolge gezeichnet werden soll. Malen mit GDI bedeutet Hier und Jetzt Pixel anzufärben. Und die die Pixel behalten ihre Farbe genau so lang bis ihre Farbe geändert wird und das wars. Es heißt nicht umsonst DrawText und nicht CreateText() 😉



  • okay 🙂

    aba ich muss ihn ja zeichen. da ich ihn ja brauche sonnt würde ich ihn ja nicht zeichen und später brauche ich ihn halt nicht mehr.

    also einfach dann die textfarbe ändern? 🙂

    das ich nich selber drauf gekommen bin!

    is aba irgentwie doof, das man gdi objekte nicht einfach wieder entfernen kann.

    Benutzt man eigentlich eher textout oder drawtext?



  • mann soll doch auch nur in WM_PAINT zeichen

    Das halte ich für ein Gerücht. Ich verwende WM_PAINT garnicht. Prinzipiell brauchst du nur ein Handle zum Devicecontext (HDC) und kannst dann damit machen was und wann du möchtest.

    DrawText hat mehr Optionen, wobei Textout simpler ist.



  • metapoint2011 schrieb:

    aba ich muss ihn ja zeichen. da ich ihn ja brauche sonnt würde ich ihn ja nicht zeichen und später brauche ich ihn halt nicht mehr.

    Dann zeichne ihn später eben nichtmehr!?

    metapoint2011 schrieb:

    also einfach dann die textfarbe ändern? 🙂

    Nein verdammt, einfach den Text nicht zeichnen.

    metapoint2011 schrieb:

    is aba irgentwie doof, das man gdi objekte nicht einfach wieder entfernen kann.

    Es sind eben keine Objekte, da gibts nichts zu entfernen. Wenn du auf eine Tafel malst und dann gerne an einer Stelle was andres malen willst musst du die Tafel zuerst löschen...

    metapoint2011 schrieb:

    Benutzt man eigentlich eher textout oder drawtext?

    Je nachdem was man braucht, wär ja nicht so dass die beiden Funktionen genau das gleiche tun!?

    Wenn dus ganz genau wissen willst dann einfach mal hier lesen 😉



  • und wie zeichne ich einen text nicht?

    gibts da eine funktion für oder was?

    mit invalidaterect habe ich das ganze fenster neu gezeichnet.

    nur kommt der text dann trozdem wieder nach dem minimieren.

    oda hat einer ein kleines beispiel?



  • metapoint2011 schrieb:

    und wie zeichne ich einen text nicht?

    1. Du willst Text haben, also malst du Text in WM_PAINT.
    2. Du willst Text jetzt nichtmehr haben also zeichnest du den entsprechenden Bereich des Fensters neu nur ab jetzt in WM_PAINT eben ohne den Text zu zeichnen. Wenn du TextOut/DrawText nicht aufrufst dann wird auch kein Text gemalt...



  • metapoint2011 schrieb:

    und wie zeichne ich einen text nicht?

    rofl 😃 😕



  • man.. ich habs immernochnicht "ganz" kappiert.

    also meint ihr das z.b so:

    wenn ich z.b einen button drücke, wird das fenster neu gezeichnet und dann ab einer bestimmen stellen in WM_PAINT weitergemalt?

    ich zeige euch auch mal meinen code:

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	int wmId, wmEvent;
    	static HWND hBtn1, hBtn2, hBtnStop, hEditU1, hEditU2, hEditCount, hEditTimer;
    	static WCHAR wBufTime[100];
    	static RECT rc, rc1;
    	static int iMin, iSdown;
    	PAINTSTRUCT ps;
    	HDC hdc;
    
    	switch (message)
    	{
    	case WM_CREATE:
    		hEditCount = CreateWindow(_T("edit"), _T("min"), 
    								  WS_CHILD | WS_VISIBLE | WS_BORDER | ES_CENTER | ES_NUMBER,
    								  130, 20, 60, 22, hWnd, (HMENU) 1, hInst, NULL);
    
    		hBtn1 = CreateWindow(_T("button"), _T("Countdown setzen"),
    							 WS_CHILD | WS_VISIBLE | WS_BORDER,
    							 34, 50, 150, 22, hWnd, (HMENU) 2, hInst, NULL);
    
    		hEditU1 = CreateWindow(_T("edit"), _T("h"),
    							   WS_CHILD | WS_VISIBLE | WS_BORDER | ES_CENTER | ES_NUMBER,
    							   110, 107, 22, 22, hWnd, (HMENU) 3, hInst, NULL);
    
    		hEditU2 = CreateWindow(_T("edit"), _T("m"),
    							   WS_CHILD | WS_VISIBLE | WS_BORDER | ES_CENTER | ES_NUMBER,
    							   145, 107, 22, 22, hWnd, (HMENU) 4, hInst, NULL);
    
    		hBtn2 = CreateWindow(_T("button"), _T("Uhrzeit setzen"),
    							   WS_CHILD | WS_VISIBLE | WS_BORDER,
    							   35, 137, 140, 22, hWnd, (HMENU) 5, hInst, NULL);
    
    		hBtnStop = CreateWindow(_T("button"), _T("Timer stoppen!"),
    								WS_CHILD | WS_BORDER,
    								45, 120, 140, 22, hWnd, (HMENU) 6, hInst, NULL);
    
    		hEditTimer = CreateWindow(_T("edit"), NULL,
    								 WS_CHILD | WS_BORDER | ES_CENTER  | ES_READONLY,
    								 45, 35, 140, 22, hWnd, (HMENU) 7, hInst, NULL);
    		break;
    
    	case WM_SIZE:
    		iMin = 0;
    
    		rc.left = 0;
    		rc.top = 0;
    		rc.right = 0;
    		rc.bottom = 0;
    
    		rc1.left = 0;
    		rc1.top = 0;
    		rc1.right = 0;
    		rc1.bottom = 0;
    		break;
    
    	case WM_TIMER:
    		iMin -= 1;
    		wsprintf(wBufTime, TEXT("Noch %d min."), iMin);
    		SetWindowText(hEditTimer, wBufTime);
    		if(iMin == 0)
    		{
    			KillTimer(hWnd, 1);
    			shutdown();
    		}
    		break;
    
    	case WM_COMMAND:
    		wmId    = LOWORD(wParam);
    		wmEvent = HIWORD(wParam);
    		// Menüauswahl bearbeiten:
    		switch (wmId)
    		{
    		case SET_COUNT:
    			{
    			WCHAR wctBuf[10];
    			char  ctBuf[10];
    
    			GetWindowText(hEditCount, wctBuf, 9);
    			WideCharToMultiByte(CP_ACP, NULL, wctBuf, sizeof(wctBuf), ctBuf, sizeof(ctBuf), NULL, NULL);
    			iMin = atoi(ctBuf);
    
    			ShowWindow(hBtn1, SW_HIDE);
    			ShowWindow(hBtn2, SW_HIDE);
    			ShowWindow(hEditU1, SW_HIDE);
    			ShowWindow(hEditU2, SW_HIDE);
    			ShowWindow(hEditCount, SW_HIDE);
    
    			rc.left = 10;
    			rc.top = 10;
    			rc.right = 220;
    			rc.bottom = 85;
    
    			rc1.left = 10;
    			rc1.top = 95;
    			rc1.right = 220;
    			rc1.bottom = 170;
    
    			InvalidateRect(hWnd, NULL, TRUE);
    
    			ShowWindow(hBtnStop, SW_SHOW);
    			ShowWindow(hEditTimer, SW_SHOW);
    
    			wsprintf(wBufTime, TEXT("Noch %d min."), iMin);
    			SetWindowText(hEditTimer, wBufTime);
    
    			SetTimer(hWnd, 1, 60000, NULL);
    			}
    			break;
    		case STOP_COUNT:
    			KillTimer(hWnd, 1);
    
    			ShowWindow(hBtnStop, SW_HIDE);
    			ShowWindow(hEditTimer, SW_HIDE);
    
    			rc.left = 0;
    			rc.top = 0;
    			rc.right = 0;
    			rc.bottom = 0;
    
    			rc1.left = 0;
    			rc1.top = 0;
    			rc1.right = 0;
    			rc1.bottom = 0;
    
    			InvalidateRect(hWnd, NULL, TRUE);
    
    			ShowWindow(hBtn1, SW_SHOW);
    			ShowWindow(hBtn2, SW_SHOW);
    			ShowWindow(hEditU1, SW_SHOW);
    			ShowWindow(hEditU2, SW_SHOW);
    			ShowWindow(hEditCount, SW_SHOW);
    			break;
    		case IDM_\1:
    			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    			break;
    		case IDM_EXIT:
    			DestroyWindow(hWnd);
    			break;
    		default:
    			return DefWindowProc(hWnd, message, wParam, lParam);
    		}
    		break;
    
    	case WM_PAINT:
    		hdc = BeginPaint(hWnd, &ps);
    
    		Rectangle(hdc, 10, 10, 220, 85);
    		TextOut(hdc, 30, 22, _T("Countdown : "), sizeof("countdown : "));
    
    		Rectangle(hdc, 10, 95, 220, 170);
    		TextOut(hdc, 41, 110, _T("Uhrzeit : "), sizeof("uhrzeit : "));
    		TextOut(hdc, 132, 110, _T(" : "), sizeof(" : "));
    
    		Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom);
    		Rectangle(hdc, rc1.left, rc1.top, rc1.right, rc1.bottom);
    
    		EndPaint(hWnd, &ps);
    		break;
    
    	case WM_DESTROY:
        ...............................
    


  • Vielleicht beschreib ich dir mal ganz langsam was du da programmiert hast: Du hast dein Fenster so programmiert dass beim Neuzeichnen (WM_PAINT) ein Text gezeichnet wird. Jetzt möchtest du dass der Text verschwindet. Also zeichnest du dein Fenster neu. Beim Neuzeichnen wird nun natürlich wieder der Text gezeichnet (schließlich hast dus ja so programmiert) was du jetzt aber nichtmehr möchtest -> Problem.

    Was könnte man da tun?

    Antwort: Wenn der Text nichtmehr erscheinen soll aufhören den Text hinzumalen.



  • okay z.b so in WM_PAINT? bText ist jetzt mal eine variable mit dem Typ BOOL

    WM_PAINT:
    
    if(bText == FALSE)
    TextOut(.......);
    else if(bText == TRUE)
    irgentwas anderes oder return 0;
    
    break;
    
    ?????? hab ichs verstanden?
    


  • z.B. ja...



  • aahhhh... danke danke

    ich bin so unschlau.. das sind so einfache dinge 😞



  • metapoint2011 schrieb:

    ich bin so unschlau.. das sind so einfache dinge 😞

    Ich würde eher meinen du hattest einfach nur ein Missverständnis darüber wie GDI funktioniert was deine Gedankengänge in die falsche Richtung gelenkt hat. Und schlussendlich isses dir ja klargeworden 😉



  • stimmt 🙂



  • WM_PAINT:
    
    if(!bText)
    TextOut(.......);
    else if(bText)
    irgentwas anderes oder return 0;
    

    Boolsche Werte auf == TRUE und == FALSE zu prüfen ist Quatsch.



  • George Boole schrieb:

    Boolsche Werte auf == TRUE und == FALSE zu prüfen ist Quatsch.

    huh!?


Anmelden zum Antworten