Java 到 C# 的转换。如何在位图上绘制矩形?

2024-01-20

首先,我对 C# 和 Java 都是菜鸟。

因此,我被分配了将 java 小程序转换为 C# 的任务,除了使用鼠标事件通过拖放在屏幕上绘制矩形之外,我还成功完成了所有操作。

应该发生的情况是,当我单击鼠标并在屏幕上拖动鼠标时,应该会出现一个没有填充和白色边框的矩形。我下面的代码只是一个白色的屏幕,上面有一个红十字,如果我注释掉 form1_Paint 中的 if(action) 语句,那么它可以工作,但没有矩形,所以一定是那个代码搞乱了它。

http://gyazo.com/b2506b8c2ea9b304e34172c42ce98aab http://gyazo.com/b2506b8c2ea9b304e34172c42ce98aab

http://gyazo.com/a8764ac9f5380f0109623d7a7750ddb6 http://gyazo.com/a8764ac9f5380f0109623d7a7750ddb6

[update]

我现在有一个要显示的矩形,但它发生在 MouseUp 事件上,而不是在我拖动鼠标时创建它。显而易见的下一步是将其移动到不同的鼠标事件,例如 mouseMove,但当我将其变大时,它确实会变得混乱并不断创建矩形。如何让它在拖动鼠标时不断调整矩形大小而不是不断创建矩形? 代码

   private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Graphics g1 = e.Graphics;
        g1.DrawImage(bitmap, 0, 0, x1, y1);

    }
    //added load method
    private void Form1_Load(object sender, EventArgs e)//runs functions on load
    {
        init();
        start();

    }
    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        if (action)
        {
            xe = e.X;
            ye = e.Y;

        }




    }

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        action = true;
        // e.consume();  
        xs = xe = e.X;
        ys = ye = e.Y; // starting point y
         Form1_MouseMove(sender, e);
         this.Invalidate();

    }

    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
          using (Graphics g = this.CreateGraphics())
            {
                Pen pen = new Pen(Color.White);
                g.DrawRectangle(pen, xs, ys, Math.Abs(xs - xe), Math.Abs(ys - ye));

            }

        int z, w;  
        //e.consume();

            //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();

            this.Invalidate();
            //Repaint();



    }

您的代码中最大的问题是以下语句Form1_Paint() method:

g1.Dispose();

你应该never处置Graphics实例传递给你。它属于框架,而不是您的代码。但您尤其不应该丢弃您打算稍后使用的物品。当你把它扔在这里时,那么Graphics当您稍后尝试绘制矩形时,实例无效。

请注意,这与 Java 中的相同。我希望原来的Java代码没有调用Graphics.dispose() too!

其他一些建议:

  • 当创建一个新的Pen对象,添加一个using声明以确保Pen您创建的实例已正确处理(您确实拥有该实例!:))。但在这种情况下,您不需要创建新的Pen对象...只需使用库存Pen由.NET 提供。 IE。Pens.White.
  • 你似乎没有打电话Invalidate() in the MouseDown and MouseMove事件处理程序。除非您这样做,否则您将不会获得任何视觉反馈,因为不会调用 Paint 事件处理程序。

修复代码,使其看起来像这样:

// Little helper method :)
private static void Swap<T>(ref T t1, ref T t2)
{
    T temp = t1;
    t1 = t2;
    t2 = t1;
}

private void Form1_Paint(object sender, PaintEventArgs e)
{
    Graphics g1 = e.Graphics;
    g1.DrawImage(bitmap, 0, 0, x1, y1);

    if (action)
    {
        //g.setColor(Color.White);
        if (xe < xs)
        {
            Swap(ref xs, ref xe);
        }

        if (ye < ys)
        {
            Swap(ref ys, ref ye);
        }

        g1.DrawRectangle(Pens.White, xs, ys, (xe - xs), (ye - ys));
    }
}

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
   // e.consume();
    if (action)
    {
        xe = e.X;
        ye = e.Y;
        Invalidate();
        //repaint();
    }

}

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    action = true;
    // e.consume();
    if (action)
    {
        xs = xe = e.X;
        ys = ye = e.Y;
        Invalidate();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 到 C# 的转换。如何在位图上绘制矩形? 的相关文章

随机推荐