Textausgabe
-
Hallo,
ich würde gerne ne normale Textausgabe in nen Windows Fenster machen. Soweit geht das auch ganz gut nur ist es bis jetzt so das der Text sofort da ist. Ich würde es lieber so haben das die Buchstaben nach und nach erscheinen so Schreibmaschienenmäßig. Nur weiss ich nicht wirklich wie. Die Pausen zwischen einzelnen Zeilen sollte auch immer unterschiedlich sein. Wie kann ich das am besten hinbekommen ?
-
Nimmst dir ein Static-Control, einen Timer und SetWindowText
-
Naja soweit bin ich schon. Mein Problem liegt darin das ich nicht weiss wie ich den Timer benutzen soll. Timer setzen hab ich drin. Den Timer wieder killen hab ich auch drin. Aber wie setze ich den Timer jetzt auch noch ein ? Könnte mir vielleicht jemand nen kleines Beispiel geben ?
-
case WM_TIMER: // ... break;
-
-
miller_m schrieb:
Ja die Seite kenne ich. Bzw gucke ich sowieso immer zuerst auf der MSDN Seite. Aber ich komme damit nicht so wirklich klar. Dort heisst es:
// process the 10-second timer
So ich hatte mir auch mal das Win32API Buch von Petzold gekauft. Dort gibt es auch so nen Beispiel. Wenn ich das richtig verstanden hab soll in "case WM_TIMER" und dann da wo die beiden "//" sind die Sachen rein die alle 10 Sekunden ausgeführt werden sollen. Oder sehe ich das falsch ? Wenn ich da zumindest mein "DrawText" einfüge dann erhalte ich natürlich die Schrift nicht. Der Timer funktioniert aber ich hab um das zu testen noch nen "MessageBeep" eingebaut. Irgendwie verwirrt mich das ganze. Werd wohl noch weiter im Netz danach suchen und hoffen das ich irgendwann mal irgendwas finde womit ich was anfangen kann.
-
Yasha schrieb:
Wenn ich das richtig verstanden hab soll in "case WM_TIMER" und dann da wo die beiden "//" sind die Sachen rein die alle 10 Sekunden ausgeführt werden sollen. Oder sehe ich das falsch ?
siehst du richtig
Yasha schrieb:
Wenn ich da zumindest mein "DrawText" einfüge dann erhalte ich natürlich die Schrift nicht. Der Timer funktioniert aber ich hab um das zu testen noch nen "MessageBeep" eingebaut.
zeichnest du das fenster auch neu UpdateWindow()
-
Zeichnen solltest du nur in WM_PAINT und in WM_TIMER dann nur InvalidateRect (+ ggf. UpdateWindow)
-
Meins sieht jetzt so aus und ist warscheinlich total Falsch....
case WM_TIMER : MessageBeep (-1) ; DrawText (hdc, TEXT ("Nur ein Test"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; InvalidateRect (hwnd, NULL, FALSE) ; return 0 ; case WM_PAINT : hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; EndPaint (hwnd, &ps); return 0 ; case WM_DESTROY: KillTimer (NULL, Timer1) ; PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }Beim bauen meckert er dann natürlich über die Variable hdc. War mir irgendwie auch klar dass das so endet.
-
PAINTSTRUCT ps; HDC hdc; case WM_TIMER : UpdateWindow(hwnd); return 0 ; case WM_PAINT : hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; DrawText (hdc, TEXT ("Nur ein Test"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint (hwnd, &ps); return 0 ;
-
@miller_m
Mhm danke erstmal aber es funktioniert noch nicht ganz so wie es soll. Wenn ich es so übernehme wie von dir geschrieben dann ist der Text sofort da und danach passiert nichts mehr. Hab es dann nochmal etwas abgeändert das mit dem Timer sieht jetzt so aus:case WM_TIMER : InvalidateRect(hwnd, NULL, TRUE) ; UpdateWindow(hwnd) ; return 0 ;Naja nun sieht man das er im Sekundentakt das Bild quasi neu Zeichnet. Man sieht halt immer ein kurzes Flackern. Ich wollte das aber irgendwie so haben das bei dem Satz "Nur ein Test" die Buchstaben im Sekundentakt auftauchen.
-
Dann musst du dir eine statische Variable anlegen, die du in WM_TIMER hochzählst. In Abhängigkeit davon gibst du dann eben den String bis zu diesem Zeichen aus

In deinem Fall kannst du das Flackern dadurch unterbinden, dass du bei InvalidateRect als letzten Parameter FALSE nimmst - das bewirkt dann, dass dein Fensterinhalt nicht gelöst wird und du einfach über den alten Inhalt drüberzeichnest

-
Erstmal nochmal danke an alle für die Tips. Hab es jetzt hinbekommen

Dann musst du dir eine statische Variable anlegen, die du in WM_TIMER hochzählst. In Abhängigkeit davon gibst du dann eben den String bis zu diesem Zeichen aus
Ich weiss grade nicht ob ich das gemacht hab was du meintest. Bin im Grunde totaler Anfänger hab erst mit einfachen ausgaben in nen Dosfenster begonnen und hab jetzt halt angefangen das ganze mit der winAPI zu machen. Werde mal die teile vom Code hier Posten die geändert wurden. Vielleicht kann mir ja dann auch jemand sagen ob die Lösung so ok ist
int i = 0; char text1[] = "Nur ein Test"; char text2[] = "Noch ein weiterer Test"; char text3[] = "und jetzt nichts mehr"; case WM_TIMER : GetClientRect (hwnd, &rect); InvalidateRect(hwnd, NULL, TRUE) ; break; case WM_PAINT : hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; if (i == 0) { DrawText (hdc, text1, -1, &rect, DT_LEFT | DT_VCENTER) ; i = 1; } else if (i == 1) { DrawText (hdc, text2, -1, &rect, DT_CENTER | DT_VCENTER) ; i = 2; } else { DrawText (hdc, text3, -1, &rect, DT_RIGHT | DT_VCENTER) ; i = 0; } EndPaint (hwnd, &ps); return DefWindowProc(hwnd, message, wParam, lParam); break;So schauts jetzt aus und es funktioniert auch ohne Probleme.
-
bei der stringlaenge von drawtext musst du deine variable angeben, die immer einen hochgezaehlt wird, sodass immer ein buchstabe mehr dargestellt wird...
-
Yasha scheint jetzt wohl doch nicht mehr Zeichen für Zeichen ausgeben zu wollen, sondern nacheinander verschiedene Texte?!
@Yasha: dein i solltest du besser in WM_TIMER hochzählen, denn WM_PAINT bekommst du unter Umständen öfters mal auch zwischendurch (z.B. nach Wiederhestellen nachdem dein Fenster minimiert war, o.ä.)
Zur besseren Übersichtlichkeit, wäre evtl. statt den if/else ein switch ganz praktisch
-
Yasha scheint jetzt wohl doch nicht mehr Zeichen für Zeichen ausgeben zu wollen, sondern nacheinander verschiedene Texte?!
Ähm ja sorry. Wenn irgendwas funktioniert so wie es sollte überleg ich mir gleich was man noch dazu machen könnte. Als nächstes werde ich da noch verschiedene Sounddateien abspielen lassen. Und zwar so das es irgendwie mit den Texten die ausgegeben werden zusammen passt mal gucken wie ich das anstelle.