今天看到QQ上有一个当鼠标划过按钮时使选中的按钮放大并置顶,自己写个代码试验下,代码如下:
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
int x = 0;//保存鼠标进入的按钮的原始位置X坐标
int y = 0;//保存鼠标进入的按钮的原始位置Y坐标
System.Drawing.Size size = new Size();//保存鼠标进入的按钮的原始大小
private void Btn_MouseEnter(object sender, EventArgs e)
{
if (!(sender is Button))
return;
Button btn = sender as Button;
btn.BringToFront();
x = btn.Location.X;
y = btn.Location.Y;
size = btn.Size;
System.Drawing.Size newSize = new Size((int)(size.Width * 1.3), (int)(size.Height * 1.3));
btn.Size = newSize;
int residualX = (newSize.Width - size.Width) / 2;
int residualY = (newSize.Height - size.Height) / 2;
btn.Location = new Point(x - residualX, y - residualY);
}
private void Btn_MouseLeave(object sender, EventArgs e)
{
if (!(sender is Button))
return;
Button btn = sender as Button;
btn.Location = new Point(x, y);
btn.Size = size;
}
private void Btn_Click(object sender, EventArgs e)
{
if (!(sender is Button))
return;
MessageBox.Show((sender as Button).Text);
}
}
整个过程中最重要的方法是这个:BringToFront()方法。
截图:
我擦,忘了一个效果了,就是QQ上的按钮的激活的时候,是动态放大和缩小的,明天把那个动态的效果加上,完善下,现在半夜,失眠,不过也没心思,去做了
今晚重新完善了下,写成了一个控件代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Threading;
namespace _TopButton
{
public class ButtonEx : Button
{
private Thread magnifyThread = null;
private Thread lessenThread = null;
private Size _size;
private Point _p;
protected override void OnMouseEnter(EventArgs e)
{
StartMagnifyThread();
base.OnMouseEnter(e);
}
protected override void OnMouseLeave(EventArgs e)
{
StartlessenThread();
base.OnMouseLeave(e);
}
private void MagnifyMethod()
{
Invoke(new MethodInvoker(new Action(delegate()
{
_p = Location;
_size = Size;
BringToFront();
})));
int times = 1;
double ratio = 0.02;//每次增长的比例
int t = 1;
while (times <= 10)
{
{
System.Drawing.Size newSize;
if (times < 8)
{
newSize = new Size((int)(_size.Width * (1 + (times) * ratio)),
(int)(_size.Height * (1 + (times) * ratio)));
}
else if (times == 8)
{
newSize = new Size((int)(_size.Width * (1 + (times + 5) * ratio)),
(int)(_size.Height * (1 + (times + 5) * ratio)));
}
else
{
newSize = new Size((int)(_size.Width * (1 + (times-t) * ratio)),
(int)(_size.Height * (1 + (times-t) * ratio)));
t = t + 2;
}
times++;
Invoke(new MethodInvoker(new Action(delegate()
{
Size = newSize;
})));
int residualX = (newSize.Width - _size.Width) / 2;
int residualY = (newSize.Height - _size.Height) / 2;
Invoke(new MethodInvoker(new Action(delegate()
{
Location = new Point(_p.X - residualX, _p.Y - residualY);
})));
}
Thread.Sleep(5);
}
}
private void LessonMethod()
{
Invoke(new MethodInvoker(new Action(delegate()
{
{
Location = _p;
Size = _size;
}
})));
}
private void StartMagnifyThread()
{
//if ((magnifyThread == null || !magnifyThread.IsAlive) && (lessenThread == null || !lessenThread.IsAlive))
{//注释掉了才行,分析下
magnifyThread = new Thread(new ThreadStart(MagnifyMethod));
magnifyThread.IsBackground = true;
magnifyThread.Start();
}
}
private void StartlessenThread()
{
if (magnifyThread != null && magnifyThread.IsAlive)
{
magnifyThread.Abort();
magnifyThread = null;
}
lessenThread = new Thread(new ThreadStart(LessonMethod));
lessenThread.IsBackground = true;
lessenThread.Start();
}
}
}