【问题标题】:How to cache the image of the control?如何缓存控件的图像?
【发布时间】:2014-11-18 12:19:39
【问题描述】:

我有 C# 应用程序,但绘画工作是在 C++ 项目中完成的(这就是它必须的方式)。

所以我添加到我的窗口PictureBox,并将句柄传递给绘图函数。它工作正常。

但是,当控件无效时(我将窗口移到屏幕外,然后将其移回),结果是窗口部分为空。 AFAIK 有两种方法 - 重绘或缓存图像。

重绘可能是一个昂贵的过程(图像不会经常更改,但处理很耗时,想想 3d 渲染器),所以我想简单地缓存图像。

如果我从过去直接使用 Win32 API 编程的时候没记错的话,只需设置一些标志。 WinForms可以吗?如果是,怎么做?

【问题讨论】:

  • 如果你想在 PictureBox 中显示图像,为什么不设置它的 Image 属性而不是在它的表面上绘制呢?这将持续存在,并且确实是 Picturebox 的用途!您可以使用 PicteureBox.DrawToBitmap().. 将表面缓存到 bmp
  • @TaW,因为底层绘图函数对 WinForms 一无所知。它是原始 Win32 代码,对句柄 (HWND) 进行操作。
  • 对不起,我错了,不是关于总体思路,而是关于实现它的方法。由于像素位于表面上,因此您无法使用 DrawToBitmap 捕获它们。您需要使用CopyFromScreen设置仅捕获正确的区域,然后将生成的位图设置为PB的图像..
  • 小修正:DrawToBitmap 不起作用,因为我们想要的像素不是从 Paint 事件中绘制的。除此之外,它很好地构成了 PictureBox 的所有三层(背景图像、图像和控制表面)..
  • 发送STM_SETIMAGE 消息。我相信picturebox 是 win32 中的静态控件,所以它会起作用。

标签: c# winforms invalidation


【解决方案1】:

这会有所帮助:

Bitmap getControlSurface(Control ctl)
{
    bitmap = new Bitmap(ctl.Width, ctl.Height);

    using (Graphics g = Graphics.FromImage(bitmap))
    {
        Point pScreen = PointToScreen(ctl.Location);
        g.CopyFromScreen(pScreen, Point.Empty, ctl.Size);
    }
    return bitmap;
}

如果您知道表面何时刷新,您可以这样使用它:

 if ( pictureBox1.Image != null) pictureBox1.Image.Dispose();
 pictureBox1.Image =  getControlSurface(pictureBox1);

唯一的问题是 PictureBox 实际上必须在屏幕上完全可见

【讨论】:

  • 非常感谢,这真的很有帮助。如果一些 W32 忍者提出单一标志,我将把这个问题留得更久一点:-) 我希望你没问题。
  • 我忍者,我没问题 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
相关资源
最近更新 更多