怎样在Panel上画图(100分)

  • 主题发起人 主题发起人 netmonit
  • 开始时间 开始时间
N

netmonit

Unregistered / Unconfirmed
GUEST, unregistred user!
我在一个窗口上放置了一个Panel,在Panel上放置了一些TImage控件,表示一些设备,
需要在一些TImage控件之间画一些线,表示两个设备之间有连接关系,但我发现Panel
控件没有Canvas属性,无法画线,请各位高手指点一二,多谢!
 
最简单的办法是使用TShape(在Additional页,TImage旁),
将其Height设为1,就是一条细线
 
TPanel 的 Canvas 是 Protected 的属性,可以这样访问它:
type
TCrackPanel = class(TPanel);
...
procedure TForm1.Button1Click(Sender: TObject);
begin
with TCrackPanel(Panel1).Canvas do
begin
LineTo(...);
...
end;
end;
 
对于没有Canvas属性的控件,如果有Handle属性,可用GetDC(Handle)来取得DC,之后就可以
用DC来画你想画的东东了。
 
有一个非常奇怪的问题。
我首先在一个Form上放置了一个Panel,然后在Panel上放置了两个Image,它们分别是
image1和image2。
用bbkxjy的方法在它们之间画一条连线,完全正确。
如果我在程序中用动态的方法再在Panel上增加一个Image3,然后在它们之间
画线,结果靠近image3的一部分线就不见了。
程序如下:
procedure TForm1.Button2Click(Sender: TObject);
var
x1, x2, x3, y1, y2, y3: integer;
begin

image3 := TImage.Create(self.Panel1);
image3.Parent := self.Panel1;
image3.Width := image2.Width;
image3.Height := image2.Height;
image3.Picture.LoadFromFile('technlgy.ico');
image3.Left := 10;
image3.Top := 10;
image3.OnClick := self.ImageClick;

x1 := image1.Left;
y1 := image1.Top;
x2 := image2.Left;
y2 := image2.Top;
x3 := image3.Left + image3.Width;
y3 := image3.Top + image3.Height;
//showmessage(inttostr(x3) + '|' + inttostr(y3));
with TCrackPanel(Panel1).Canvas do
begin
moveto(x3,y3);
lineto(x2,y2);
moveto(x3,y3);
lineto(x1,y1);
end;
end;
更为奇怪的是如果我在程序中增加一条显示语句showmessage,在弹出显示框后,我按了
对话框的OK键后,程序显示的画线结果就是正确的。
请再指点一下。
 
大概是 TImage 还没来得及重绘的缘故,试试用 Image3.Update; 去替换 ShowMessage 那一句。
 
to netmonit
Refresh it
 
多人接受答案了。
 
后退
顶部