首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当DoubleBuffered设置为true时重写OnPaint时出现问题

当DoubleBuffered设置为true时重写OnPaint时出现问题
EN

Stack Overflow用户
提问于 2010-07-15 20:08:31
回答 1查看 1.5K关注 0票数 1

我已经创建了一个从Panel派生的自定义控件。我使用它来使用BackgroundImage属性显示一个图像。我重写了OnClick方法并将isSelected设置为true,然后调用Invalidate方法并在重写的OnPaint中绘制一个矩形。在我将DoubleBuffered设置为true之前,一切都很顺利。这个矩形被画出来了,然后又被擦除了,我不明白为什么会这样。

代码语言:javascript
复制
public CustomControl()
    : base()
{
    base.DoubleBuffered = true;

    base.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.ResizeRedraw, true);
}

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

    PaintSelection();
}

private void PaintSelection()
{
    if (isSelected)
    {
        Graphics graphics = CreateGraphics();
        graphics.DrawRectangle(SelectionPen, DisplayRectangle.Left, DisplayRectangle.Top, DisplayRectangle.Width - 1, DisplayRectangle.Height - 1);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-15 20:12:37

PaintSelection中,不应该创建新的Graphics对象,因为该对象将绘制到前台缓冲区,然后后台缓冲区的内容会立即透支前台缓冲区。

改为绘制在PaintEventArgs中传递的Graphics

代码语言:javascript
复制
protected override void OnPaint(PaintEventArgs pe)
{
    base.OnPaint(pe);
    PaintSelection(pe.Graphics);
}

private void PaintSelection(Graphics graphics)
{
    if (isSelected)
    {
        graphics.DrawRectangle(SelectionPen, DisplayRectangle.Left, DisplayRectangle.Top, DisplayRectangle.Width - 1, DisplayRectangle.Height - 1);
    }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3255368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档