0

我开发了以下自定义组合框来增加项目的高度。完成后,当有滚动条时,下拉菜单的末尾会出现一个空白区域。 在此处输入图像描述 我该如何纠正这个问题?

class MyComboBoxXX : ComboBox
{
    public MyComboBoxXX():base()
    {
        this.DrawMode = DrawMode.OwnerDrawVariable;
        this.DropDownStyle = ComboBoxStyle.DropDownList;
        this.MaxDropDownItems = 5;
        this.IntegralHeight = false;         
    }

    protected override void OnMeasureItem(MeasureItemEventArgs e)
    {
        e.ItemHeight = 40;
        this.DropDownHeight = 40 * 5;        
    }
    protected override void OnDrawItem(DrawItemEventArgs e)
    {        
        e.DrawBackground();        
        var index = e.Index;    
        if (index < 0 || index >= Items.Count) return;    
        using (var brush = new SolidBrush(e.ForeColor))
        {            
            Rectangle rec = new Rectangle(e.Bounds.Left, e.Bounds.Top + ((e.Bounds.Height - ItemHeight) / 2), e.Bounds.Width, ItemHeight);
            e.Graphics.DrawString(this.Items[e.Index].ToString(), e.Font, new SolidBrush(this.ForeColor), rec);
        }
        e.DrawFocusRectangle();
    }    
}
4

3 回答 3

2

如果仔细观察,DropDown 区域的顶部和底部似乎都有一个 1 像素的边框。您可以通过将 2 个像素添加到DropDownHeight.

protected override void OnMeasureItem(MeasureItemEventArgs e)
{
    e.ItemHeight = 40;
    this.DropDownHeight = (40 * 5) + 2; //add 2 pixels to include the border
}



结果:
最后没有空格的组合框

于 2013-02-26T07:54:10.370 回答
0

需要存储默认的 ItemHeight,因为从 Normal 更改 DrawMode 会导致向项目高度添加 2 个像素的填充。在调用 ItemHeight 之前需要检索 Handle,因为它会创建句柄。没有这个,ItemHeight 属性的值是不正确的。 http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/ComboBox.cs

于 2015-02-10T13:53:37.847 回答
0

我认为如果 DropDownHeight 值小于 OnMeasureItem 方法覆盖中的最大数量,您应该将其减少到适当的项目数。

于 2013-02-26T04:00:09.547 回答