Autor Beitrag
Nano-Ware
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Di 24.07.12 14:51 
Hallo,

ich arbeite bei meinem derzeitigen Programm mit GDI+ unter Anderem wegen dem Anti-Aliasing. Ich habe jetzt ein Graphics Object als Zeichenfläche erzeugt und zwar mit dem Handle des Desktops, so wie hier beschrieben:
www.swissdelphicente.../showcode.php?id=259

Das Problem ist nur, dass ich ersteinmal keine Möglichkeit finde das Canvas das Desktops "auszuschneiden" und zweitens es in TGPImage oder TGPBitmap zu speichern.

Das Sinn ist der, dass ich gern eine MakeScreenshot Funktion hätte, die eine GDI+ geläufige Bildvariable zurückliefert, dass ich damit arbeiten kann


Ich bedanke mich schonmal sehr herzlich für eure Hilfe, vor Allem, weil ich sie immoment sehr oft brauche..
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 24.07.12 18:47 
ich habe nicht ganz verstanden was Du mit dem HDC des Desktops in Zusammenhang mit einem Screenshot willst, aber vielleicht kannst Du was mit den Fetzen anfangen
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
    GetEncoderClsid('image/png', encoderClsid);
                                                                           // oder ein beliebiges anderes Format  
    dest:=TGPBitmap.Create(MulitFrameImage.GetWidth,MulitFrameImage.GetHeight,PixelFormat16bppRGB565);
    g := TGPGraphics.Create(dest);
    try
// Tu das was Du mit dem Bild machen willst

    dest.Save( aFilename, encoderClsid, nil );
    finally
    g.Free;
    dest.Free;
    end;

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Nano-Ware Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Di 24.07.12 18:54 
Hm nein sry das hilft mir nicht weiter. Ich möchte nen Screenshot machen. Das hab ich halt bis jetzt immer so gemacht. (Vorschläge für neue Optionen nehm ich gerne an). Den Screenshot möchte ich in einem GDi+ Bildobjekt speichern (das Transparenz unterstützt). Dieses Bildobjekt wird dann später bei DrawImage auf ein Canvas gemalt mit ein paar andere Informationen. Hoffentlich geht das so. Ich würde ungern mit Dateien auf der Festplatte arbeiten müssen.
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 24.07.12 19:17 
Du musst ja TGPBitmap nicht speichern, Du kannst es auch zu Malen verwenden.
Nur was Du Transparentes vom Desktop holen willst verstehe ich nicht, da ist ja schon alles rum ums Eck ...
Wenn Du eine Fenster dazu bekommst sich auf ein 32-Bittiges TGPImage oder auch ein entsprechend manipuliertes TBitmap (32 - Bit) mit geleertem Alphakanal, zu malen, statt auf den Desktop, dann hast Du IMHO das was Du wirklich suchst.
Aber wie gesagt, es kann gut sein dass ich Dich missverstanden habe.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Nano-Ware Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Di 24.07.12 19:26 
Ich will nichts Transparentes vom Desktop holen, sondern was Transparentes in das Objekt malen, wenn der Screenshot drinnen ist. Ich stell die Frage mal neu:

Wie erstelle ich einen Screenshot und speichere diesen in eine/m/r TGPImage/TGPBitmap? (Ohne Zwischenspeichern)
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 24.07.12 22:11 
eigentlich wollte ich, das woran ich doch einige Zeit geschwitzt habe nicht so einfach ... aber ..

Den Screenshot auf eine normales Bitmap bekommst Du sicher hin ...

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
// 2011 by Thomas Wassermann
    TGPImageWrapper=Class(TObject)
       private
       FImage: TGPImage;
       FStream: TMemoryStream;
       public
       Constructor Create(AGraphic:TGraphic);overload;
       Constructor Create(FileName: String);overload;
       Destructor Destroy;override;
       Public
       Property Image:TGPImage read FImage;
     

constructor TGPImageWrapper.Create(AGraphic: TGraphic);
begin
  inherited Create;
  FStream := TMemoryStream.Create;
  AGraphic.SaveToStream(FStream);
  Fimage:= TGPImage.Create(TStreamAdapter.Create(FStream));
end;

constructor TGPImageWrapper.Create(FileName: String);
begin
  inherited Create;
  Fimage:= TGPImage.Create(FileName);
end;

destructor TGPImageWrapper.Destroy;
begin
  FImage.Free;
  FStream.Free;
  inherited;
end;


ich verwende es eigentlich immer für Sachen wie das
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure CreateGPList(il:TDragImageList;var ol:TObjectList<TGPImageWrapper>);
var
  i:Integer;
  ico:TIcon;
begin
  ol := TObjectList<TGPImageWrapper>.Create;
  ol.OwnsObjects := true;
  for I := 0 to il.Count - 1  do
    begin
      ico:=TIcon.Create;
      try
        IL.GetIcon(i,ico);
        ol.Add(TGPImageWrapper.Create(ico));
      finally
        ico.Free;
      end;
    end;
end;

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Nano-Ware Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Mi 25.07.12 00:26 
Erstmal vielen Dank, ich versteh davon erstmal nicht so viel und schau es mir morgen an. Aber warum kann man das denn nicht einfach machen? Ohne Umwege über eine herkömmlicht Bitmap?