winform自定义控件 (转帖)

定义控件

本文以按钮为例,制作一个imagebutton,继承系统button,

分四种状态

1,正常状态

2,获得焦点

3,按下按钮

4,禁用

当然你得准备一张图片,包含四种状态的样式,同样你也可以准备四张图片,这取决于你如何draw按钮

我们定义一个构造函数

private enum btnState

{

Button_UP = 0,//正常状态

Button_Focus = 1,//获得焦点

Button_Down = 2,//按下按钮

Button_Disabled = 3,//禁用按钮

}

然后设置控件“状态”属性

private btnState imgState=0;

//设置属性

public btnState ButtonState

{

get

{

return imgState;

}

set

{

if (imgState != value)

{

imgState = value; Refresh();

}

}

}

然后判断按钮是否被禁用,同样写一个属性

private bool _buttonEnabled = true;

public bool BtnEnabled

{

get

{

return _buttonEnabled;

}

set

{

if (value == false)

{

_buttonEnabled = false;

imgState = btnState.Button_Disabled;

//删除按钮所有事件

disBindEvent();

}

else

{

_buttonEnabled = true;

imgState = btnState.Button_UP;

//绑定按钮所有事件

bindEvent();

}

}

}

好,到这里,我们继续上面设置属性中的事情,开始写按钮时间的绑定和删除

先列举一下,按钮有哪些事件:

从我们定义的按钮状态着手:

Button_UP = 0,//正常状态--------------->mouseleaver,lostfocus

Button_Focus = 1,//获得焦点------------>mousehover,mouseup

Button_Down = 2,//按下按钮------------->mousedown

Button_Disabled = 3,//禁用按钮--------->enable

private void bindEvent()

{

MouseLeave += new EventHandler(imgButton_MouseLeave );

LostFocus += new EventHandler(imgButton_LostFocus );

MouseHover += new EventHandler(imgButton_MouseHover );

MouseUp += new MouseEventHandler(imgButton_MouseUP);

MouseDown += new MouseEventHandler(imgButton_MouseDown);

EnabledChanged += new EventHandler(imgButton_EnAbleChanged);

}

private void disBindEvent()

{

MouseLeave -= new EventHandler(imgButton_MouseLeave);

LostFocus -= new EventHandler(imgButton_LostFocus);

MouseHover -= new EventHandler(imgButton_MouseHover);

MouseUp -= new MouseEventHandler(imgButton_MouseUP);

MouseDown -= new MouseEventHandler(imgButton_MouseDown);

EnabledChanged -= new EventHandler(imgButton_EnAbleChanged);

}

然后接着写上面用到的事件

//鼠标事件

private void imgButton_MouseLeave(object sender, EventArgs e)

{

ButtonState = btnState.Button_UP;

Invalidate();

}

private void imgButton_LostFocus(object sender, EventArgs e)

{

ButtonState = btnState.Button_UP;

Invalidate();

}

private void imgButton_MouseHover(object sender,MouseEventArgs  e)

{

ButtonState = btnState.Button_Focus;

Invalidate();

}

private void imgButton_MouseUP(object sender, MouseEventArgs  e)

{

ButtonState = btnState.Button_Focus;

Invalidate();

}

private void imgButton_MouseDown(object sender, EventArgs e)

{

ButtonState = btnState.Button_Down;

Invalidate();

}

private void imgButton_EnAbleChanged(object sender, EventArgs e)

{

if (Enabled)

{

ButtonState = btnState.Button_UP;

Invalidate();

}

else

{

ButtonState = btnState.Button_Disabled;

Invalidate();

}

}

到这里,按钮一些事件就写完了,下面开始制作按钮的外观,进行按钮描绘

//绘制按钮外观

private void imgButtonPaint(object sender,PaintEventArgs e)

{

Graphics gr=e .Graphics ;

int indexWidth = Size.Width * (int)imgState ;

if (Image == null) return;

if (Image.Width > indexWidth)

{

gr.DrawImage(Image, 0, 0, new Rectangle(new Point(indexWidth, 0), Size), GraphicsUnit.Pixel);

}

else

{

gr.DrawImage(Image, 0, 0, new Rectangle(new Point(0, 0), Size), GraphicsUnit.Pixel);

}

}

到这里,基本一个imagebutton就制作完了,有兴趣可以试一试,抛砖引玉,这个方法也是刚学过来的

http://www.cnblogs.com/njnudt/archive/2007/08/16/857719.html

时间: 2024-11-06 14:58:30

winform自定义控件 (转帖)的相关文章

winform 自定义控件:半透明Loading控件

winform  自定义控件:半透明Loading控件 by wgscd date:2015-05-05 效果: using System;using System.Drawing;using System.Windows.Forms;using System.ComponentModel;using System.Threading; namespace wgscd{ /// <summary> /// 自定义控件:半透明控件 /// </summary> [ToolboxBit

(二十七)c#Winform自定义控件-多输入窗体

前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control 如果觉得写的还行,请点个 star 支持一下吧 欢迎前来交流探讨: 企鹅群568015492  准备工作 这个窗体继承子基类窗体FrmWithOKCancel1,如果你对FrmWithOKCancel1还不了解,请移步 (二十五)c#Winform自定义控件-有确定取消的窗体(一) 查看 开始 添

(四十一)c#Winform自定义控件-进度条

前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control 如果觉得写的还行,请点个 star 支持一下吧 欢迎前来交流探讨: 企鹅群568015492  NuGet Install-Package HZH_Controls 目录 https://www.cnblogs.com/bfyx/p/11364884.html 准备工作 前面写过一个进度条,但是并

c#Winform自定义控件-目录

前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git 如果觉得写的还行,请点个 star 支持一下吧 欢迎前来交流探讨: 企鹅群568015492  ~~~持续增加中~~~~~ 自定义控件 (一)c#Winform自定义控件-基类控件 (二

(四十六)c#Winform自定义控件-水波进度条

前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git 如果觉得写的还行,请点个 star 支持一下吧 欢迎前来交流探讨: 企鹅群568015492  麻烦博客下方点个[推荐],谢谢 NuGet Install-Package HZH_Con

(七十九)c#Winform自定义控件-导航菜单

前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git 如果觉得写的还行,请点个 star 支持一下吧 欢迎前来交流探讨: 企鹅群568015492  来都来了,点个[推荐]再走吧,谢谢 NuGet Install-Package HZH_C

WPF使用Winform自定义控件

在WPF的用户控件中使用Winfrom自定义控件的过程: 1.添加引用 WindowsFormsIntegration.dll System.Windows.Forms.dll 2.在要使用WinForm控件的WPF窗体的XAML文件中添加如下内容: xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" xmlns:wfi ="clr-namespace:System.Windo

winform 自定义控件的使用

c#的自定义控件还是很方便的,至少相对于c++而言. 1,当然是建立一个windows 窗体空间库,我这里就是用vs 2015 ,工程名MyControl 第二步.在自定义空间窗体内,拖放这样一组空间.我们发送编辑框的内容给父窗体,然后接受父窗体的发送的内容,显示到listbox 中. 这里会看到我使用了委托和事件,其实,刚入门的我,对于c#里的委托和事件 理解的并不深刻.看到很多地方再用.感觉和c++ 的回调很相似.这里就不纠结了, 后面慢慢理解吧.我们通过委托将子窗体的内容发送到主窗体. n

Winform自定义控件—Button(上)

在开发中用的最多的相信就是Button控件,但是Button本身是在是太丑陋了,自己还背景图还会产生"黑线",为了使用方便,并且美观,我们采用迂回的方式来实现Button的效果. 在这里使用UserControl+Label进行封装 先来看代码: ButtonM.cs 1 using System; 2 using System.ComponentModel; 3 using System.Drawing; 4 using System.Windows.Forms; 5 6 names