我想实现在程序运行期动态生成的image和shape控件,能够通过鼠标达到移动,看了一下方法,有mousedown和mousemove事件,但不起作用。原因是他们都是从tcontrol继承下来的Tgraphiccontrol控件,没有自己的句柄,只有父窗口的,那我想实现这样的功能,该怎么处理???最好有源码,谢了!!
很急~~分不够再加!!!
很急~~分不够再加!!!
解决方案 »
- 数字证书的时间戳功能如何在离线的情况也签名
- 各位大侠,谁知道像QQ那样,点击那个拖盘图标,弹出菜单,菜单左边的竖条是怎么实现的呀?谢谢
- 如何修改DBNavigator中删除数据时出“delete record?”改为中文“要删除这条记录吗”。。。。
- 有关sql里sum的问题,在线等!
- pascal里指针加1如何表示?
- 怪问题:在网上没有找到相关资料,代码提示:EoleException:存取器不是参数存取器,请大家指教!
- 急!请问如何设置button按钮或者bitbutton的颜色?
- 大专生都来加油!upup
- 如何控制控件的拖动不会拖出窗体外,使得窗体客户区增大?
- Delphi 不如 VC++ 之你见
- FastReport动态生成Band,我用的FR4.0
- 哭笑不得散分兼求助: 竟然拿到了Symantec/Pctools的offer
Panel的autosize设置trueprocedure TFmMain.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture ;
Panel1.Perform(WM_SYSCOMMAND, $F012, 0);
end;
1. 设定Image的属性DragKind=dkDock; DragMode=dmAutomatic; 设定Form
的属性DockSite=true。
2. 在Image的事件OnEndDock里写一行代码就可以了:
void __fastcall TForm1::Image1EndDock(TObject *Sender, TObject *Target,
int X, int Y)
{
((TControl*)Sender)->HostDockSite = (TWinControl*)0xFFFFFFFF;
}
int X, int Y)
{
((TControl*)Sender)->HostDockSite = (TWinControl*)0xFFFFFFFF;
}
在delphi里怎么写,尤其是(TWinControl*)0xFFFFFFFF; 这句话??
我试了一个,这个好像是Delphi中的停靠技术,我要的是动态增加的控件能够在比方说在容器panel上随鼠标点中进行移动。
wintergoes(多来米饭少来稀) 的方法是可以,但是我希望通过中间的窗口去实现,因为我的程序那样会复杂,新增删除可能还要考滤中间的panel。
Shift: TShiftState; X, Y: Integer);
begin
(Sender as TImage).Tag := 1;
FPoint.X := X;
FPoint.Y := Y;
end;procedure TimgForm.imgMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
with Sender as TImage do
begin
if Tag = 1 then
begin
Left := Left + X - FPoint.X;
Top := Top + Y - FPoint.Y;
end;
end;
end;procedure TimgForm.imgMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
(Sender as TImage).Tag := 0;
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, ExtCtrls, StdCtrls;type
TForm1 = class(TForm)
Image1: TImage;
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
StartMousePos:TPoint;
StartImgPos:TPoint;
currMousePos:TPoint;
CurrImgPos:TPoint;
IsMoving:Boolean;
Procedure DrawCurrRect();
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.DrawCurrRect;
var
aRect:TRect;
begin
//计算坐标
aRect.Left:=CurrMousePos.X-StartMousePos.X+StartImgPos.X;
aRect.Top:=CurrMousePos.y-StartMousePos.Y +StartImgPos.Y;
aRect.Right:=aRect.Left+Image1.Width;
aRect.Bottom:=aRect.Top+Image1.Height;
//画虚框
Self.Canvas.DrawFocusRect(aRect);
//移动图片位置:不建议这样用,这会使得系统响应速度变慢,并且效果不是很及时
//
//Image1.Left:=StartImgPos.X+(currMousePos.X-StartMousePos.X);
//Image1.Top:=StartImgPos.y+(currMousePos.y-StartMousePos.y);
end;procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
IsMoving:=True; //允许移动
//记录起点位置以及当前鼠标位置
StartMousePos.X:=x;
StartMousePos.Y:=y;
StartImgPos.X:=Image1.Left;
StartImgPos.Y:=Image1.Top;
CurrMousePos.X:=x;
CurrMousePos.Y:=y;
//画虚框
DrawCurrRect();
end;procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if IsMoving=True then
begin
DrawCurrRect(); //清除旧框
currMousePos.X:=x; //记录当前位置
currMousePos.Y:=y;
DrawCurrRect(); //画新框
end;
end;procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
IsMoving:=False; //禁止移动
DrawCurrRect(); //清除旧框
CurrMousePos.X:=x; //记录当前位置
CurrMousePos.Y:=y;
//移动图片位置
Image1.Left:=StartImgPos.X+(currMousePos.X-StartMousePos.X);
Image1.Top:=StartImgPos.y+(currMousePos.y-StartMousePos.y);
end;end.
procedure TForm1.FormCreate(Sender: TObject);
begin
with TPanel.Create(Self) do begin
Name := 'ImgParentPanel';
Parent := Self;
Left := Image1.Left;
Top := Image1.Top;
BevelOuter := bvNone;
Caption := '';
AutoSize := True;
Show;
end;
Image1.Parent := TWinControl(Self.FindComponent('ImgParentPanel'));{附:想拖动图片移动窗体吗?注掉这句试试}
Image1.Picture.Assign(Application.Icon);
Image1.AutoSize := True;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
ReleaseCapture;
TImage(Sender).Parent.Perform(WM_SysCommand, $F012, 10);
end;
我一道在用我的代码,工作的很好啊.