none
为什么Drawstring 在Form与Bitmap上的效果不一样 RRS feed

  • 问题

  • 这张图由以下代码产生。
    左面的是用DrawString函数直接绘制在Form上的,右面的是在Bitmap对象中绘制好后,DrawImage到窗体上的。
    可以看到文本显示效果非常不同。
    因为我想使用双缓冲,把大量文本先绘制在BitMap上,再让它显示出来,但是两种显示效果不一样是无法容忍的。
    请问,这是为什么?怎样让两种方法绘制的文本显示效果一模一样
    即使换了字体,两种方法的显示效果仍然不一致。
    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        
        bmp = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);
        Graphics gBmp = Graphics.FromImage(bmp);//内存位图
        Graphics gForm = e.Graphics;//Form
        for (int i = 1; i < 20; i++)
        {
            System.Drawing.Font f = new Font("宋体", i, FontStyle.Regular);
            gForm.DrawString("this is a test", f, Brushes.Black, new PointF(10f, i*Font.Height));
            gBmp.DrawString("this is a test", f, Brushes.Black, new PointF(0f, i * Font.Height));
        }
        gForm.DrawImage(bmp, new Point(200, 0));
    }
    2011年10月7日 8:46

答案

  • 可能是因为gBmp有2层背景颜色的原因。
    如果你把gBmp的背景颜色设置为透明或者白色的话,就会看到gForm和gBmp是一样的。
    如下代码:
                Bitmap bmp = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);
    
                Graphics gBmp = Graphics.FromImage(bmp);//内存位图
    
                Graphics gForm = e.Graphics;//Form
                gBmp.FillRectangle(new SolidBrush(Color.FromArgb(255, 255, 255)), 0, 0, 300, 400);     //重新绘制一个区域,放置gBmp。背景颜色为白色。
    
    
                for (int i = 1; i < 20; i++)
                {
                    System.Drawing.Font f = new Font("宋体 ", i, FontStyle.Regular);
    
                    gForm.DrawString("this is a test", f, Brushes.Black, new PointF(10f, i * Font.Height));
    
             gBmp.DrawString("this is a test", f, Brushes.Black, new PointF(0f, i * Font.Height));
    
                }
    
                gForm.DrawImage(bmp, new Point(200, 0));
    

    效果图:
    当然我的窗体背景颜色也是白色的。 

    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 arongsuyila 2011年10月10日 12:58
    2011年10月10日 7:23
    版主

全部回复

  • 把画图挪到Form1_Paint外试试,比如FormLoad里

    2011年10月9日 5:06
  • 可能是因为gBmp有2层背景颜色的原因。
    如果你把gBmp的背景颜色设置为透明或者白色的话,就会看到gForm和gBmp是一样的。
    如下代码:
                Bitmap bmp = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);
    
                Graphics gBmp = Graphics.FromImage(bmp);//内存位图
    
                Graphics gForm = e.Graphics;//Form
                gBmp.FillRectangle(new SolidBrush(Color.FromArgb(255, 255, 255)), 0, 0, 300, 400);     //重新绘制一个区域,放置gBmp。背景颜色为白色。
    
    
                for (int i = 1; i < 20; i++)
                {
                    System.Drawing.Font f = new Font("宋体 ", i, FontStyle.Regular);
    
                    gForm.DrawString("this is a test", f, Brushes.Black, new PointF(10f, i * Font.Height));
    
             gBmp.DrawString("this is a test", f, Brushes.Black, new PointF(0f, i * Font.Height));
    
                }
    
                gForm.DrawImage(bmp, new Point(200, 0));
    

    效果图:
    当然我的窗体背景颜色也是白色的。 

    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 arongsuyila 2011年10月10日 12:58
    2011年10月10日 7:23
    版主