{A}{S0}
简介
这是。NET版本的我以前的MFC文章中,。一个几年前,我在Visual C成员的要求,实现一个自定义的ListBox控件类似于MFC的CCheckListBox论坛讨论,但单选按钮。最初,它似乎是微不足道的,因为独特的选择ListBox控件的版本符合要求,但我的结论是,这种控制有一定的优势:它是清楚的是选项是互斥单选按钮。这是一个很好的选择一组单选按钮,因为你必须保持只有一个控制,使用更少的内存。
它继承了一些有用的功能,如滚动排序,数据绑定和多列。这将是更容易动态地更改选项,演示应用程序所示。这将是更易于管理,选择事件,也显示在演示应用。使用代码
落实到你的项目RadioListBox,你只需要做几个步骤:纳入您的项目RadioListBox.cs。拖放到表单中RadioListBox的对象。变更控制的标准属性,就像一个ListBox。Countersense标准ListBox,透明的BackColor属性是允许的。
这就是全部!现在你可以使用作为一个经常性的ListBox中的单选按钮集合。您可以添加Items.Add()方法和SelectedIndex属性为用户选择查询项目。伪透明
一些。NET控件BackColor属性接受一个透明的颜色,但ListBox是不是其中之一。所以,透明度需要大量的管理技巧。然而,透明度是一个关键的功能,需要这种控制是有益的。它允许控制,获得一个真正的单选按钮的外观和感觉,你可以看到在上面的截图。我决定留在托管世界提供虚假的透明度,控制,通过重写BackColor属性,接受它,并保存自己的背景颜色的画笔。当设置背景色为透明,将模拟控制父窗体或控件,即使形成有一个非标准的背景颜色。RadioListBox内部
RadioListBox类是来自Windows窗体ListBox类的所有者绘制功能。恢复类定义如下:using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms.VisualStyles;
namespace System.Windows.Forms
{
public class RadioListBox : ListBox
{
private StringFormat Align;
private bool IsTransparent = false; // Handles the transparent state
private Brush BackBrush; // Manages its own background brush
// Allows the BackColor to be transparent
public override Color BackColor ...
// Hides these properties in the designer
[Browsable(false)]
public override DrawMode DrawMode ...
[Browsable(false)]
public override SelectionMode SelectionMode ...
// Public constructor
public RadioListBox() ...
// Main painting method
protected override void OnDrawItem(DrawItemEventArgs e) ...
// Prevent background erasing
protected override void DefWndProc(ref Message m) ...
// Other event handlers
protected override void OnHandleCreated(EventArgs e) ...
protected override void OnFontChanged(EventArgs e) ...
protected override void OnParentChanged(EventArgs e) ...
protected override void OnParentBackColorChanged(EventArgs e) ...
}
}
OnDrawItem()方法的核心是提升。该方法不突出标准ListBox控件中选定的项目,但绘制一个单选按钮,而不是。它还管理的重点国家,正确绘制焦点矩形和背景色的透明度属性。下面是C#源代码:{C}历史,2007年4月23日:第一个版本九月十四日,2007年:改进控制渲染(stephpms感谢);范围内的数据支持(PeterDP感谢)
9月1日,2008年:改进的背景画;大字体支持(rkousha感谢)