Photoshop中橡皮擦的功能是怎样实现的?(50分)

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

shijie

Unregistered / Unconfirmed
GUEST, unregistred user!
定义两个区域,一旦重合就执行某些操作?
 
基本不知楼主所云。
1、既然叫“橡皮擦”,那就是鼠标移到哪,“橡皮擦”矩形内的区域就清空呗。
2、如果你限定了绘图区域,那就用 IntersectRect 函数取得绘图区域和“橡皮擦”矩形区域的相交区域,然后将相交区域清空呗。
3、至于楼主“定义两个区域,一旦重合就执行某些操作?”,重不重合从 IntersectRect 函数是否非零就能判断出来,非零就是相交,为零就是不相交。至于要显示出“橡皮擦”的移动过程,根本不必刻意去画,因为区域清空到哪自然会出现一条轨迹。
 
代码如下(当鼠标划过窗体时,会擦掉窗体固定区域的背景):
procedure FormOnMouseMove(...);
const
EraseWidth = 8;
var
rectErase: TRect;
hrgnErase: HRGN;
begin
IntersectRect(rectErase, Rect(80, 80, 400, 200), Rect(X - EraseWidth, Y - EraseWidth, X + EraseWidth, Y + EraseWidth));
hrgnErase := CreateRectRgnIndirect(rectErase);
//此处,不用事先将 Region 用 SelectObject 选入设备环境
FillRgn(Canvas.Handle, hrgnErase, GetStockObject(WHITE_BRUSH));
DeleteObject(hrgnErase);
end;
 
我觉得根本不用去判断两个区域有没相交,只要在图层上,把鼠标所经过的区域都画透明色就行了.。当然,魔术橡皮擦则是判断的某个区域,而背景橡皮擦填充的则是背景色咯
 
大概楼上的都误解楼主的意思了。我猜楼主说的应该是,鼠标移过的地方,用背景图填充吧,而不是2楼vvyang说的清空。
用API ExtCreatePen ,设置 LOGBRUSH 为背景位图的Handle可以实现你要的效果。
 
看这个页面:
http://hi.baidu.com/%B7%E7%C9%F1%DA%D8%B7%B2/blog/item/d6a4c42f4ac8a23a1e3089fb.html
鼠标变成了猫,当然也可以把它换成拖布,擦除页面的某些区域。
 
To shijie:
不是给你写代码了么,难道还要我写代码把你变成“拖布”?
现在的地球太危险了,楼主还是去火星吧...
 
先获取下背景颜色,然后将Mouse所在区域Rect,用背景颜色填充
 
楼主又开始玩消失鸟...
 
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if start[5] then
if Button=mbleft then
Clering:=true;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if Clering then
begin
image1.Canvas.Brush.Style:=bsClear;
image1.Canvas.Brush.Color:=clWhite;
image1.Canvas.FillRect(rect((x-4),(y-4),(x+4),(y+4)));
end;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button=mbLeft then
begin
Clering:=false;
start[5]:=false;
end;
 
楼主这种火星人还是人道毁灭了好...
 
后退
顶部