c# - GDI+ 拖拽窗口到 UserControl 后的拖尾现象

标签 c# gdi+

我正在创建一个 UserControl,我想通过 ControlPaint.DrawBorder() 为其添加边框。
我为 OnPaint() 创建了一个覆盖,并将其放入其中:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);


    int     Border_Width    =1;
    Color   Border_Color    =Color.FromArgb(170,170,170);

    ControlPaint.DrawBorder(e.Graphics,e.ClipRectangle,
        Border_Color,Border_Width,ButtonBorderStyle.Solid,      //Left
        Border_Color,Border_Width,ButtonBorderStyle.Solid,      //Top
        Border_Color,Border_Width,ButtonBorderStyle.Solid,      //Right
        Border_Color,Border_Width,ButtonBorderStyle.Solid);     //Bottom
}

边框画的很好,但是自从我加了那个之后,问题就来了:

每当我将其他窗口拖到该用户控件上时,我都会在用户控件上出现“残留物”。

看看它的样子:

在覆盖 OnPaint() 之前:

覆盖 OnPaint() 之后:

为什么会这样?

根据我的实验,
尝试启用 DubbleBuffering 在这里没有帮助.. 涂抹仍然存在..

此外,如果我禁用 ControlPaint.DrawBorder() 行,
并将其替换为 e.Graphics.DrawRectangle(),
然后问题就消失了..

所以这意味着问题不一定在于覆盖 OnPaint() 或类似的东西,而是在于 ControlPaint.DrawBorder()

ControlPaint 类在它提供的其他绘图操作中是否存在问题?
是否有解决办法,或者由于这个错误应该避免它?

最佳答案

您似乎使用 cliprect 来绘制边框,这意味着只有控件中应该重绘的部分。使用控件尺寸/坐标绘制边框。

关于c# - GDI+ 拖拽窗口到 UserControl 后的拖尾现象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34542599/

相关文章:

c# - 重构常量字符串

c# - 在 Unity WebGL 构建中获取 "system.net.sockets.socketexception no such host is known"

c# - Windows DPI 设置影响 Graphics.DrawString

c# - 使用 group by 获取结果

c# - 在哪里可以找到列表中可单击项目使用的 Windows Phone 按钮样式?

c# - 如何从另一个线程通知等待任务完成?

c++ - GDI+ 与 C++Builder?

c++ - Gdiplus::Bitmap 到 BYTE 数组?

c# - 在 ASP.NET/C# 中使用 GDI+ 裁剪图像时抗锯齿?

c++ - 如何使用 Libwebp 从 Webp 解码和编码?