| Autor |
Beitrag |
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Fr 21.08.09 14:29
...Die Frage stelle ich mir schon länger. Hab mal gegooglet und nur Themen zu JavaScript gefunden. Das ist nicht ganz das, was ich suche. Mich interessiert, wie ein WYSIWYG-Editor das schafft, jedes einzelne neue Zeichen, das ich eintippe, mit Formatierung ruck-zuck auf dem Bildschirm darzustellen, und das flackerfrei. Ich hab mir mal Gedanken gemacht und bin zu dem Entschluss gekommen, dass sowas doch eigentlich nur über dynamische Arrays und DoubleBuffered gehen sollte. Aber:
1.) Für jedes einzelne Zeichen zu pushen (falls man gerade in der Mitte oder am Anfang editiert), dürfte nicht gerade sehr speicherfreundlich sein.
1.) Standard-Komponenten wie TToolbar werden bei DoubleBuffered = True sehr unschön dargestellt.
Der Editor wird ja sicher nicht für jedes Zeichen ungecachet neuzeichnen.  Hat zufällig jemand damit Erfahrung oder weiß, wie sowas gemacht wird?
Das gleiche gilt für (Vektor-)Grafikprogramme: Man wird ja schlecht das ganze Bild kurzerhand neu zeichnen, weil ich in einer Bézierkurve mal eben einen Knoten verschoben habe...
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 480
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Fr 21.08.09 16:28
Ich könnte mir vorstellen, dass die ganze Zeichnerei auf einem Offscreen-Bitmap läuft, was dann einmal per BitBlt oder ähnlichem auf die Form kopiert wird. Dabei muss auch nicht unbedingt alles neu gezeichnet werden, sondern nur der Teil, der sich gerade ändert.
Und ein paar hundert Linien im Hintergrund zu zeichnen, geht in Nullkommanix. Ich habe in einer Anwendung zur Graphenvisualisierung sowas verwendet. Die Graphen (so ~250 Knoten und 2000 Kanten) können dabei gedreht werden - dass passiert im OnScroll einer Scrollbar - absolut ruckel- und flickerfrei, ohne weitere Tricks. 
_________________ We are, we were and will not be.
|
|
Jakob_Ullmann 
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Fr 21.08.09 16:34
BitBlt kannte ich noch gar nicht (wundere ich mich selbst, vom Namen kam's mir bekannt vor  ). Aber warum geht das gerade mit BitBlt so schnell? Hab in der D7-Hilfe nichts gefunden (nur bei delphi-treff.de, wie die Parameter sind und was sie bedeuten), ist das eine API-Funktion?
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 480
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Fr 21.08.09 16:39
Ja, das ist so eine API-Funktion. Warum das nun so schnell ist - was weiß ich.
In meinem Delphi 7 findet man das unter Hilfe -> Windows SDK; kann aber auch sein, dass ich das irgendwann mal nachinstalliert hab.
_________________ We are, we were and will not be.
|
|
jaenicke
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 21.08.09 18:55
Jakob_Ullmann hat folgendes geschrieben : | | 1.) Standard-Komponenten wie TToolbar werden bei DoubleBuffered = True sehr unschön dargestellt. |
Ich vermute du beziehst dich auf den entsprechenden Fehler in Delphi 7 und früher bei Kombination von DoubleBuffered und XP Manifest? Der ist bei Delphi 2006 Turbo Delphi wie so viele andere behoben.
Für Delphi 7 habe ich hier eine Lösung gepostet, die automatisch entsprechende Korreturen beim Start der Exe aktiviert:
www.delphipraxis.net...1002829.html#1002829
Sollte das bei deiner Toolbar nicht helfen, müsstest du das dafür ggf. noch anpassen, das Prinzip sollte das gleiche sein.
|
|
Jakob_Ullmann 
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Sa 22.08.09 11:16
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Sa 22.08.09 14:58
Canavs.Draw bzw Canvas.StretchDraw verwenden intern auch nichts anderes als BitBlt und StretchBlt
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 23.08.09 19:55
BitBlt ist nur dann schnell, wenn Quell- und Ziel-Kontext das gleiche Pixelformat haben. Dann ist das mehr oder weniger ein erweitertes MemCopy\Move.
Aber zur Ausgangsfrage, wie ein WYSIWYG-Editor funktioniert:
Man trenne Darstellung auf Monitor und Datenhaltung ganz extrem voneinander; lege dazwischen eine Control-Schicht, die dem Model Änderungsaufträge geben kann, bzw. Änderungen am Model zur Darstellung rückübersetzt und optimiere die dabei entstehenden Calltrees soweit es geht.
Als Beispiel, wie sowas funktioniert, kann ich einen Blick in die Java-Programmierung empfehlen (speziell den Java Source).
Unter Java erzeugt selbst das Einfache eintippen eines Zeichens in ein Editfeld etwa 10-500 Aufrufe von verschiedenen Callbacks, die dieses Ereignis (neues Zeichen) von der GUI zuerst zum Modell hinter dem Edit reichen, wo das umgesetzt wird und danach wieder zurück zur GUI gereicht wird ...
Und nein: Java ist dabei sogar richtig schnell ... Da kann man durchaus nen Prozess-Monitor mit schreiben, der mit 50 FPS Flackerfrei updated  (incl. Farbübergängen und ner reihe anderer Spielereien)
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|