Winform按钮重绘问题

S308981840 2013-07-29 05:30:36
 
public enum ButtonType
{
/// <summary>
/// 最小化
/// </summary>
Minimize,
/// <summary>
/// 最大化
/// </summary>
Maximization,
/// <summary>
/// 关闭
/// </summary>
Close,
/// <summary>
/// 还原
/// </summary>
Restore
}
/// <summary>
/// 按钮状态
/// </summary>
public enum ButtonState
{
/// <summary>
/// 正常
/// </summary>
None,
/// <summary>
/// 鼠标滑过
/// </summary>
Hover,
/// <summary>
/// 按下
/// </summary>
Down
}

public class ToolsButton : Button
{
#region 私有字段
private Image backImg;
private Image hoverImg;
private Image clickImg;
private ButtonType type;
private ButtonState state = ButtonState.None;
#endregion

#region 公有属性
/// <summary>
///
/// </summary>
public Image BackImg
{
get { return backImg; }
set { backImg = value; }
}
/// <summary>
///
/// </summary>
public Image HoverImg
{
get { return hoverImg; }
set { hoverImg = value; }
}
/// <summary>
///
/// </summary>
public Image ClickImg
{
get { return clickImg; }
set { clickImg = value; }
}
/// <summary>
/// 按钮类型
/// </summary>
public ButtonType Type
{
get { return type; }
set { type = value; }
}
/// <summary>
/// 按钮状态
/// </summary>
public ButtonState State
{
get { return state; }
set { state = value; }
}
#endregion

#region 构造函数
public ToolsButton()
{
//默认构造函数
InitializeComponent();
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="bType">按钮类型</param>
/// <param name="width">宽度</param>
/// <param name="height">高度</param>
/// <param name="location">坐标</param>
public ToolsButton(ButtonType bType, Point location)
{
type = bType;
Location = location;
FlatAppearance.BorderSize = 0;
FlatStyle = FlatStyle.Flat;
Anchor = AnchorStyles.Top | AnchorStyles.Right;
switch (type)
{
case ButtonType.Minimize:
Width = 30;
Height = 22;
backImg = Image.FromFile(Application.StartupPath + "\\Resource\\Image\\Min.png");
hoverImg = Image.FromFile(Application.StartupPath + "\\Resource\\Image\\Min_OnHover.png");
clickImg = Image.FromFile(Application.StartupPath + "\\Resource\\Image\\Min_OnClick.png");
break;
case ButtonType.Maximization:
Width = 30;
Height = 22;
backImg = Image.FromFile(Application.StartupPath + "\\Resource\\Image\\Max.png");
hoverImg = Image.FromFile(Application.StartupPath + "\\Resource\\Image\\Max_OnHover.png");
clickImg = Image.FromFile(Application.StartupPath + "\\Resource\\Image\\Max_OnClick.png");
break;
case ButtonType.Close:
Width = 40;
Height = 22;
backImg = Image.FromFile(Application.StartupPath + "\\Resource\\Image\\Close.png");
hoverImg = Image.FromFile(Application.StartupPath + "\\Resource\\Image\\Close_OnHover.png");
clickImg = Image.FromFile(Application.StartupPath + "\\Resource\\Image\\Close_OnClick.png");
break;
case ButtonType.Restore:
Width = 30;
Height = 22;
backImg = Image.FromFile(Application.StartupPath + "\\Resource\\Image\\Restore.png");
hoverImg = Image.FromFile(Application.StartupPath + "\\Resource\\Image\\Restore_OnHover.png");
clickImg = Image.FromFile(Application.StartupPath + "\\Resource\\Image\\Restore_OnClick.png");
break;
default:
break;
}
InitializeComponent();
}
#endregion

#region 方法
private void InitializeComponent()
{
this.SuspendLayout();
//
// ToolsButton
//
this.Paint += new System.Windows.Forms.PaintEventHandler(this.CloseButton_Paint);
this.ResumeLayout(false);

}

private void CloseButton_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
//g.DrawImage(, 0, 0);
g.DrawImage(GetImage(),
new Rectangle(0, 0, Width, Height),
new Rectangle(0, 0, GetImage().Size.Width, GetImage().Size.Height),
GraphicsUnit.Pixel);

}

private Image GetImage()
{
Image img = backImg;
switch (state)
{
case ButtonState.None:
img = backImg;
break;
case ButtonState.Hover:
img = hoverImg;
break;
case ButtonState.Down:
img = clickImg;
break;
}
return img;
}
#endregion

#region 事件

protected override void OnMouseDown(MouseEventArgs mevent)
{
this.State = ButtonState.Down;
this.InitializeComponent();
base.OnMouseDown(mevent);
}

protected override void OnMouseHover(EventArgs e)
{
this.State = ButtonState.Hover;
this.InitializeComponent();
base.OnMouseHover(e);
}

protected override void OnMouseLeave(EventArgs e)
{
this.State = ButtonState.None;
this.InitializeComponent();
base.OnMouseLeave(e);
}

protected override void OnMouseUp(MouseEventArgs mevent)
{
this.State = ButtonState.Hover;
this.InitializeComponent();
base.OnMouseUp(mevent);
}
#endregion
}


鼠标滑过时并没有重绘按钮 请问这是什么问题
...全文
128 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
智商余额不足 2013-07-29
  • 打赏
  • 举报
回复

public ButtonState State
{
   get { return state; }
   set 
   {
      if((ButtonState)value!=state)
      {
         state = value; 
         this.Invalidate();
      }
   }
}
这样写比较好些吧?
S308981840 2013-07-29
  • 打赏
  • 举报
回复
引用 2 楼 hwenycocodq520 的回复:

 protected override void OnMouseHover(EventArgs e)
{
    this.State = ButtonState.Hover;
    //this.InitializeComponent();
    //把this.InitializeComponent(); 换成this.Invalidate();
    base.OnMouseHover(e);
 }
3Q!!
智商余额不足 2013-07-29
  • 打赏
  • 举报
回复

 protected override void OnMouseHover(EventArgs e)
{
    this.State = ButtonState.Hover;
    //this.InitializeComponent();
    //把this.InitializeComponent(); 换成this.Invalidate();
    base.OnMouseHover(e);
 }
S308981840 2013-07-29
  • 打赏
  • 举报
回复
求解答

110,536

社区成员

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

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

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