CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

在线等待“在圆形或椭圆区域内使填充颜色渐变”??高分相赠!!!!

楼主ingener(祝福)2003-08-03 10:51:09 在 Delphi / VCL组件开发及应用 提问

在线等待“在圆形或椭圆区域内使填充颜色渐变”??高分相赠!!!!  
  我已经做过一个,是将Brush.Bitmap设置成我用程序实现的颜色渐变,然后用strechdraw();可以画出一个正方形或长方形的来。但是对于圆形或椭圆就不能实现。  
  用以下方法:  
  canvas.Brush.Bitmap:=图形文件;  
  canvas.ellipse();  
  以上实现的效果有这样情况,如果ellipse的初始点坐标是图形文件宽度和高度整数倍时则在椭圆或圆区域内显示完全图象,如果不是初始坐标,而且ellipse使用的宽度和高度跟图形相同的时候,则在椭圆或圆区域内显示多个半图(图形文件左一半,有一半).  
   
  请大家帮我解决在椭圆或圆区域内显示出渐变色,不一定是用canvas.Brush.Bitmap:=图形文件. 问题点数:100、回复次数:30Top

1 楼huojiehai(海天子)回复于 2003-08-03 10:55:02 得分 1

我不会,但帮你顶!Top

2 楼failer(独败)回复于 2003-08-03 10:57:53 得分 1

关注Top

3 楼ingener(祝福)回复于 2003-08-03 11:07:52 得分 0

大家帮我顶,来着有分!Top

4 楼bxh2dai(希望明天会有些改变)回复于 2003-08-04 21:53:18 得分 1

好的,我也来顶,但是这个问题,我以前见过,我帮你去找找看,看能不能帮你解决Top

5 楼ingener(祝福)回复于 2003-08-05 09:49:18 得分 0

大家快来顶。来着有分!Top

6 楼zth215(大海)回复于 2003-08-05 10:02:14 得分 1

关注,学习Top

7 楼tonylk(=www.tonixsoft.com=)回复于 2003-08-05 10:19:00 得分 0

有一个稍麻烦点的方法,  
  先制作一个矩形的,足够包容该椭圆的颜色渐变的图像,  
  然后制作两个椭圆图像,一个是白底黑色图形的,另一个是黑底白色图形的,  
  将黑底白色图形的图像和你的窗口底色做按位与操作,这样背景色的中间椭圆型区域为黑色了,接着讲白底黑色图形的图像与刚才制作的彩色渐变图像做按位与操作,该渐变图像变为底色为黑色,  
  最后将以上处理过的背景图像和渐变色图像做按位或操作。完成。  
   
  不知道说明白了没有。。Top

8 楼ingener(祝福)回复于 2003-08-05 10:37:47 得分 0

这个方法我试试吧,不过2次与之后之后在按位或,不知道变成什么颜色了。  
  你有原码吗?贴一下,小弟表示感谢。  
  谁还有更简单的方法。帮忙顶。Top

9 楼tonylk(=www.tonixsoft.com=)回复于 2003-08-05 11:27:43 得分 0

好像有CopyRect函数,设置最后一个参数为SRC_OR,SRC_AND,等,这种方法我以前做过,肯定没有问题,晚上回家帮你找一下代码吧。Top

10 楼ingener(祝福)回复于 2003-08-05 16:22:01 得分 0

好,继续顶Top

11 楼Borland2004(我是转型者)回复于 2003-08-05 16:47:06 得分 0

我相信我可以给你写出来,但是我需要交换,你帮我写一个ADO存取图标的Demo,我帮你写这个的DemoTop

12 楼ingener(祝福)回复于 2003-08-05 16:57:18 得分 0

ADO存取图标的这个不难,你是存储.bmp,还是.ico的??Top

13 楼tonylk(=www.tonixsoft.com=)回复于 2003-08-05 19:30:52 得分 50

Canvas.CopyMode:=cmSrcAnd;  
      Canvas.CopyRect(RectTmpDes,TuTmp^.AMaskBmp.Canvas,RectTmpSrc);  
      Canvas.CopyMode:=cmSrcPaint;  
      Canvas.CopyRect(RectTmpDes,TuTmp^.ABmp.Canvas,RectTmpSrc);  
  Top

14 楼Borland2004(我是转型者)回复于 2003-08-05 20:31:27 得分 1

我只需要存储ICO就可以了,你帮我写Demo,我给你写DemoTop

15 楼lovedata(萨菲洛斯&我爱娃娃)回复于 2003-08-05 23:37:02 得分 20

这是我帮你找的关于图象的梯度填充的资料,但是代码不全,你自己看看吧~  
  Gradient   fill   procedure    
  Undertitle:      
     
  Category:   Graphic    
  Uploader:   Gerhardus   Geldenhuis    
       
  Question:   Gradient   fill    
  Answer:   paste   this   on   your   form   +   1   button   and   2   panels   and   a   paintbox   and   link   the   panels   onclick   event   and   you   will   see   it   work  
  it   is   fairly   fast.  
  when   using   this   code   in   your   application   it   is   suggested   to   first   draw   to   a   tbitmap   this   will   when   the   screen   area   neads   to   be   redrawn   speed   it   up   considerably.  
   
  function   getnewcolor(M1,M2:TColor;Location:Integer):TColor;  
  var  
      V     :   array[0..2]   of   Byte;//BeginRGBValue  
      D     :   array[0..2]   of   integer;//RGBDifference  
      R,G,B                     :   Byte;  
      K1,K2   :Longint;  
  begin  
              K1:=ColorToRGB(M1);  
              K2:=ColorToRGB(M2);  
              V[0]   :=   GetRValue(K1);  
              V[1]   :=   GetGValue(K1);  
              V[2]   :=   GetBValue(K1);  
   
              D[0]   :=   GetRValue(K2)-V[0];  
              D[1]   :=   GetGValue(K2)-V[1];  
              D[2]   :=   GetBValue(K2)-V[2];  
   
              R   :=   V[0]   +   MulDiv   (Location,   D[0],   Form1.PaintBox1.Width   -   1);  
              G   :=   V[1]   +   MulDiv   (Location,   D[1],   Form1.PaintBox1.Width   -   1);  
              B   :=   V[2]   +   MulDiv   (Location,   D[2],   Form1.PaintBox1.Width   -   1);  
      Result:=RGB(R,   G,   B);  
  end;  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      I   :Integer;  
  begin  
      for   i:=1   to   PaintBox1.Width   do  
      begin  
          PaintBox1.Canvas.Pen.Color:=GetNewColor(panel1.color,panel2.color,i);  
          PaintBox1.Canvas.MoveTo(i,1);  
          PaintBox1.Canvas.LineTo(i,Panel2.Height);  
      end;  
  end;  
   
  procedure   TForm1.Panel1Click(Sender:   TObject);  
  begin  
      if   ColorDialog1.Execute   then  
      if   Sender=Panel1   then  
          Panel1.Color:=ColorDialog1.Color  
      else      
  Top

16 楼lovedata(萨菲洛斯&我爱娃娃)回复于 2003-08-05 23:37:40 得分 0

我觉得这个方法是可以的,好好研究研究吧~Top

17 楼ingener(祝福)回复于 2003-08-06 08:58:25 得分 0

你这个方法我试过,不过只能完成长方形或正方形的颜色渐变,对于圆或椭圆没有办法填充的。欢迎朋友继续。来着有分。Top

18 楼ingener(祝福)回复于 2003-08-06 10:14:00 得分 0

怎么没有人顶呀,没有人来我自己顶Top

19 楼hiflower(花)回复于 2003-08-06 12:46:28 得分 22

这是我编的一个函数,可以有一个   Rect   中进行颜色渐变。有水平渐变、垂直渐变、矩形渐变、椭圆渐变  
   
  你只要将这个   Rect   再进行圆形或椭圆剪裁就能达到目的了。  
   
  type   TArtRectMode=(armHorizontal,armVertical,armRectangle,armEllipse);  
  procedure   DrawArtRect(ACanvas:TCanvas;ARect:TRect;ColorFrom,ColorTo:TColor;  
    ArtRectMode:TArtRectMode;Supplement:Integer=100);  
  var  
  Bmp:TBitmap;  
      i,n:Integer;  
      r1,g1,b1,r2,g2,b2:Integer;  
      r,g,b:Integer;  
      dr,dg,db,nr,ng,nb:Extended;  
      YXScale,f:Double;  
      OldColor:TColor;  
  begin  
  OldColor:=-1;  
  Bmp:=TBitmap.Create;  
      with   Bmp   do  
      begin  
      Width:=ARect.Right-ARect.Left;  
      Height:=ARect.Bottom-ARect.Top;  
          Canvas.Pen.Color:=clWhite;  
          Canvas.Brush.Color:=clWhite;  
          Canvas.Rectangle(0,0,Width,Height);  
      end;  
   
      r1:=GetRValue(ColorFrom);  
      g1:=GetGValue(ColorFrom);  
      b1:=GetBValue(ColorFrom);  
      r2:=GetRValue(ColorTo);  
      g2:=GetGValue(ColorTo);  
      b2:=GetBValue(ColorTo);  
   
      case   ArtRectMode   of  
      armHorizontal:  
          begin  
      dr:=(r2-r1)/Bmp.Width;  
      dg:=(g2-g1)/Bmp.Width;  
      db:=(b2-b1)/Bmp.Width;  
      nr:=r1;  
      ng:=g1;  
      nb:=b1;  
      with   Bmp.Canvas   do  
      begin  
      for   i:=0   to   Bmp.Width   do  
          begin  
              r:=Trunc(nr);  
              g:=Trunc(ng);  
              b:=Trunc(nb);  
  //         r:=Trunc(r1+(r2-r1)/Bmp.Width*i);  
  //             g:=Trunc(g1+(g2-g1)/Bmp.Width*i);  
  //             b:=Trunc(b1+(b2-b1)/Bmp.Width*i);  
              Pen.Color:=RGB(r,g,b);  
              MoveTo(i,0);  
              LineTo(i,Bmp.Height);  
          nr:=nr+dr;  
              ng:=ng+dg;  
              nb:=nb+db;  
          end;  
      end;  
          end;  
          armVertical:  
          begin  
      dr:=(r2-r1)/Bmp.Height;  
      dg:=(g2-g1)/Bmp.Height;  
      db:=(b2-b1)/Bmp.Height;  
      nr:=r1;  
      ng:=g1;  
      nb:=b1;  
      with   Bmp.Canvas   do  
      begin  
      for   i:=0   to   Bmp.Height   do  
          begin  
              r:=Trunc(nr);  
              g:=Trunc(ng);  
              b:=Trunc(nb);  
              Pen.Color:=RGB(r,g,b);  
              MoveTo(0,i);  
              LineTo(Bmp.Width,i);  
          nr:=nr+dr;  
              ng:=ng+dg;  
              nb:=nb+db;  
          end;  
      end;  
          end;  
          armRectangle:  
          begin  
          YXScale:=Abs(Supplement/100);  
          n:=Trunc(Max(Bmp.Height/YXScale,Bmp.Width)/2);  
      dr:=(r2-r1)/n;  
      dg:=(g2-g1)/n;  
      db:=(b2-b1)/n;  
      nr:=r1;  
      ng:=g1;  
      nb:=b1;  
        with   Bmp.Canvas   do  
            begin  
              Brush.Style:=bsSolid;  
                  Pen.Mode:=pmCopy;  
                  Pen.Style:=psSolid;  
            for   i:=n   downto   0   do  
                begin  
                  r:=Trunc(nr);  
                      g:=Trunc(ng);  
                      b:=Trunc(nb);  
                      Pen.Color:=RGB(r,g,b);  
  //               Brush.Color:=Pen.Color;  
                      Brush.Style:=bsClear;  
                Rectangle(Bmp.Width   div   2   -i,Bmp.Height   div   2-Trunc(i*YXScale),  
                      Bmp.Width   div   2   +i,Bmp.Height   div   2   +Trunc(i*YXScale));  
                      nr:=nr+dr;  
                      ng:=ng+dg;  
                      nb:=nb+db;  
                end;  
              end;  
          end;  
          armEllipse:  
          begin  
          YXScale:=Abs(Supplement/100);  
          f:=Distance(0,0,Bmp.Width,Bmp.Height);  
          n:=Trunc(Max(f/YXScale,f)/2);  
      dr:=(r2-r1)/n;  
      dg:=(g2-g1)/n;  
      db:=(b2-b1)/n;  
      nr:=r1;  
      ng:=g1;  
      nb:=b1;  
              with   Bmp.Canvas   do  
              begin  
                  Pen.Mode:=pmCopy;  
                  Pen.Style:=psSolid;  
                  Pen.Width:=1;  
          for   i:=n   downto   0   do  
            begin  
                  r:=Trunc(nr);  
                      g:=Trunc(ng);  
                      b:=Trunc(nb);  
            Pen.Color:=RGB(r,g,b);  
                  Brush.Color:=Pen.Color;  
                      if   Supplement<0   then  
                      Brush.Style:=bsClear  
                      else  
                      Brush.Style:=bsSolid;  
                      if   Pen.Color<>OldColor   then  
                      begin  
                      OldColor:=Pen.Color;  
                Ellipse(Bmp.Width   div   2-i,Bmp.Height   div   2   -Trunc(YXScale*i),  
                      Bmp.Width   div   2+i,Bmp.Height   div   2   +Trunc(YXScale*i));  
                      end;  
                      nr:=nr+dr;  
                      ng:=ng+dg;  
                      nb:=nb+db;  
                  end;  
            end;  
          end;  
      end;//case  
      ACanvas.CopyMode:=cmSrcCopy;  
      ACanvas.CopyRect(ARect,Bmp.Canvas,Rect(0,0,Bmp.Width,Bmp.Height));  
      Bmp.Free;  
  end;  
  Top

20 楼ingener(祝福)回复于 2003-08-20 22:29:19 得分 0

还没有人解决  
  再顶Top

21 楼windwather(流年似水)回复于 2003-08-21 00:31:07 得分 1

我也不会,帮你顶了。顺便学习。Top

22 楼tonylk(=www.tonixsoft.com=)回复于 2003-08-21 10:50:34 得分 0

我说的那个方法一定可以,效率其实也不低,你到底试过没有,不要妄想着有人会把代码写好了给你。Top

23 楼hiflower(花)回复于 2003-08-21 12:24:00 得分 0

同意楼上  
  其实我的方法也是可行的Top

24 楼ingener(祝福)回复于 2003-08-21 19:53:34 得分 0

上面的方法我试过了,在FORM里的结果是可以的,但是我做的是一个控件,控件实现的结果却是还是上面的样子(我的主题上提到的)Top

25 楼hiflower(花)回复于 2003-08-21 20:38:49 得分 0

这就很奇怪了,Form   的Canvas   与你的控件的   Canvas   难道还有不同了  
  你的控件从什么继承来的Top

26 楼ingener(祝福)回复于 2003-08-21 20:53:06 得分 0

TGraphicControl   继承的。Top

27 楼ingener(祝福)回复于 2003-08-21 20:53:40 得分 0

我又动态创建了一个BITMAP可是好象有问题。Top

28 楼tonylk(=www.tonixsoft.com=)回复于 2003-08-21 21:38:16 得分 0

动态创建的bitmap在绘图前记得设置大小,以及PixelFormat,肯定不会有问题的,Top

29 楼ingener(祝福)回复于 2003-08-22 09:54:31 得分 0

tonylk(tony)谢谢,正在努力当中。Top

30 楼tjff2000(fengyun)回复于 2003-08-22 10:41:52 得分 2

你可以用  
  hr:HRGN;  
  hr:=CreateEllipticRgn(0,1,300,200);   //形成一椭圆区域  
  SetWindowRgn(handle,hr,true);   //形成椭圆的初始化窗体  
  再用渐进色填充即可。Top

相关问题

  • 怎么把图片往一个椭圆形里面填充呢?
  • 如何用渐变的颜色填充?
  • 如何生成椭圆形SpeedBtn?
  • EVC下如何制作圆形和椭圆形按钮?
  • 如何用渐变色填充矩形?谢谢!
  • 怎样把某个区域填充成渐变色?
  • 怎样在VB.NET中用PathGradientBrush填充一个渐变矩形
  • flash mx 2004填充色怎么设成多条渐变颜色?
  • 如何在一个弧形里填充渐变色?
  • 创建椭圆,并用brush填充,结果没有效果

关键词

  • 渐变
  • 图形
  • 区域
  • 图像
  • 控件
  • 椭圆
  • bmp
  • yxscale
  • trunc
  • ng

得分解答快速导航

  • 帖主:ingener
  • huojiehai
  • failer
  • bxh2dai
  • zth215
  • tonylk
  • Borland2004
  • lovedata
  • hiflower
  • windwather
  • tjff2000

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo