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

델파이 팁&트릭
Delphi Programming Tip&Tricks
[229] 그라디언트를 그려보자 2
이경환.단디 [lncsoft] 4348 읽음    2008-02-15 13:45
아래 lyn님이 GradientFill 함수에 대한 사용법을 적어 주셨는데, 좀 더 다양하게 활용하기 위한 추가 설명과  예제 소스입니다.

GradientFill 함수는 한 번의 함수 호출로, 다양한 그라디언트 효과를 연출할 수 있는 함수입니다.
삼각형 또는 사각형으로 이루어진 여러개의 그라디언트를 조합할 수 있다는 얘기입니다.
lyn님이 패스한 부분들에 그 답이 있습니다.^^

먼저, 함수의 원형을 다시 보죠.

function GradientFill(DC: HDC; // 캔버스의 핸들 
                                Vertex: PTriVertex; Vertex 배열의 포인터 
                                NumVertex: ULONG;  Vertex 배열 인자 수 
                                Mesh: Pointer;  // 그릴 삼각형 또는 사각형의 [배열] 포인터 
                                NumMesh,  // Mesh의 배열 갯수(그릴 삼각형 또는 사각형의 갯수) 
                                Mode: ULONG) // 삼각형 또는 사각형 수직, 수평 선택 
                                : BOOL; stdcall; 

Vertex는 위치와 색상값을 가지고 있는 구조체의 배열에 대한 포인터입니다.
NumVertex는 Vertex 배열의 갯수를 넘기구요~
Mesh는 그릴 삼각형 또는 사각형들의 구조체 또는 구조체의 배열의 포인터입니다.
NumMesh는 Mesh의 갯수를 넘겨줍니다.
Mode는 그라디언트를 사각형 수직, 수평 또는 삼각형중에서 선택합니다.

스크린 샷은 첨부 파일을 보시면 됩니다.
아래는 예제 소스입니다.
필요한 부분들에는 주석을 달았습니다.

사각형으로 연출한 예제 소스입니다.
var 
  DCRect : array[0..1] of GRADIENT_RECT; // 그라디언트 영역의 갯수 
  Vertex : array[0..3] of TTriVertex; 
코드 
  Vertex[0].x     := 0; 
  Vertex[0].y     := 0; 
  Vertex[0].Red   := 104 shl 8; 
  Vertex[0].Green := 104 shl 8; 
  Vertex[0].Blue  := 173 shl 8; 
  Vertex[0].Alpha := 0; 
 
  Vertex[1].x     := TitleBar.Width; 
  Vertex[1].y     := TitleBar.Height div 2; 
  Vertex[1].Red   := 165 shl 8; 
  Vertex[1].Green := 165 shl 8; 
  Vertex[1].Blue  := 209 shl 8; 
  Vertex[1].Alpha := 0; 
 
  Vertex[2].x     := 0; 
  Vertex[2].y     := TitleBar.Height div 2;  
  Vertex[2].Red   := 165 shl 8; 
  Vertex[2].Green := 165 shl 8; 
  Vertex[2].Blue  := 209 shl 8; 
  Vertex[2].Alpha := 0;  

  Vertex[3].x     := TitleBar.Width; 
  Vertex[3].y     := TitleBar.Height;  
  Vertex[3].Red   := 104 shl 8; 
  Vertex[3].Green := 104 shl 8; 
  Vertex[3].Blue  := 173 shl 8; 
  Vertex[3].Alpha := 0;  

// 두 개의 그라디언트의 영역으로 사용할 vertex를 지정합니다.  
  DCRect[0].UpperLeft := 0; // 첫번째 사각형 그라디언트 상단 좌측의 vertex 배열 인덱스입니다. 
  DCRect[0].LowerRight := 1; 
  DCRect[1].UpperLeft := 2; 
  DCRect[1].LowerRight := 3; 
 
  GradientFill(TitleBarImage.Canvas.Handle, 
                    @Vertex, 
                    4,   //Vertex 배열의 갯수 
                    @DCRect, 
                    2,   // DCRect 배열의 갯수 
                    GRADIENT_FILL_RECT_V); 


아래는 삼각형으로 연출한 예제 소스입니다.
var 
  DCTri : array[0..1] of TGradientTriangle; // 그라디언트 영역의 갯수 
  Vertex : array[0..3] of TTriVertex; 
begin 
  Vertex[0].x     := 0; 
  Vertex[0].y     := 0; 
  Vertex[0].Red   := 104 shl 8; 
  Vertex[0].Green := 104 shl 8; 
  Vertex[0].Blue  := 173 shl 8; 
  Vertex[0].Alpha := 0; 
  Vertex[1].x     := PaintBox1.Width; 
  Vertex[1].y     := PaintBox1.Height div 2; 
  Vertex[1].Red   := 165 shl 8; 
  Vertex[1].Green := 165 shl 8; 
  Vertex[1].Blue  := 209 shl 8; 
  Vertex[1].Alpha := 0; 
  Vertex[2].x     := 0; 
  Vertex[2].y     := PaintBox1.Height div 2; 
  Vertex[2].Red   := 231 shl 8; 
  Vertex[2].Green := 211 shl 8; 
  Vertex[2].Blue  := 209 shl 8; 
  Vertex[2].Alpha := 0; 
  Vertex[3].x     := PaintBox1.Width; 
  Vertex[3].y     := PaintBox1.Height; 
  Vertex[3].Red   := 104 shl 8; 
  Vertex[3].Green := 104 shl 8; 
  Vertex[3].Blue  := 173 shl 8; 
  Vertex[3].Alpha := 0; 
// 두 개의 그라디언트의 영역으로 사용할 vertex를 지정합니다. 
  DCTri[0].Vertex1 := 0; 
  DCTri[0].Vertex2 := 1; 
  DCTri[0].Vertex3 := 2; 
  DCTri[1].Vertex1 := 1; 
  DCTri[1].Vertex2 := 2; 
  DCTri[1].Vertex3 := 3; 
  GradientFill(PaintBox1.Canvas.Handle, @Vertex, 4, @DCTri, 2, GRADIENT_FILL_TRIANGLE); 
end; 


대구에서 단디~

+ -

관련 글 리스트
229 그라디언트를 그려보자 2 이경환.단디 4348 2008/02/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.