想在Form上画一个虚框,不知道怎么实现!

想在Form上画一个虚框,不知道如何实现!!!
大家用delphi,都知道当鼠标左键点下,并拖动鼠标的时候,在form上会出现一个虚框,虚框内的所有控件就都被选中了。我也想在运行时要这么一个画虚框的效果,不知道如何实现?

只要能把这个虚框画出来就行,大虾们帮帮忙!

我只知道用Canvas,并设置
Canvas.Brush.Style   :=   bsClear;
Canvas.Pen.Style   :=   psDot;
用Canvas.Rectangle可以画四方框。

------解决方案--------------------
开发图形软件?
------解决方案--------------------
http://www.soudie.net/top_6186_cat_1/
不知道对不对,可以参考以下
编辑主菜单。 增加Write,Draw俩个下拉菜单项。 在 "Write "下增加 "HelloWorld!! ", "Iamateacher ", "Font.. "菜单项.在 aw "下增加 "Arc ", "Line ", "Polygon ", "RoundRect ", "Rectangle ", "color. " , "LineStyle ", "WidthLine ". 在 "LineStyle " 菜单下增加 "Solid ", "Dash ", "Dot ", "DashDot ", "DashDotDot " 子菜单。

  相应的在SdiForm中增加ColorDialog,FontDialog, 控件。

  在OnPaint事件中增加如下代码:

procedureTSDIAppForm.FormPaint(Sender:TObject);
begin
canvas.FillRect(rect);{清空桌面画布}
withSDIappformdo
posx:=clientwidthdiv2;
posy:=clientheightdiv2;{确定客户区中心点}
casedetectIof
1:
begin
setpenstate;
canvas.Ellipse(posx-50,posy-50,posx+50,posy+50);
//penwidth:=oldwidth;
end;{在客户区中心点画圆}
2:
begin
setpenstate;
canvas.MoveTo(posx-60,posy-60);
canvas.LineTo(posx+60,posy+60);
//penwidth:=oldwidth;
end;{在客户区画直线}

3:
begin
fposx:=trunc(50*cos(pi/6));
fposy:=trunc(50*sin(pi/6));
setpenstate;
Canvas.Polygon([Point(posx-fposy,posy-fposx),
Point(posx+fposy,posy-fposx),
Point(posx+50,posy),Point(posx+fposy,posy+fposx),
point(posx-fposy,posy+fposx),point(posx-50,posy)]);
//penwidth:=oldwidth;
end;{在客户区中心点画多边形}
4:
begin
setpenstate;
canvas.RoundRect(posx-100,posy-50,posx+100,posy+50,
20,20);
end;{在客户区中心点画带圆角的矩形}

5:
begin
setpenstate;
sdiappform.Canvas.Brush.Color:=clred;
canvas.Rectangle(posx-100,posy-50,posx+100,posy+50);
sdiappform.Canvas.Brush.Color:=bcolor;
end{在客户区中心点用红色刷子画矩形}
else
begin
canvas.Font:=formfont;
canvas.TextOut(30,posy,str);
end;
end;{写字}
end;
上面程序中出现的变量在事件OnCreate中初始化。
procedureTSDIAppForm.FormCreate(Sender:TObject);
begin
str:=;{要写在画布上的字符串}
formfont:=canvas.font;{字体和大小}
detectI:=0;{确定画布上出现何种图形的参数}
rect:=sdiappform.ClientRect;{客户区矩形}
oldwidth:=sdiappform.Canvas.Pen.Width;{最初画笔宽度}
penwidth:=oldwidth;{画笔宽度}
penstyle:=sdiappform.Canvas.Pen.Style;{画笔类型}
pencolor:=sdiappform.Canvas.Pen.Color;{画笔颜色}
bcolor:=sdiappform.Canvas.Brush.Color;{画刷颜色}
end;

  为了减少代码,定义了一个Public过程,设定画笔。代码如下:
procedureTSDIAppForm.setpenstate;
begin
withsdiappform.Canvas.Pendo
begin
color:=pencolor;
style:=penstyle;
width:=penwidth;
end;
end;

  响应每一个菜单项OnClick事件本程序设计得非常简单,如果有兴趣,读者也可以加上一些代码,完成许多复杂的工作。
procedureTSDIAppForm.LineColor1Click(Sender:TObject);
begin
ifcolordialog1.Executethen
begin
pencolor:=colordialog1.Color;
SdiAppForm.Canvas.Pen.Style:=psInsideFrame;
ifpenwidth$#@60;1then
SdiAppForm.Canvas.Pen.Width:=3;
SdiAppForm.Canvas.Pen.Color:=pencolor;
invalidate;
end;
end;{完成画笔颜色设定}
//{完成画笔笔形设定}
procedureTSDIAppForm.Solid1Click(Sender:TObject);
begin
penStyle:=pssolid;
invalidate;
end;


procedureTSDIAppForm.Dot1Click(Sender:TObject);
begin
PenStyle:=psdot;
invalidate;
end;