Drawing verschwindet

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
RUzZlacK
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 28
Registriert: Do, 31. Mär 2016 11:32
Wohnort: Pforzheim

Drawing verschwindet

Beitrag von RUzZlacK »

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 :D

Viele Grüße,

Alex
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Drawing verschwindet

Beitrag von Tom »

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
RUzZlacK
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 28
Registriert: Do, 31. Mär 2016 11:32
Wohnort: Pforzheim

Re: Drawing verschwindet

Beitrag von RUzZlacK »

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:

Code: Alles auswählen

 LOCAL oPS  := XbpPresSpace():new()   

   oPS:create( oDlg_Urlaubsplaner:drawingArea:winDevice() )   
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 :roll:
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Drawing verschwindet

Beitrag von Tom »

Hallo, Alex.

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.
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.
Herzlich,
Tom
RUzZlacK
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 28
Registriert: Do, 31. Mär 2016 11:32
Wohnort: Pforzheim

Re: Drawing verschwindet

Beitrag von RUzZlacK »

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?
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Drawing verschwindet

Beitrag von brandelh »

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 )
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Drawing verschwindet

Beitrag von Tom »

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):

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
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!
Herzlich,
Tom
RUzZlacK
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 28
Registriert: Do, 31. Mär 2016 11:32
Wohnort: Pforzheim

Re: Drawing verschwindet

Beitrag von RUzZlacK »

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.
Antworten