关于颜色的异或(200分)

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

sunqi

Unregistered / Unconfirmed
GUEST, unregistred user!
当选中一个SHAPE 空件时,我希望能想在WINDOWS 环境中选中图标一样颜色能变为浅蓝色
以提示用户已选中
 
不太明白,不就是在shape的鼠标事件里使它的颜色为浅蓝么?
 
是的,但直接变为浅蓝色,效果不好,希望能象WINDOWS 中的将图标被选中一样,好象WINDOWS
是产生一层蓝色网格,原有的颜色还能看到。
 
确定这种效果是不是异或先?
 
应该不是异或,只是想说明这个现象。
 
做一个蒙板(用Image,透明属性设为true)

1. 用Image的画布在该Image上画蓝色网格,方法是:
安一定的规律(比如每隔3个象素点画一个蓝点,扫描整个画布)
2. 用户没有选图时,蒙板Image的visiable属性设为false;
选中时改成true 并把蒙板蒙上去(要先蒙好 再改visiable属
性成true )

你试试吧,我正打算写一个 可以一起切磋嘛
 
以下是我编的程序,你可以暂时参考:
(我用label1和label2代替你的图片,image2的transparent属性为true)
... ~~~~~~ ~~~~~~~~~~~ ~~~~~
private
aa01x,aa01y:integer;
aa02x,aa02y:integer;
...
procedure TForm1.FormCreate(Sender: TObject);
var
xx,yy:integer;
begin
image2.Visible := false;
//
xx := image2.width-1;
yy := image2.height-1;
//
while not(xx<0) do
begin
while not(yy<0) do
begin
<font color=green>image2.Canvas.Pixels[xx,yy] := clBlue;</font>
<font color=green>yy := yy-<b>3</b>;</font>
end;
<font color=green>xx := xx-<b>3</b>;</font>
yy := image2.height-1;
end;
image2.Visible := true;
end;

procedure TForm1.Label1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
aa01x := x;
aa01y := y;
end;

procedure TForm1.Label2MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
aa02x := x;
aa02y := y;
end;

procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
image2.Left := aa01x+label1.left;
image2.Top := aa01y+label1.top;
image2.Visible := true;
end;

procedure TForm1.Label2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
image2.Left := aa02x+label2.left;
image2.Top := aa02y+label2.top;
image2.Visible := true;
end;
-----------------------------------------------------------------------
不过,这不是一个好方法
我想你是否可以改变 要变色图的色度(可能要扫描所有的象素点)
另,我再调试程序时发现,要是把上面绿字的“3”改成“2”,
delphi画的都是“白点”??
谁有好方法也请告诉我,谢!
 
又是Alpha混合的问题。
 
我记得是用异或xor.
 
更正,不好意思----少删了点!
更正后的全程序如下:
procedure TForm1.FormCreate(Sender: TObject);
var
xx,yy:integer;
begin
image2.Visible := false;
//
xx := image2.width-1;
yy := image2.height-1;
//
while not(xx<0) do
begin
while not(yy<0) do
begin
image2.Canvas.Pixels[xx,yy] := clBlue;
yy := yy-3;
end;
xx := xx-3;
yy := image2.height-1;
end;
end;

procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
image2.Left := label1.left;
image2.Top := label1.top;
image2.Visible := true;
end;

procedure TForm1.Label2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
image2.Left := label2.left;
image2.Top := label2.top;
image2.Visible := true;
end;
这下保证没错了。
 
别忘了----》
(我用label1和label2代替你的图片,image2的transparent属性为true)
~~~~~~ ~~~~~~~~~~~ ~~~~~
不好意思我这人太粗心

还有,有好的算法告诉我一声!谢!
 
网格? 设置Brush不就行了?
 
CAT.YY 的方法我试了一下,可以用,但一个是速度较慢,不理想,另外在程序控制时,
若多选时就更麻烦,WINDOWS中的图标是如何做的呢??,希望高手指点!!!
 
windows下就是设置BRUSH做到的嘛.
直接修改TShape.Brush.Style就可以了.
 
Windows中图标被选中时那种效果是用ImageList绘制的
 
看一下listview的源代码中的选中后的算法,就行了,一个道理,,
 
附加功能 将问题提前
 
sunqi:如果还想接着讨论请定期提前自己的帖子,如果不想继续讨论请结束帖子。
 
多人接受答案了。
 
后退
顶部