我想覆盖ListBox的DrawItem函数但是我失败了。我尝试过来自网络和msdn的各种片段,但是为什么它不起作用。 源代码仅用于测试,因此我不关心良好的结构等。我想要一个可以学习并可能改进的工作脚本。
我正在使用MS VS 2015 RC并通过Form-Designer添加活动。
目前我有以下源代码。我的log rte也没有显示drawitem条目 - 所以它没有被添加。
Form1.cs的
using System;
using System.Drawing;
using System.Windows.Forms;
namespace CustomFormElements
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.listBox1.Items.Add("Test");
this.listBox1.Items.Add("Test1");
this.listBox1.Items.Add("Test2");
this.listBox1.Items.Add("Test3");
this.listBox1.Items.AddRange( new Object[] { "Test4", "Test5", "Test6" });
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
}
private void AddToLog(string text)
{
this.richTextBox1.Text = this.richTextBox1.Text + text + "\r\n";
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
this.AddToLog("SelectedIndexChanged");
}
private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
this.AddToLog("DrawItem");
bool isSelected = ((e.State & DrawItemState.Selected) == DrawItemState.Selected);
if (e.Index > -1)
{
/* If the item is selected set the background color to SystemColors.Highlight
or else set the color to either WhiteSmoke or White depending if the item index is even or odd */
Color color = isSelected ? SystemColors.Highlight :
e.Index % 2 == 0 ? Color.Green : Color.SandyBrown;
// Background item brush
SolidBrush backgroundBrush = new SolidBrush(color);
// Text color brush
SolidBrush textBrush = new SolidBrush(e.ForeColor);
// Draw the background
e.Graphics.FillRectangle(backgroundBrush, e.Bounds);
// Draw the text
e.Graphics.DrawString(listBox1.GetItemText(listBox1.Items[e.Index]), e.Font, textBrush, e.Bounds, StringFormat.GenericDefault);
// Clean up
backgroundBrush.Dispose();
textBrush.Dispose();
}
e.DrawFocusRectangle();
}
private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e)
{
this.AddToLog("MeasureItem");
}
private void listBox1_Enter(object sender, EventArgs e)
{
this.AddToLog("Enter");
}
private void listBox1_Leave(object sender, EventArgs e)
{
this.AddToLog("Leave");
}
private void listBox1_Click(object sender, EventArgs e)
{
this.AddToLog("Click");
}
}
}
Form1.Designer.cs
namespace CustomFormElements
{
partial class Form1
{
/// <summary>
/// Erforderliche Designervariable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Verwendete Ressourcen bereinigen.
/// </summary>
/// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Vom Windows Form-Designer generierter Code
/// <summary>
/// Erforderliche Methode für die Designerunterstützung.
/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
/// </summary>
private void InitializeComponent()
{
this.listBox1 = new System.Windows.Forms.ListBox();
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
this.SuspendLayout();
//
// listBox1
//
this.listBox1.FormattingEnabled = true;
this.listBox1.Location = new System.Drawing.Point(13, 13);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(332, 303);
this.listBox1.TabIndex = 0;
this.listBox1.Click += new System.EventHandler(this.listBox1_Click);
this.listBox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.listBox1_DrawItem);
this.listBox1.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.listBox1_MeasureItem);
this.listBox1.SelectedIndexChanged += new System.EventHandler(this.listBox1_SelectedIndexChanged);
this.listBox1.Enter += new System.EventHandler(this.listBox1_Enter);
this.listBox1.Leave += new System.EventHandler(this.listBox1_Leave);
//
// richTextBox1
//
this.richTextBox1.Location = new System.Drawing.Point(361, 13);
this.richTextBox1.Name = "richTextBox1";
this.richTextBox1.Size = new System.Drawing.Size(479, 303);
this.richTextBox1.TabIndex = 1;
this.richTextBox1.Text = "";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1009, 475);
this.Controls.Add(this.richTextBox1);
this.Controls.Add(this.listBox1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.RichTextBox richTextBox1;
}
}
答案 0 :(得分:12)
根据{em> ListBox.DrawMode 的MSDN:
此事件由所有者绘制的ListBox使用。该活动仅被提出 当DrawMode属性设置为DrawMode.OwnerDrawFixed或 DrawMode.OwnerDrawVariable。您可以使用此事件来执行 在ListBox中绘制项目所需的任务。如果你有 可变大小的项(当DrawMode属性设置为时 DrawMode.OwnerDrawVariable),在绘制项目之前,MeasureItem 事件被提出。您可以为MeasureItem创建事件处理程序 event指定要绘制的项目的大小 DrawItem事件的事件处理程序。