我有一个问题:
窗体的颜色是否能用渐变色,如从上到下其颜色从白到黑,可以得话,该怎么实现????

解决方案 »

  1.   

    都是自己画的。
    var i,j:Integer;
        Dct:TRect;
    begin
    j:=Form1.height;
    for i:=0 to 255 do
      begin
        Canvas.Brush.Color:=RGB(255,255,i);
        Dct:=Rect(i*2,0,(i+1)*2,j);
        Canvas.FillRect(Dct);
      end;
    end;
      

  2.   

    var
      i, j, k: DWord;
    begin
      j :=Form1.Height;
      i := 0;
      k := 0;
      while i <= j do
      begin
        if i mod 2 = 1 then
        begin
          Inc(k);
          Canvas.Pen.Color := RGB(k, k, k);
        end;
        Canvas.MoveTo(0, i);
        Canvas.LineTo(Form1.Width, i);
        Inc(i);
      end;
      

  3.   

    var
      i, j, k: DWord;
    begin
      j :=Form1.Height;
      i := 0;
      k := 0;
      while i <= j do
      begin
        if i mod 2 = 1 then
        begin
          Inc(k);
          Canvas.Pen.Color := RGB(k, k, k);
        end;
        Canvas.MoveTo(0, i);
        Canvas.LineTo(Form1.Width, i);
        Inc(i);
      end;
      

  4.   

    我们看到有些安装程序的背景色自上由下由蓝变黑,我们可以通过下列程序实现
    双击窗体的OnPaint事件,然后编写如下程序: procedure TForm1.FormPaint(Sender: TObject);
    var i:word;
        dy,y:real;
    begin
        dy:=clientheight/256;
        y:=0;
        for i:=255 downto 0 do
        begin
           canvas.brush.color:=$00000000+i*$10000;
           canvas.fillrect(rect(0,round(y),clientwidth,round(y+dy)));
           y:=y+dy;
        end;
    end; 
      

  5.   

    可以使用一个 API 函数得到更平滑的颜色过渡。type
      COLOR16 = word;
      TRIVERTEX = packed record
         x, y: dword;
         Red: COLOR16;
         Green: COLOR16;
         Blue: COLOR16;
         Alpha: COLOR16;
      end;
      
      function GradientFill(DC: hDC; pVertex: Pointer;
            dwNumVertex: DWORD; pMesh: Pointer;
            dwNumMesh, dwMode: DWORD): DWord; stdcall; external 'msimg32.dll';procedure TForm1.DrawPanel;
    var
      vert : array[0..1] of TRIVERTEX;
      gRect : GRADIENT_RECT;
      cl: LongInt;
    begin
      vert[0].x := 0;
      vert[0].y := 0;
      cl := ColorToRGB(clBlack);
      vert[0].Red := GetRvalue(cl) * 256;
      vert[0].Green := GetGValue(cl) * 256;
      vert[0].Blue := GetBValue(cl) * 256;
      vert[0].Alpha := $0000;
      vert[1].x := FillImage.Width;
      vert[1].y := FillImage.Height;
      cl := ColorToRGB(clWhite);
      vert[1].Red := GetRValue(cl) * 256;
      vert[1].Green := GetGValue(cl) * 256;
      vert[1].Blue := GetBValue(cl) * 256;
      vert[1].Alpha := $0000;
      gRect.UpperLeft := 0;
      gRect.LowerRight := 1;
      GradientFill(Form1.Canvas.Handle, @vert, 2, @gRect, 1, GRADIENT_FILL_RECT_H);
    end;GRADIENT_FILL_RECT_H 是横向过渡,GRADIENT_FILL_RECT_V 是纵向过渡,详细情况查询 MSDN 帮助。
      

  6.   

    忘了改了,FillImage 是一个 TImage,可以将它换成 Form。
      

  7.   

    如果是 Panel 方法也是一样的。但是还是存在对应位置的问题,必须使你的 Panel 的开始颜色和窗体部分的颜色是相同的,这个计算是个问题。而且 API 的渐变色函数中颜色的变化不是一段连续的颜色,其中有一些杂点混在其中,需要计算一个点的颜色。所以难度是有的,我还没有什么方法。