本帖最后由 bduren 于 2011-11-18 08:05:36 编辑

解决方案 »

  1.   

    线性渐变画刷就可以
    http://houke2004.blog.163.com/blog/static/20863165200952525747443/
      

  2.   

    建议参考JVCL控件中,比如jvGradientHeaderPanel,Gradient相关的属性,看看他的实现源码
      

  3.   

    封装得很好,可以直接使用JVCL中的TJvGradient
      

  4.   

    晕倒,你这样写要实现右边的效果是不可能的。按照下面写,你可以调整参数实现你自己的效果:如果你的高度小于255
    y1 := Space;
    y2 := Space;
    for i:=0 to CHeight do
    begin
      b.lbColor:=RGB(0, 255 - i, 0);
      ...
      y2 = Space + i;
      Rectangle(DC, Space, y1, cWidth, y2 + i);
      y1 = y2;end;
      

  5.   

    谢谢各位因为颜色是要让用户设置的所以类似 b.lbColor:=RGB(0, 255 - i, 0); 这样的代码应该不太可能还有,应该不会用 for 循环实现,因为效率较低,量大的时候(很多个这个控件) 程序的反应速度会很低必须一次性绘制继续坐等各位的指点再次感谢了
      

  6.   

    使用GDI+的 TGpLinearGradientBrush
      

  7.   

    var gBrush : TGpBrush;
        gp : TGpGraphics;
        r : TGpRect;
    begin
      gBrush := TGpLinearGradientBrush.Create(FRect,ARGBFromCOLORREF(FAlphas,color1), ARGBFromCOLORREF(FAlphaE,color2),lmHorizontal);
      gp := TGpGraphics.Create(dc);
      gp.FillEllipse(gBrush,r);
      freeandnil(gBrush);
      freeandnil(gp);
    end;
      

  8.   

    惭愧,我只会for循环,我也很想知道能一次绘制的
      

  9.   

    还有人在么?请教一下
    TGpBrush
    要uses哪个文件啊,找不到啊,不能用噢
      

  10.   

    GDI+ 的东西,一般是用 gdiplus
      

  11.   

    10楼的兄弟啊,能不能给详细点啊
    用GDI+肯定要用一些文件
    我下载了GDIPOBJ,GDIPAPI,GDIPUNTIL
    还有什么 GDIPLUS………………
    等等
    我自己还用的Graphics, 搞的晕呼呼的
    不是少这个,就是少那个!全部搞全了,又是类型不对啥的
    搞死人了,能不能给详细点啊
    把一些必须的文件发我邮箱行么?
    十分感谢……
    [[email protected]][/email]
      

  12.   

    ARGBFromCOLORREF
    仅引用 GDIPAPI, GDIPOBJ; 这两个文件,总是会报
    ARGBFromCOLORREF 未定义噢
    怎么办呢?
      

  13.   

    发个阿发伯大侠修改的GDI+单元文件给你吧
      

  14.   

    你的邮箱发不到,退信,你可以自己到网上找下阿发伯大侠修改的GDI+,去他的博客就有
      

  15.   

    谢谢您了
    不好意思,查了一下,可能是邮箱满了,1000封了,呵呵
    再次请教您了
    我现在直接在想在ScrollBox上绘制,我重载了ScrollBox的WMPaint
    在里面GetDC,然后用GDI绘制是可以的
    但换面GDI+绘制就不行了,不知道为什么噢
    麻烦能试一下么?
    再次感谢您了!
      

  16.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,Gdiplus,GdipUtil;type
      TScrollBox = class(Forms.TScrollBox)
      private
        procedure WMPaint(var msg : TMessage);message WM_PAINT;
      public
    end;type
      TForm1 = class(TForm)
        ScrollBox1: TScrollBox;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TScrollBox }procedure TScrollBox.WMPaint(var msg: TMessage);
      var dc : HDC;
          gp : TGpGraphics;
          gBrush : TGpBrush;
          rc : TGpRect;
          tagbrush : tagLOGBRUSH;
          hB : HBRUSH;
    begin
      inherited;
      dc := GetDC(Handle);
      gp := TGpGraphics.Create(dc);
      rc := GpRect(0,0,Width,Height);
      tagbrush.lbStyle := BS_SOLID;
      tagbrush.lbColor := clWhite;
      hB := CreateBrushIndirect(tagbrush);
      FillRect(dc,Rect(0,0,Width,Height),hB);
      gBrush := TGpLinearGradientBrush.Create(rc,ARGBFromTColor(255,clBlue),ARGBFromTColor(100,clBlue));
      gp.FillRectangle(gBrush,rc);
      DeleteObject(hB);
      FreeAndNil(gp);
      FreeAndNil(gBrush);
      ReleaseDC(Handle,dc);
    end;end.
    //正常显示,你所谓的从一种颜色向透明的渐变,最终要看的画布底色是什么,如果上面的DC上有获取控件的背景图像数据,那结果就像PAINTBOX上画半透明的图片一样,如果是白色,那结果就是由蓝向白过渡