Screenshots von Komponenten
-
Hallo zusammen,
ich würde gerne eine VCL-Komponente dazu bringen sich auf ein TCanvas zu zeichnen, obwohl sie auf dem Bildschirm nicht zu sehen ist.habe folgenden Code schon aus anderen Beiträgen gesammelt und verändert:
TCanvas *canvas = new TCanvas(); TJPEGImage *jpg = new TJPEGImage(); //canvas->Handle = GetWindowDC(WindowHandle); TRect Source = Rect(0, 0, Width, Height); PaintTo(canvas, 0, 0); Graphics::TBitmap *bmp = new Graphics::TBitmap(); bmp->Width = Source.Width(); bmp->Height = Source.Height(); bmp->PixelFormat = pf24bit; bmp->Canvas->CopyRect(Source, canvas, Source); jpg->Assign(bmp); jpg->SaveToFile("test.jpg"); delete jpg; delete bmp; delete canvas;
Damit funktioniert es wunderbar solange die Komponente angezeigt wird.
Es soll aber auch funktionieren, wenn irgendein Fenster darüberliegt. Im Moment ist es noch so, daß quasi der Teil aus einem Gesamt-Screenshot ausgeschnitten wird, an dem die Komponente sitzt.Ich hoffe ihr versteht was ich meine und könnt mir helfen.
Vielen Dank schonmal vorne wech
basedow
-
Hm, keiner eine Idee? Oder ist das einfach mit BCB6 nicht drin?
Mit Java ist das kein Problem. Da hat jede Komponente eine Methodepublic void Paint(Graphics g) {...}
Wenn man dieser Methode einfach ein anderes Graphics-Objekt unterschiebt, zb von einer Bitmap, dann zeichnet sie sich in dieses Objekt. Auch wenn sie nicht sichtbar ist.
Und genau das brauche ich für eine BCB6 Komponente. Sie soll auch in eine Bitmap zeichnen, wenn sie nicht sichtbar ist. Also quasi eine Umleitung der Grafikroutine in eine andere Zeichenoberfläche.
Vielleicht ist mein Problem jetzt etwas klarer - hoffentlich
basedow
-
Wird eine "Zeichenfläche" verdeckt, zeichnet Windows auch nix da hin. Es gibt aber ne krasse Nachricht namens WM_PAINT die Windows an ein Fenster verschickt, sobald sich diese neu zeichnen muß. Wenn es eine VCL-Kompo nicht selber erledigt muß sich halt der Programmierer drum kümmern und die Zeichenfläche bepinseln sobald WM_PAINT eintrifft.
Oder ist das einfach mit BCB6 nicht drin?
Ich kanns nicht mehr hören ! Mit dem BCB kann fast man alles machen wenn man sich nicht immer nur stur an der VCL orjentiert. Man kann sich auch ohne Probleme direkt der WIN-API bedienen, nur ist dann meist etwas mehr Gehirnschmalz gefordert
-
Moment moment - bevor da jetzt irgendwelche Missverständnisse aufkommen:
Peter schrieb:
Ich kanns nicht mehr hören ! Mit dem BCB kann fast man alles machen wenn man sich nicht immer nur stur an der VCL orjentiert. Man kann sich auch ohne Probleme direkt der WIN-API bedienen, nur ist dann meist etwas mehr Gehirnschmalz gefordert
Ich wollte niemandes geliebtes Entwicklungstool in Verruf bringen oder schlecht machen. Ich war mir nur wirklich nicht sicher, ob das überhaupt geht. So - ich hoffe das is geklärt.
Nun zu meinem Gehirnschmalz:
Ich muss mich an der VCL orientieren, weil die Software nun mal mit VCL gebaut ist.
Das mit der Message is ja ne Idee, aber ich dachte, die FunktionPaintTo(canvas, 0, 0);
würde ein zeichnen anstoßen. Das Bild wird ja auch erstellt, nur eben mit einem Ausschnitt aus einem Screenshot und nicht mit meiner Komponente drin. Also zB mit ner Titelleiste eines anderen Fensters drüber oder sowas.
Zu guter Letzt wär ich dir sehr verbunden, wenn du mir sagen könntest, wie es funktioniert anstatt meinen Bregen zu beleidigen
Für so Fragen ist doch so ein Forum da - oderAlso bitte lass mich von deinem Gehirnschmalz kosten - Meister
basedow
-
Hallo
Nun zu meinem Gehirnschmalz:
Ich muss mich an der VCL orientieren, weil die Software nun mal mit VCL gebaut ist.
Das mit der Message is ja ne Idee, aber ich dachte, die FunktionDas schliesst nicht aus, das du solche Probleme auch mit der Win-API loest.
Oder ?
MfG
Klaus
-
@basedow
Oh sorry, wollte Dich weder persönlich angreifen noch Deine Fähigeiten anzweifeln. Meinen "Ausbruch" war eher allgemeiner Natur
Stellt eine VCL Kompo keine OnPaint-Methode zur Verfügung, muß man sich halt leider selber drum kümmern. Notfalls eine neue Klasse ableiten und da drin nen Messagehandler plazieren um die WM_PAINT abzuhandeln. Wie das Thema in Deinem speziellen Fall anzugehen ist, mußt Du selber rausfinden. Hab selber genug zum "Knobeln", kann und will mich jetzt nicht auch noch mit anderen ProgProbs beschäftigen
-
Hm,
also das mit der OnPaint Funktion bringt mir denk ich nicht viel. Ich habe die Komponente nicht selbst gebaut und somit müsste ich in der OnPaint Funktion alles selber zeichnen. Das wiederum käme einer Neuentwicklung gleich, weil es sich um so eine Art Tacho handelt. Ist also in dem Sinne kein Steuerelement sondern eine reine Anzeige. Wenn ich die allerdings selbst neu zeichne hätte ich ja die ganze Arbeit der Komponente noch einmal getan. Ausserdem habe ich ja dann immer noch das Problem auf die Bitmap umzuleiten bzw. auch bei minimierter (also unsichtbarer) Komponente ein bild zu bekommen.
Ich brauche (wenn das möglich ist) eine Lösung, die die vorhandenen Funktionen der Komponente benutzt aber auf ein anderes Device zeichnet als den Monitor. Ich weiss wie gesagt nicht, ob das überhaupt möglich ist. Ich weiss auch nicht, ob ich hier im richtigen Forum bin, oder ob das eher in WinAPI oder sonstwo hingehört.
Ich wäre auf jeden Fall dankbar für Tipps.
basedow