作者Anonymoux (猜猜偶素随 ? ^*^)
看板C_Sharp
标题Re: [问题] listbox的item发生闪动问题
时间Thu Feb 10 01:07:49 2011
※ 引述《jiing24 (jiing)》之铭言:
: 小弟的Form在BMP底图上有一个ListBox里头的item是去读取xml档产生的
: 不过只有读取一次
: 可是现在虽然运作正常
: 但是ListBox内的item项偶尔会不正常闪动
: 就是只要有视窗A盖在listbox上头盖一半,然後再把含listbox送到上层时
: (底层仍是视窗A),就会发生闪动的问题,或是放着不管,有时就会发生闪动
: 想请问要如何设定listbox才不会发生lisbox的item会闪动的问题
: 谢谢
: 小弟目前是在看DrawMode和CauseValidation这二个属性
: 不过也仅是乱猜而已
: 後来把DrawMode改成OwnerDrawFixed(因为控制项中的所有项目都是手动绘制,且有相同的大小)
: 然後加了二行
: 在网路上找,发现了这里也说到它有listbox item flashing 的问题(Item 0 flashing)
: http://www.codeproject.com/cs/combobox/multicolumnlistbox.asp
: 不过目前看其程式码还看不出什麽端倪,还请各位给予建议。
key words: double buffered list box c sharp
根据作者的Final solution
在自订义控制项中 加入下列程式码即可
public DbTreeView()
{
// Enable default double buffering processing (DoubleBuffered returns
true)
SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint, true);
// Disable default CommCtrl painting on non-Vista systems
if (Environment.OSVersion.Version.Major < 6)
SetStyle(ControlStyles.UserPaint, true);
}
protected override void OnPaint(PaintEventArgs e)
{
if (GetStyle(ControlStyles.UserPaint))
{
Message m = new Message();
m.HWnd = Handle;
m.Msg = WM_PRINTCLIENT;
m.WParam = e.Graphics.GetHdc();
m.LParam = (IntPtr)PRF_CLIENT;
DefWndProc(ref m);
e.Graphics.ReleaseHdc(m.WParam);
}
base.OnPaint(e);
}
我自己用的缺点是
强制开启水平轴之後
水平轴卷动时会发生残影 (垂直轴卷动时倒不会发生~奇怪)
目前是想到在水平轴卷动时 invalidate
不过不知道水平轴卷动的event是啥...
加在drawitem 中 没有效果 = =
不晓得有没有人有类似问题的解决方法可以提供参考??
http://www.codeproject.com/KB/list/double-buffered-tree-view.aspx?msg=3745576
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.204.119.163