在Windows 7上滚动时,所有者绘制组合框显示混乱

时间:2010-11-28 15:38:28

标签: .net winforms

当组合包含大量项目时,组合被删除,你向上和向下滚动下拉列表,下拉列表中的项目全部搞砸了 - 看起来它们互相覆盖。我在deve studio 2008上使用64位Windows 7运行。我在Windows XP上没有这个问题。将代码简化为一个简单的例子,可以重现问题。

 public class ODComboBox : ComboBox
 {
    protected override void OnDrawItem(
        DrawItemEventArgs e)
    {
        if (e.Index == -1)  {
            e.DrawBackground();
            e.DrawFocusRectangle();
            return;
        }

        string text = Items[e.Index].ToString();       
        e.Graphics.SetClip(e.Bounds);
        e.DrawBackground();
        e.Graphics.DrawString(text, Font, new SolidBrush(ForeColor), e.Bounds);
        e.DrawFocusRectangle();          
    }
}

comob的绘制模式设置为OwnerDrawFixed,这是来自主机的OnLoad方法。

private void Form1_Load(object sender, EventArgs e)
{
    for (int i = 0; i < 50; ++i) {
       cobmob1.Items.Add("AAAAAAAAAAAAAAAAAAAAAAAA");
       cobmob1.Items.Add("BBBBBBBBBBBBBBBBBBBBBBBB");
    }

    cobmob1.DropDownWidth = 500;
}

combo screenshot

3 个答案:

答案 0 :(得分:2)

我无法重现您在Windows Server 2008 R2(64位)下使用上述代码所描述的行为。滚动对我来说似乎很顺利,虽然在列表中反复看到相同的两个项目是一个不同寻常的效果。我非常怀疑原因是Windows 7中存在的但是没有显示本身在服务器变体中;它们基本上是相同的操作系统。

我的猜测是它与您的视频卡驱动程序和Windows Vista中引入的新显示模型(WDDM)有关。也许是某种重绘问题?你的视频卡多大了?您是否在从Windows XP升级的同时升级了它?

它也可能与新的Aero主题有关。您是否尝试在Aero Basic或Classic主题下运行应用程序?如果您不想更改操作系统主题,请尝试以下操作:

  1. 右键单击应用程序的.EXE文件,然后从下拉菜单中选择“属性”。
  2. 打开“兼容性”标签。
  3. 选中“禁用视觉主题”和“禁用桌面合成”框。
  4. 单击“确定”,然后再次运行该应用程序。

答案 1 :(得分:2)

这是这里的解决方案:  https://connect.microsoft.com/VisualStudio/feedback/details/524617/listbox-ownerdraw-windows-7 将此代码放在OnDrawItem而不是e.DrawBackground中 发布者:Mykola Kovalchuk于2010年1月2日以9:01μμ发布 我找到了工作解决方案 - 背景的特殊双重清洁(两条线都是必需的,并且按照这个顺序):

//e.Graphics.FillRectangle(new SolidBrush(e.BackColor), e.Bounds);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0, e.BackColor.R, e.BackColor.G, e.BackColor.B)), e.Bounds);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(255, e.BackColor.R, e.BackColor.G, e.BackColor.B)), e.Bounds);

我认为Windows 7中的ListBox使用透明颜色自我绘制,并且在滚动时它不会清除要重新绘制的部分,这会导致绘制人工制品。 此外,e.BackColor被命名为颜色“Window”,即使所有ARGB组件都相同,它也不等于FromArgb生成。

答案 2 :(得分:0)

在视频驱动程序更新后,我遇到了同样的问题,但已得到纠正。