【问题标题】:WS_EX_COMPOSITED style in ListView causes endless WM_PAINTListView 中的 WS_EX_COMPOSITED 样式导致无休止的 WM_PAINT
【发布时间】:2014-07-29 14:38:26
【问题描述】:

我正在尝试为 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 循环。这是bug??? 我正在使用 WS_EX_COMPOSITED 样式来避免闪烁。如何避免这种无限的 WM_PAINT 循环?

【问题讨论】:

  • 该样式标志仅适用于顶级窗口。避免 ListView 闪烁已经很简单了,只需将其 DoubleBuffered 属性设置为 true

标签: c# winforms listview


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多