1

メインパネルとPictureBoxで構成されるuserControlライブラリがあり、ズーム可能なPictureBoxツールを作成したいのですが、メインパネルのmouseWheelイベントを使用してズームインおよびズームアウトしますが、どうすればよいかわからないという問題があります。画像上のマウスの位置でズームインするので、ズームインするたびに、ズームはパネルの左上隅に移動します。これを修正するにはどうすればよいですか?

private double ZOOMFACTOR = 1.15;   // = 15% smaller or larger
private int MINMAX = 5;
void picPanel_MouseWheel(object sender, MouseEventArgs e)
    {
        if (e.Delta > 0)
        {
            ZoomIn();
        }
        else
        {
            ZoomOut();
        }
    }

    private void ZoomIn()
    {
        if ((picBox.Width < (MINMAX * this.Width)) &&
            (picBox.Height < (MINMAX * this.Height)))
        {
            picBox.Width = Convert.ToInt32(picBox.Width * ZOOMFACTOR);
            picBox.Height = Convert.ToInt32(picBox.Height * ZOOMFACTOR);
        }
    } 
    private void picBox_MouseEnter(object sender, EventArgs e)
    {
        if (picBox.Focused) return;
        picBox.Focus();
    }

アップデート :

私はこれを試しました、それは働いているように見えます、しかしそれがそうであるべきであるように正確ではありません!! 何か案は?

    private void ZoomIn()
    {
        if ((picBox.Width < (MINMAX * this.Width)) &&
            (picBox.Height < (MINMAX * this.Height)))
        {
            picBox.Width = Convert.ToInt32(picBox.Width * ZOOMFACTOR);
            picBox.Height = Convert.ToInt32(picBox.Height * ZOOMFACTOR);

            Point p = this.AutoScrollPosition;
            int deltaX = e.X - p.X;
            int deltaY = e.Y - p.Y;
            this.AutoScrollPosition = new Point(deltaX, deltaY);
        }
    } 
4

2 に答える 2

2

問題は、コントロールがビューポートのように機能していることです。原点は左上にあるため、そのコーナーから画像を引き伸ばすたびに、結果として左上隅にズームインする必要があります。引き伸ばされた画像をオフセットし、ユーザーがズームインしたポイントを中央に配置します。

  • 画像サイズ:200,200
  • ユーザーが100,50をクリックして、2倍にズームインします
  • 画像を引き伸ばす
  • 画像サイズは400,400で、ユーザーがクリックした場所は実質的に200,100になります。
  • 画像のサイズを変更するには、画像を左に100ピクセル、上に50ピクセルスライドさせる必要があります。

paint画像オフセットを描画するには、イベントハンドラーをオーバーライドする必要があります。

 RectangleF BmpRect = new RectangleF((float)(Offset.X), (float)(Offset.Y), (float)(ZoomedWidth), (float)(ZoomedHeight));
  e.Graphics.DrawImage(Bmp, ViewPort , BmpRect, GraphicsUnit.Pixel);

Bmpはあなたのイメージです。ViewPortは、pictureBoxコントロールによって定義された長方形です。

これが役立つかもしれないスレッドです。

于 2012-05-22T00:41:25.870 に答える
2

これは、マウス位置でのズーム画像の例です....テスト済みで検証済みです。

protected override void OnMouseWheel(MouseEventArgs ea)
{
    //  flag = 1;
    // Override OnMouseWheel event, for zooming in/out with the scroll wheel
    if (picmap1.Image != null)
    {
        // If the mouse wheel is moved forward (Zoom in)
        if (ea.Delta > 0)
        {
            // Check if the pictureBox dimensions are in range (15 is the minimum and maximum zoom level)
            if ((picmap1.Width < (15 * this.Width)) && (picmap1.Height < (15 * this.Height)))
            {
                // Change the size of the picturebox, multiply it by the ZOOMFACTOR
                picmap1.Width = (int)(picmap1.Width * 1.25);
                picmap1.Height = (int)(picmap1.Height * 1.25);

                // Formula to move the picturebox, to zoom in the point selected by the mouse cursor
                picmap1.Top = (int)(ea.Y - 1.25 * (ea.Y - picmap1.Top));
                picmap1.Left = (int)(ea.X - 1.25 * (ea.X - picmap1.Left));
            }
        }
        else
        {
            // Check if the pictureBox dimensions are in range (15 is the minimum and maximum zoom level)
            if ((picmap1.Width > (imagemappan.Width)) && (picmap1.Height > (imagemappan.Height)))
            {
                // Change the size of the picturebox, divide it by the ZOOMFACTOR
                picmap1.Width = (int)(picmap1.Width / 1.25);
                picmap1.Height = (int)(picmap1.Height / 1.25);

                // Formula to move the picturebox, to zoom in the point selected by the mouse cursor
                picmap1.Top = (int)(ea.Y - 0.80 * (ea.Y - picmap1.Top));
                picmap1.Left = (int)(ea.X - 0.80 * (ea.X - picmap1.Left));
            }
        }
    }
}
于 2015-06-12T07:47:20.700 に答える