怎样实现窗口上的所有东西都颜色渐变?

解决方案 »

  1.   

    我倒是有个笨办法timer+图片切割(把你的按钮什么的都用图片代替,就象金山公司的很多软件的外观那样,有很多的skin)可能太苯了点!
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ActnMan, ActnColorMaps, ExtCtrls, Menus;type
      TForm1 = class(TForm)
        MainMenu1: TMainMenu;
        N1: TMenuItem;
        mnu_Horizontal: TMenuItem;
        mnu_Vertical: TMenuItem;
        N2: TMenuItem;
        mnu_StartColor: TMenuItem;
        mnu_EndColor: TMenuItem;
        ColorDialog1: TColorDialog;
        procedure Draw(StartColor:TColor;EndColor:TColor;Direction:Integer);
        procedure mnu_StartColorClick(Sender: TObject);
        procedure mnu_VerticalClick(Sender: TObject);
        procedure mnu_HorizontalClick(Sender: TObject);
        procedure mnu_EndColorClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormPaint(Sender: TObject);
        procedure FormResize(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      StartColor:TColor;
      EndColor:TColor;
      Direction:Integer;
    implementation{$R *.DFM}procedure TForm1.Draw(StartColor:TColor;EndColor:TColor;Direction:Integer);
    var
      i:Integer;
      Dct:TRect;
      c1,c2,c3:byte;
    begin
        if Direction=0 then
        begin
            for i:=0 to self.Width-1 do
            begin
                c1:=GetRValue(StartColor)+Trunc(i*(GetRValue(EndColor)-GetRValue(StartColor))/(self.Width-1));
                c2:=GetGValue(StartColor)+Trunc(i*(GetGValue(EndColor)-GetGValue(StartColor))/(self.Width-1));
                c3:=GetBValue(StartColor)+Trunc(i*(GetBValue(EndColor)-GetBValue(StartColor))/(self.Width-1));
                Canvas.Brush.Color:=RGB(c1,c2,c3);
                //每次画矩形的画刷颜色
                Dct:=Rect(i,0,i+1,self.Height);
                //每次刷绘的矩形区域
                Canvas.FillRect(Dct);
                //填充颜色
            end;
        end
        else
        begin
            for i:=0 to self.Height-1 do
            begin
                c1:=GetRValue(StartColor)+Trunc(i*(GetRValue(EndColor)-GetRValue(StartColor))/(self.Height-1));
                c2:=GetGValue(StartColor)+Trunc(i*(GetGValue(EndColor)-GetGValue(StartColor))/(self.Height-1));
                c3:=GetBValue(StartColor)+Trunc(i*(GetBValue(EndColor)-GetBValue(StartColor))/(self.Height-1));
                Canvas.Brush.Color:=RGB(c1,c2,c3);
                //每次画矩形的画刷颜色
                Dct:=Rect(0,i,self.Width,i+1);
                //每次刷绘的矩形区域
                Canvas.FillRect(Dct);
                //填充颜色
            end;
        end;
    end;procedure TForm1.mnu_StartColorClick(Sender: TObject);
    begin
        if ColorDialog1.Execute then
            StartColor:=ColorDialog1.Color;
        Draw(StartColor,EndColor,Direction);
    end;procedure TForm1.mnu_VerticalClick(Sender: TObject);
    begin
        Direction:=1;
        Draw(StartColor,EndColor,Direction);
    end;procedure TForm1.mnu_HorizontalClick(Sender: TObject);
    begin
        Direction:=0;
        Draw(StartColor,EndColor,Direction);
    end;procedure TForm1.mnu_EndColorClick(Sender: TObject);
    begin
        if ColorDialog1.Execute then
            EndColor:=ColorDialog1.Color;
        Draw(StartColor,EndColor,Direction);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
        StartColor:=RGB(0,0,0);
        EndColor:=RGB(255,255,255);
        Direction:=0;
    end;procedure TForm1.FormPaint(Sender: TObject);
    begin
        Draw(StartColor,EndColor,Direction);
    end;procedure TForm1.FormResize(Sender: TObject);
    begin
        self.Canvas.Refresh;
        Draw(StartColor,EndColor,Direction);
    end;end.
    此為窗躰背景色 漸變色