ListView中的WS_EX_COMPOSITED样式导致无穷无尽的WM_PAINT

时间:2014-07-29 14:38:27

标签: c# winforms listview

我试图在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循环?

1 个答案:

答案 0 :(得分:0)

要知道你使用WS_EX_COMPOSITED的原因有点困难。我希望这是其他问题的错误解决方案。或者也许是试图解决当前的问题。我不明白为什么你需要那种风格。

有人想知道你为什么不使用GetDCEx获得DC。人们还想知道为什么你将DC传递给需要窗口句柄的Graphics.FromHwnd。据推测,这会导致异常,也许这就是你的无限循环。

您应该做的是调用GetDCEx来获取设备上下文。有关详细信息,请参阅here。然后Graphics.FromHdc获取Graphics个对象。完成DC后,请记得致电ReleaseDC