改变光标的问题(100分)

  • 主题发起人 主题发起人 zh_sh
  • 开始时间 开始时间
Z

zh_sh

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在程序中动态的改变光标,例如:当鼠标按下时,改变光标,松开时
还原,我在panel1的OnMouseDown事件中写了如下语句:
if button=mbleft then
panel1.cursor:=crdrag;
在OnMouseUp中还原,可是运行时却没有反映,如果将语句改成鼠标右键,即:
if button=mbright then
panel1.cursor:=crdrag;
结果又行了,请给小弟解释一二,如果修改,该如何修改?
 
应该没有问题,但。。。 不明白。
 
确实不行,我发现鼠标左键的OnMouseDown事件好象是在松开时触发的,而右键

的是在按下时触发的,非常奇怪
 
提供一种解决办法:

定义个一个全局变量

var alternate:boolean=false;

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if button=mbLeft then
begin
Panel1.cursor:=crHandPoint;
Panel1.Perform(WM_LBUTTONUP,0,0);

Label1.Caption :='down';
end;
end;

procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
alternate:=not alternate;
if alternate then exit;
if button=mbLeft then
begin
Panel1.cursor:=crdefault;
Label1.Caption :='up';
end;
end;

 
稍微解释一下,我发现左键只有在MouseUp时才会改变Cursor,我跟
踪了MouseDown事件里的 Panel1.cursor:=crHandPoint; 也没看出什么
名堂来。

把上述代码中的关于Label1的去掉,是为了测试用的。

在MouseDown事件里,Label1可以被顺利改变,可Panel1.cursor:=crHandPoint; 就是不起作用,不能急了。

所以我干脆在MouseDown里触发一个MouseUp消息,但又因为需要在
MouseUP中把鼠标Cursor改回来,于是定义了一个全局布尔变量alternate,
根据alternate的值来确定MouseUp里是否需要把Cusor改回缺省。

 
行得通,只是稍嫌麻烦,不知可否有更简单的方法(这该不是一个bug吧)
 
我估计这是一个bug.

mbRight和mbLeft我都跟踪比较过了。也许是我粗心,
没发现其中有什么不一样。

兄弟,我的办法不能算麻烦吧,包括一个变量定义只多了四行代码 。
 
最简单的方法:
Screen.cursor:=crdrag;

用Screen.Cursor ,而不是 Panel.Cursor
 
可是用screen.cursor的话,移出panel后,鼠标仍是改变后的形状,而我的目的
是仅当鼠标在panel上按下时才改变,移出或松开后还原成原来的形状,你可以用
panel1.cursor,看看点鼠标右键的效果
 
你还要写 OnMouseUp 啊设回 crDefault 啊

Panel更糟糕,在别处松开没反映
 
嘻嘻,还是用我的办法简单啊,不过我发现存在一个小bug :-)

但是很容易解决,你先自个儿试试看吧。
 
刚才又试了一下,还是Pipi说的更简单。
不过确实搞不懂为什么Panel会出问题。

如果一定要改Panel的图标的话,无论左键还是右键,
一定要在Form的OnMouseUp里写上和Panel的OnMouseUp里一样的代码。
 
再补充一句(不嫌烦吧?:-)

如果要求鼠标在Panel上按下后(未松开)就移出Panel时需
恢复鼠标形状,那只有用我的方法了。并且需增加如下代码:

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
alternate:=false;
Panel1.Cursor :=crdefault; // 无论左键还是右键,都需要这句。
end;
 
谢谢cheka和Pipi的耐心讲解,hehe
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部