请问在程序运行过程中动态改变image的大小时,怎样才使Image中已画的图形不被擦除(50分)

  • 主题发起人 主题发起人 LearningAug
  • 开始时间 开始时间
L

LearningAug

Unregistered / Unconfirmed
GUEST, unregistred user!
我的代码如下:
//面板Panel的Resize函数,Image放在此Panel上的,Image的大小随Panel改变而改变
procedure Tfrm_main.PanelResize(Sender: TObject);
var
BackBitmap: TBitmap;
begin
BackBitmap := TBitmap.Create;
try
BackBitmap.Assign(Image1.Picture.Bitmap); // 先将原来画的东西保存起来
Image1.Picture.Graphic := nil; //清除原来的内容,否则没法改变大小。
Image1.Width := Panel.Width;
Image1.Height := Panel.Height;
Image1.Canvas.Draw(0, 0, BackBitmap); // 再把原图画回去
finally
BackBitmap.Free;
end;
end;

但是当Panel的大小改变后,尤其是被缩小后,Image中已画的图形会被Panel的边框擦除掉,请问应该怎么解决这个问题?
 
Image1.Canvas.StretchDraw(Rect(0,0,Image1.Width ,Image1.Height ), BackBitmap)
 
用StretchDraw已画图象是不回被擦除了,但是图象的比例变了啊!我想不要改变图象的比例。
 
就像MSN中的那个绘图效果一样
 
试一下设置Panel的双缓存为True,pnl1.DoubleBuffered := True,看好不好一点,我也在问类似的问题.呵呵
 
DoubleBuffered:=True 只能消除图象的闪烁,但是不能确保图象不被擦除。
 
自己计算一下比例 bili,然后用 比如以最大宽度 则计算高度 xxx 因该为 (原高度-现高度) div 2

bili:= BackBitmap.width/Image1.width
Image1.Canvas.StretchDraw(Rect(0,xxx,Image1.Width ,Image1.Height div bilie ), BackBitmap)
 
我感觉 Image1.Picture.Bitmap 这个地方有问题,但是不知道怎么修改
 
你这个并没有消失,只是被覆盖住了而已。所以办法是显示出来:

1.放缩。Stretch := True
2.使用滚动条!将Img放到ScrollBox上。这样保证能显示。
3.只显示一部分
 
To:
xiammy,我用了你的第二个方法,使用ScrollBox,但是ScrollBox好象对Image没有起到作用
 
使用Stretch属性就可以了, 不用那么费劲。
或者用 stretchDraw函数。
 
x:=min(Image1.Width/BackBitmap.width,Image1.Height/BackBitmap.Height);
Image1.Canvas.StretchDraw(Rect(0,0,Image1.Width*x ,Image1.Height*x ), BackBitmap)
 
To yuzk2005:
用StretchDraw的效果不好。比例没有跟上图形的变化。X为小数,这样图象会失真的
 
你是希望panel大小改变时image中图象比例不变只显示一部分,还是希望图象比例能根据panel的大小而缩放?

如果是第一种,在panel上放个ScrollBox,再把image放到ScrollBox里,设置autosize:=true; top:=0; left:=0; 其他属性默认

如果是第2种,直接把image放到panel上,设置
Image1.Align:=alClient;
Image1.Stretch:=true;
其他属性默认
 
我是希望你说的第一种。panel大小改变时image中图象比例不变只显示一部分。
但是ScrollBox对Image不起作用,你可以试一下。当panel变小后,ScrollBox不会产生滚动条的
 
??????不会啊 我刚试过了才发的帖子 没问题啊
 
ScrollBox在panel里 要设置ScrollBox的Align:=alClient;
 
你能把你的代码发到我的邮箱里吗?要不就是我哪里没有设置好
我的邮箱:learningoct@tom.com
可以的话,我就结贴了!
 
我刚刚又试了一下,可以了。谢谢了哈
 
多人接受答案了。
 
后退
顶部