gpt4 book ai didi

C# ListBox DrawItem 不工作

转载 作者:太空狗 更新时间:2023-10-29 20:02:43 33 4
gpt4 key购买 nike

我想覆盖 ListBox 的 DrawItem 函数,但失败了。我尝试了来自网络和 msdn 的各种片段,但不知何故它不起作用。 源代码仅用于测试,所以我不关心良好的结构等。我想要一个我可以从中学习并可能改进的工作脚本。

我正在使用 MS VS 2015 RC 并通过 Form-Designer 添加事件。

目前我有以下源代码。我的日志 rte 也不显示 drawitem 条目 - 所以它没有被添加。 enter image description here

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;
}
}

最佳答案

根据 MSDN对于 ListBox.DrawMode:

This event is used by an owner-drawn ListBox. The event is only raised when the DrawMode property is set to DrawMode.OwnerDrawFixed or DrawMode.OwnerDrawVariable. You can use this event to perform the tasks needed to draw items in the ListBox. If you have a variable-sized item (when the DrawMode property is set to DrawMode.OwnerDrawVariable), before drawing an item, the MeasureItem event is raised. You can create an event handler for the MeasureItem event to specify the size for the item that you are going to draw in your event handler for the DrawItem event.

关于C# ListBox DrawItem 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31088713/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com