如何为自定义控件在工具箱中自定义个性化图标

很多朋友都为自己编写各自使用的控件,但是所有的控件默认在工具箱中的图片都是单一的图标—齿轮。如何为自定义的控件在工具箱中自定义个性化的图标

背景:作者在编写了一个中间带数字的进度条的控件过程中,突然发现添加在工具箱中的图有点单一,于是产生了如何改用自己定义图的方式来做工具箱的图,于是查询大量的资料,翻译此文如下.该文章和原文有点出入,我修改其中一些Bug,改用自己的实例来做下面叙述. 
下面你可以通过不同的方法来完成。在下面例子中,bitmap 或icon图片必须遵循下面的规则
1、Bitmap 或icon尺寸不许是16色 16 X 16
2、底色必须是透明的
 
技术方案1: 用一个bitmap图片(不能是一个icon图片,嵌入资源)文件
不需要使用特别的ToolboxBitmapAttribute类来实现.
例如你有一个命名空间 CarryNoProgramBar ,自定义控件为 Bar 的项目。
1按照上面图片规则来建立一个命名为 Bar .bmp的图片,添加该图片到你的项目,
2把该 Bar .bmp的图片设置属性 生成操作设置为à嵌入的资源
3注意该图片的命名空间必须也是 CarryNoProgramBar
4如果该控件的命名空间和项目的默认命名空间不匹配,你必须把该bitmap图片移到适当的子目录让他们匹配。如果你使用该方法无效,很显然你不能使用该技术来实现你自定义图片,你可以下面ToolboxBitmap属性技术来实现
5.注明我使用直接在根目录中的方式取的工具箱中的图标。
上面简单的技术来实现你的需求,而不需要你去使用ToolboxBitmapAttribute去产生你的类型
技术解决方案2:
使用ToolboxBitmap属性
使用一个和类型同名bitmap图片而非icon嵌入资源,默认的命名空间是 CarryNoProgramBar
namespace CarryNoProgramBar {
[ToolboxBitmap(typeof(Bar))]
public class Bar : UserControl  {...}
}
上面例运行当中,假定了你的项目根目录下存在一个命名为Bar.bmp嵌入资源图片,注意是你的图片和控件的命名空间的一致性
例2 如果你需要项目中存在子目录放你的图片,你可以修改为
namespace CarryNoProgramBar{
[ToolboxBitmap(typeof(Bar),"sub.Bar.bmp")]
    public class Bar : UserControl
    {...... }
}
或者
[ToolboxBitmap(typeof(Bar),"sub.Bar.ico")]
通过子目录使用,你可以使用特殊的资源,当然也包括ico文件,必须注意我上面使用了一个sub的子目录
例3
有时候你的控件和图片不在同一个命名空间里,在下面的情况你必须在统一个命名空间里使用同一个类型的嵌入资源的图片
 默认命名空间
namespace MyAssemblyNamespace{
 public class SomeType
 {...}
}
namespace DifferentNamespace
{
[ToolboxBitmap(typeof(SomeType), "Bar.ico")]
public class Bar : UserControl  
{...}
}

 

 

http://blog.donews.com/utilities/archive/2004/02/04/2621.aspx

VS风格的ToolBox和QQ的界面很相似,都是有多个栏目,并且这些栏目可以展开和折叠,当鼠标在某个子栏目上时,可以高亮显示,另外在VS风格的ToolBox中,点击选中项目的时候,要用特殊的颜色标识出来。 1. 创建控件的边框,我在前边的文章也讲过(),直接将代码复制过来,稍做修改即可。 2. 添加滚动条,因为我们的控件只需要垂直的滚动,所以我只只加入一个垂直的滚动条。 3. ToolBox包含多个Category,我们不但要创建Category类,还要创建这个类的集合。 4. 每一个Category包含多个Item,我们不但要创建ToolBoxItem类,还要创建这个类的集合。 5. 重载OnPaint方法,绘制控件的内容,在绘制的时候要注意滚动条的当前值,由于采用了双缓冲机制,所以每次总是将所有的内容重绘一次,不考虑ClipRect。 6. 写一个方法,根据鼠标的坐标计算出鼠标指向的Item或者Category,这个方法是这个控件的核心。 7. 重载OnMouseMove方法,当鼠标指向某个Item的时候,高亮显示出来。 8. 重载 OnMouseDown方法,当鼠标在某个Item上按下的时候,用指定的颜色标识出来,如果鼠标按下的地方是一个Category,根据当前的情况展开或者时折叠这个category。 9. 计算控件当前状态的内容的总的高度,用于设置滚动条的可见与不可见。 10. 暴露一个属性,用于为用户提供当前选中的Item。 11. 声明一个ItemChanged事件,便于用户在选择另一个Item时添加处理的代码。 实现了上述的内容,这个控件也就基本完成了。由于代码并不复杂,我就不将代码列出来讲解了,我将提供代码的下载,大家在看代码的时候,如有不明白的地方,可以参考我前面的控件教程。因为只花了几个小时写的这个控件,难免还有一些问题,请大家指出。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值