按钮的互斥事件实现
各位前辈,在做折叠菜单中的二级菜单的鼠标事件时,遇到互斥事件。
实现的效果就是,处于点击状态的按钮取消它的背景变换。同时恢复上一个的鼠标事件正常。
我做的效果,所有二级菜单按钮每一个在第一次点击时都达到了效果。但是第二次点击时,按下的效果就没有了,鼠标一离开就触发了离开事件。假象就是好像第二次点击没有解除掉它的离开与进入事件。
如果我的鼠标事件有问题,那为什么第一次又能正常解除它的离开与进入事件呢?
百思不得其解,请大神们看看代码哪里有问题。
先说明几个问题:
1、折叠菜单一级按钮我没有弄互斥效果,是通过两个Image和改变文本颜色来提醒用户;
2、折叠菜单实现原理:用FlowLayOutPanel的流式布局做主容器,每个一级菜单按钮下放一个Panel,一级菜单按钮的Tag与Panel设为相同索引号,在一级菜单的点击事件中循环容器中Panel控件的Tag,如果相同的就将Panel的高度设为0,达到折叠效果。
3、在二级菜单的Panel容器中放置按钮,这些按钮要求互斥,互斥的实现是变换背景图片。
代码如下:
public partial class SubMenuBt : Button
{
public SubMenuBt()
{
this.FlatStyle = FlatStyle.Flat;
this.FlatAppearance.BorderSize = 0;
this.Font = new Font("方正书宋简体", 10F);
this.Image = Image.FromFile(@"E:\C#项目文件\控件测试图片\动态菜单图片\二级菜单图标2.png");
this.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.BackgroundImageLayout = ImageLayout.Stretch;
this.BackgroundImage = Image.FromFile(@"E:\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景Normal.png");
this.Size = new Size(150, 25);
this.Margin = new Padding(0,1,0,0);
this.Checked = false;
this.MouseEnter +=new EventHandler(SubMenuBt_MouseEnter);
this.MouseLeave +=new EventHandler(SubMenuBt_MouseLeave);
this.MouseDown +=new MouseEventHandler(SubMenuBt_MouseDown);
this.Click +=new EventHandler(SubMenuBt_Click);
}
public bool Checked { get; set; }
private void SubMenuBt_Click(object sender, EventArgs e)
{
SubMenuBt sbt = sender as SubMenuBt;
foreach (Control c in sbt.Parent.Controls)
{
if (c is SubMenuBt && c != sbt)
{
SubMenuBt bt = c as SubMenuBt;
if (bt.Checked == true)
{
bt.BackgroundImage = Image.FromFile(@"E:\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景Normal.png");
bt.MouseEnter += new EventHandler(SubMenuBt_MouseEnter);
bt.MouseLeave += new EventHandler(SubMenuBt_MouseLeave);
bt.Checked = false;
}
}
}
if (sbt.Checked == false)
{
sbt.MouseEnter -= new EventHandler(SubMenuBt_MouseEnter);
sbt.MouseLeave -= new EventHandler(SubMenuBt_MouseLeave);
sbt.BackgroundImage = Image.FromFile(@"E:\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景Down.png");
sbt.Checked = true;
}
}
private void SubMenuBt_MouseEnter(object sender, EventArgs e)
{
SubMenuBt sbt = sender as SubMenuBt;
sbt.BackgroundImage = Image.FromFile(@"E:\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景In.png");
}
private void SubMenuBt_MouseLeave(object sender, EventArgs e)
{
SubMenuBt sbt = sender as SubMenuBt;
sbt.BackgroundImage = Image.FromFile(@"E:\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景Normal.png");
}
private void SubMenuBt_MouseDown(object sender, EventArgs e)
{
SubMenuBt sbt = sender as SubMenuBt;
sbt.BackgroundImage = Image.FromFile(@"E:\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景Down.png");
}
}
初始状态效果图: 点开状态效果图:

请大神们帮忙看看哪里需要完善!拜托了。
...全文
相关推荐
Qt按钮互斥效果
经典Qt按钮互斥效果,按钮的三种状态,显示背景及前置背景,响应,利用纯代码实现。
AMX:AMX代码段
AMX #AMX编程此存储库充当备有AMX代码段的备忘单 ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶_____________¶¶¶¶¶¶¶¶¶¶¶¶_¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶____________________________¶¶¶¶¶¶¶¶__¶¶___________¶¶¶¶¶¶¶¶¶¶¶________________¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶__¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ ¶¶¶¶¶¶¶¶¶¶¶ ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶____¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶
JS实现checkbox互斥(单选)功能示例
主要介绍了JS实现checkbox互斥(单选)功能,涉及JavaScript针对页面元素属性的判断及动态操作相关实现技巧,需要的朋友可以参考下
多个按钮状态切换
同一界面有多个按钮,按钮之间互无关系,选择其中一个还原上一个的状态
jquery实现密保互斥
jquery实现密保互斥,用于解决密保,投票等类似互斥问题,内附demo,支持ie6+,火狐,谷歌等大多数浏览器


