急!运行时移动Timage控件? 在D5中能透明在D6在怎么没有? (50分)

  • 主题发起人 主题发起人 YongSoft
  • 开始时间 开始时间
Y

YongSoft

Unregistered / Unconfirmed
GUEST, unregistred user!
急!运行时移动Timage控件
 
运行是什么意思?
动态创建?
var
Image1: TImage;
begin
Image := TImage.Create(Self);
with Image do
begin
.Parent := Self;
Picture.LoadFromFile('...');
Show;
end;
end;
 
hehe,TImage不是twincontrol控件,不能用perform
老老实实处理mousemove事件吧。
 
这位大哥是不是想用Timage作动画呀,让图片从一头移动到另一头?
 
写以下三个事件就可以。我已经试过了

void __fastcall TForm1::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
tp=ClientToScreen(TPoint(X,Y));
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
TPoint p;
p=ClientToScreen(TPoint(X,Y));
Image1->Top+=(p.y-tp.y);
Image1->Left+=(p.x-tp.x);

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if(Shift.Contains(ssLeft))
{
TPoint p;
p=ClientToScreen(TPoint(X,Y));
Image1->Top+=(p.y-tp.y);
Image1->Left+=(p.x-tp.x);
}
}
另外还要申明一个全局变量 TPoint tp;
 
糟了,这是CB代码,我忘记了,你把它转成DELPHI代码吧,应该不难吧,转不了我过一会儿再贴个DELPHI码
 
procedure TForm1.imageMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
(Sender as TWinControl).Perform(WM_SYSCOMMAND, $F012, 0);
end ;
 
Delphi代码我已经写出来了:

private
{ Private declarations }
tp:TPoint;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
tp:=ClientToScreen(Point(X,Y));
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
p:TPoint;
begin
if ssLeft in Shift then
begin
p:=ClientToScreen(Point(X,Y));
Image1.Left:=Image1.Left+(p.x-tp.x);
Image1.Top:=Image1.Top+(p.y-tp.y);
end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
p:TPoint;
begin
p:=ClientToScreen(Point(X,Y));
Image1.Left:=Image1.Left+(p.x-tp.x);
Image1.Top:=Image1.Top+(p.y-tp.y);
end;
 
试一试这个
在MOUSEDOWN事件中加:
const
SC_DragMove = $F012;
begin
ReleaseCapture;
panel1.perform(WM_SysCommand, SC_DragMove, 0);
end;
 
to qn-wl:
TImage是由TGraphicControl派生下来的,不能强制转换成TWinControl,
TGraphicControl和TWinControl是属于同一级别的类,有TControl派生下来的
你上面那种写法会出错的,如果是Panel或者Button就不会出错,
Chenlili说的没错
 
to :zyg_zm,Chenlili:
还没讲完,
form中加一个PANEL1,在PANEL1的MOUSEDOWN事件中加
const
SC_DragMove = $F012;
begin
ReleaseCapture;
panel1.perform(WM_SysCommand, SC_DragMove, 0);
end;
再在PANEL1上加上IMAGE,另IMAGE的MOUSEDOWN事件为PANEL1的MOUSEDOWN事件
嘿嘿,看看谁的方法妙^-^
在WIN2000+D5下OK
 
如果用直接mousedown和mouseup,mousemove 事件里面写代码,就象我写的那三个事件中
把Image换成(Sender as TControl),将所有控件的该三个事件都指定用这三个事件代码,
那么所有的控件都可以移动,而且不影响其他事件。

>>嘿嘿,看看谁的方法妙^-^在WIN2000+D5下OK

如果一定要用$F012消息的话,你有没有运行试试看,用了ReleaseCapture以后控件的鼠标
事件根本就不能正常使用。比如说OnClick(),你试试看,控件会粘着鼠标走。
 
而且这个问题问的是TImage的一定问题,你说的只是在Panel上的perorm,你试试TImage.perform看看
 
楼主的意思是:
运行时移动IMAGE控件,就是将IMAGE控件运行是能移动,那就让PANEL1驮着
IMAGE移动啊。感觉上去不就是IMAGE被你用鼠标拖动吗!
你若觉的不行的话,可一自己试试。或者流个E-MAIL,我发给你。
 
感谢大家回答的问题!
Image不能放在Panel上,因为Image要透明
我程序思路是怎样的:
在Canvel上写入字符串,当鼠标在字符串按下是,Image移到字符串上大小与字符串一样Left
top也一样关Image上画边框,看下去好字符串画一个边框,鼠标移动时Image也移动,当鼠标
放下时将字符串在Image所在位置绘制。
哪位高手帮帮我,谢了!
 
那你没有必要移动这个IMAGE,其实你应该在整个IMAGE的CANVAS上画字符串,因为这样你不用考虑
重画的问题,而鼠标按下时根据字符串的位置和鼠标的坐标判断,拖动时你就直接在image的mousemove
事件里根据x,y参数在image上画矩形框,矩形框的大小可以按照字符串的高度与宽度来控制
(canvas有TextWidth,TextHeight函数),并且画矩形框之前,用xor模式将先前画过的矩形框擦除。
拖动结束时,也就是IMAGE的mouseup事件时,可以在x,y参数的地方重新画上字符串,先将旧的字符串擦除。

如果按照你现在的思路,直接在form.canvas上画的话,当FORM被别的窗体盖住以后再回来时,画过的东西就没有了。IMAGE就不会
 
后退
顶部