Auf Paintbox schreiben

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Auf Paintbox schreiben

Beitrag von khh »

hallo zusammen,
ich möchte auf einer Paintbox auf ein HG -Bild schreiben.
Das ganze soll als Bitmap gespeichert werden.
Die Koordinaten, Schriftgrösse, -Art usw. möchte ich zusätzlich zur Weiterverwendung in einem Record speichern.
Wie würdet Ihr das am Besten umsetzen.
Ich habe mir überlegt dass der Anwender entweder direkt auf der Paintbox schreibt, oder ein Label oder so auf der Paintbox ablegt und die Schrift-Art-Grösse usw. aus Voreinstellungen übernommen werden.
Das Ganze so in Richtung Windows Paint, nur eben dass die Werte zusätzlich in einem Record gespeichert werden können.
Gibts da irgendwo ein Beispiel?

Dake für eure Info

Gruss KH

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

In ein Label kannst du wohl nicht schreiben.
Ich würde ein TEdit beim Cursor platzieren. Das kann man dann z.B. wenn die Return Taste kommt schliessen resp.verstecken und den Text auf den Canvas schreiben.

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

@theo
danke dir, werd ich dann mal so probieren.

Gruss KH

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Auf Paintbox schreiben

Beitrag von Euklid »

khh hat geschrieben: ich möchte auf einer Paintbox auf ein HG -Bild schreiben.
Hallo khh,

ist vielleicht die Prozedur canvas.textout etwas für dich? Hier kannst du die Koordinaten gleich eingeben, an denen der Text erscheint.

Musst mal gucken, wenn du den Befehl textout verwendest, würde ich dir unter Umständen empfehlen, eine TImage statt eine Paintbox zu verwenden.

Viele Grüße, Euklid

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Ich denke das weiss er schon selbs, es ging hier um das bearbeiten eines exes nicht um das reine zeichnen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

hallo zusammen,
Ich würde ein TEdit beim Cursor platzieren.
das hab ich jetzt so gemacht, funktioniert auch einwandfrei.
Daraus ergibt sich aber folgendes:
Owner des Tedit ist die Paintbox, Parent das Form.
Die Paintbox hab ich auf ein Panel gelegt, damit man auch sieht wo man arbeitet. Da aber das Panel und die Paintbox nicht als Parent des Tedit aktzepiert wird hab ich mit :
ScreenToClient(Mouse.CursorPos);
die Einfügeposition des TEdit berechnet. Bis hierhin funktioniert das auch wunderbar.
das Eingabefeld lässt sich an der Mousepos. erzeugen, ausblenden und der Text kann auch mit textout auf eine _feste_ position auf der Paintbox ausgeben werden. Wenn ich jetzt aber Tedit.left und Tedit.top verwende um den text mit textout auf die Canvas der paintbox zu positionieren funktioniert das nicht.
Ich denk mal das sind ja auch die Koordinaten auf der Form.
Wie bekomme ich nun die richtigen Koordinaten auf dem paintbox.canvas?

ich hoffe ich hab mich einigermassen verständlich ausgedrückt.
vieleicht geht alles auch viel einfacher ??
Danke für eure Hilfe

Gruss KH

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Was da genau schief läuft kann ich dir auch nicht sagen.
Ich würde aber sowieso statt der Paintbox einfach eine Ableitung von TCustomControl verwenden. Diese kann andere Komponenten "hosten", auf Keyboard Events reagieren etc. und hat dann auch ihr eigenes "Koordinatensystem".

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

@theo,
werd ich dann mal so probieren

Gruss KH

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

hallo zusammen, hallo Theo,
alsoo, ich hab jetzt meine Componente von TCustomControl abgeleitet.
in einer proc lade ich ein Bild per:
self.Canvas.stretchDraw(rectangle1,image.Picture.bitmap);
danach erstelle ich im onClick Ereignis ein editfeld an der Cursorposition.
Bis hierhin funktioniert das wunderbar, bis auf eine Kleinigkeit.
Beim Erstellen des Editfeldes wird in der linken oberen ecke der canvas ein Feld in der Grösse des editfeldes und in der color der komponente gezeichnet, welches das geladene Bitmap an der Stelle überschreibt.
Mach ich da was falsch, oder muss ich irgendwo refeshen ?
EDIT:
wenn ich mit einem anderen Window über die Komponente fahre, wird das geladene Bild auch gelöscht :-(
Danke für eure Hilfe
Gruss KH
Zuletzt geändert von khh am Sa 3. Mai 2008, 13:50, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

khh hat geschrieben: Mach ich da was falsch, oder muss ich irgendwo refeshen ?
Du solltest im OnPaint Event zeichnen.
Das kannst du mit Invalidate programmatisch auslösen, wenn es Änderungen gibt.

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

@theo,
ich danke dir


Gruss KH

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

@theo,
Du solltest im OnPaint Event zeichnen.
hab das Bild aus dem opendialog jetzt im OnpaintEvent "nachgeladen".
Funktioniert auch soweit, bis auf ein kurzes Flackern bei dem man sieht dass oben links besagtes Feld gezeichnet wird.

Was ist das, was zeichnet dieses feld in die linke ecke ?
Macht es vieleicht Sinn das Bild in einem stream zu speichern und daraus neu zu zeichnen. Ich denk mal dass nachladen fromfile zu langsam ist, oder ?

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

khh hat geschrieben: Was ist das, was zeichnet dieses feld in die linke ecke ?
Keine Ahnung.
khh hat geschrieben: Macht es vieleicht Sinn das Bild in einem stream zu speichern und daraus neu zu zeichnen. Ich denk mal dass nachladen fromfile zu langsam ist, oder ?
Du solltest es erst in ein anderes Bitmap laden, und OnPaint jew. auf den Canvas pappen mit Canvas.Draw(0,0,BufferBitmap);

Gewöhn dich dran, dass der Canvas in diesem Fall eine flüchtige Sache ist die bei jedem Paint event bemalt werden muss.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Du solltest in ein Buffer zeichnen. Das ist zwar eine mehrbelastung weil du ja erst in ein Buffer zeichnest und dann wieder raußkopierst aber es lohnt sich. Bei meinem TextEditor Beispiel arbeite ich ohne buffer weil es für ein einfaches Beispiel reicht, aber es ist zu langsam, darum flimmert es wenn ich z.b. den Cursor dort bewege. Such mal nach Buffer in:
http://www.delphipraxis.net" onclick="window.open(this.href);return false; weil du hier warscheinlich noch nicht viel in dieser Richtung finden wirst. Das nennt sich noch anders irgendwas mit "Doubel Buffer" oder so ist auch eine Eigenschaft von z.b. einem From oder einem Panel.
MFG
Michael Springwald

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

ich danke euch

Gruss KH

Antworten