重绘所有者绘制的 winforms 组合框项目

Posted

技术标签:

【中文标题】重绘所有者绘制的 winforms 组合框项目【英文标题】:Redrawing of owner-drawn winforms combobox items 【发布时间】:2012-08-25 14:55:38 【问题描述】:

我需要在具有不同背景颜色的组合框中显示项目。我还想根据项目是否被选中(或鼠标在其上方)来更改该颜色,这与组合框不是所有者绘制时的工作方式相同。

一切正常,除了当鼠标离开我更改颜色的项目之一时,该项目保持与鼠标在顶部时相同的颜色。在下面的示例中,项目 'other' 最初是使用 myUnselectedBrush 正确绘制的;鼠标移到顶部,使用 mySelectedBrush 正确绘制;当鼠标离开时,它仍然错误地用 mySelectedBrush 绘制;它应该是用 myUnselectedBrush 绘制的。物品“某物”一切正常,其颜色没有改变。

我做错了什么?

private void comboBoxDraw(object sender, DrawItemEventArgs e)

    ComboBox cb = (ComboBox)sender;
    Graphics g = e.Graphics;

    e.DrawBackground();
    if (e.Index > -1)
    
        object item = cb.Items[e.Index];
        switch (somethingOrOther)
            
                case something:
                    break;

                case other:
                    e.Graphics.FillRectangle(
                               (cb.SelectedIndex == e.Index) 
                                   ? mySelectedBrush 
                                   : myUnselectedBrush, 
                               e.Bounds);
                    break;
            
        
    

    e.DrawFocusRectangle();
    if (e.Index > -1)
    
       // draw the string
    

【问题讨论】:

【参考方案1】:

而不是使用

cb.SelectedIndex == e.Index

我需要使用 DrawItemState:

((state & DrawItemState.Selected) > 0) || ((state & DrawItemState.HotLight) > 0)

【讨论】:

以上是关于重绘所有者绘制的 winforms 组合框项目的主要内容,如果未能解决你的问题,请参考以下文章

在Winform的组合框中获取旧的选定索引

调整大小时隐藏的组合框

稍后更改组合框的项目高度(用于 DPI 感知)

MFC:如何为所有者绘制渲染 Aero 风格的组合框?

Winform ComboBox 自定义

Winform ComboBox 自定义