C#学习教程:BlinkinginaListViewControl(OwnerDraw,Virtual)我在虚拟模式下有一个ListView控件,我尝试进行自定义绘图。使用此方法覆盖完成项目渲染:protectedoverridevoidOnDrawItem(DrawListViewItemEventArgseventArgs)如引用问题中所述,自定义绘图在鼠标悬停事件上引入了闪烁。调试器告诉我这是由于触发了太多自定义绘制事件而发生的。现在-所引用问题的公认答案告诉我们:这是.NET的ListView中的一个错误,您不能使用双缓冲来绕过它。我在我的任何自定义呈现事件处理程序(DrawItem、DrawSubItem)中都看到了ListView控件的闪烁问题。我试过BeginUpdate()/EndUpdate()和双缓冲都没有成功。我认为.NET会向自定义绘制列右侧的所有列触发额外的WM_PAINT。但我发现解决方法是自定义呈现列ListView。它工作得很好!在列标题编辑器中,将自定义绘制的列设置为最后一列更改所需位置的“DisplayIndex”这应该可以解决鼠标悬停或运行时渲染中的闪烁问题。至少对于OnDrawItem的双缓冲,有一个错误是错误的,但是有点愚蠢:你可以设置一个受保护的属性,但你需要重写ListView。我创建了这种类:publicclassMyListView:ListView{publicMyListView():base(){DoubleBuffered=true;然后在我的MyForm.Designer.cs文件中,我用以下行更改了ListView的实例化:privateListViewmyListView;this.myListView=newMyListView();OnDrawItem会很有魅力!就像这里的答案一样,不确定,但我认为ListView.BeginUpdate()和ListView.EndUpdate()可以解决问题。MSDN主题可能是这样的:protectedoverridevoidOnDrawItem(DrawListViewItemEventArgseventArgs){ListView.BeginUpdate();//在这里工作ListView.EndUpdate();}更新另一种选择可能是使用新线程来更新ListView...我在我的应用程序中将其与BeginUpdate()/EndUpDate()一起实现,发现它比仅BeginUpdate()/EndUpDate()更快。UPDATE我在SO上找到了另一个workingsolution,BrianGillespie提供的一个helper类:以上就是C#学习教程的全部内容:ListView控件中的Flashing(OwnerDraw,Virtual),如果对大家有用需要学习更多C#学习教程,希望大家多多关注--publicenumListViewExtendedStyles{//////LVS_EX_GRIDLINES///GridLines=0x00000001,//////LVS_EX_SUBITEMIMAGES///SubItemImages=0x00000002,/////LVS_EX_CHECKBOXES///CheckBoxes=0x00000004,//////LVS_EX_TRACKSELECT///TrackSelect=0x00000008,//////LVS_EX_HEADERDRAGDROP///HeaderDragDrop=0x00000010,//////LVS_EX_FULLROWSELECT///FullRow0x00000020,//////LVS_EX_ONECLICKACTIVATE///OneClickActivate=0x00000040,//////LVS_EX_TWOCLICKACTIVATE///TwoClickActivate=0x00000080,//////LVS_EX_FLATSB///FlatsB=0x00000100_,//_/LVS//Regional=0x00000200,//////LVS_EX_INFOTIP///InfoTip=0x00000400,//////LVS_EX_UNDERLINEHOT///UnderlineHot=0x00000800,//////LVS_EX_UNDERLINECOLD///Underline0lineCold=0x00000//////LVS_EX_MULTIWORKAREAS///MultilWorkAreas=0x00002000,//////LVS_EX_LABELTIP///LabelTip=0x00004000,//////LVS_EX_BORDERSELECT///BorderSelect=0x00008000,//////LVS_EX_DOUBLEBUFFER///DoubleBuffer=0x00010000,//////LVS_EX_HIDELABELS///HideLabels=0x00020000,//////LVS_EX_SINGLEROW///SingleRow=0x00040000,//////LVS_EX_SNAPTOGRID///SnapToGrid=0x00080000,/////LVS_EX_SIMPLESELECT///SimpleSelect=0x00100000}publicenumListViewMessages{First=0x1000,SetExtendedStyle=(First+54),GetExtendedStyle=(First+55),}//////包含更改扩展样式的辅助方法在ListView上,包括启用双缓冲。///基于GiovanniMontrone的文章///intwparam,intlparam);公共静态voidSetExtendedStyle(Controlcontrol,ListViewExtendedStylesexStyle){ListViewExtendedStyles样式;样式=(ListViewExtendedStyles)SendMessage(control.Handle,(int)ListViewMessages.GetExtendedStyle,0,0);样式|=exStyle;SendMessage(control.Handle,(int)ListViewMessages.SetExtendedStyle,0,(int)styles);}publicstaticvoidEnableDoubleBuffer(Controlcontrol){ListViewExtendedStyles样式;//读取当前样式styles=(ListViewExtendedStyles)SendMessage(control.Handle,(int)ListViewMessages.GetExtendedStyle,0,0);//启用双缓冲区和边框选择样式|=ListViewExtendedStyles.DoubleBuffer|ListViewExtendedStyles.BorderSelect;//编写新样式SendMessage(control.Handle,(int)ListViewMessages.SetExtendedStyle,0,(int)styles);}publicstaticvoidDisableDoubleBuffer(Controlcontrol){ListViewExtendedStyles样式;//读取当前样式styles=(ListViewExtendedStyles)SendMessage(control.Handle,(int)ListViewMessages.GetExtendedStyle,0,0);//禁用双缓冲区和边框selectstyles-=styles&ListViewExtendedStyles.DoubleBuffer;样式-=样式&ListViewExtendedStyles.BorderSelect;//编写新样式SendMessage(control.Handle,(int)ListViewMessageSetExtendedStyle,0,(int)styles);}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
