3

ユーザーが画像をアップロードし、特定の場所(現在のマウスポインター)で画像を拡大および縮小できるアプリケーションを作成しています。

また、ユーザーは画像をドラッグして、画像がズームされているときに画像の他の部分を表示できる必要があります。

それを実現するためにいくつかの機能を実装しましたが、イメージ全体をスケーリングしています。画像の特定の部分を拡大縮小する方法、または画像全体を拡大縮小してから、現在のマウス ポインターが配置されている場所をポイントする方法を知りたいです。

コード:

private void DisplayIsdDiagram(BO.IsdDiagram IsdDiagram)
{
    DoubleBuffered = true;
    zoomFac = 1;
    translateX = 0;
    translateY = 0;
    transStartX = 0f;
    transStartY = 0f;

    picIsdDiagram.BorderStyle = BorderStyle.Fixed3D;
    bmp = new Bitmap(Image.FromStream(new MemoryStream(IsdDiagram.Image.ToArray())));

    if (bmp.Width > bmp.Height)
    {
        ratio = (float)picIsdDiagram.Width / (float)bmp.Width;
        translateRatio = (float)bmp.Width / (float)picIsdDiagram.Width;
    }
    else
    {
        ratio = (float)picIsdDiagram.Height / (float)bmp.Height;
        translateRatio = (float)bmp.Height / (float)picIsdDiagram.Height;
    }

    //picIsdDiagram.Image = bmp;

    picIsdDiagram.Refresh();
    picIsdDiagram.MouseWheel += new MouseEventHandler(picIsdDiagram_MouseWheel);
}

private void picIsdDiagram_MouseWheel(object sender, MouseEventArgs e)
{
    IsZooming = true;

    if (e.Delta < 0)
    {
        if (zoomFac > 1)
            zoomFac = zoomFac - (float)0.1;
    }
    else
    {
        if (zoomFac <= 5)
            zoomFac = zoomFac + (float)0.1;
    }

    picIsdDiagram.Refresh();
    IsZooming = false;
}

private void picIsdDiagram_MouseDown(object sender, MouseEventArgs e)
{
    IsZooming = false;
    IsMouseDown = true;

    transStartX = e.X;
    transStartY = e.Y;
}

private void picIsdDiagram_MouseUp(object sender, MouseEventArgs e)
{
    IsZooming = false;
    IsMouseDown = false;

    translateX = translateX + ((e.X - transStartX) * (translateRatio / zoomFac));
    translateY = translateY + ((e.Y - transStartY) * (translateRatio / zoomFac));

    picIsdDiagram.Refresh();
}

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

    g.ScaleTransform(ratio * zoomFac, ratio * zoomFac);

    if (IsZooming == false && IsMouseDown == true)
        g.TranslateTransform(translateX, translateY);

    g.DrawImage(bmp, 0, 0);
}

MouseHover イベントから現在のマウス位置を取得しようとし、ズームのみが完了したときに画像を翻訳しようとしましたが、うまくいきません。

また、Picture Box には他の複数の Picture ボックスが含まれており、大きな画像で何らかの表現を表示できます。大きな画像をスケーリングする際、小さな画像 (画像内) はスケーリングしないでください。大きな画像をズームした後でも、実際の場所でそれらを表示するには、位置を再計算する必要があります。

上記のように、私は2つの問題に直面しています:

1) スクロールして特定の場所 (現在のマウス ポインター) で画像をズームするには。

2) ズームおよび移動中にサブ画像の座標を再生成する。

私を正しい方向に導くことができる助け。

また、他の手段があれば、この機能を実現できます。

アプリケーション: Windows

コントロール:ピクチャーボックス

言語 : C#

応答を待っています!

4

1 に答える 1