我试图在C#中为ListView提供自定义边框颜色。我已经将ListView子类化并覆盖WndProc方法来处理WM_NCPAINT消息以提供自定义边框颜色。
public class SampleListView : ListView
{
public SampleListView ()
{
InitializeComponent();
View = Details.Details;
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; /*WS_EX_COMPOSITED*/
return cp;
}
}
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case: WM_NCPAINT
base.WndProc(ref m);
IntPtr hDc=Win32.GetWindowDC(m.Hwnd);
Graphics g = Graphics.FromHwnd(hDc);
RECT windowRect= new RECT();
Win32.GetWindoRect(m.Hwnd, ref windowRect);
ControlPaint.DrawBorder(g, windowRect, Color.YellowGreen, ButtonBorderStyle.Solid);
g.Dispose();
break;
default:
base.WndProc(ref m);
break;
}
}
}
将SampleListView添加到表单并启动应用程序。 SPY ++在SampleListView中显示无限的WM_PAINT循环。这是一个错误??? 我使用WS_EX_COMPOSITED样式来避免filckering。我怎样才能避免这种无限的WM_PAINT循环?
答案 0 :(得分:0)
要知道你使用WS_EX_COMPOSITED
的原因有点困难。我希望这是其他问题的错误解决方案。或者也许是试图解决当前的问题。我不明白为什么你需要那种风格。
有人想知道你为什么不使用GetDCEx
获得DC。人们还想知道为什么你将DC传递给需要窗口句柄的Graphics.FromHwnd
。据推测,这会导致异常,也许这就是你的无限循环。
您应该做的是调用GetDCEx
来获取设备上下文。有关详细信息,请参阅here。然后Graphics.FromHdc
获取Graphics
个对象。完成DC后,请记得致电ReleaseDC
。