怎样让一个图标在Form1.canvas上运动(200分)

  • 主题发起人 主题发起人 SYT
  • 开始时间 开始时间
S

SYT

Unregistered / Unconfirmed
GUEST, unregistred user!
我声明了一个图标变量myICON:TICON,然后用myICON.handle:=EctractICON(application.handle,'hello.dll',1)方法从hello.dll中取出了一个图标,我想让该图标在FORM1.CANVAS上做一个简单的直线运动,要求不破坏原来背景,并且我不想使用image,listView等之类的控件帮忙,有那位高手能帮我解决该难题,最好能有源码并能在delphi4下调试通过,悬赏200分。
 
很简单,用Canvas.Draw就可以
 
copymode :=cmXor;
 
我声明了一个图标变量myICON:TICON,然后用myICON.handle:=EctractICON
(application.handle,'hello.dll',1)方法从hello.dll中取出了一个图标,
我想让该图标在FORM1.CANVAS上做一个简单的直线运动,要求不破坏原来背景,
并且我不想使用image,listView等之类的控件帮忙,有那位高手能帮我解决该
难题,最好能有源码并能在delphi4下调试通过,悬赏200分。


 

帅兄,刚刚调试完成的,基本满足你的要求:
1.不用image,listview;
2.不破坏原背景;
3.作直线运动.
如果满意,赶快发分。

unit draw;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
x1,y1:integer;
Form1: TForm1;
bmp1:tbitmap;
aicon:ticon;
i:integer=0;
rect1,rect2:trect;
implementation

{$R *.DFM}


procedure TForm1.Button1Click(Sender: TObject);
begin
bmp1:=tbitmap.create;
AIcon:=ticon.Create;
aicon.loadfromfile('d:/borland/delphi4/lib/dedman.ico');
bmp1.width:=aicon.width;
bmp1.height:=aicon.height;
x1:=100;y1:=100;
form1.canvas.ellipse(90,90,150,150);
rect1.left:=x1;
rect1.top:=y1;
rect1.right:=x1+aicon.Width;
rect1.bottom:=y1+aicon.Height;
rect2.left:=0;
rect2.top:=0;
rect2.right:=bmp1.width;
rect2.bottom:=bmp1.height;
bmp1.canvas.CopyRect(rect2,form1.canvas,rect1);
form1.Canvas.Draw(x1,y1,aIcon);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
form1.canvas.draw(x1,y1+i,bmp1);
i:=i+1;
rect1.left:=x1;
rect1.top:=y1+i;
rect1.right:=x1+aicon.Width;
rect1.bottom:=y1+i+aicon.Height;
bmp1.canvas.CopyRect(rect2,form1.canvas,rect1);
form1.Canvas.Draw(x1,y1+i,aIcon);
end;

end.
 
dedman的方法我是解答
http://www.gislab.ecnu.edu.cn/delphibbs/dispq.asp?LID=181943
的盗版!
请参看http://www.gislab.ecnu.edu.cn/delphibbs/dispq.asp?LID=181943
原理是将原背景复制到一Bitmap中,
运动后再用它来恢复.
 
呵呵,盗版猖獗呀。
 
清者自清:-)
在这里,特此声明!!!该法绝对是我自己昨夜奋斗到3点才试出,
是试了好几种方法才得出的,如有雷同,纯属巧合。

我虽才加入大富翁阵营不到一月,这里却已成了我心目中的乐园,
此等D版行为岂是吾等所为,帅义廷,别给我加分!!!
 
sorry,我刚才有些激动了。
帅义廷,你如果觉得我的答案合适,还是应发分给我:
此程序绝对是我本人所写,我拿分我问心无愧。
 
花了15分钟来抢分:
下例不必保存背景, 一样不破坏.
type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
MyIcon: TIcon;
x, y: Integer;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
MyIcon := TIcon.Create;
MyIcon.LoadFromFile('C:/Program Files/Common Files/Borland Shared/Images/Icons/Factory.ico');
x := 0;
y := 50;
canvas.Draw(x, y, MyIcon);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if assigned(MyIcon) then
MyIcon.Free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if assigned(MyIcon) then begin
RedrawWindow(handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_ERASENOW or RDW_ALLCHILDREN);
inc(x, 4);
canvas.draw(x, y, MyIcon);
end;
end;

end.
 
我上次回答你提的那个鼠标拖动icon的,后来你说不满意,
我又试了一下,好像必须重新定义一icon类,增加
onmousedown,onmousemove,onmouseup属性,再加上上面的方法
就能实现。
 
对dedman表示歉意

我做事(包括说话、吃饭)一向不经过大脑,(除了编程外)
我对前面说的话深表歉意,
我和dedman对此问题,
虽然方法基本原理是一样,
出现时间有先后,
但应该都是我们自己想出来的,
dedman奋斗到半夜3点的经历,
我们都有,
我们应该相互自勉,(所谓英雄所见略同嘛)
不应该为了一点分而...
来,dedman,我们一起为了百万的目标奋斗吧!
 
好,我交你这个朋友了。:-D
 
多人接受答案了。
 
后退
顶部