Entwickler-Ecke

Multimedia / Grafik - function fastblt


[)arkSlayer - Di 22.04.03 11:23
Titel: function fastblt
high,

kann mir jemand erklären wie ich mit dieser funktion (fastblt, oder blt) ein bildausschnitt von einem bild aus einer dximaglist auf der dxdraw.surface darstellen kann?? bitte mit ein bisschen code :lol:

ok, langer satz :wink: , thx, bye


Simon Joker - Do 24.04.03 11:21

Hi [)arkSlayer




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:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
...
type
  TForm1 = class(TForm)
    DXDraw1: TDXDraw;
    DXImageList1: TDXImageList;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure DXDraw1Initialize(Sender: TObject);
    procedure DXDraw1Finalize(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    FSurface:TDirectDrawSurface;
  end;

...

procedure TForm1.DXDraw1Initialize(Sender: TObject);
begin
  FSurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
end;

procedure TForm1.Button1Click(Sender: TObject);
var ScrRect:TRect;
begin
   if not DXDraw1.CanDraw then exit;
   //Kann wo anders geschehen
   FSurface.SetSize(DXImageList1.Items[0].Width,DXImageList1.Items[0].Height);
   DXImageList1.Items[0].Draw(FSurface,0,0,0);
   //Festsetzen des Ausschnitts
   ScrRect.Left:=5;
   ScrRect.Top:=5;
   ScrRect.Right:=5;
   ScrRect.Bottom:=5;
   //Blitten
   DXDraw1.Surface.BltFast(0,0,ScrRect,0,FSurface);
   DXDraw1.Flip;
end;

procedure TForm1.DXDraw1Finalize(Sender: TObject);
begin
  FSurface.Free;  FSurface:=nil;
end;

...


[)arkSlayer - Do 24.04.03 12:23

danke erstma, compilieren tut der alles ohne fehler, aber wenn ich auf den button klicke komm ein violent access fehler und der zeigt mir die zeile an:

Quelltext
1:
  DXImageList1.Items[0].Draw(FSurface,0,0,0);                    


muss ich irgendwo noch was einstellen oder so?

mfg slayer, bye


Simon Joker - Do 24.04.03 13:44

Hast du sie createt? Siehe DXDraw1Initialize.


[)arkSlayer - Do 24.04.03 15:37

ich hab alles von dir übernommen...auf der form hab ich noch dxdraw-fläche mit imagelist gemacht und button druntergeknallt.

ich hab keine ahnung warum da ein fehler kommt wenn ich auf den button klicke...compilierfehler komm ja nich...

hast du's mal bei dir gestestet?

mfg slayer, bye


Simon Joker - Do 24.04.03 16:02

Yup, funzt!
Testproggi, suag hier: [url] http://www.simonjoker.de\Trans\Test3.zip [/url]


[)arkSlayer - Sa 03.05.03 20:21

re, die frage kommt zwar etwas spät :roll:,aber:

das klappt jetzt alles bei mir...nur ich kann ein bild nicht so laden:

Quelltext
1:
DXDraw1.Surface.BltFast(-10,-10,ScrRect,0,FSurface);                    

x,y sind doch integer-vars...da müsste es doch aus dem negativen bereich laden oder???

plz hlpe quickly, is wirklich wichtig, beeinflusst mein ganzen sourcecode und weiters vorgehen, PLZ, bye


[)arkSlayer - So 04.05.03 11:14

ok, dann geht das halt nicht, aber jetzt noch was ;) :oops:

wie kann ich den bildausschnitt mit transparenz laden?? wenn ich die flag reinschreibe kennt er die nich: DDBLTFAST_DESTCOLORKEY....

plz, help, me, bye


Simon Joker - Mo 05.05.03 08:54

Hi [)arkSlayer

1. Negative Werte werden BLTFast nicht unterstützt. Die musst du vorher bei SourceRechteck berücksichtigen.

2. Funktioniert wahrscheinlich nicht, weil du der DXDraw.Surface keinen Colorkey zugewiesen hast. Ich habe es mit DDBLTFAST_SRCCOLORKEY probiert und das tuts.

Du kannst auch die zusätzliche Surface sparen. Verwende einfach die des ImageListItems. Hier ist der Colorkey die Eigenschaft TransparentColor.

DXDraw1.Surface.BltFast(0,0,ScrRect,DDBLTFAST_SRCCOLORKEY,DXImageList1.Items[0].PatternSurfaces[0]);