实际上这并不是一个按钮,只是一个变换背影图层而已,但通过过滤背景色,它实现了按钮的不规则形态,例如最常见的圆角风格,下面是代码
namespace CDTheme { public abstract partial class CDBaseImage : CDBase { private Image _normalImage; private Image _disabledImage; public CDBaseImage() { InitializeComponent(); } [Browsable(false)] public override Image BackgroundImage { get { return base.BackgroundImage; } set { base.BackgroundImage = value; } } public Image NormalBackImage { get { return _normalImage; } set { _normalImage = value; BackImageChanged(); } } public Image DisabledBackImage { get { return _disabledImage; } set { _disabledImage = value; BackImageChanged(); } } public Image MouseMoveBackImage { get; set; } public Image MouseDownBackImage { get; set; } private void BackImageChanged() { if (!CDEvent.HasFlag(CDControlEvent.BackImage)) return; if (Enabled) { if (CDState.HasFlag(CDControlState.MouseDown)) { if (MouseDownBackImage != null) BackgroundImage = MouseDownBackImage; } else if (CDState.HasFlag(CDControlState.MouseEnter)) { if (MouseMoveBackImage != null) BackgroundImage = MouseMoveBackImage; } else { if (NormalBackImage != null) BackgroundImage = NormalBackImage; } } else { BackgroundImage = DisabledBackImage == null ? NormalBackImage : DisabledBackImage; } } protected override void StateChanged(CDControlState changedState, bool allow) { base.StateChanged(changedState, allow); BackImageChanged(); } } }
显然你看到了abstract关键字,这说明这个类只是封装了背景变换的相关属性和功能实现,但却不能直接使用,这是因为更多的复杂控件需要以它来派生,为了能实现简单按钮的功能,又有了下面这个真正可以在IDE中显示并使用的winform组件
namespace CDTheme { [ToolboxItem(true)] [DefaultEvent("Click")] public partial class CDBackImage : CDBaseImage { public CDBackImage() { SetCDControlEvent(CDControlEvent.BackImage | CDControlEvent.MouseClick | CDControlEvent.MouseMove, true); InitializeComponent(); DesigntimeSkinLoad("CDBackImage"); } } }
ToolboxItemAttribute特性决定了这个组件将显示在工具窗口中
DefaultEventAttribute特性决定了这个组件的默认事件,也就是我们在IDE窗口中双击时的事件
SetCDControlEvent方法决定了这个组件所响应的需求,在父类的StateChanged方法中完成了需求的功能,也就是背景变化
DesigntimeSkinLoad方法是在设计时装载已定义的组件皮肤的,这个示例没有内容会单独用一篇内容来阐述
在父类中,在NormalBackImage和DisabledBackImage属性的set方法中调用了BackImageChanged方法,目的是在设计时能够在IDE中体现背景变化的效果
演示一下吧,在设计器上建一个窗口,把此控件拖进来,NormalBackImage、DisabledBackImage、MouseMoveBackImage和MouseDownBackImage属性上设计对应的图片后,这个示例程序就做好了,效果图如下
后话,只是一个变换背影的小功能是用不着写这么多代码的,这只是一个示例,更多复杂和漂亮的功能,在以后会为大家展示
时间: 2024-11-09 05:26:46