안녕 하세요?
BacTeria 박종민 입니다.
오늘의 Tip은 Fade In에 대한 방법(?) 입니다.
자세한건 아래 첨부된 소스를 보시구요.
관련된 RES 파일은 첨부 파일로 덧붙였습니다.
그럼 이만... 오늘도 파튕!!
unit FadeInEffect;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ExtCtrls;
type
TFadeEffect = class
private
Masks: array [0..7] of hBrush;
NegMasks: array [0..7] of hBrush;
public
constructor Create;
destructor Destroy; override;
procedure FadeIn(Target: TCanvas; X, Y: integer; Pic: TBitmap; DelayTime: Integer);
end;
implementation
{$R EffRes.res}
procedure Delay(Amount : Integer);
var
GetTime : Integer;
begin
GetTime := GetTickCount;
while GetTime + Amount > GetTickCount do
Application.ProcessMessages;
end;
constructor TFadeEffect.Create;
var
m: Integer;
BrName: String[8];
lb: TLogBrush;
bm, oldbm: HBitmap;
mDC: HDC;
R: TRect;
begin
{Memory DC needed to create negative masks}
mDC := CreateCompatibleDC(0);
{load and create masks}
for m := 0 to 7 do begin
{load mask bitmap from resource}
BrName := 'merge' + IntToStr(m); BrName[7] := #0;
bm := LoadBitmap(HInstance, @BrName[1]);
{create brush from bitmap}
lb.lbStyle := bs_Pattern;
lb.lbHatch := bm;
Masks[m] := CreateBrushIndirect(lb);
{create negative of same mask}
R := Rect(0, 0, 8, 8);
oldbm := SelectObject(mDC, bm);
WinProcs.InvertRect(mDC, R);
lb.lbHatch := bm;
NegMasks[m] := CreateBrushIndirect(lb);
{dispose bitmap resource}
SelectObject(mDC, oldbm);
DeleteObject(bm);
end;
DeleteDC(mDC);
end;
destructor TFadeEffect.Destroy;
var
m: integer;
begin
{dispose masks}
for m := 0 to 7 do begin
DeleteObject(Masks[m]);
DeleteObject(NegMasks[m]);
end;
end;
procedure TFadeEffect.FadeIn(Target: TCanvas; X, Y: integer; Pic: TBitmap; DelayTime: Integer);
var
m: integer;
memDC1, memDC2: hDC;
memBM1, memBM2, oldBM1, oldBM2: hBitmap;
oldB1, oldB2: hBrush;
URect: TRect;
begin
{create memory DC and bitmap for target}
memDC1 := CreateCompatibleDC(Target.Handle);
memBM1 := CreateCompatibleBitmap(Target.Handle,
Pic.Width, Pic.Height);
oldBM1 := SelectObject(memDC1, memBM1);
{copy picture to memory}
BitBlt(memDC1, 0, 0, Pic.Width, Pic.Height,
Target.Handle, X, Y, SrcCopy);
{save original brush}
oldB1 := Selectobject(memDC1, Masks[0]);
{create memory DC and bitmap for picture}
memDC2 := CreateCompatibleDC(Target.Handle);
memBM2 := CreateCompatibleBitmap(Target.Handle,
Pic.Width, Pic.Height);
oldBM2 := SelectObject(memDC2, memBM2);
{save original brush}
oldB2 := Selectobject(memDC2, NegMasks[0]);
{perform a transition with each mask}
for m := 0 to 7 do begin
{Punch holes in current picture}
SelectObject(memDC1, Masks[m]);
BitBlt(memDC1, 0, 0, Pic.Width, Pic.Height,
memDC1, 0, 0, MergeCopy);
{Extract corresponding pixels in new picture}
BitBlt(memDC2, 0, 0, Pic.Width, Pic.Height,
Pic.Canvas.Handle, 0, 0, SrcCopy);
SelectObject(memDC2, NegMasks[m]);
BitBlt(memDC2, 0, 0, Pic.Width, Pic.Height,
memDC2, 0, 0, MergeCopy);
{Merge the two pictures}
BitBlt(memDC1, 0, 0, Pic.Width, Pic.Height,
memDC2, 0, 0, SrcPaint);
{Blast it to the screen}
BitBlt(Target.Handle, X, Y, Pic.Width, Pic.Height,
memDC1, 0, 0, SrcCopy);
Delay(DelayTime);
end;
{restore / dispose structures}
SelectObject(memDC1, oldB1);
SelectObject(memDC1, oldBM1);
DeleteObject(memBM1);
DeleteDC(memDC1);
SelectObject(memDC2, oldB2);
SelectObject(memDC2, oldBM2);
DeleteObject(memBM2);
DeleteDC(memDC2);
{Paint full picture}
Target.Draw(X, Y, Pic);
end;
end.