Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Paintbox und XPManifest


adler - Mo 30.08.04 01:16
Titel: Paintbox und XPManifest
Hi!

Habe noch nie mit ner "Paintbox" gearbeitet, habe aber auch nichts anderes gefunden in dem ich etwas "zeichnen" kann.
Ich habe in der Hilfe geschaut, aber nichts gefunden.
Als befehl schrieb ich folgendes:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
punkt:TPoint;
begin
punkt.X := 1;
punkt.Y := 1;
paintbox1.ClientToScreen(punkt);
paintbox1.Repaint;


Aber irgendwie habe ich keinen Punkt gesehen, sollte da jetzt nicht nen punkt kommen?
ich seh keinen. Bin ich vllt. ganz aufem Holzweg?

Also, wenn ja, ich möchte nur mal eine box, in der ich punkte setzen kann.

ThX

PS: Oder stört da vllt. das XPManifest?


Raphael O. - Mo 30.08.04 10:41

wenn ich etwas zeichnen möchte (2D), dann benutze ich immer ein Image...
und da einen Punkt zu zeichnen geht folgendermaßen:

Delphi-Quelltext
1:
image1.canvas.pixels[x,y]:=clBlack;                    

ansonsten dürften v.a. die Befehle moveto und lineto interessant sein, sowie canvas.brush.color,. canvas.pen.color, rectangle usw. ;-)

<schleichwerbung>das das funktioniert kannst du z.B. an dem Screenschot in diesem Thread sehen: http://www.delphi-forum.de/topic_Schiebeteil_20972.html </schleichwerbung>


Delete - Mo 30.08.04 13:34

Die Paintzbox ist schon die richtige Komponente zum Zeichen. TImage ist nur für das Darstenne von "fertigen" Grafiken gedacht. Du zeichens nur falsch. ClientToScreen rechnet nur Koordinaten um. Zum Setzen von einzelnen Pixel benutz SetPixel und wenn du Linien und ähnliches zeichenen willst nutz MoveTo und Line To bzw. die Zeichenfunktionen für geometrische Objekte: Ellipse, FillRect, DrwaRect, etc.


adler - Mo 30.08.04 18:27

Ja, Danke, das ist gut.

Aber nun habe ich einen "Stift" programmiert.
So, leider funktioniert das net so gut.
Wenn ich diesen "zu" schnell bewege, fehlen zwischendrin pixel, weil MouseMove wahrscheinlich nicht so
schnell hinter einander ausgeführt werden kann.
Antwort bitte ;) wie kann ich das am besten lösen?

ThX!


Delete - Mo 30.08.04 19:14

Wie wärs mal mit selber denken? ^^
ne Möglichkeit wäre es zum Beispiel, ein LineTo vom ersten MouseMove zum zweiten MouseMove zu machen.


adler - Mo 30.08.04 19:15

Habe ich mir auch schon gedacht, aber ist das net doof?
wenn der vllt. ganz schnell nen "kreis" zieht, dann ist da vllt. nur ein zwei linien.

EDIT:
Ok, habe halt Linien erstmal gemacht.
Nun: Die Sind nur SCHWARZ, dabei will ich sie so wie ich auch die Punkte machen kann.

ThX!


Delete - Mo 30.08.04 19:44

adler hat folgendes geschrieben:
Nun: Die Sind nur SCHWARZ, dabei will ich sie so wie ich auch die Punkte machen kann.

Ist es zu viel verlangt, ein gramatiklisch Korrektes deutsch zu schreiben und dabei noch eine Satz zu produzieren, der auch vom Inhalt Sinn macht? Könnte aber die Gefahr bestehen, dass man versteht, was du willst. :roll:


adler - Mo 30.08.04 20:46

Luckie hat folgendes geschrieben:
adler hat folgendes geschrieben:
Nun: Die Sind nur SCHWARZ, dabei will ich sie so wie ich auch die Punkte machen kann.

Ist es zu viel verlangt, ein gramatiklisch Korrektes deutsch zu schreiben und dabei noch eine Satz zu produzieren, der auch vom Inhalt Sinn macht? Könnte aber die Gefahr bestehen, dass man versteht, was du willst. :roll:


Ist doch klar wie Glasbrühe.
Also:
Die LINIEN sind nur Schwarz, dabei will ich die LINIEN in der Farbe, wie ich auch die Punkte mache. bzw panel1.color

Verstanden?


Delete - Mo 30.08.04 20:53

Jetzt ist es klar. Dann kuck dir mal die Eigenschft Pen.Color von TCanvas an.


adler - Mo 30.08.04 21:03

Ok, Danke.

Aber eine Frage bleibt noch.
Das ist echt sche****, dass der inhalt verschwindet, wenn ich ne form oder so drüber ziehe.
Wie kann ich das ändern? :(


Böser Borstel - Di 31.08.04 08:23

mußt alle immer in OnPaint von der Paintbox malen, dann wird das verdeckte beim aufdecken wieder neugemalt.


adler - Di 31.08.04 11:12

Also muss ich mir eigentlich noch nen array mit den Farben speichern?
Weil die sind ja sonst nicht mir in der PaintBox enthalten.
Dann speichere ich jetzt mein Bild einfach in nen eigenen array.
und im OnPaint übergebe ich die Pixelfarben, soll ichs so machen, ja? ;)
Oder haste was besseres?


Böser Borstel - Di 31.08.04 14:05

du mußt dir jeden einzelnen pixel mit seinen eigenschaften(farbe,x,y,...) merken und sie in onpaint neuzeichnen.


Delete - Di 31.08.04 14:19

Nein. Man zeichent auf ein Bitmap im Speicher und kopiert das bei Änderungen oder wenn erforderlich (Neuzeichnen etc.) auf die Painbox. Siehe hier: http://www.luckie-online.de/Downloads/Sonstiges/OffScreenBitmap.html


adler - Di 31.08.04 14:34

Warum ist dann ne PaintBox besser als ein Image?
Was gibt es dort für unterschiede.


adler - Di 31.08.04 19:52

`Nochwas:

Wie kann ich es wieder leeren?
.clear gibts net.
ACHTUNG: net weiß, sondern Leer! Das man sieht, was dahinter ist. Danke ;)