代码之家  ›  专栏  ›  技术社区  ›  mbeckish

C#、GDI+-为什么我的矩形被截断?

  •  2
  • mbeckish  · 技术社区  · 17 年前

    当我运行以下代码时:

        private void button1_Click(object sender, EventArgs e)
        {
            Bitmap b = new Bitmap(300, 400);
            using (Graphics g = Graphics.FromImage(b))
            {
                g.FillRectangle(Brushes.Black, new Rectangle(0, 0, 300, 400));
            }
    
            b.RotateFlip(RotateFlipType.Rotate90FlipNone);
    
            using (Graphics g2 = Graphics.FromImage(b))
            {
                g2.DrawRectangle(new Pen(Color.White, 7.2f), 200, 100, 150, 100);
            }
    
            using (Graphics g3 = this.panel1.CreateGraphics())
            {
                g3.DrawImage(b, 0, 0);
            }
        }
    

    我得到以下结果:

    alt text http://www.freeimagehosting.net/uploads/2c309ec21c.png

    笔记:

    • 原始的

    • 这种情况发生在各种场景中。我第一次注意到它是在一个更复杂的应用程序中——我写这个应用程序只是为了简单地说明这个问题。

    有人能看出我做错了什么吗?

    3 回复  |  直到 17 年前
        1
  •  7
  •   Oren Trutner    17 年前

    http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=96328 ).我能够重新解释你描述的问题。一种可能的解决方案是在第一个位图的基础上创建第二个位图,并在此基础上绘制。以下代码似乎绘制正确:

    private void button1_Click(object sender, EventArgs e) {
        Bitmap b = new Bitmap(300, 400);
        using (Graphics g = Graphics.FromImage(b)) {
            g.FillRectangle(Brushes.Black, new Rectangle(0, 0, 300, 400));
        }
    
        b.RotateFlip(RotateFlipType.Rotate90FlipNone);
        Bitmap b2 = new Bitmap(b);
    
        using (Graphics g2 = Graphics.FromImage(b2)) {
            g2.DrawRectangle(new Pen(Color.White, 7.2f), 200, 100, 150, 100);
        }
    
        using (Graphics g3 = this.panel1.CreateGraphics()) {
            g3.DrawImage(b2, 0, 0);
        }
    }
    

    alt text http://www.freeimagehosting.net/uploads/f6ae684547.png

        2
  •  0
  •   Francis B.    17 年前

    如果你改变矩形的位置,你就能完全看到它。

    using (Graphics g2 = Graphics.FromImage(b))
    {
        g2.DrawRectangle(new Pen(Color.White, 7.2f), 50, 50, 150, 100);
    }
    
        3
  •  0
  •   Igor Brejc    17 年前

    TryGdiPlus (对这类事情非常有用,顺便说一句)。

    g2.DrawRectangle(new Pen(Color.White, 7.2f), 200, 100, 99, 100);
    

    因此,即使在旋转后,位图的宽度看起来仍然是300像素。