4

Q: Google マップでのズームのような、ピクチャ ボックス上の現在のマウス位置でのズームを実装するにはどうすればよいですか?

私は論文の仕事として、単純な GIS / マップ エンジンを設計しています。このアプリケーションは、わずかに変更されたタブ コントロールのタブにマップが読み込まれるように設計されています。

マップは標準の JPEG または PNG 形式のデジタル画像であり、それらのほとんどは非常に高い解像度 (2000x2000px 以上) です。

これらは、タブページのサブコントロールとして追加されるピクチャ ボックスに読み込まれます。画像/画像ボックスの中心にのみズームするボタンクリックイベントとして、単純なズーム方法を実装しました。

私がやりたいのは、ピクチャボックス内の現在のマウス位置で画像がズームされるように、マウスホイールイベントでズームを実装することです。

現在、ズームインのコードは次のようになっています。

            timesZoomed += 1;
            zoomRatio += 0.1f;
            pbxMapa.Width = pbxMapa.Width * zoomRatio;
            pbxMapa.Height = pbxMapa.Height * zoomRatio;
            pbxMapa.Location = new Point((this.Width / 2) - (pbxMapa.Width / 2), this.Height / 2) - (pbxMapa.Height / 2));
  • デフォルトの「zoomRatio」値は 1 で、0.6f まで増加しています。
  • 引数「timesZoomed」のデフォルト値は 0 で、最大 6 です。
  • 「pbxMapa」は、マップの画像が読み込まれたピクチャボックスです。ピクチャボックスの「ImageSizeMode」プロップは「ズーム」に設定されていますが、ピクチャボックスのサイズはロードされた地図画像のフルサイズに設定されています。

また、この単純なズームコードを試していました。計算はある程度効果的ですが、より大きな比率でズーム/乗算すると、かなりのオフセットがあります。

                pbxMapa.Location = new Point(pbxMapa.Location.X + (int)((pbxMapa.Location.X * zoomRatio - mouseXPbx) / 8), pbxMapa.Location.Y + (int)((pbxMapa.Location.Y * zoomRatio - mouseYPbx) / 8));
  • 「mouseXPbx」および「mouseYPbx」変数は、「pbxMapa」内の現在のマウス位置を表します。位置決めのオフセットを最小限にするために8で割った。

事前に感謝します。

4

2 に答える 2

5

以下のコードは、現在のマウス位置でpictureBoxをズームおよびストレッチしました

pictureBox1.Width = (int)(pictureBox1.Width * zoomratio );
pictureBox1.Height = (int)(pictureBox1.Height * zoomratio );                
pictureBox1.Top = (int)(e.Y - zoomratio * (e.Y - pictureBox1.Top));
pictureBox1.Left = (int)(e.X - zoomratio * (e.X - pictureBox1.Left));
于 2014-07-14T13:56:00.083 に答える
0

このコード行で位置の計算を微調整することができました。それはうまく機能しており、必要な方法でズームしています。

pbxMapa.Location = new Point(pbxMapa.Location.X + (int)(((pbxMapa.Location.X - mouseXPbx) / 10) * zoomRatio), pbxMapa.Location.Y + (int)(((pbxMapa.Location.Y - mouseYPbx) / 10) * zoomRatio));
于 2012-05-18T16:17:37.453 に答える