Drawing verschwindet
Moderator: Moderatoren
Drawing verschwindet
Moin zusammen,
habe ein "kleinen" Urlaubsplaner gebastelt, gezeichnet, gemalt, zusammengebaut wie auch immer. Es funktioniert auch alles ABER wenn das XbpDialog aus dem Bildschirmrand geschoben wird und wieder rein, dann ist auch diese gezeichnete Stelle die außerhalb vom Bildschirm war auf dem XbpDialog nicht mehr da.
Hab da noch net viel Erfahrung mit OwnerDrawing also wenn jemand die Lösung dafür kennt, wäre ich ihm dankbar
Viele Grüße,
Alex
habe ein "kleinen" Urlaubsplaner gebastelt, gezeichnet, gemalt, zusammengebaut wie auch immer. Es funktioniert auch alles ABER wenn das XbpDialog aus dem Bildschirmrand geschoben wird und wieder rein, dann ist auch diese gezeichnete Stelle die außerhalb vom Bildschirm war auf dem XbpDialog nicht mehr da.
Hab da noch net viel Erfahrung mit OwnerDrawing also wenn jemand die Lösung dafür kennt, wäre ich ihm dankbar
Viele Grüße,
Alex
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9367
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Drawing verschwindet
Du musst im einfachsten FAll nur ein "InvalidateRect" für Dein Planer-Control in die Resize-/Move-Slots des Dialogs klemmen. Allerdings sollte das eigentlich automatisch passieren. Auf welchem XbPart basiert Dein Control? Wie heißt die Methode, die es zeichnet?
Herzlich,
Tom
Tom
Re: Drawing verschwindet
Entschuldige, das alles hab ich nicht so ganz verstanden.
Wie meinst du das mit dem InvalidateRect()? Hab das grad versucht aber klappt nicht oder ich mach da was komplett falsch.
Das alles basiert schlicht aufm "leerem" XbpDialog. Striche, Abstände, Pixel, Farben, Koordinaten, wo geklickt wird etc. rechne ich mir alles selbst aus und zeichne mit GraBox, GraString etc.. Wenn es das ist was du mit "Auf welchem XbPart basiert Dein Control? Wie heißt die Methode, die es zeichnet", meinst?
Das ganze Projekt hier ist meine erste Arbeit mit dem OwnerDrawing Thema deshalb villeicht so nebenbei noch ne Frage: Kann mir jemand erklären was es sich genau mit dem oPS auf sich hat? So grob versteh ich das schon, ist die Fläche auf der ich Zeichne oder?
Ich mach das z.B. grade so:
ist das überhaupt richtig? Hab auch gesehen man kann das auch anderst machen?
Hab ja gelesen das du, Tom, auch nen ganzen Kalender erstellt hast, wäre froh, wenn du mir (oder auch andere natürlich) hier ein paar Tipps zur sache OwnerDrawing geben kannst, wie ich ein "Stabiles" Fenster erzeugen kann das nicht halbwegs verschwindet am Rand
Ich hätte das jetzt einfach bei jeder Bewegung des Fensters komplett neugezeichnet, aber hab gedacht das ist nicht wirklich die "Professionelle" Art.
Viele Grüße
Alex
Wie meinst du das mit dem InvalidateRect()? Hab das grad versucht aber klappt nicht oder ich mach da was komplett falsch.
Das alles basiert schlicht aufm "leerem" XbpDialog. Striche, Abstände, Pixel, Farben, Koordinaten, wo geklickt wird etc. rechne ich mir alles selbst aus und zeichne mit GraBox, GraString etc.. Wenn es das ist was du mit "Auf welchem XbPart basiert Dein Control? Wie heißt die Methode, die es zeichnet", meinst?
Das ganze Projekt hier ist meine erste Arbeit mit dem OwnerDrawing Thema deshalb villeicht so nebenbei noch ne Frage: Kann mir jemand erklären was es sich genau mit dem oPS auf sich hat? So grob versteh ich das schon, ist die Fläche auf der ich Zeichne oder?
Ich mach das z.B. grade so:
Code: Alles auswählen
LOCAL oPS := XbpPresSpace():new()
oPS:create( oDlg_Urlaubsplaner:drawingArea:winDevice() )
Hab ja gelesen das du, Tom, auch nen ganzen Kalender erstellt hast, wäre froh, wenn du mir (oder auch andere natürlich) hier ein paar Tipps zur sache OwnerDrawing geben kannst, wie ich ein "Stabiles" Fenster erzeugen kann das nicht halbwegs verschwindet am Rand
Ich hätte das jetzt einfach bei jeder Bewegung des Fensters komplett neugezeichnet, aber hab gedacht das ist nicht wirklich die "Professionelle" Art.
Viele Grüße
Alex
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9367
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Drawing verschwindet
Hallo, Alex.
Verstehe. Du erzeugst auf der DrawingArea Deines Dialogs einen Presentation-Space. Nach dem Erzeugen (Create()) "bemalst" Du den dann:
Mit dem Show() sieht man es. Das Problem ist: Letztlich hast Du nur einen flüchtigen Hintergrund gemalt. Die Daten sind statisch, und beim Neuzeichnen des Dialogs (Überlagerung, Bewegung, Größenänderung) passiert nichts: Der Dialog leert sich nach und nach. Das Problem ist: Du malst an der falschen Stelle. Und im falschen Objekt.
Aber Dein Ansatz ist prinzipiell richtig. Das hat nur mit Ownerdrawing nicht viel zu tun, es ist einfaches Drawing. Mit grafischen Primitiven kann man jederzeit in eine Presentation-Space malen, und der PS könnte auch von einem Drucker stammen. Ownerdrawing bedeutet, dass man als Entwickler das Zeichnen eines Controls übernimmt. Beim "advanced Ownerdrawing" macht man das auch für alle bekannten Zustände.
So oder so. Du solltest auf der DrawingArea Deines Dialogs ein XbpStatic (der Typ ist völlig egal) platzieren, und zwar eines, das im Init als DrawMode "XBP_DRAW_OWNER" bekommt. Dann kann man die Methode "Draw" dieses Statics überlagern; sie erhält schon den dazugehörigen Presentation-Space als Parameter, außerdem dessen Größe/Koordinaten. In dieser Methode zeichnest Du dann alles, wofür Du wahrscheinlich Deinen bereits erzeugten Code zu 99 Prozent übernehmen kannst. Diese Draw-Methode wird jedes Mal ausgelöst, wenn das Control neu gezeichnet werden muss, also auch in den oben skizzierten Situationen. Ein InvalidateRect() auf das Objekt musst Du dann nur noch auslösen, wenn sich die Daten ändern - und es würde sich dann auch neu zeichnen, mit geänderten Daten. Dadurch wird es dynamisch.
Verstehe. Du erzeugst auf der DrawingArea Deines Dialogs einen Presentation-Space. Nach dem Erzeugen (Create()) "bemalst" Du den dann:
Code: Alles auswählen
GraBox(oPS,{x},{y},GRA_OUTLINE)
GraLine ... usw.
Aber Dein Ansatz ist prinzipiell richtig. Das hat nur mit Ownerdrawing nicht viel zu tun, es ist einfaches Drawing. Mit grafischen Primitiven kann man jederzeit in eine Presentation-Space malen, und der PS könnte auch von einem Drucker stammen. Ownerdrawing bedeutet, dass man als Entwickler das Zeichnen eines Controls übernimmt. Beim "advanced Ownerdrawing" macht man das auch für alle bekannten Zustände.
So oder so. Du solltest auf der DrawingArea Deines Dialogs ein XbpStatic (der Typ ist völlig egal) platzieren, und zwar eines, das im Init als DrawMode "XBP_DRAW_OWNER" bekommt. Dann kann man die Methode "Draw" dieses Statics überlagern; sie erhält schon den dazugehörigen Presentation-Space als Parameter, außerdem dessen Größe/Koordinaten. In dieser Methode zeichnest Du dann alles, wofür Du wahrscheinlich Deinen bereits erzeugten Code zu 99 Prozent übernehmen kannst. Diese Draw-Methode wird jedes Mal ausgelöst, wenn das Control neu gezeichnet werden muss, also auch in den oben skizzierten Situationen. Ein InvalidateRect() auf das Objekt musst Du dann nur noch auslösen, wenn sich die Daten ändern - und es würde sich dann auch neu zeichnen, mit geänderten Daten. Dadurch wird es dynamisch.
Herzlich,
Tom
Tom
Re: Drawing verschwindet
Vielen Dank, im Verständnis hat mir das schon viel weiter geholfen. Das heißt ein Static übers ganze Dialog ziehen und ihm dann :drawMode:= XBP_DRAW_OWNER geben ja?
Aber wie kann ich jetzt mein bisher verwendeten Code auf dieses Static "überziehen"? Ich hab da ja immer das oPS des Dialogs angegeben wie geb ich jetzt des Statics an?
Bzw. wie kann ich da diese ganzen GraString GraBox etc. jetzt auch verwenden?
Aber wie kann ich jetzt mein bisher verwendeten Code auf dieses Static "überziehen"? Ich hab da ja immer das oPS des Dialogs angegeben wie geb ich jetzt des Statics an?
Bzw. wie kann ich da diese ganzen GraString GraBox etc. jetzt auch verwenden?
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Drawing verschwindet
Schau mal hier habe ich erklärt wie das mit rotem Text im PushButton geht (mit ownerdrawing)
http://www.xbaseforum.de/viewtopic.php?f=16&t=9229
besonders hier spielt die Music, ist nicht schwer:
METHOD HBColorButton:draw( oPS, aInfo )
http://www.xbaseforum.de/viewtopic.php?f=16&t=9229
besonders hier spielt die Music, ist nicht schwer:
METHOD HBColorButton:draw( oPS, aInfo )
Gruß
Hubert
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9367
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Drawing verschwindet
Hallo, Alex.
Im Prinzip musst Du nur dafür sorgen, dass sich alles, was Du zeichnest, im Bedarfsfall auch neu zeichnet. Dafür musst Du eigentlich nicht mit Ownerdrawing hantieren. Du musst nur den Code, den Du aktuell wahrscheinlich direkt nach dem Create() des Dialogs hast, in eine Funktion packen - und diese mit dem Dialogobjekt aufrufen, und zwar einmal an der Ursprungsstelle (also nach dem Create()) und dann in den Slots "paint" und "resize" des Dialogs. Ungefähr so (keine Gewähr, quasi blind getippt):
Das hat dann auch noch den Vorteil, dass Du das Neuzeichnen Deines Urlaubsplaners jederzeit selbst auslösen kannst, beispielsweise über eine Schaltfläche, die als Action einfach "oDlg_Urlaubsplaner:InvalidateRect()" aufruft. Diese Methode veranlasst das Neuzeichnen, ruft also irgendwann ihrerseits den Paint-Slot auf. Dadurch würde der Dialog dann auch geänderte Daten reflektieren!
Im Prinzip musst Du nur dafür sorgen, dass sich alles, was Du zeichnest, im Bedarfsfall auch neu zeichnet. Dafür musst Du eigentlich nicht mit Ownerdrawing hantieren. Du musst nur den Code, den Du aktuell wahrscheinlich direkt nach dem Create() des Dialogs hast, in eine Funktion packen - und diese mit dem Dialogobjekt aufrufen, und zwar einmal an der Ursprungsstelle (also nach dem Create()) und dann in den Slots "paint" und "resize" des Dialogs. Ungefähr so (keine Gewähr, quasi blind getippt):
Code: Alles auswählen
oDlg_Urlaubsplaner:Create() ...
oDlg_Urlaubsplaner:Resize := {|a,xNIL,o|MeineMalerei(o)}
oDlg_Urlaubsplaner:Paint := {|a,xNIL,o|MeineMalerei(o)}
MeineMalerei(oDlg_Urlaubsplaner)
oDlg_Urlaubsplaner:Show()
FUNCTION MeineMalerei(oDlg_Urlaubsplaner)
* hier malen
RETURN NIL
Herzlich,
Tom
Tom
Re: Drawing verschwindet
Das ganze mit dem OwnerDrawing werd ich mir in Zukunft noch genauer ansehen müssen...
Vielen dank Tom, das hat hier für gereicht. Zum glück hatte ich das ganze Zeichnen sowieso schon in einer Funktion um immer wieder aufzurufen.
Damit wärs dann erledigt. Danke nochmals.
Vielen dank Tom, das hat hier für gereicht. Zum glück hatte ich das ganze Zeichnen sowieso schon in einer Funktion um immer wieder aufzurufen.
Damit wärs dann erledigt. Danke nochmals.