我的目的是做一个按钮,当鼠标放在上面时按钮变为原来的两倍大小。我用一个继承自UserContorl的类来实现该功能,并且在上面放置了一个Label控件,用来显示提示文字。用下面的代码绑定控件的MouseEnter事件,当鼠标移动到控件上时大小确实变为原来的两倍,但再将鼠标移动到Label控件上时,按钮不停的闪烁,只要鼠标离开Label,就不闪,不知道什么原因,希望大家赐教。
public partial class UserControl1 : UserControl
    {
          //鼠标经过时发生的事件:大小变为原来的两倍
        private void UserControl1_MouseEnter(object sender, EventArgs e)
        {
            this.Location = new Point(StartLocation.X-StartSize.Width/2,StartLocation.Y-StartSize.Height/2);
            this.Size = new Size(StartSize.Width * 2, StartSize.Height * 2);
         }
     }

解决方案 »

  1.   


    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing;namespace WindowsFormsApplication3
    {
        public class ButtonEx:Button
        {
            /// <summary>
            /// 记录按钮在缩放前的大小
            /// </summary>
            private Size m_szButtonRect = Size.Empty;
            /// <summary>
            /// 按钮关联的ToolTip控件
            /// </summary>
            private ToolTip m_ttToolTipWindow = new ToolTip();        /// <summary>
            /// 此按钮所关联的提示信息
            /// </summary>
            public string ToolTipText { get; set; }        private void ShowToolTipText()
            {
                if (m_ttToolTipWindow == null) m_ttToolTipWindow = new ToolTip();
                if (!string.IsNullOrEmpty(this.ToolTipText))
                {
                    m_ttToolTipWindow.ToolTipIcon = ToolTipIcon.Info;
                    m_ttToolTipWindow.ToolTipTitle = "提示信息";
                    m_ttToolTipWindow.UseAnimation = true;
                    m_ttToolTipWindow.UseFading = true;                
                    m_ttToolTipWindow.ShowAlways = true;                
                    m_ttToolTipWindow.Show(this.ToolTipText, this,this.Location);
                }
                
            }        private void HideToolTipText()
            {
                if (m_ttToolTipWindow != null)
                {
                    m_ttToolTipWindow.Hide(this);                           
                }
            }        protected override void OnMouseHover(EventArgs e)
            {
                base.OnMouseHover(e);            ShowToolTipText();
            }                protected override void OnMouseEnter(EventArgs e)
            {
                //记录按钮原始大小
                m_szButtonRect = this.Size;            base.OnMouseEnter(e);            //将按钮大小扩大一倍
                this.Size = Size.Add(this.Size, this.Size);
            }        protected override void OnMouseLeave(EventArgs e)
            {
                base.OnMouseLeave(e);            //离开时还原按钮大小
                this.Size = m_szButtonRect;            //离开时销毁ToolTip控件
                HideToolTipText();
            }
        }
    }
    我给你现写了一个,不会出现你说的问题,你用的方法可能欠妥。
      

  2.   

    我也写过一个继承于Button的类,完全可以实现这个功能,但是没有用用户控件方便
      

  3.   

    你的代码不全,StartLocation和StartSize是啥?        Point StartLocation = new Point();
            Size StartSize =new Size();
            private void UserControl1_MouseEnter(object sender, EventArgs e)
            {
                this.Location = new Point(StartLocation.X - StartSize.Width / 2, StartLocation.Y - StartSize.Height / 2);
                this.Size = new Size(StartSize.Width * 2, StartSize.Height * 2); 
            }        private void UserControl1_Load(object sender, EventArgs e)
            {
                StartLocation = this.Location;
                StartSize = this.Size;
            }我用你的方法试,并没有闪烁现象。如果想要得到别人更详细的帮助,就请把你的问题更详细的描述出来。
      

  4.   

    StartLocation和StartSize分别是按钮的初始位置和初始大小
      

  5.   

    以下是我猜测的:
    你是不是还应该有个MouseLeave的事件处理程序来恢复控件的大小?如果是这样的话那问题可能出在控件里的Label上,当你鼠标进入控件大小改变没问题,但移入Label上就会引发控件的MouseLeave事件,从而恢复控件大小,但这时由于代码调整了控件的大小可能再一次使鼠标位于控件上再次引发MouseEnter(大小变为两倍,会使鼠标再一次位于Label上而引发MouseLeave),如此反复,所以会不停的闪。不知你听清明白没?
      

  6.   

    jibo126的意思我听明白了,也正是我遇到的问题,但不知道该怎么解决
      

  7.   

    如果Label的作用只是显示文本的话建议用UserControl的Paint事件处理程序直接绘制!