1

源程序下载
1：变色窗口背景

第一步：创建一个应用程序，保存为Unit为U00202.Pas，Form.Name = Form1，Progect为P00202.prg。
第二步：在Form1的OnCreate事件里面添加如下一段代码：
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;
自己动手试一下吧，你还可以把$00000000，改成其他你喜欢的颜色。
2：不用标题栏也移动窗体
一般情况下，移动一个窗体需要将鼠标放置在标题栏上才能拖动窗体，为 什么非要使用标题栏呢？其实我们可以使用一个巧妙的方法来实现将鼠标放置 在窗体上按下就可拖动窗体，下面先看实现代码。在Form1的“Private”部分声明过程：
在private部分加入下列代码：
procedure wmnchittest(var msg:twmnchittest);message wm_nchittest;
在程序部分加入以下代码：
procedure TForm1.wmnchittest(var msg:twmnchittest);
begin
inherited;
if (htclient=msg.result) then msg.result:=htcaption;
end;
上面的关键代码虽然只有两行，但它实现了鼠标直接拖动窗体的目的。代码的原理是利用窗体的WM_NCHITTEST消息，这个消息是当光标移动、鼠标按下或释放时发生的，当程序检测到鼠标在窗体中按下的消息后（消息的值为htClient），将鼠标在标题栏上按下时产生的消息（值为htCaption）传递出去，这样就巧妙的欺骗程序认为是标题栏被按下，当然就可拖动窗体了。
3：状态条插入可视控件
首先,在FROM中放置一个状态条控件StatusBar1:TStatusBar,。调节StatusBar1.Panels，在其中插入3个状态条嵌板。把第二个嵌板的参数Style设置成psOwnerDraw。这一点很重要，如果没有这样做，将永远无法显示文字以外的东西。在From中放置一个Button1:TButton ;
第二步，在FROM的Public中申明一个StatusDrawRect:TRect; //记录要插入状态条特技的坐标范围
第三步：在状态条的OnDrawPanel事件中插入一行StatusDrawRect:=rect;以记录参数Style设置成psOwnerDraw的嵌板的坐标。在Button1的OnClick事件，中定义一个TProgressBar类型的变量Progress。响应过程中调用Create方法把它建立起来，再设定状态条为该进程条的父窗口，进而设定进程条的一些必要参数。例如：最大值、最小值、原点坐标、高度和宽度等。
procedure TForm1.Button1Click(Sender: TObject);
Var
ssbmp:Tbitmap;
progress:TProgressbar;
I, count:integer;
staPanleWidth:integer;
begin
progress:=TProgressbar.create(form1);
count:=9000; //进程条的最大值
staPanleWidth:=StatusBar1.Panels.Items[1].width; //由于进程条的很宽，所以需要改变状态条嵌板的宽度，这里先保存它的宽度。
StatusBar1.Panels.Items[1].width:=300; // 改变宽度
StatusBar1.repaint;
with progress do
begin
top:=StatusDrawRect.top;
left:=StatusDrawRect.left;
width:=StatusDrawRect.right-StatusDrawRect.left;
height:=StatusDrawRect.bottom-StatusDrawRect.top;
//设定进程条的宽度和高度
visible:=true;
try
Parent := StatusBar1; //该进程条的拥有者为状态条status
Max := Count; //进程条的最大和最小值
Min := 0;
Step := 1; //进程条的步长
for i := 1 to Count do Stepit; // 累加进程条
ShowMessage('现在，进程条将要从内存中被释放');
finally
Free; //释放进程条
end; //try
end; //with
StatusBar1.Panels.Items[1].width:=staPanleWidth; //恢复状态条嵌板的宽度
end;
procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect:TRect);
begin
StatusDrawRect:=rect; //记录要实现状态条特技的坐标范围
end;

源程序下载