如何在画布上擦除所画的图标(50分)

  • 主题发起人 主题发起人 帅义庭
  • 开始时间 开始时间

帅义庭

Unregistered / Unconfirmed
GUEST, unregistred user!
我用下列方法
AIcon:=TIcon.Create;
AIcon.Handle:=ExtractIcon(0,'project1.dll',1);
frmMain.Canvas.Draw(100,100,aIcon);
AIcon.Free;
但不知道如何擦除这个图标
 
Canvas.Brush.Color:=...;
Canvas.FillRect(...);
 
最好先获得图标大小在fiilrect
 
上面的方法会在背景上留下痕迹,是否可以设置pen.mode:=pmNotXor画图标和擦除图标,因为我是要用鼠标把图标拖住跑的。
 
pen.mode:=pmXor;在同一位置写两遍。
 
把图标放在一个image控件里不就得了
 
To g622:
我按照你说的pen.mode:=pmXor;在同一位置写两遍,可就是不能擦除该图标,
不知是何原因,我的编程环境是WINDOWS98,DELPHI4.0

 
pen.mode只影响画线,
对于DRAW要用Canvas.CopyMode,
Canvas.CopyMode:=cmPatInvert
 
Luckm:

Canvas.CopyMode:=cmPatInvert;
canvas.draw(100,100,aIcon);
在同一位置写两遍为何不能擦除该图标?

 
xWolf:
是canvas.Refresh吗? 我试了一下还是不能擦除?不知你是否亲自试过,如果
成功,望把源码贴出来,谢谢!



 
可以用擦除的方法:
.......
//读取ICON
.......
Back:=new Graphics::TBitmap();
Back.Width:=AIcon.Width;
Back.Height:=AIcon.Height;
Canvas.CopyRect(Rect(x,y,x+Back.Width,y+Back.Height),Back.Canvas,Back.Canvas.ClipRect);
//将背景复制到Back中
....
画ICON
....
Canvas.Draw(x,y,Back);//用原来的背景擦除Icon
....

(这样不会有任何‘副’作用)
 
如果是临时画上去的图标, 调用frmMain.invalidate就擦掉了, 当然你得保证
画该图标的程序不在某个控件的OnPaint事件里. 比如你在form上放了个
button, 然后button.onclick事件中画这个图标的话, 直接调用
frmMain.invalidate就擦掉了.
 
Another_eYes:
那样会不会闪啊?
我看Luckm的方法比较妥当.
 
Luckm:
你的方法很新颖,只是我在试验过程中并没有象你说的那样不会有副作用,而是在背景上总是回留下一块白色的疤痕,不知你是否试过?
 
放一个image不就行了,要拖动图标直接拖image就可以了。
 
www:
如果用IMAGE那我的程序中就需要几千个image控件,太不好了吧!lucky说的方法很是好,可我在DELPHI中未试验通过,不知怎的?
 
嘿嘿,不好意思,搞错了一个地方,
Canvas.CopyRect(Rect(x,y,x+Back.Width,y+Back.Height),Back.Canvas,Back.Canvas.ClipRect);
是将Back中的图像复制到Form上去,反了一边。难怪会有白的呢。
重新贴过:
可以用擦除的方法:
.......
//读取ICON
.......
Back:=new Graphics::TBitmap();
Back.Width:=AIcon.Width;
Back.Height:=AIcon.Height;
Back.Canvas.CopyRect(Back.Canvas.ClipRect,Canvas,Rect(x,y,x+Back.Width,y+Back.Height));
//将背景复制到Back中
....
画ICON
....
Canvas.Draw(x,y,Back);//用原来的背景擦除Icon
....

(这样不会有任何‘副’作用)
 
是pen.mode:=pmnot

 
接受答案了.
 
后退
顶部