1

次のコードを使用して、画面の一部を 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+ での操作が重すぎるのでしょうか? 何も詰まらないように簡単だと思っていました。

回答を承認済みとしてマークする前に考えたことはありますか?

4

2 に答える 2

2

それは確かに間違ったアプローチだと思います。

は、 ( ! ) を含むandコマンドClippingRegionのクリッピングにのみ使用されます。DrawXXXFillXXXDrawImage

CopyFromScreenただし、指定されたものを使用し、PointsソースをクリップしSizeません。

地域の場合、権利と値Rectangleを選択することで同じ結果が得られるため、これは問題ありません。PointSize

しかし、より興味深いクリッピング領域を使用することを目指したらBitmap、画面からコピーし、そこからクリッピング領域に使用できる中間を使用する必要がありますDrawImage

このために、多かれ少なかれ複雑なGraphicsPaths.

コード例を次に示します。

Rectangleクリッピング座標をorに入れた後、次の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);
}
于 2015-02-15T12:59:18.710 に答える
0

そうじゃないかな

 e.Graphics.Clip = myRegion;
于 2015-02-15T11:09:39.100 に答える