一个关于Timage非常值得一看的问题(100分)

  • 主题发起人 主题发起人 hejiesi
  • 开始时间 开始时间
H

hejiesi

Unregistered / Unconfirmed
GUEST, unregistred user!

假如Timage的width和height的初始值为200,200 在这个范围内画一个矩形
能够看到这个矩形,跟着把width和height的值设为400,400 并执行
fillrect(rect(300,300,400,400)); 那这个矩形就看不到了,Why ??????
 
重画应该没有问题呀!
 
iamge1.repain;
image1.updata;
image1.inde...
等等都不行
 
把你的代码贴出来看看
 
同意"AMO"-->>把你的代码贴出来看看
 
不用贴了,肯定看不到,因为Cavans 这个东西,在
图片的大小发生改变时会产生很多异常,我试过很多次了。
我的意见:
原因 : cavans 没有重新初始化。
解决: 改变大小时进行初始化 : image.picture := nil;
注意 : ×要重新画矩形了。
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
image1.Height:=200;
image1.Width:=200;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
image1.Canvas.Brush.Color:=clred;
image1.Canvas.FillRect(rect(0,0,100,100));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
image1.Height:=400;
image1.Width:=400;
image1.Canvas.FillRect(rect(200,200,300,300));
image1.Refresh;
image1.Repaint;
image1.Invalidate;
end;
end.

上面的程序,在按button1后再按button2,那button2所画的东西就看不到.Why ????

 
杀大龙所说得原因正确,
当image的大小发生变化时,image的canvas未相应改变,
此时canvas的大小仍是200X200,
所以你画的rect(200,200,300,300)当然变显示不出来了,
你可以改成:
image1.Canvas.FillRect(rect(100,100,200,200));
就可以看到了。
修改的方法有三:
1、改变大小后加入:
TBitmap(image1.Picture.Graphic).width:=400;
TBitmap(image1.Picture.Graphic).height:=400;
来扩大canvas的大小。
整个过程如下:
procedure TForm1.Button2Click(Sender: TObject);
begin
image1.Height:=400;
image1.Width:=400;
image1.Canvas.Brush.Color:=clwhite;// 因为canvas扩大的部分要重画,所以先置回白色。
TBitmap(image1.Picture.Graphic).width:=400;
TBitmap(image1.Picture.Graphic).height:=400;
image1.Canvas.Brush.Color:=clred;
image1.Canvas.FillRect(rect(100,100,200,200));
image1.Refresh;
image1.Repaint;
image1.Invalidate;
end;

当然你可以自己改Timage
2、在image中加入一幅图就行了
3、如杀大龙所说


 
多人接受答案了。
 
amo 的三个方法,我觉得都是一样的,。因为它都会导致 vcl 消息机制更新组件,
所执行的代码是一样的。
 
后退
顶部