怎样实现当鼠标移动到 Panel 上时它改变颜色,离开时又变回来?(100分)

  • 主题发起人 主题发起人 tom12345
  • 开始时间 开始时间
T

tom12345

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样实现当鼠标移动到 Panel 上时它改变颜色,离开时又变回来?
 
unit Unit1;
interface
uses
Messages, SysUtils, Graphics, Controls, Forms, ExtCtrls, Classes;
type
TPanel = class(ExtCtrls.TPanel)
private
procedure CMMouseEnter(var Message: TMessage);
message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage);
message CM_MOUSELEAVE;
end;
type
TForm1 = class(TForm)
Panel1: TPanel;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TPanel.CMMouseEnter(var Message: TMessage);
begin
inherited;
self.Color := clred;
end;
procedure TPanel.CMMouseLeave(var Message: TMessage);
begin
inherited;
self.Color := clblue;
end;
end.
 
xiaojun5556, 你好,谢谢你及时的解答,出现了一个问题,所有的 Panel 当鼠标移动到 它上面时都改变颜色,这样的话如果一个 Panel1 中含有一个 Panel2 的话,当鼠标移动到Panel2 上面时, Panel1 也跟着改变颜色,显示不出效果,如何做到当鼠标移动到Panel2 上面时,Panel2改变颜色 ,而 Panel1 不改变颜色?    
 
加入判断。还有在Delphi 2006及以上版本中加入了MouseEnter和MouseLeave事件,你可以针对不同的Panel写代码
 
szhcracker, 如何判断?
 
提一个思路:
1、设置几个HWND型的全局变量;
2、在窗体的OnShow事件中把Panel1、Panel2的Handle赋给变量,如hPanel1;
3、加入判断如下:
procedure TPanel.CMMouseEnter(var Message: TMessage);
begin
inherited;
if Message.lParam = hPanel1 then
self.Color := clred;
end;
4、还有简单的方法就是直接判断:
if Message.lParam = Panel1.Handle then
...
以上方法供你参考。
 
szhcracker,代码如下,编译通过,但运行无反应
var
hPanel1:HWND;
procedure TForm1.FormShow(Sender: TObject);
begin
hpanel1:=Panel1.Handle;
end;

procedure TPanel.CMMouseEnter(var Message: TMessage);
begin
inherited;
if Message.lParam = hPanel1 then
self.Color := clred;
end;
 
self.Color := clred;改为Panel1.Color := clred;试试
或者你直接用SendMessage()来变色试试
 
直接用消息就OK了。
 
MouseEnter和MouseLeave事件
 
szhcracker:self.Color := clred;改为Panel1.Color := clred
[Error] Unit1.pas(88): Undeclared identifier: 'Panel1'
SendMessage()变色,能否说的具体些?
luoyanqing119:如何直接用消息?
qq112729650:delphi7无MouseLeave事件。
 
Form1.pnl1.Color
 
这个不是很难.有些东西自己多研究研究就会了..开始可能会写很多代码才能实现.不过写的过程中再研究一下.就会发现可以少写代码也可以实现.这样你慢慢就会了.
 
szhcracker,用 Form1.panel1.Color ,运行还是无反应。
 
嗯,是的,我帮你试了一下,你这么干肯定可以:
procedure TPanel.CMMouseEnter(var Message: TMessage);
var
Pos: TPoint;
Handle: HWND;
begin
inherited;
GetCursorPos(Pos);
//得到当前光标位置
Handle := WindowFromPoint(Pos);
//返回当前位置的句柄
if Handle = Form1.pnl1.Handle then
Form1.pnl1.Color := clRed;
if Handle = Form1.pnl2.Handle then
Form1.pnl2.Color := clBlack;
end;

procedure TPanel.CMMouseLeave(var Message: TMessage);
begin
inherited;
Self.Color := clBtnFace;
end;
可以结贴了,哈哈。[:)]
 
谢谢各位大侠。
 
后退
顶部