XP中ListView的图片刷新和Win7, Win8不同,导致闪烁。解决方法是重载WndProc方法。
//Flag for painting if inner painting or customer painting
private bool isInWmPaintMsg = false;
#region NMHDR
/// <summary>
/// List view message struct
/// </summary>
[StructLayout(LayoutKind.Sequential)]
private struct NMHDR
{
public IntPtr hwndFrom;
public int idFrom;
public int code;
}
#endregion
/// <summary>
/// Win proc function
/// </summary>
/// <param name="m">windows message</param>
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
//WM_PAINT
case 0x0F:
this.isInWmPaintMsg = true;
base.WndProc(ref m);
this.isInWmPaintMsg = false;
break;
//WM_REFLECT_NOTIFY
case 0x204E:
NMHDR nmhdr = (NMHDR)m.GetLParam(typeof(NMHDR));
//NM_CUSTOMDRAW
if (nmhdr.code == -12)
{
// When paint own picture and refresh
if (this.isInWmPaintMsg)
{
base.WndProc(ref m);
}
}
//Other message
else
{
base.WndProc(ref m);
}
break;
default:
base.WndProc(ref m);
break;
}
}