如何放大用pen在image控件中画的图?(200分)

  • 主题发起人 主题发起人 e土人
  • 开始时间 开始时间
E

e土人

Unregistered / Unconfirmed
GUEST, unregistred user!
1。在一个form放了一个TScroolBox(align = alClient)
2.接着在TScroolBox里放一个Timage(align = alClient)
3.用image.canvas.pen画了图
4.我试图通过将image.width和height放大,并超出TScroolBox的范围,再重画图,
以达到放大图象的目的,可image.width的值确不会变大,而我在编辑的时候却可以拉大
这是为什么?
 
是否根据pen的绘图边界动态地变更Width,Height的大小呢?!
 
我用的函数MyDraw(Arect : Trect),调用为MyDraw(image.ClientRect)。
如果把调用改为MyDraw(Rect(image.left,image.top,image.right*2,image.bottom*2))
的话,图像是可以放大,但不会出现scroolbar,也就无法看到全部图像,还有其他办法吗?
谢啦?
 
你采用动态创建Image,当你放大时,重新设置Image的Width,和Height,unit Unit1;
并把它放在Form上
interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
View1: TMenuItem;
ZoomIn1: TMenuItem;
ZoomOut1: TMenuItem;
Draw1: TMenuItem;
Exit1: TMenuItem;
Panel1: TPanel;
Position1: TMenuItem;
add1: TMenuItem;
N1: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure ZoomIn1Click(Sender: TObject);
procedure ZoomOut1Click(Sender: TObject);
procedure RepaintOriginalMap(Sender:TObject);
procedure PaintMap(TPa:array of Tpoint);
private
{ Private declarations }
public
{ Public declarations }
end;

const
OriginalHeight=600;
OriginalWidth=800;
var
Form1: TForm1;
Image1:TImage;
Temppa,pa:array[1..4] of TPoint;
NowWidth,NowHeight:integer;
implementation

{$R *.DFM}

procedure TForm1.PaintMap(TPa:array of Tpoint);
begin
Image1.Canvas.Brush.Color := clTeal;
Image1.Canvas.Polygon(Tpa);
end;

procedure TForm1.RepaintOriginalMap(Sender:TObject);
begin
Image1.Free;
Image1:=TImage.Create(Self);
Image1.Parent:=Form1;
Image1.Left:=0;
Image1.Top:=0;
Image1.Height:=OriginalHeight;
Image1.Width:=OriginalWidth;
NowHeight:=Image1.Height;
NowWidth:=Image1.Width;
PaintMap(Pa);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Image1:=TImage.Create(Self);
Image1.Parent:=Form1;
Image1.Left:=0;
Image1.Top:=0;
Image1.Width:=OriginalWidth;
Image1.Height:=OriginalHeight;
NowWidth:=Image1.Width;
NowHeight:=Image1.Height ;
pa[1].x:=50;
pa[1].y:=50;
pa[2].x:=50;
pa[2].y:=50;
pa[3].x:=65;
pa[3].y:=85;
pa[4].x:=120;
pa[4].y:=60;
temppa:=pa;
PaintMap(temppa);
end;

procedure TForm1.ZoomIn1Click(Sender: TObject);
var
i:integer;
begin
Image1.Free;
Image1:=TImage.Create(Self);
Image1.Parent:=Form1;
Image1.Left:=0;
Image1.Top:=0;
Image1.Height:=trunc(NowHeight*1.5);
Image1.Width:=trunc(NowWidth*1.5);
NowHeight:=Image1.Height;
NowWidth:=Image1.Width;

for i:=1 to 4 do
begin
TempPa.x:=trunc(temppa.x*1.5);
TempPa.y:=Trunc(temppa.y*1.5);
end;
paintmap(temppa)
end;

procedure TForm1.ZoomOut1Click(Sender: TObject);
var
i:integer;
begin
MyCount:=MyCount-1;
Label1.Caption:=IntToStr(MyCount);
if myCount=0 then
begin
RepaintOriginalMap(Sender)
end
else
begin
Image1.Destroy;
Image1:=TImage.Create(Self);
Image1.Parent:=Form1;
Image1.Left:=0;
Image1.Top:=0;
Image1.Height:=Trunc(NowHeight/1.5);
Image1.Width:=Trunc(NowWidth/1.5);
NowHeight:=Image1.Height;
NowWidth:=Image1.Width;

for i:=1 to 4 do
begin
Temppa.x:=trunc(Temppa.x/1.5);
TempPa.y:=trunc(Temppa.y/1.5);
end;
PaintMap(Temppa)
end;
end;



end.
 
呵呵,方法太不先进了。
你在内存中建立一个TBitMap对象,把你的图像调到此Bitmap中(用LoadFromFile等)
在ScrollBox中不要放Timage,放一个TPaintBox就可以了,设align为client。
然后在TPaintBox的OnPaint事件中写PaintBox.Canvas.StreachDraw(...BitMap);
就可以了。StreachDraw的范围你自己来控制,保证比你用TImage快。
 
>>可image.width的值确不会变大
如果你用了Timage中的TBitmap后,单纯改变Timage.width图像
宽是不变的,还要改变Tbitmap.width才行
 
wuheedm的方法可以解决放大的问题,但又产生新的问题,动态创建的image如何接收事件,
如onmousemove?
 
问题已解决,image1.onmousemove := imagess.onmousemove(sender : Tobject;...)
感谢各位的帮助,特别是wuheedm.
 

Similar threads

D
回复
0
查看
824
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
669
DelphiTeacher的专栏
D
后退
顶部