Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 팁&트릭
Delphi Programming Tip&Tricks
[22] [팁] Fade In 효과...
박종민.BacTeria [bacteria] 7161 읽음    2002-04-08 11:15
안녕 하세요?

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.

+ -

관련 글 리스트
22 [팁] Fade In 효과... 박종민.BacTeria 7161 2002/04/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.