Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Message Procedur mit textout (https://www.delphipraxis.net/72-message-procedur-mit-textout.html)

Salomon 9. Jun 2002 16:00


Message Procedur mit textout
 
Aha,
hier haben sich also einige User aus dem ehemaligen DF versteckt ;-)
Ist echt schade, das DAS Delphiforum nicht mehr existiert. Es wäre natürlich super wenn sich noch weitere alte User hier anmelden würden und eine ähnlich große und vor allem hilfsbereite Community entstehen würde.

Nun zu meinem Problem. Mit Luckies Hilfe habe ich vor einiger Zeit ein Konsolen Programm in nonVCl programmiert. Das Programmfenster bedeckt dabei den ganzen Bildschirm.
Nun wollte ich eine Message Procedure schreiben, der man text als String oder PChar übergeben kann, der dann mit Hilfe von textout auf das Fenster geschrieben werden soll. Dabei soll die Procedure nach jedem übergeben String eine neue Zeile anfange. Sind 10 Zeilen auf dem Bildschirm, sollen alle Zeilen eins weiter nach oben rücken, die obere wegfallen, und unten die neue hinzugefügt werden.
Mein Problem geht aber schon beim textout los, das geht nämlich bei mir nur in der WM_Paint Procedure so wie es sollte. Und das mit den 10 Zeilen Text habe ich auch noch nicht gelöst.
Hier schoneinmal ein Anfang:

Code:
procedure messageout (text : PChar);
var WndDC: HDC;
        ps: TPaintStruct;
begin
        WndDC := BeginPaint(hmain, ps);
        SetTextColor(WNdDC,RGB(140, 255, 0));
        SetBkMode(WNdDC, TRANSPARENT);
        textout (WndDC,10,10,text,length(text));
        EndPaint(hmain, ps);
end;
Das ist doch was für Luckie, den nonVCL Gott :-) Bin übrigens über deine Seite hierher gekommen.

Mfg
Salomon

Luckie 9. Jun 2002 16:12

Schön, dass du über meine Seite hierhergefunden hast. Aber trozdem schreibe ich mich immer noch mit c: Luckie.

Nun, da muß man wohl etwas an der Logik basteln. Aber was spricht gegen ein Multiline-Edit oder eine Listbox?

Die 10 Zeilen mit TexOut bekommst du mit einer for-Schleife hin in der du immer die neue Postion in Abhängigkeit der Zählvariablen ermittelst. Die Strings packst du vorher in ein Array of String und sprichst sie mit der Zählvariable an.
Aber kuckt dir in diesem Zusammenhang mal DrawText an mit dem Flag DT_WORDWRAP oder wie der heißt, eventuell kommst du damit weiter. DrawText wäre so wie so vorzuziehen, da du mit den Flags mehr Formatierungsmöglichkleiten hast.

Salomon 9. Jun 2002 16:54

Luckie mit c sieht doch irgendwie besser aus, sorry. Ich habe es der Richtigkeithalber oben auch noch verbessert.

Ein Multiline-Edit oder eine Listbox wollte ich nicht verwenden, da der gesammte Bildschirm mit dem schwarzen Fenster ausgefüllt ist, und ich darauf später noch andere "Effekte" darstellen möchte.
Bei dem Draw Text blicke ich nicht ganz durch, muss ich da jedesmal diese Fill Rec Struktur ändern? Und warum funktioniert Textout nicht auserhalb von WM_PAINT?

Mfg Salomon

Luckie 9. Jun 2002 19:46

Es funktioniert schon außerhalb von WM_PAINT, du mußt dir nur mit GetDC() einen HDC für den Clientbereich deines Fensters holen (und nicht vergessen wieder mit DeleteDC() frei zu geben). Bloß das Problem wird sein, dass der Text wohl jedes mal verschwinden wird, wenn das Fenster neu gezeichent wird. Deswegen macht man so was in WM_PAINT, weil das Fenster jedesmal ein WM_PAINT bekommt, wenn es neu gezeichnet wird.

Salomon 9. Jun 2002 20:39

Ja, leider verschwindet der text sofort wieder.

Ich habe aber eine neue Idee. Kann man nicht ein Array of String global erstellen. Dieses Array wird dann über die Messageprozedur mit den benötigten TextMeldungen versorgt.
Im WM_PAINT Ereignis zeichnet man nun jedesmal alle 10 Zeilen aus dem Array auf das Fenster.
Wurde eine Textmeldung hinzugefügt, ändert die Messageprozedur die Reihenfolge der Textmeldungen im Array, fügt die neue Meldung unten an.
Danach wird eine WM_Paint Message an das Fenster geschickt, damit alles neu gezeichnet wird.
Sollte doch funktionieren oder? Nunja, werde ich morgen mal ausprobieren. Wenn einer hier einen Logikfehler sieht bitte posten, dann überleg ich mir was neues.

Mfg Salomon

Luckie 10. Jun 2002 00:03

Jupp, so müßte es gehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz