0

Mouse_Up 時に C# Windows フォームで実行されるコード ブロックがあります。基本的には、レンダリングされたイメージをズームインし、ラバー バンドが描画されるたびにズームインし続けます。チェックボックスを追加してこれを逆にしたい (これは既に行っています)。チェックボックスがオンになっている場合は、代わりにラバーバンドの描画に従って現在のビューからズームアウトします。反対のオペランド、つまり「-」の代わりに「+」を使用するのと同じくらい簡単だと思いましたが、うまくいきません。以下にイベントコードを掲載しました。チェックボックスの状態を変更するための条件付き IF があります。最初のロットはズームインで問題なく動作します。ELSE IF の後のセクションではズームアウトできません。そのため、誰かが見られるように繰り返しコードをそこに残しました。ありがとう

private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        if (checkBox1.Checked == false)
        {
            int z, w;
            this.Cursor = Cursors.Arrow;
            // Set internal flag to know we no longer "have the mouse".
            weHaveMouse = false;
            // If we have drawn previously, draw again in that spot
            // to remove the lines.
            if (ptLast.X != -1)
            {
                toolStripStatusLabel1.Text = "Please click and drag to zoom into the Fractal";
                Point ptCurrent = new Point(e.X, e.Y);
                MyDrawReversibleRectangle(ptOriginal, ptLast);
            }
            // Set flags to know that there is no "previous" line to reverse.
            ptLast.X = -1;
            ptLast.Y = -1;
            ptOriginal.X = -1;
            ptOriginal.Y = -1;
            //e.consume();
            if (action)
            {
                xe = e.X;
                ye = e.Y;
                if (xs > xe)
                {
                    z = xs;
                    xs = xe;
                    xe = z;
                }
                if (ys > ye)
                {
                    z = ys;
                    ys = ye;
                    ye = z;
                }
                w = (xe - xs);
                z = (ye - ys);
                if ((w < 2) && (z < 2)) initvalues();
                else
                {
                    if (((float)w > (float)z * xy)) ye = (int)((float)ys + (float)w / xy);
                    else xe = (int)((float)xs + (float)z * xy);
                    xende = xstart + xzoom * (double)xe;
                    yende = ystart + yzoom * (double)ye;
                    xstart += xzoom * (double)xs;
                    ystart += yzoom * (double)ys;
                }
                xzoom = (xende - xstart) /(double)x1;
                yzoom = (yende - ystart) / (double)y1;
                mandelbrot();
                rectangle = false;
                //Refresh();
            }
        }
        else if (checkBox1.Checked == true)
        {
            int z, w;
            this.Cursor = Cursors.Arrow;
            // Set internal flag to know we no longer "have the mouse".
            weHaveMouse = false;
            // If we have drawn previously, draw again in that spot
            // to remove the lines.
            if (ptLast.X != -1)
            {
                toolStripStatusLabel1.Text = "Please click and drag to zoom into the Fractal";
                Point ptCurrent = new Point(e.X, e.Y);
                MyDrawReversibleRectangle(ptOriginal, ptLast);
            }
            // Set flags to know that there is no "previous" line to reverse.
            ptLast.X = -1;
            ptLast.Y = -1;
            ptOriginal.X = -1;
            ptOriginal.Y = -1;
            //e.consume();
            if (action)
            {
                xe = e.X;
                ye = e.Y;
                if (xs > xe)
                {
                    z = xs;
                    xs = xe;
                    xe = z;
                }
                if (ys > ye)
                {
                    z = ys;
                    ys = ye;
                    ye = z;
                }
                w = (xe - xs);
                z = (ye - ys);
                if ((w < 2) && (z < 2)) initvalues();
                else
                {
                    if (((float)w > (float)z * xy)) ye = (int)((float)ys + (float)w / xy);
                    else xe = (int)((float)xs + (float)z * xy);
                    xende = xstart + xzoom * (double)xe;
                    yende = ystart + yzoom * (double)ye;
                    xstart += xzoom * (double)xs;
                    ystart += yzoom * (double)ys;
                }
                xzoom = (xende - xstart) / (double)x1;
                yzoom = (yende - ystart) / (double)y1;
                mandelbrot();
                rectangle = false;
                //Refresh();
            }
        }

    }
4

1 に答える 1