在delphi6.0中,如何实现以下功能:当我将鼠标移动到一个控件上(例如:CheckBox控件),这个控件的字体和背景颜色改变,当鼠标移走时,控件的字体和背景颜色恢复到原来的状态。请问我将用哪几个事件,如何实现,最好给出源代码。
谢谢!

解决方案 »

  1.   

    自己写组件,继承原来的ComboBox然后拦截WM_MOUSEENTER和WM_MOUSELEAVE消息!
      

  2.   

    设置onmousemove事件为:
    checkbox.font.name:='你要变的类型';
    checkbox.font.color:='你要变的顔色';
    checkbox.font.size:='你要变的大小';
      

  3.   

    mousemove方法不行, 首先鼠标离开你不知道, 就算你设定个边界, 判断进入边界就算
    离开的话, 实际应用中鼠标跑得稍微快一点就漏掉了. 不实用. 
    用CM_MOUSEENTER, CM_MOUSELEAVE做非常简单,有实用
      

  4.   

    Delphi中,鼠标的消息响应是通过元件的OnMouseDown、OnMouseU p和OnMouseMove事件实现的,通过对此三个事件编程,可控制图像在有限区域内移动。考虑到所移动的图像的边界应总在该区域外,因此图像的左上角坐标应小于该区域对应坐标,图像右下角坐标应大于该区域对应坐标(除非图像大小比该区域小)。图1  具体方法是:  1、新建一工程Project1,在Form1中依次放入Panel1、Panel2和I mage1元件,注意Pa nel2和Image1分别在Panel1和Panel2上,再将一La bel1元件加入Panel2中,调整Panel1尺寸为适当大小,并修改各元件属性为:
    元件
    属性名
    属性值
    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; 
      

  5.   

    我想要的效果是不需要点击鼠标就能够变颜色的。
    ycxuyuq(注册失败) 你好,我也遇到了同样的问题,只用了mousemove事件,但是我的鼠标移动的太快就漏掉了,但是没有mouseenter和mouseleave时间,你说的CM_MOUSEENTER, CM_MOUSELEAVE这两个东西我不太清楚,能够给个解释或者例子吗,谢谢!
      

  6.   

    请各位不要误人子弟,用以下方法多简单呀!!!!!!!!!
    用CM_MOUSEENTER, CM_MOUSELEAVE做非常简单,有实用
      

  7.   

    下面代码调试通过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.
      

  8.   

    好,看了。
    我们做个例子:::在一个窗体上,当鼠标移到标签上时,颜色为红色。鼠标移走时,颜色为蓝色。为了让你能更好的理解对象的属性,我把对象的属性放在程序代码中,也就是动态创建的。双击窗体,不,先在窗体上加一个 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;  //鼠标离开后的颜色。现在可以按运行了。看一看你的成果。好简单是吧,其实更主要的是希望你能在这个例子里学到更多的,可以算是领悟吧。嘻嘻~~~~睡觉去喽~~~~
      

  9.   

    感谢各位的关注与解答,我的问题已经在各位高手的帮助下意见解决。特别提出感谢wisenowa(127.0.0.1),shuijin(水晶妹妹)和kerisyml(魂之利刃) 。我总结一下,wisenowa的方法可以适用于基本上所有的控件,水晶妹妹讲的MouseLeave事件--在某一些控件上没有这个事件。
    谢谢大家,给大家发分。