图形、图像(100分)

  • 主题发起人 主题发起人 xxptt
  • 开始时间 开始时间
X

xxptt

Unregistered / Unconfirmed
GUEST, unregistred user!
form上有一个Shape元件,怎样在程序运行时用鼠标改变其位置和大小?
(例:就像Windows画板中的——矩形选定功能一样可以改变其位置和大小)
 
拖放很简单,参照下面这个就行:
procedure TfmTest.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if Source is TImage then begin
TImage(Source).Left := x - TImage(Source).Width div 2;
TImage(Source).Top := y - TImage(Source).Height div 2;
end;
end;

procedure TfmTest.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if ssShift in (Shift) then ShowMessage('按下了shift!')
else if Not CheckBox1.Checked then Image1.BeginDrag(false)
end;

procedure TfmTest.FormDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
if (Source is TImage) then Accept := true;
end;
至于改变大小,我再看看吧
 

thank you, Crab!
 
晚了一步
 
一个类似的问题--- 在image上如何对图形的一部分做剪切,并可对剪切的部分用鼠标拖动呢?
 
能否用一个小的 image?
 
随便写了个,希望你满意。


private
{ Private declarations }
MouseDown:Boolean;
Start:TPoint;

...

procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if not MouseDown then begin
Start:=ScreenToClient(Shape1.ClientToScreen(Point(X,Y)));
MouseDown:=True;
end;
end;

procedure TForm1.Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
P:TPoint;
begin
if MouseDown then begin
P:=ScreenToClient(Shape1.ClientToScreen(Point(X,Y)));
if ssShift in Shift then begin
Shape1.Width:=Shape1.Width-Start.x+P.x;
Shape1.Height:=Shape1.Height-Start.y+P.y;
end else begin
Shape1.Top:=Shape1.Top-Start.y+P.y;
Shape1.Left:=Shape1.Left-Start.x+P.x;
end;
Start:=P;
end;
end;

procedure TForm1.Shape1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if MouseDown then MouseDown:=False;
end;



 
用HitTest, 你可以在运行时改变任何控件的外型.
 
To 吕生:

HitTest是TCustomControlBar或TCustomGrid的方法。
而TShape并不是从以上两个类继承,那么HitTest又怎么对TShape有效呢?
 
我说的是搞定WM_NCHITTEST消息,《Delphi 4核心编程》上有这个例子。
 
简单的这样行不行。

....
var
Form1: TForm1;
x0,y0:integer;
down,resized:Boolean;

implementation

{$R *.DFM}

procedure Tform1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
x0:=x;
y0:=y;
if (x>Image1.Width-10)or(y>image1.Height-10) then begin
Image1.Cursor:=crSize;
resized:=true;
end else begin
Image1.Cursor:=crDefault;
down:=TRUE;
end;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if x>Image1.Width-10 then begin
Image1.Cursor:=crSize;
end else begin
Image1.Cursor:=crDefault;
end;
if down then begin
Image1.Left:=Image1.Left+x-x0;
Image1.top:=Image1.top+y-y0;
end;
if resized then begin
Image1.Width:=Image1.Width+x-x0;
Image1.Height:=Image1.Height+y-y0;
x0:=x;y0:=y;
end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
down:=False;
resized:=False;
end;

 
MenXin 的方法好象是对整个image操作,而我的要求是对image中 的图形中选定的一部分进行剪贴,拖动。想“画图”中的一样。
 
learningguy:
你的要求?这问题不是你提的吧
 
就相关的问题讨论一下不可以吗?还是非得另外开个道场。
我是寻寻觅觅到此的,看这里高手云集,人气颇旺。想快一点解决我的问题。
于是......
 
多人接受答案了。
 
后退
顶部