-2

概要:最初のフォームサイズの外側には描画されません。スケールアップするのではなく、スケールダウンすることができます。

要約が十分に明確でない場合の説明:したがって、私のフォームが最初にサイズ1000,800である場合。拡大縮小後、描画した画像が1000,800を超えることはありません。

フォームを2000,1600のサイズに拡大縮小すると、トリミングされます。画像は下と右の両方の半分でトリミングされるため、左上の部分のみが描画されます。

作成時にフォームを2000,1600に設定している限り、スケーリングは正しく機能するので、正しく機能すると確信しています。

。。重要かどうかはわかりませんが、要求どおりにコーディングしてください。。

mapDrawer.DrawImage( map1,
    new RectangleF(0, 0, ImageSizeX * scale, ImageSizeY * scale),
    new RectangleF(0, 0, ImageSizeX, ImageSizeY),
    GraphicsUnit.Pixel);

ここで、scaleはform.size/map_sizeです。そして、私はxまたはyの小さいスケールを取りました。

4

2 に答える 2

1

不適切なスニペットからは確認できませんが、mapDrawerオブジェクトに問題があります。おそらくフォームの Load イベントで作成した Graphics オブジェクトであることは間違いありません。当時のフォームのサイズに基づいたクリッピング領域があります。その後、サイズを変更してフォームを大きくすると、このコピーされた Graphics オブジェクトが元の境界を超えて描画できないことがわかります。できません。

Graphics オブジェクトをコピーしないでください。ペイントは常に Paint イベント ハンドラで行い、渡された e.Graphics オブジェクトを使用してください。これにより、ダブルバッファリングが正しく機能することも保証されます。画像を再描画する必要がある場合は、Invalidate() メソッドを使用します。

于 2012-07-17T11:23:37.850 に答える
0

私の最善の推測は、フォームが再描画されたときに画像を再描画する必要があるということです:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;

    g.DrawImage(map1,
        new RectangleF(0, 0, ImageSizeX * scale, ImageSizeY * scale),
        new RectangleF(0, 0, ImageSizeX, ImageSizeY),
        GraphicsUnit.Pixel);
}

フォームのサイズが変更されたとき (または強制的に再描画が行われたとき) にこのメソッドを呼び出すには、フォームのコンストラクターで Paint イベントにハンドルを追加する必要があります。

Paint += new EventHandler(Form1_Paint);
于 2012-07-17T11:13:20.350 に答える