当组合包含大量项目时,组合被删除,你向上和向下滚动下拉列表,下拉列表中的项目全部搞砸了 - 看起来它们互相覆盖。我在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;
}
答案 0 :(得分:2)
我无法重现您在Windows Server 2008 R2(64位)下使用上述代码所描述的行为。滚动对我来说似乎很顺利,虽然在列表中反复看到相同的两个项目是一个不同寻常的效果。我非常怀疑原因是Windows 7中存在的但是没有显示本身在服务器变体中;它们基本上是相同的操作系统。
我的猜测是它与您的视频卡驱动程序和Windows Vista中引入的新显示模型(WDDM)有关。也许是某种重绘问题?你的视频卡多大了?您是否在从Windows XP升级的同时升级了它?
它也可能与新的Aero主题有关。您是否尝试在Aero Basic或Classic主题下运行应用程序?如果您不想更改操作系统主题,请尝试以下操作:
答案 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)
在视频驱动程序更新后,我遇到了同样的问题,但已得到纠正。