【发布时间】: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