有没有办法让所选项目的高度大于列表框中其余项目的高度?这就是我现在所拥有的,但它只是作为一个普通的列表框:
public class BuddyListBox : ListBox
{
public BuddyListBox()
{
this.ResizeRedraw = true;
this.DoubleBuffered = true;
this.BorderStyle = BorderStyle.None;
this.Dock = DockStyle.Fill;
this.DrawMode = DrawMode.OwnerDrawVariable;
this.ItemHeight = 16;
}
protected override void OnDrawItem(DrawItemEventArgs e)
{
if (e.Index == -1 || e.Index >= this.Items.Count)
return;
Buddy current = (Buddy)this.Items[e.Index];
//Bitmap icon = current.StatusImage;
//e.Graphics.DrawImage(icon, e.Bounds.Left, e.Bounds.Top, 16, 16);
e.DrawBackground();
e.Graphics.DrawString(current.Address, e.Font, new SolidBrush(current.Status != BuddyStatus.offline ? e.ForeColor : Color.DarkGray), 16 + e.Bounds.Left, e.Bounds.Top);
e.Graphics.DrawString(current.Status.ToString(), e.Font, new SolidBrush(Color.LightGray), e.Bounds.Right - (int)(e.Graphics.MeasureString(current.Status.ToString(), e.Font).Width) - this.Margin.Right, e.Bounds.Top);
e.DrawFocusRectangle();
}
protected override void OnSelectedIndexChanged(EventArgs e)
{
this.Refresh();
}
protected override void OnMeasureItem(MeasureItemEventArgs e)
{
if (e.Index == this.SelectedIndex)
e.ItemHeight = this.ItemHeight * 2;
else
e.ItemHeight = this.ItemHeight;
}
}
当 DrawMode 为 OwnerDrawFixed 时,您的 OnMeasureItem 不会执行任何操作。将模式更改为 OwnerDrawVariable。
不幸的是,MeasureItem 事件仅在创建句柄时发生,因此这里有一个解决方法:
public class BuddyListBox : ListBox
{
int thisIndex = -1;
public BuddyListBox()
{
this.DrawMode = DrawMode.OwnerDrawVariable;
}
protected override void OnDrawItem(DrawItemEventArgs e)
{
if (this.Items.Count > 0)
{
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
e.Graphics.FillRectangle(SystemBrushes.Highlight, e.Bounds);
else
e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds);
e.Graphics.DrawString(this.Items[e.Index].ToString(), e.Font, Brushes.Black, e.Bounds.Left, e.Bounds.Top);
base.OnDrawItem(e);
}
}
protected override void OnSelectedIndexChanged(EventArgs e)
{
base.OnSelectedIndexChanged(e);
thisIndex = this.SelectedIndex;
this.RecreateHandle();
}
protected override void OnMeasureItem(MeasureItemEventArgs e)
{
if (e.Index > -1)
{
if (e.Index == thisIndex)
e.ItemHeight = 32;
else
e.ItemHeight = 16;
}
base.OnMeasureItem(e);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)