我正在尝试使用以下代码将屏幕的一部分复制到Windows窗体上的新位置。
private void Form1_Paint(object sender, PaintEventArgs e)
{
var srcPoint = new Point(0,0);
var dstPoint = new Point(Screen.PrimaryScreen.Bounds.Width/2, Screen.PrimaryScreen.Bounds.Height/2);
var copySize = new Size(100, 100);
e.Graphics.CopyFromScreen(srcPoint, dstPoint, copySize, CopyPixelOperation.SourceCopy);
}
CopyFromScreen函数似乎忽略了之前设置的所有剪辑。
e.SetClip(new Rectangle(srcPoint.X, srcPoint.Y, 20, 20));
我是在做错什么还是这只是错误的方法。
对于上下文:我正在尝试通过在边缘复制HUD并使其居中于中间位置来缓解UI宽屏游戏问题。
我知道FlawlessWidescreen,但是它不支持很多不受欢迎的游戏。我想在内存中闲逛(做些无瑕的事情)也可以,但是几乎总是反对TOS。
编辑:最终目标是复制一些任意路径作为形状而不是简单的矩形(我希望从图像蒙版中复制)。
编辑#2:所以我每100毫秒绘制一次不规则形状。事实证明,这只会暂停游戏,直到我将速度降低到每500毫秒一次。但是游戏仍然不顺利。复制和绘制图像的操作是否只是GDI +中的操作而已?我以为它很简单,不会停顿任何东西。
在我将答案标记为已接受之前有何想法?
我想这确实是错误的方法。
将ClippingRegion
仅用于削波DrawXXX
和FillXXX
命令,包括DrawImage
(!)。
该CopyFromScreen
然而,将使用给定Points
和Size
和未剪辑的来源。
对于Rectangle
区域而言,这没有问题,因为您可以通过选择正确的值Point
和Size
值来获得相同的结果。
但是,一旦您打算使用更有趣的剪切区域,就必须使用Bitmap
从屏幕上复制到其中的中间片段,然后再将其用于DrawImage
剪切片段。
为此,您可以创建或多或少复杂的文件GraphicsPaths
。
这是一个代码示例:
将裁剪坐标放入Rectangle
或后,GraphicsPath clip
您可以编写如下内容:
e.Graphics.SetClip(clip);
using (Bitmap bitmap = new Bitmap(ClientSize.Width, ClientSize.Height))
{
using (Graphics G = Graphics.FromImage(bitmap))
G.CopyFromScreen(dstPoint, srcPoint,
copySize, CopyPixelOperation.SourceCopy);
e.Graphics.DrawImage(bitmap, 0, 0);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句