关于自定义button控件

焱rock 2012-07-30 02:20:00
小弟项目中需要用到自定义button,使用的是Usercontrol,在Usercontrol中声明了如下事件:
public delegate void ButtonClicked(object sender,EventArgs e);
public event ButtonClicked buttonClicked = null;
同时小弟将一个picturebox放入usercontrol中,在picturebox的mouseup事件中加入了如下代码:
private void pictureBox_BackGrd_MouseUp(object sender, MouseEventArgs e)
{
pictureBox_BackGrd.Image = global ::ButtonControl.Resource.backgrdoff;//这是鼠标弹起后button显示的图片
if( buttonClicked != null )
{
buttonClicked( null, e );
}
}
同时mousedown事件中加入如下代码:
private void pictureBox_BackGrd_MouseDown(object sender, MouseEventArgs e)
{
pictureBox_BackGrd.Image = global ::ButtonControl.Resource.backgrdon;
}
这样在winform程序中调用此控件,可以实现类似按钮点击的功能,但是我发现这样跟vs自带的button效果还是不一样,自带的button运行时是按下去弹起来之后才相应click事件,我现在这样做是还没到显示按钮弹起来的效果就已经执行了ButtonClicked事件了,请问大牛怎么改我的代码才能实现跟原生的button一样的运行效果?
...全文
156 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
焱rock 2012-07-31
  • 打赏
  • 举报
回复

private void OnMouseUp( object sender, EventArgs e )
{
_PicBox.Image = Image.FromFile( "c:\\edit-off.png" );

_PicBox.Update();//关键是这里
if( buttonClicked != null )
{
buttonClicked( null, e );
}
}
焱rock 2012-07-31
  • 打赏
  • 举报
回复
问题解决,应该这样改:

private void OnMouseUp( object sender, EventArgs e )
{
_PicBox.Image = Image.FromFile( "c:\\2.jpg" );

_PicBox.Update(); if( buttonClicked != null )
{
buttonClicked( null, e );
}
}

呵呵。
SocketUpEx 2012-07-31
  • 打赏
  • 举报
回复
其实嘛
你就不应该在MouseUp和MouseDown里修改图片
应该在外部的事件处理函数里修改图片
外部喜欢先MsgBox再换图片
还是喜欢先Sleep(100000)再换图片
都行

焱rock 2012-07-31
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
C# code


绝对没有问题


using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
public delegate void FileChangeHandler(String path);

pub……
[/Quote]哥们。你在MessageBox.Show("OK");
前面加上一句:System.Threading.Thread.Sleep( 3000 );看看什么效果?中间有一段时间即便你弹起了鼠标,图片也不会变化mouseup对应的图片的。
SocketUpEx 2012-07-30
  • 打赏
  • 举报
回复

绝对没有问题


using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
public delegate void FileChangeHandler(String path);

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void myButton1_buttonClicked(object sender, EventArgs e)
{
MessageBox.Show("OK");
}
}

public class MyButton : UserControl
{
public delegate void ButtonClicked(object sender, EventArgs e);
public event ButtonClicked buttonClicked;
private PictureBox _PicBox;

private void OnMouseUp(object sender, EventArgs e)
{
_PicBox.Image = Image.FromFile("c:\\2.jpg");

if (buttonClicked != null)
{
buttonClicked(null, e);
}
}

private void OnMouseDown(object sender, EventArgs e)
{
_PicBox.Image = Image.FromFile("c:\\1.jpg");
}

public MyButton()
{
_PicBox = new PictureBox();
_PicBox.Dock = DockStyle.Fill;
_PicBox.MouseUp += OnMouseUp;
_PicBox.MouseDown += OnMouseDown;

this.Controls.Add(_PicBox);
}
}
}


焱rock 2012-07-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
C# code

费话哦
委托事件就那么几板斧
当然和你的一样了
我的没加背景
但测试过
确实是松开鼠标才会触发
private void myButton1_buttonClicked(object sender, EventArgs e)
{
MessageBox.Show("OK");
}
[/Quote]问题就在换背景这里
SocketUpEx 2012-07-30
  • 打赏
  • 举报
回复
费话哦
委托事件就那么几板斧
当然和你的一样了
我的没加背景
但测试过
确实是松开鼠标才会触发
private void myButton1_buttonClicked(object sender, EventArgs e)
{
MessageBox.Show("OK");
}


焱rock 2012-07-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
C# code

namespace WindowsFormsApplication2
{
public delegate void FileChangeHandler(String path);

public partial class Form1 : Form
{
public Form1()
{
……
[/Quote]这个跟我的思路一样啊,实际运行的时候,还等不及mouseup里面变换背景,就已经响应了buttonclick了。你可以把你自己的这个控件和原生的button比较一下就明白了。
SocketUpEx 2012-07-30
  • 打赏
  • 举报
回复
namespace WindowsFormsApplication2
{
public delegate void FileChangeHandler(String path);

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void myButton1_buttonClicked(object sender, EventArgs e)
{
MessageBox.Show("OK");
}
}

public class MyButton : UserControl
{
public delegate void ButtonClicked(object sender, EventArgs e);
public event ButtonClicked buttonClicked;

private void OnMouseUp(object sender, EventArgs e)
{
if (buttonClicked != null)
{
buttonClicked(null, e);
}
}

public MyButton()
{
PictureBox picBox = new PictureBox();
picBox.Dock = DockStyle.Fill;
picBox.MouseUp += OnMouseUp;

this.Controls.Add(picBox);
}
}
}


焱rock 2012-07-30
  • 打赏
  • 举报
回复
顶一下!有没有人知道啊?
焱rock 2012-07-30
  • 打赏
  • 举报
回复
没有 if( buttonClicked != null )
{
buttonClicked( null, e );
}
在winform中是不会响应Buttonclick事件的啊,您加这个Application.DoEvents();我没明白,请指教,谢谢!
bdmh 2012-07-30
  • 打赏
  • 举报
回复
pictureBox_BackGrd.Image = global ::ButtonControl.Resource.backgrdoff;
Application.DoEvents();
焱rock 2012-07-30
  • 打赏
  • 举报
回复
我是在picture的mouseup事件中触发的,而我在mousedown里面更换了背景,实际运行时,点击控件后还没来得及显示mouseup里面的图片,就已经响应buttonclick事件了。
bdmh 2012-07-30
  • 打赏
  • 举报
回复
你那看看你都在哪里触发的 ButtonClicked 啊,如果你自己控制鼠标,应该在MouseUp事件中触发,你还可以在Picture的Click事件中触发

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧