.net 在Windows7上滚动时,所有者绘制组合框显示混乱

.net 在Windows7上滚动时,所有者绘制组合框显示混乱,.net,winforms,.net,Winforms,当组合包含很多项目时,组合会被下拉,您会上下滚动下拉列表,下拉列表中的项目会被弄乱-看起来它们会相互覆盖。我正在使用deve studio 2008在64位Windows7上运行。我在windows xp上没有这个问题。我们将代码简化为一个简单的例子,再现了这个问题 public class ODComboBox : ComboBox { protected override void OnDrawItem( DrawItemEventArgs e) {

当组合包含很多项目时,组合会被下拉,您会上下滚动下拉列表,下拉列表中的项目会被弄乱-看起来它们会相互覆盖。我正在使用deve studio 2008在64位Windows7上运行。我在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;
}
我无法在Windows Server 2008 R2(64位)下使用上述代码重现您描述的行为。在我看来,滚动看起来很平滑,尽管看到相同的两个项目在列表中反复出现是一种稍微不寻常的效果。我非常怀疑原因是Windows 7中存在的东西,但在相同的服务器变体中没有表现出来;它们本质上是相同的操作系统

我猜这与您的显卡驱动程序和Windows Vista中引入的新显示模式有关。也许是某种重画的问题?你的显卡有多旧?您是在从Windows XP升级的同时升级的吗

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

右键单击应用程序的.EXE文件,然后从下拉菜单中选择属性。 打开兼容性选项卡。 选中“禁用视觉主题”和“禁用桌面合成”框。 单击“确定”,然后再次运行应用程序。 我无法在Windows Server 2008 R2(64位)下使用上述代码重现您描述的行为。在我看来,滚动看起来很平滑,尽管看到相同的两个项目在列表中反复出现是一种稍微不寻常的效果。我非常怀疑原因是Windows 7中存在的东西,但在相同的服务器变体中没有表现出来;它们本质上是相同的操作系统

我猜这与您的显卡驱动程序和Windows Vista中引入的新显示模式有关。也许是某种重画的问题?你的显卡有多旧?您是在从Windows XP升级的同时升级的吗

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

右键单击应用程序的.EXE文件,然后从下拉菜单中选择属性。 打开兼容性选项卡。 选中“禁用视觉主题”和“禁用桌面合成”框。 单击“确定”,然后再次运行应用程序。
在视频驱动程序更新后,我遇到了相同的问题,得到了纠正。

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

这是解决方案: 将此代码放在OnDrawItem中,而不是e.DruckGround中 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);
我认为Windows7中的ListBox用透明的颜色来绘制,滚动时它并没有清除要重新绘制的部分,这会导致绘制人工制品。
另外,e.BackColor被命名为颜色窗口,即使所有的ARGB组件都相同,它也不等于FromArgb生成的颜色窗口。

这就是这里的解决方案: 将此代码放在OnDrawItem中,而不是e.DruckGround中 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);
我认为Windows7中的ListBox用透明的颜色来绘制,滚动时它并没有清除要重新绘制的部分,这会导致绘制人工制品。
此外,e.BackColor被命名为color Window,即使所有ARGB组件都相同,它也不等于FromArgb生成的。我认为您的思路正确-将机器上的主题设置为Aero basic或Classic解决了问题。但是.exe上的设置无效。我的机器操作系统是最近的-它是一个戴尔T3500精密与Nvidea显示FX580显示卡,它来与寡妇7安装。我很高兴在我的机器上使用Aero Basic,实际上我认为我更喜欢它,但我需要在我无法控制的机器上运行我的代码。你知道如何让我的代码在Aero上安全运行吗?我开始认为这是一个迫使我迁移到WPF的阴谋:-@Shane-你是否尝试手动绘制背景而不是e.trackground@灰色代码-我愿意接受您的回答,但我需要找到一个解决方案,允许代码在大多数默认配置下运行,或者至少确认这是不可能的。有没有其他的想法可以尝试,或者我可以调查的信息来源?@Shane:实际上我必须安装Windows7
今晚在一台机器上,所以我已经计划检查它的行为是否有任何不同。否则,我没有更新我的答案,因为老实说,我没有任何其他的想法,什么可能导致这一点。很奇怪,我不能重现这种行为。在我再次尝试之前,我只想确保您使用的是与原始问题中的代码完全相同的代码,而这就是在您的机器上重现该行为所需的全部内容?@Shane:所以今晚变成了一天左右的晚些时候,但在Aero主题下的全新Windows 7 32位安装上,我看不到任何绘画问题。我试过运行在调试和发布模式下编译的应用程序,以及在下拉样式设置为DropDown和DropDownList的组合框上运行。我甚至尝试将FlatStyle设置为标准和系统。我真的不知道你在看什么。在我看来,卷轴看起来非常平滑,除了由特定测试字符串产生的稍微奇怪的效果。很抱歉,我无法复制它,因为如果没有,我不知道如何修复它。我认为您走在了正确的轨道上-将机器上的主题设置为Aero basic或Classic解决了问题。但是.exe上的设置无效。我的机器操作系统是最近的-它是一个戴尔T3500精密与Nvidea显示FX580显示卡,它来与寡妇7安装。我很高兴在我的机器上使用Aero Basic,实际上我认为我更喜欢它,但我需要在我无法控制的机器上运行我的代码。你知道如何让我的代码在Aero上安全运行吗?我开始认为这是一个迫使我迁移到WPF的阴谋:-@Shane-你是否尝试手动绘制背景而不是e.trackground@灰色代码-我愿意接受您的回答,但我需要找到一个解决方案,允许代码在大多数默认配置下运行,或者至少确认这是不可能的。有没有其他可以尝试的想法或者我可以调查的信息来源?@Shane:实际上我今晚必须在一台机器上安装Windows7,所以我已经计划检查它的行为是否有任何不同。否则,我没有更新我的答案,因为老实说,我没有任何其他的想法,什么可能导致这一点。很奇怪,我不能重现这种行为。在我再次尝试之前,我只想确保您使用的是与原始问题中的代码完全相同的代码,而这就是在您的机器上重现该行为所需的全部内容?@Shane:所以今晚变成了一天左右的晚些时候,但在Aero主题下的全新Windows 7 32位安装上,我看不到任何绘画问题。我试过运行在调试和发布模式下编译的应用程序,以及在下拉样式设置为DropDown和DropDownList的组合框上运行。我甚至尝试将FlatStyle设置为标准和系统。我真的不知道你在看什么。在我看来,卷轴看起来非常平滑,除了由特定测试字符串产生的稍微奇怪的效果。英伟达,我很抱歉我不能复制它,因为如果不是,我不知道如何修复它。我从英伟达网站下载了最新的驱动程序,这就解决了这个问题。谢谢。我从Nvidia站点下载了最新的驱动程序,这就解决了这个问题。