如何在一个圆内填充渐变颜色??? ( 积分: 50 )

  • 主题发起人 主题发起人 semsy
  • 开始时间 开始时间
用GDI+吧,很容易实现
 
楼上说的对。对GDI+吧。
 
selectrgnobject方式,自己用循环画一个渐变矩形,指定它的有效果从画区域是圆的
这样也成吧。效率不知道
hViewRgn := CreateRectRgnIndirect(ClipRect);
SelectClipRgn(ScreenBuf.Canvas.Handle, hViewRgn);
//这里画渐变背景的循环
DeleteObject(hViewRgn);
 
1、创建一个圆形剪裁区域,d 表示直径
hrgnClip := CreateEllipticRgn(0, 0, d, d);
2、创建一个画刷,用它来实现渐变
hBrush := CreateSolidBrush(RGB(255, 255, 255));
3、把它们选入设备环境
hdcWnd := GetDC(Form1.Handle)
hBrush := SelectObject(hdcWnd, hBrush);
hrgnClip := SelectObject(hdcWnd,, hrgnClip);
4、开始往上画正方形,用到 SetBrushColor,他可以方便地实现渐变色
var
i: Longint;
begin
i := 0;
while i < 256 do
begin
SetBrushColor(hBrush, RGB(255, i, 255- i));
FillRect(hdcWnd, 0, i, d, i + 2);
Inc(i, 2);
end;
enb;
5、该释放的都释放
DeleteObject(SelectObject(hdcWnd, hrgnClip));
DeleteObject(SelectObject(hdcWnd, hBrush));
ReleseDC(Form1.Handle, hdcWnd);
 
SetBrushColor(hBrush, RGB(255, i, 255- i));
这句要怎么用啊
 
I 服了 you!
怎么用不是给你写了么?
 
可是编译时提示undeclared identifier:'SetBrushColor'啊
 
D7中要怎样增加GDI+支持呢,我下了个GPDraw V0.8,但老是注册不了,
 
To semsy:
GDI 中提供了渐变色的 API,给你写了个函数,用起来没问题

type
//下面的一些定义其实 Windows.pas 单元已经提供,但是 delphi 中对 COLOR16 的定义有错误,致使一系列用到 COLOR16 的函数和记录都无法使用,只能重新定义
COLOR16 = Word;

TRIVERTEX = packed record
x: Longint;
y: Longint;
Red: COLOR16;
Green: COLOR16;
Blue: COLOR16;
Alpha: COLOR16;
end;

function GradientFill(DC: HDC; var Vertex: TRIVERTEX; NumVertex: ULONG; Mesh: Pointer; NumMesh, Mode: ULONG): BOOL;
stdcall; external msimg32 name 'GradientFill';

function R16(clr: COLORREF): COLOR16;
begin
Result := GetRValue(clr) shl 8;
end;

function G16(clr: COLORREF): COLOR16;
begin
Result := GetGValue(clr) shl 8;
end;

function B16(clr: COLORREF): COLOR16;
begin
Result := GetBValue(clr) shl 8;
end;

//x0, y0, x1, y1 是椭圆的左上角和右下角的坐标,clrLeft, clrRight 是左上角和右下角的颜色
procedure GradientEllipse(hdc: HDC; x0, y0, x1, y1: Integer; clrLeft, clrRight: TColor);
var
clr0, clr1: COLORREF;
vert: array[0..1] of TRIVERTEX;
index: GRADIENT_RECT;
hrgnClip: HRGN;
begin
clr0 := ColorToRGB(clrLeft);
clr1 := ColorToRGB(clrRight);
vert[0].x := x0;
vert[0].y := y0;
vert[0].Red := R16(clr0);
vert[0].Green := G16(clr0);
vert[0].Blue := B16(clr0);
vert[0].Alpha := 0;
vert[1].x := x1;
vert[1].y := y1;
vert[1].Red := R16(clr1);
vert[1].Green := G16(clr1);
vert[1].Blue := B16(clr1);
vert[1].Alpha := 0;
index.UpperLeft := 0;
index.LowerRight := 1;
hrgnClip := CreateEllipticRgn(x0, y0, x1, y1);
hrgnClip := SelectObject(hdc, hrgnClip);
GradientFill(hdc, vert[0], 2, @index, 1, GRADIENT_FILL_RECT_H);
DeleteObject(SelectObject(hdc, hrgnClip));
end;

GradientFill 也可以实现不同角度和方向的填充效果,如果要 45 度渐变,把矩形分割成两个三角形就可以了...
 
后退
顶部