AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bildschirmfoto knipst nicht alles
Thema durchsuchen
Ansicht
Themen-Optionen

Bildschirmfoto knipst nicht alles

Ein Thema von KodeZwerg · begonnen am 29. Mai 2018 · letzter Beitrag vom 4. Jun 2018
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: Bildschirmfoto knipst nicht alles

  Alt 31. Mai 2018, 08:51
Zitat:
Die einfachste Antwort und zugleich auch die erschreckenste: ich wusste es nicht besser.
Schade

Denn dein Beispiel war richtig wollte nur prüfen ob du den Unterschied zwischen GetDC, CreateDC, CreateCompatibleDC kennst.
Und ob du weist warum DeleteDC und nicht ReleaseDC in dieser Funktion verwendet werden muss.

Bitte versuche dich da nochmal zu informieren.
Denn es nicht zu wissen kann besonders hier bei der Freigabe\nicht Freigabe von DC's zu extremen Speicherlecks führen.

OK.. Ich mache es dir etwas einfacher.
Ein DC das man sich einholt also über Get! muss man freigeben und das freigeben geschieht über ReleaseDC..
Ein DC das man selber erstellt muss man löschen das macht man mit DeleteDC.

löschen und freigeben sind zwei unterschiedliche Dinge und die darf man nicht verwechseln.
Wie gesagt andernfalls könnte es sein das wenn du 5 Bilder in den Speicher geladen hast deine Anwendung plötzlich 200MB Speicher verwendet
dieser wird dann nicht freigegeben und du produzierst am laufenden Band Speicherlecks in Massen.

gruss

Geändert von EWeiss (31. Mai 2018 um 09:21 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Bildschirmfoto knipst nicht alles

  Alt 31. Mai 2018, 09:03
Zitat:
mit Deiner zweiten "So-Wirds-Gemacht" Variante komme ich noch nicht wirklich voran
Es ist eigentlich ganz einfach.

GetDesktopWindow.. gibt dir das Handle des Desktop zurück.
Dieses Handle verwendest du nun um über GetDC das DC des Desktop zu bekommen.
Dann ermittelst du über GetWindowRect die Ausmaße des Desktop (alternativ mit GetSystemMetrics)
Wenn du mehrere Monitore verwendest dann bitte mit "GetDeviceCaps". Aber Achtung dann keines falls GetDC verwenden sondern "CreateDC"
Abhängig davon wie du das Bild anzeigen willst in einem Panel das kleiner ist als das Bild was du aufnimmst (ohne Scrollbar)
musst du die Blitter Methode wählen in diesen Fall also StretchBlt damit wird das Komplette Bild in das Panel passend eingefügt.
Wenn du ein Panel mit Scrollbar erstellst kannst du BitBlt verwenden da du dann das Bild Scrollen kannst.
Anschließend ReleaseDC um das DC welches du dir über GetDC geholt hast wieder freizugeben.

Aber auch hier wieder aufpassen wenn du das DC über CreateDC erstellst DeleteDC verwenden.

gruss

Geändert von EWeiss (31. Mai 2018 um 11:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Bildschirmfoto knipst nicht alles

  Alt 31. Mai 2018, 13:40
Ich bin heute etwas im Stress, tausend Dank für Deine liebe Erläuterung, abends werde ich mich damit mehr beschäftigen.
Für mich ist es erst Tag 2 mit dem ganzen DC Relaese Delete Strecht Bit Blt und all diesen Sachen.
Ich verinnerliche das schon noch, aber bitte habe etwas Rücksicht, Tag 2... (!)
Es ist total cool von Dir das Du Dir die Zeit zum lesen und schreiben nimmst, das hilft mir echt viel voll!

Rein im Kopf habe ich nun auch eine neue Sache die ich versuchen werde umzusetzen, für Dich alten Hasen im Gfx Business ist das ein klacks aber für mich nicht so ganz

Hier meine neue heran gehens weise Theorie: (ohne befehle zu nennen da ich da eh falsch liege ^_^)
Window Handle ermitteln
Window Rectangle ermitteln
Window verschwinden lassen
Rectangle Schwarz ausmalen
Window zurück holen
Knipsen
Schwarzes Rectangle löschen
Fertig.

So das ich wirklich nur das Fenster im Schnappschuss habe was ich wollte, Beispiel Dein OTTB mal wieder, wenn Da irgendein anderes Fenster drunter ist, das will ich ja nicht geknippst haben, ich hoffe ich konnte es Laienhaft einigermassen Gut Ausdrücken.

Danke für Input, ich lese Dich später!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Bildschirmfoto knipst nicht alles

  Alt 31. Mai 2018, 13:45
Kein Problem mach in ruhe.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Bildschirmfoto knipst nicht alles

  Alt 31. Mai 2018, 14:51
Ich sitze nun im Bus und habe Deine Erläuterung gelesen und auch Verstanden (!!!)
Heute abend geh ich mit neuem Mut frisch ans Werk, das Release/Delete ist absolut plausibel ohne viel Fachchinesisch Erklärt von Dir, da weiß ich ja nun Bescheid worauf ich achten muss. Auch das Du die Vorgehensweise nochmal beschrieben hast was was macht und wofür und warum und und und, vielen Dank mein Freund!
Ich muss selbst nur noch mir Bewusst werden womit ich arbeiten sollte weil ich irgendwie da auch noch nicht so ganz gecheckt habe wieso einer Methode a) nimmt und anderer Methode b)
TBitmap <-> HBITMAP, das eines direkt eine Graphik ist und das andere ein Handle zu einer Graphik ist mir schon irgendwie klar.... ach da gibt es noch viele Fragezeichen die ich hoffentlich bald lichten kann, Stück für stück wie eine Lawine presche ich mich voran in neue Gefilde.
Oder warum benutzt einer nach knipsen ein image.invalidate und ein anderer image.refresh.. all solche Sachen da muss ich noch viel blättern damit ich die zusammenhänge Verstehe bzw was Überhaupt die Unterschiede sind, für mich ists irgendwie das selbe.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Bildschirmfoto knipst nicht alles

  Alt 31. Mai 2018, 16:04
Zitat:
TBitmap <-> HBITMAP
Ich denke das weist du selbst kannst es Moment nur nicht richtig zuordnen.
Delphi-Quellcode:
MyBitmap := TBitmap.Create;
MyBitmap.Canvas.Handle := HBITMAP;
Zitat:
da auch noch nicht so ganz gecheckt habe wieso einer Methode a) nimmt und anderer Methode b)
Solange du nur einen Monitor unterstützen willst wäre die zweite Methode angebracht.
Willst du Multimonitor unterstützen dann die erste.

gruss
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Bildschirmfoto knipst nicht alles

  Alt 31. Mai 2018, 16:31
Zitat:
da auch noch nicht so ganz gecheckt habe wieso einer Methode a) nimmt und anderer Methode b)
Solange du nur einen Monitor unterstützen willst wäre die zweite Methode angebracht.
Willst du Multimonitor unterstützen dann die erste.

gruss
Wie kommst Du auf diese Aussage?
Bei Invalidate wird Windows mitgeteilt, dass das Fenster neu gezeichnet werden soll. In dem Fall das Image.

Blick in die Source von refresh:

das ruft Repaint auf
Repaint:

Delphi-Quellcode:
Invalidate
Update;
Im Normalfall ist es so das ein Invalidate ausreichen sollte. Windows kümmert sich dann darum, wann das Zeichnen passieren soll. WM_PAINT wird mit einer geringeren Priorität ausgelöst.

https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

kommt also immer darauf an was Du erwartest.
Bei Refresh und co ist die Systemlast höher, da immer sofort gezeichnet wird.

Aber mit Multimonitor hat das rein gar nichts zu tun
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Bildschirmfoto knipst nicht alles

  Alt 31. Mai 2018, 18:11
Hallo Ihr Lieben,
um die Frage "wie wirds bei mir momentan Angezeigt" zu beantworten, so: Screenshot - 31_05.jpg mit invalidate zum aktualisieren.
Die Anzeige hat aber nichts mit dem Bild gemeinsam was gespeichert wird, das liegt noch im Rohformat rum so wie ichs ausgelesen habe und kann an mehreren Stellen freigegeben werden.

Alles noch totale Early Alpha Phase.

Vielen Dank für Erklärungen für beide Fragezeichen die ich so hatte, es hat beides gefruchtet

Jetzt mach ich erstmal das was Emil sagte, ich besuche erstmal das MSDN und speicher mir alle Infos zu allen Befehlen damit ich von vorne beginnen kann aber diesmal Richtig, den Methode b) Weg.

Danke auch für Vorwarnung mit MultiMonitor, das es da Unterschiede gibt werde wusste ich nicht einmal, gut mitgedacht danke, da werde ich viel zu tun haben, auch Danke für diese Erklärungen und auch das ich ein 32bit Bild erzeugen sollte, darauf wäre ich alleine nie gekommen, ich werde all diese Hinweise aufsaugen inhalieren und langsam verdauen
Gruß vom KodeZwerg

Geändert von KodeZwerg (31. Mai 2018 um 18:20 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz