03. juli 2003 - 16:31Der er
16 kommentarer og 1 løsning
TCanvas til BMP
Hej
Jeg har brug for at convetere en TCanvas til en TBitmap.
Det er ikke så svært : procedure CustomControlToBitmap(const aControl : TWinControl; FileName : TFileName); var aDC: HDc; aCanvas: TCanvas; aRect: TRect; Bitmap: TBitmap; begin aDC := GetWindowDC(aControl.Handle); aCanvas := TCanvas.Create; aCanvas.Handle := aDC; aRect := Rect(0,0,aControl.Width,aControl.Height); Bitmap := TBitmap.Create; with Bitmap do begin Width := aControl.Width; Height:= aControl.Height; PixelFormat := pfDevice; end; Bitmap.Canvas.CopyRect(aRect,aCanvas,aRect); Bitmap.SaveToFile (FileName); Bitmap.Free; aCanvas.Free; ReleaseDC(aControl.Handle, aDC); end;
procedure TForm1.Button1Click(Sender: TObject); begin CustomControlToBitmap(Panel1, 'C:\hest.bmp'); end;
Problmet er blot hvis mit panel er skjult, så får jeg pixels fra det overnliggende vindue ....
Problemet er jeg har en masse kontroller som generer på runtime. Dem sætter jeg på en TPanel. Det panel skal jeg siden bruge som et Bitmap. Problemet er blot at mit panel IKKE er synligt, og ikke kan blive det !
Så jeg skal bruge en løsning på enten det ene eller andet problem !
Nu ved jeg ikke nøjagtig din idé. Men det jeg har gjort er at overskrive din Panel's canvas (som af en eller anden grund ikke er sat Public i sin klasse) med en ny Canvas som du har 100% kontrol over. Ideén er så at Skrive/Tegne alt det som du har lyst til på den nye Canvas! Du kan selvfølgelig gøre MyCanvas til en global variant!
// Ok nu har vi screenshot af hele formen, så skal vi jo bare have fundet // det der ligger på panel // pga af et eller anden kan man ikke bruge clientrect, eller BoundsRect // ved at lave recten selv, kan man nok også få den anden kode til at virke // som capture control
Såvidt jeg kan se er Jens' ønske at kunne kovertere en controls (med Visible := false; //!!!) canvas til bitmap... eller, som jeg har forstået, at lave et "screenshot" af noget der ikke vises på skærmen...
Er der nogen af jer der tolker Jens' spørgsmål anderledes end jeg gør?
Problemet er bare, at du ikke kan lave en screen-shot af noget som ikke eksitere på skærmen (hvilket egentligt også er logisk nok) uden at lave en kreativ løsning (grifisk simulering). Det vil sige, at hvis det er Panel'ens Canvas du vil bruge som udgangs punkt (Parent Canvas), skal man vel bare assigne en canvas til din panel (som jeg har vist) og kopiér de andre control's canvas (i de rigtige positioner selvfølig) til panelens canvas. Men Jens har ikke rigtigt præciseret i hvilken sammenhæng koden skal bruges. Hvis han laver er mere detaljeret beskrivelse af sit projekt vil det også være nemmere at hjælpe ham!
function WinControlToBitmap(const aControl: TWinControl): TBitmap; begin Result := TBitmap.Create; with Result do try Width := aControl.Width; Height := aControl.Height; PixelFormat := pfDevice; aControl.PaintTo(Canvas.Handle, 0, 0); except Free; end; end;
Sæt et TPanel på en form og prøv så det her :
procedure TForm1.Button1Click(Sender: TObject); begin Panel1.Left := -400; Image1.Picture.Bitmap.Assign(WinControlToBitmap(Panel1)); end;
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.