鼠标移动并响应的问题--参与者有分!! 在delphi6.0中,如何实现以下功能:当我将鼠标移动到一个控件上(例如:CheckBox控件),这个控件的字体和背景颜色改变,当鼠标移走时,控件的字体和背景颜色恢复到原来的状态。请问我将用哪几个事件,如何实现,最好给出源代码。谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 自己写组件,继承原来的ComboBox然后拦截WM_MOUSEENTER和WM_MOUSELEAVE消息! 设置onmousemove事件为:checkbox.font.name:='你要变的类型';checkbox.font.color:='你要变的顔色';checkbox.font.size:='你要变的大小'; mousemove方法不行, 首先鼠标离开你不知道, 就算你设定个边界, 判断进入边界就算离开的话, 实际应用中鼠标跑得稍微快一点就漏掉了. 不实用. 用CM_MOUSEENTER, CM_MOUSELEAVE做非常简单,有实用 Delphi中,鼠标的消息响应是通过元件的OnMouseDown、OnMouseU p和OnMouseMove事件实现的,通过对此三个事件编程,可控制图像在有限区域内移动。考虑到所移动的图像的边界应总在该区域外,因此图像的左上角坐标应小于该区域对应坐标,图像右下角坐标应大于该区域对应坐标(除非图像大小比该区域小)。图1 具体方法是: 1、新建一工程Project1,在Form1中依次放入Panel1、Panel2和I mage1元件,注意Pa nel2和Image1分别在Panel1和Panel2上,再将一La bel1元件加入Panel2中,调整Panel1尺寸为适当大小,并修改各元件属性为:元件属性名属性值Panel1BevelInner:bvRaisedBevelOuter: bvNoneBorderStyle: bsSinglePanel2Align:alClientImage1AutoSize:TruePicture:”Apple.bmp”Label1Align:alClientTransparent : True 注意:此处Label1的作用不是显示字符,而是利用它响应鼠标消息 ,如果不用Label1而直接利用Image1的鼠标事件响应,则会由于其OnMo useDown事件的激活与Image1的自身坐标移动事件冲突而使图像发生闪烁甚至不能移动。 2、在implementation后加入变量声明:origin:Tpoint;image_left:integer;image_top:integer;visa1:Tpoint; (鼠标当前位置相对图像右下角的坐标)visa2:Tpoint; (鼠标当前位置相对图像左上角的坐标)canmove:boolean; 编写Label1鼠标响应事件:procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton;S hift: TShiftState; X, Y: Integer);beginif Button=mbLeft thenbeginorigin.x:=X;origin.y:=Y;image_left:=image1.left;image_top:=image1.top;visa1.x:=X-(image1.width-panel2.width+image1.left);visa1.y:=Y-(image1.height-panel2.height+image1.top);visa2.x:=X-image1.left;visa2.y:=Y-image1.top;canmove:=true;end;end;procedure TForm1.Label1MouseMove(Sender: TObject; Shift:TShiftState; X, Y: Integer);beginif canmove thenbeginif X< visa1.x then X:=visa1.x;if X>visa2.x then X:=visa2.x;if Y< visa1.y then Y:=visa1.y;if Y>visa2.y then Y:=visa2.y;image1.left:=image_left+(X-origin.x);image1.top:=image_top+(Y-origin.y);end;end;procedure TForm1.Label1MouseUp(Sender: TObject; Button: TMouseButton;Shi ft: TShiftState; X, Y: Integer);begincanmove:=false;end; 我想要的效果是不需要点击鼠标就能够变颜色的。ycxuyuq(注册失败) 你好,我也遇到了同样的问题,只用了mousemove事件,但是我的鼠标移动的太快就漏掉了,但是没有mouseenter和mouseleave时间,你说的CM_MOUSEENTER, CM_MOUSELEAVE这两个东西我不太清楚,能够给个解释或者例子吗,谢谢! 请各位不要误人子弟,用以下方法多简单呀!!!!!!!!!用CM_MOUSEENTER, CM_MOUSELEAVE做非常简单,有实用 下面代码调试通过unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) ComboBox1: TComboBox; procedure FormCreate(Sender: TObject); private { Private declarations } CBProc: TWndMethod; procedure CBWinProc(var Msg: TMessage); public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.CBWinProc(var Msg: TMessage);begin if Msg.Msg = CM_MOUSEENTER then ComboBox1.Color := clYellow; // 鼠标进入颜色 if Msg.Msg = CM_MOUSELEAVE then ComboBox1.Color := clWhite; // 鼠标离开颜色 if Assigned(CBProc) then CBProc(Msg);end;procedure TForm1.FormCreate(Sender: TObject);begin CBProc := ComboBox1.WindowProc; ComboBox1.WindowProc := CBWinProc;end;end. 好,看了。我们做个例子:::在一个窗体上,当鼠标移到标签上时,颜色为红色。鼠标移走时,颜色为蓝色。为了让你能更好的理解对象的属性,我把对象的属性放在程序代码中,也就是动态创建的。双击窗体,不,先在窗体上加一个 Label 控件,随便输入什么的,只要有字就行。然后双击窗体,写以下代码begin //以下是开始form1.color:=clyellow; //窗体的颜色,知道吧。label1.font.size:=24; //控件的字体大小,明白吧。label1.font.color:=clgreen; //控件的颜色,懂吧。label1.font.style:=[fsbold]; //自己看吧,好吧。label1.font.name:='隶书'; //不用我说了吧。label1.wordwrap:=true; //自动换行的属性,知道吧。label1.transparent:=true; //试一试就明白的。……吧。label1.caption:='把鼠标移上来看看'; //标签的内容,最简单的了吧。end; //完了。然后在标签的 OnMouseMove 的事件中填加下面的东西,双击要填写的属性空白处,在begin和end之间加入这行代码。label1.font.color:=clred; //这是移动上面后字体的颜色。然后在标签的 OnMouseLeave 的事件里写下面的label1.font.color:=clblue; //鼠标离开后的颜色。现在可以按运行了。看一看你的成果。好简单是吧,其实更主要的是希望你能在这个例子里学到更多的,可以算是领悟吧。嘻嘻~~~~睡觉去喽~~~~ 感谢各位的关注与解答,我的问题已经在各位高手的帮助下意见解决。特别提出感谢wisenowa(127.0.0.1),shuijin(水晶妹妹)和kerisyml(魂之利刃) 。我总结一下,wisenowa的方法可以适用于基本上所有的控件,水晶妹妹讲的MouseLeave事件--在某一些控件上没有这个事件。谢谢大家,给大家发分。 有关内存泄漏的查找解决思路方法 从网上看到的感觉不错 给大家分享 下载的源代码为什么不能打开? 关于开发Delphi的IDE插件的问题。 小弟再问一个菜问题:frmrep.QuickRep1.Page.Orientation:=poportrait;这句话不能编译? 求教一个关于timer和trackbar的简单问题? if key=$0d then 是什么意思?在线等 请较文件的拖放的问题?还望大家指教! 关于自定义函数和过程的问题? delphi 请教一段文本字符串处理的写法 关于建立C/S数据库 怎样改变DbGrid的标题栏显示,让它显示有意义的标题?
checkbox.font.name:='你要变的类型';
checkbox.font.color:='你要变的顔色';
checkbox.font.size:='你要变的大小';
离开的话, 实际应用中鼠标跑得稍微快一点就漏掉了. 不实用.
用CM_MOUSEENTER, CM_MOUSELEAVE做非常简单,有实用
元件
属性名
属性值
Panel1
BevelInner:
bvRaised
BevelOuter: bvNone
BorderStyle: bsSingle
Panel2
Align:
alClient
Image1
AutoSize:
True
Picture:
”Apple.bmp”
Label1
Align:
alClient
Transparent : True 注意:此处Label1的作用不是显示字符,而是利用它响应鼠标消息 ,如果不用Label1而直接利用Image1的鼠标事件响应,则会由于其OnMo useDown事件的激活与Image1的自身坐标移动事件冲突而使图像发生闪烁甚至不能移动。 2、在implementation后加入变量声明:
origin:Tpoint;
image_left:integer;
image_top:integer;
visa1:Tpoint; (鼠标当前位置相对图像右下角的坐标)
visa2:Tpoint; (鼠标当前位置相对图像左上角的坐标)
canmove:boolean; 编写Label1鼠标响应事件:
procedure TForm1.Label1MouseDown(Sender: TObject; Button
: TMouseButton;S hift: TShiftState; X, Y: Integer);
begin
if Button=mbLeft then
begin
origin.x:=X;
origin.y:=Y;
image_left:=image1.left;
image_top:=image1.top;
visa1.x:=X-(image1.width-panel2.width+image1.left);
visa1.y:=Y-(image1.height-panel2.height+image1.top);
visa2.x:=X-image1.left;
visa2.y:=Y-image1.top;
canmove:=true;
end;
end;
procedure TForm1.Label1MouseMove(Sender: TObject; Shift:
TShiftState; X, Y: Integer);
begin
if canmove then
begin
if X< visa1.x then X:=visa1.x;
if X>visa2.x then X:=visa2.x;
if Y< visa1.y then Y:=visa1.y;
if Y>visa2.y then Y:=visa2.y;
image1.left:=image_left+(X-origin.x);
image1.top:=image_top+(Y-origin.y);
end;
end;
procedure TForm1.Label1MouseUp(Sender: TObject; Button:
TMouseButton;Shi ft: TShiftState; X, Y: Integer);
begin
canmove:=false;
end;
ycxuyuq(注册失败) 你好,我也遇到了同样的问题,只用了mousemove事件,但是我的鼠标移动的太快就漏掉了,但是没有mouseenter和mouseleave时间,你说的CM_MOUSEENTER, CM_MOUSELEAVE这两个东西我不太清楚,能够给个解释或者例子吗,谢谢!
用CM_MOUSEENTER, CM_MOUSELEAVE做非常简单,有实用
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
ComboBox1: TComboBox;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
CBProc: TWndMethod;
procedure CBWinProc(var Msg: TMessage);
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.CBWinProc(var Msg: TMessage);
begin
if Msg.Msg = CM_MOUSEENTER then
ComboBox1.Color := clYellow; // 鼠标进入颜色
if Msg.Msg = CM_MOUSELEAVE then
ComboBox1.Color := clWhite; // 鼠标离开颜色
if Assigned(CBProc) then
CBProc(Msg);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
CBProc := ComboBox1.WindowProc;
ComboBox1.WindowProc := CBWinProc;
end;end.
我们做个例子:::在一个窗体上,当鼠标移到标签上时,颜色为红色。鼠标移走时,颜色为蓝色。为了让你能更好的理解对象的属性,我把对象的属性放在程序代码中,也就是动态创建的。双击窗体,不,先在窗体上加一个 Label 控件,随便输入什么的,只要有字就行。然后双击窗体,写以下代码begin //以下是开始form1.color:=clyellow; //窗体的颜色,知道吧。
label1.font.size:=24; //控件的字体大小,明白吧。
label1.font.color:=clgreen; //控件的颜色,懂吧。
label1.font.style:=[fsbold]; //自己看吧,好吧。
label1.font.name:='隶书'; //不用我说了吧。
label1.wordwrap:=true; //自动换行的属性,知道吧。
label1.transparent:=true; //试一试就明白的。……吧。
label1.caption:='把鼠标移上来看看'; //标签的内容,最简单的了吧。
end; //完了。然后在标签的 OnMouseMove 的事件中填加下面的东西,双击要填写的属性空白处,在begin和end之间加入这行代码。
label1.font.color:=clred; //这是移动上面后字体的颜色。然后在标签的 OnMouseLeave 的事件里写下面的
label1.font.color:=clblue; //鼠标离开后的颜色。现在可以按运行了。看一看你的成果。好简单是吧,其实更主要的是希望你能在这个例子里学到更多的,可以算是领悟吧。嘻嘻~~~~睡觉去喽~~~~
谢谢大家,给大家发分。