AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi ScreenShot eines Fensters machen dessen Inhalt größer Formgröße ist
Thema durchsuchen
Ansicht
Themen-Optionen

ScreenShot eines Fensters machen dessen Inhalt größer Formgröße ist

Ein Thema von Helmi · begonnen am 16. Mär 2013 · letzter Beitrag vom 17. Mär 2013
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.344 Beiträge
 
Delphi XE2 Professional
 
#1

AW: ScreenShot eines Fensters machen dessen Inhalt größer Formgröße ist

  Alt 16. Mär 2013, 21:53
Ich habe diesen Post gefunden.

Wenn ich den so aufrufe, dann erhalt ich nur ein schwarzes Bitmap:

Delphi-Quellcode:
procedure PrintWindow(Wnd: HWND; ATo: TBitmap);
var
   hDCMem : HDC;
   DC : HDC;
   rect : TRect;
   bmp : HBITMAP;
   hOld : HGDIOBJ;
begin
   hDCMem:=CreateCompatibleDC(0);

   GetWindowRect(Wnd, rect);

   bmp:=0;

   DC:= GetDC(Wnd);
   bmp:= CreateCompatibleBitmap(DC, rect.Right-rect.Left, rect.Bottom-rect.Top);
   ReleaseDC(Wnd, DC);

   hOld:=SelectObject(hDCMem, bmp);
   SendMessage(wnd, wm_Print, hDCMem, PRF_CHILDREN or PRF_CLIENT or PRF_ERASEBKGND or PRF_NONCLIENT or PRF_OWNED);

   selectObject(hDCMem, hold);
   DeleteObject(hDCMem);

   ATo.FreeImage;
   ATo.Handle:=bmp;
end;

procedure ScreenShot_aktives_Fenster(Bild: TBitMap);
var
  h: THandle;

begin
  h := GetForeGroundWindow;

  If h <> 0 then
    PrintWindow(h, Bild);
end;
Ist mein Aufruf falsch?
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: ScreenShot eines Fensters machen dessen Inhalt größer Formgröße ist

  Alt 17. Mär 2013, 04:08
Wie sieht das Ergebnis aus wenn du PRF_ERASEBKGND aus dem SendMessage-Aufruf entfernst?
Andreas Lauß
Blog
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.344 Beiträge
 
Delphi XE2 Professional
 
#3

AW: ScreenShot eines Fensters machen dessen Inhalt größer Formgröße ist

  Alt 17. Mär 2013, 10:21
Wie sieht das Ergebnis aus wenn du PRF_ERASEBKGND aus dem SendMessage-Aufruf entfernst?
Bringt leider nichts...

Das geht meines Wissens nach nicht, weil die nicht sichtbaren Teile deines Programm-Fensters nicht in Windows als Bitmap existieren, sondern erst beim Scrollen im Programm neu gezeichnet werden. Genauso wenig kannst du den Inhalt eines gerade nicht sichtbaren TabSheets einer Pagecontrol-Komponente sehen oder das, was in einem nicht aufgeklappten Menü verborgen ist. Bildschirmaufnahmen lesen lediglich den Bildschirmspeicher aus, und dort ist eben nur das drin, was gerade hineingezeichnet wurde.
Das klingt plausibel


Die Lösung besteht darin, zwei Bildschirmfotos zu machen und die dann zusammenzufügen. Das kann man, wenn man das häufiger benötigt, natürlich automatisieren, will sagen: von einer Software erledigen lassen.
Das wäre dann die einzige Lösung.
Leider ist das Fenster so groß, dass ich nicht nur horizontal sondern auch vertikal scrollen müsste und dann die Bilder dementsprechend zusammensetzen muss
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: ScreenShot eines Fensters machen dessen Inhalt größer Formgröße ist

  Alt 17. Mär 2013, 12:06
Ich habe das mal so gemacht (vor Jahren), finde das aber leider nicht mehr.
Es wurde halt eine große bmp erstellt.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.344 Beiträge
 
Delphi XE2 Professional
 
#5

AW: ScreenShot eines Fensters machen dessen Inhalt größer Formgröße ist

  Alt 17. Mär 2013, 12:11
Ich habe das mal so gemacht (vor Jahren), finde das aber leider nicht mehr.
Es wurde halt eine große bmp erstellt.
Das wär mir egal
könntest du auf dem Dachboden (oder Keller) nach dem Code suchen?
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: ScreenShot eines Fensters machen dessen Inhalt größer Formgröße ist

  Alt 17. Mär 2013, 12:48
Ich hatte doch noch einen Tresor im Garten vergraben, den musste ich nur noch ausbuddeln und aufschweißen...

Musst Du mal schauen, ob Dich das auf den Weg bringen kann:
- DesignerBoxTournament ist eine Scrollbox
- Designer ist ein Panel in der Scrollbox, das den Kontent enthält (und der Gesamtgröße entspricht)
- ImageCopy ist ein TImage


Delphi-Quellcode:
procedure TFormTurniere.sButtonCopyClick(Sender: TObject);
var
  DR, SR: TRect;
  X, Y: Integer;
begin
  Beep;
  ImageCopy.Picture.Bitmap.Width := DesignerBoxTournament.Designer.Width;
  ImageCopy.Picture.Bitmap.Height := DesignerBoxTournament.Designer.Height;
  DR.Left := 0;
  DR.Top := 0;
  DR.Right := ImageCopy.Picture.Bitmap.Width;
  DR.Bottom := ImageCopy.Picture.Bitmap.Height;
  ImageCopy.Canvas.FillRect(DR);
  Y := 0;
  while Y < DesignerBoxTournament.Designer.Height do
  begin
    X := 0;
    while X < DesignerBoxTournament.Designer.Width do
    begin
      DesignerBoxTournament.HorzScrollBar.Position := X;
      DesignerBoxTournament.VertScrollBar.Position := Y;
      //ShowDummy(DesignerBoxTournament); // ... baute den Inhalt auf
      Application.ProcessMessages;
      Sleep(500);
      DR.Left := X;
      DR.Top := Y;
      DR.Right := X + DesignerBoxTournament.ClientWidth;
      DR.Bottom := Y + DesignerBoxTournament.ClientHeight;
      SR.Left := X;
      SR.Top := Y;
      SR.Right := X + DesignerBoxTournament.ClientWidth;
      SR.Bottom := Y + DesignerBoxTournament.ClientHeight;
      ImageCopy.Canvas.CopyRect(DR, DesignerBoxTournament.Designer.Canvas, SR);
      Inc(X, DesignerBoxTournament.ClientWidth);
    end;
    Inc(Y, DesignerBoxTournament.ClientHeight);
  end;
  ImageCopy.Picture.Bitmap.SaveToFile(Path + 'Copy.bmp');
end;
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.344 Beiträge
 
Delphi XE2 Professional
 
#7

AW: ScreenShot eines Fensters machen dessen Inhalt größer Formgröße ist

  Alt 17. Mär 2013, 13:03
Ich hatte doch noch einen Tresor im Garten vergraben, den musste ich nur noch ausbuddeln und aufschweißen...
In was für einer gefährlichen Gegend Deutschlands wohnst du denn?

Musst Du mal schauen, ob Dich das auf den Weg bringen kann:
- DesignerBoxTournament ist eine Scrollbox
- Designer ist ein Panel in der Scrollbox, das den Kontent enthält (und der Gesamtgröße entspricht)
- ImageCopy ist ein TImage


Delphi-Quellcode:
procedure TFormTurniere.sButtonCopyClick(Sender: TObject);
var
  DR, SR: TRect;
  X, Y: Integer;
begin
  Beep;
  ImageCopy.Picture.Bitmap.Width := DesignerBoxTournament.Designer.Width;
  ImageCopy.Picture.Bitmap.Height := DesignerBoxTournament.Designer.Height;
  DR.Left := 0;
  DR.Top := 0;
  DR.Right := ImageCopy.Picture.Bitmap.Width;
  DR.Bottom := ImageCopy.Picture.Bitmap.Height;
  ImageCopy.Canvas.FillRect(DR);
  Y := 0;
  while Y < DesignerBoxTournament.Designer.Height do
  begin
    X := 0;
    while X < DesignerBoxTournament.Designer.Width do
    begin
      DesignerBoxTournament.HorzScrollBar.Position := X;
      DesignerBoxTournament.VertScrollBar.Position := Y;
      //ShowDummy(DesignerBoxTournament); // ... baute den Inhalt auf
      Application.ProcessMessages;
      Sleep(500);
      DR.Left := X;
      DR.Top := Y;
      DR.Right := X + DesignerBoxTournament.ClientWidth;
      DR.Bottom := Y + DesignerBoxTournament.ClientHeight;
      SR.Left := X;
      SR.Top := Y;
      SR.Right := X + DesignerBoxTournament.ClientWidth;
      SR.Bottom := Y + DesignerBoxTournament.ClientHeight;
      ImageCopy.Canvas.CopyRect(DR, DesignerBoxTournament.Designer.Canvas, SR);
      Inc(X, DesignerBoxTournament.ClientWidth);
    end;
    Inc(Y, DesignerBoxTournament.ClientHeight);
  end;
  ImageCopy.Picture.Bitmap.SaveToFile(Path + 'Copy.bmp');
end;
Danke für den Code - ich werd mir den mal zu Herzen nehmen und versuchen das zu verstehen,
bzw. auf mein Problem anzuwenden.
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#8

AW: ScreenShot eines Fensters machen dessen Inhalt größer Formgröße ist

  Alt 17. Mär 2013, 14:53
Leider ist das Fenster so groß, dass ich nicht nur horizontal sondern auch vertikal scrollen müsste und dann die Bilder dementsprechend zusammensetzen muss
Wenn du öfter unter Platzmangel auf deinem Bildschirm leidest, dann empfehle ich dir einen 24-Zoll-Breitbild-Monitor. Weil mein erster 24-Zoller nach vier Jahren den Geist aufgab (der hatte damals 350 Euro gekostet), hab ich mir erst kürzlich einen bei Ebay ersteigert für sage und schreibe 111,- Euro, und der hat sogar noch ein paar Monate Garantie drauf. Mit so einem Monitor ist es nicht nur ein Vergnügen, sich Filme anzuschauen, sondern er erleichtert auch das Programmieren ungemein. Derzeit arbeite ich sogar mit zwei Monitoren an einem PC (moderne Grafikkarten können das), wobei der zweite kleinere Monitor u.a. zur Programm-Anzeige (Exe-Form) und zur Anzeige der Online-Hilfe und sonstigem Hilfszeugs dient. Auf dem Großen hab ich dann voll Platz für die IDE, was sehr angenehm ist.

Also überleg's dir: Bevor du hier versuchst, unlösbare Aufgaben zu lösen und deine wertvolle Zeit damit verplemperst, gibst du besser ein wenig Geld aus und hast dabei noch etliche weitere Vorteile erzielt.
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.344 Beiträge
 
Delphi XE2 Professional
 
#9

AW: ScreenShot eines Fensters machen dessen Inhalt größer Formgröße ist

  Alt 17. Mär 2013, 15:02
Ich gib dir ja recht...

Nur, erstens hab ich das Problem in der Firma.

Dann nur bei einer Software vom Siemens, die den Inhalt des Fensters nicht an das Fenster angleichen (können), sondern
auf dem Original lassen
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: ScreenShot eines Fensters machen dessen Inhalt größer Formgröße ist

  Alt 17. Mär 2013, 15:02
Ah, ok, das hatte ich nicht verstanden.
Dann könnte ich auch nur einen 30''er (2560*1600) empfehlen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:39 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