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

2023-12-02

我创建了一个源自面板的自定义控件。我用它来使用BackgroundImage 属性显示图像。我重写 OnClick 方法并将 isSelected 设置为 true,然后调用 Invalidate 方法并在重写的 OnPaint 中绘制一个矩形。 一切都很顺利,直到我将 DoubleBuffered 设置为 true。绘制了矩形,然后将其删除,我不明白为什么会发生这种情况。

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);
    }
}

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

油漆到Graphics通过在PaintEventArgs反而:

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);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 DoubleBuffered 设置为 true 时重写 OnPaint 时出现问题 的相关文章

随机推荐

  • 获取指向 std::list 或 std::forward_list 中节点的指针

    我计划在我的代码中使用 std list 我决定不使用 std forward list 因为对于删除 我认为 必须遍历整个列表 std forward list 的复杂度为 O N 正在单个链接列表 然而 当我查看文档时 我注意到两个 s
  • 如何设置小程序的大小?

    我编写了一个小测试小程序并通过 Eclipse appletviewer 启动该小程序 我在代码开头注意到了标签 但 appletviewer 没有看到它 它每次都会在标准窗口中以相同的大小启动小程序 我使用 JDK 1 7 Eclipse
  • requestAccessForMediaType 不请求许可

    我注意到我的应用程序不请求使用相机的权限 经过一些实验 我发现用于检查权限的代码需要很长时间才能完成 所以我想到让我的 viewDidload 的那部分在串行队列上运行 同步 强制其余部分等待身份验证过程完成 然后再开始下一行 但这并没有真
  • Magento 电子邮件模板

    如何为客户订单确认电子邮件和同一电子邮件的管理副本设置不同的电子邮件模板 我需要为管理员电子邮件副本添加一些额外的内容 Thanks 我假设您当前正在使用 复制 功能来发送管理员电子邮件 如果情况并非如此 请告诉我 由于当前同一封电子邮件正
  • ASP 用户控件中的 JavaScript 函数定义 [重复]

    这个问题在这里已经有答案了 可能的重复 用户控制 JavaScript 我在用户控件内定义了一个 JavaScript 函数 如果我的 aspx 页面上有多个用户控件实例 如何防止生成的 HTML 代码中存在多个函数定义 您将需要使用 Pa
  • IMFActivate::ActivateObject 返回错误代码“CoInitialize 尚未被调用。”

    我正在 Visual Studio 2013 中编写一个简单的多媒体应用程序 我需要枚举连接到我的计算机的相机设备并创建一个媒体源对象以链接到其中之一 我使用 Media Foundation SDK 并尝试在此处运行指南 https ms
  • Puppeteer-Cluster 的隐秘性是否足以通过机器人测试?

    我想知道使用 Puppeteer Cluster 的人是否可以详细说明 Cluster Launch settings 如何防止在不同上下文的页面之间共享 cookie 和 Web 数据 执行浏览器上下文here 实际上阻止cookie并且
  • Facebook json 消息的编码/解码问题。 C# 解析

    我已经下载了 json 和我的对话存档 我坚持使用奇怪的编码 json 示例 sender name Micha u00c5 u0082 timestamp 1411741499 content b u00c4 u0099d u00c4 u
  • SciPy lesssq 拟合正弦波失败

    我试图弄清楚我在这里不明白的是什么 我正在关注http www scipy org Cookbook FittingData并尝试拟合正弦波 真正的问题是卫星磁力计数据 它在旋转的航天器上产生漂亮的正弦波 我创建了一个数据集 然后尝试调整它
  • 我如何在Java中执行以下curl命令

    我将如何在 Java URLConnection 中实现以下curl命令 curl X PUT H X Parse Application Id H X Parse REST API Key H Content Type applicati
  • 如何在perl中将参数传递给系统命令

    我的命令 system start cmd exe k C script pl arg1 arg2 arg3 没有正确传递参数 这样做的正确方法是什么 Thx 最好的调用方式system是一个数组或一个列表 my args start cm
  • 在 PHP 中运行 Python 脚本:捕获所有输出

    我有一个Python程序有多个print其中的陈述 当我执行程序时PHP 显示的输出只是最后一个打印的值print陈述 有没有办法捕获所有打印的值print中的陈述Python script PHP code 尝试用shell exec 通
  • Android-SeparatedListAdapter-如何在 onClick 上获取准确的项目位置?

    我使用Sharkey 的SeparatedListAdapter 类来获得按部分分隔的ListView 课程效果很好 但我遇到的问题是我的onListItemClick 处理程序 如果我有以下分段列表 A Alex Allan B Barr
  • JAXB:我应该如何编组复杂的嵌套数据结构?

    我有几个复杂的数据结构 例如 Map lt A Set lt B gt gt Set lt Map lt A B gt gt Set lt Map lt A Set lt B gt gt gt Map lt A Map lt B Set l
  • AWS S3 Java:d​​oesObjectExist 结果为 403:FORBIDDEN

    我的 Java 程序使用 AWS SDK 与 S3 存储桶交互时遇到问题 这是我用来创建 S3 客户端的代码 public S3StorageManager S3Config config throws StorageException B
  • Apache HttpClient 4.5 将 POST 请求重定向到 GET 请求

    我正在尝试点击 post 端点 但它给出了错误 302 当我在同一服务器上尝试另一个 get Url 时 它给了我 200 然后我使用 LaxRedirectStrategy 重定向了 post 请求 post 请求正在重定向到 get 请
  • 批处理文件:获取文件夹的创建日期

    有没有办法以纯批处理文件 无电源脚本 获取文件夹的创建日期 特别是 我想将它放入这个 for 循环中 FOR f tokens G in dir b s a d C asdf DO CALL loopbody tG G 该循环调用一个 函数
  • 使用 cmake 共享库的未定义引用

    我已经找到了很多地方来寻找这个答案 但我一直无法找到任何适合我的情况的东西 这看起来很容易 这就是为什么这如此令人沮丧 我正在用 CMAKE 构建一个项目 我正在生成两个共享库 一个包含另一个 我还生成了一个可执行文件 该可执行文件正在链接
  • Safari 钥匙串防止使用 html

    Solve 我在我的项目前一天搜索这个问题 最后我找到了下面带有插件的解决方案 这个插件的工作结构是这样的 它获取您的输入并克隆它 使用此克隆并创建相同的输入属性并将其克隆为另一个隐藏输入 之后删除您的原始输入并将隐藏和克隆的输入放在相同的
  • 当 DoubleBuffered 设置为 true 时重写 OnPaint 时出现问题

    我创建了一个源自面板的自定义控件 我用它来使用BackgroundImage 属性显示图像 我重写 OnClick 方法并将 isSelected 设置为 true 然后调用 Invalidate 方法并在重写的 OnPaint 中绘制一个