0

我有一个大小为 1000、20 的 PictureBox,我在 Form_Load 事件中设置它的位图:

void Form1_Load ( object sender, EventArgs e )
{
    SetProgressBar ( pictureBox1, 25 );
}

void SetProgressBar ( PictureBox pb, int progress )
{
    Bitmap bmp = new Bitmap ( 100, 1 );

    using ( Graphics gfx = Graphics.FromImage ( bmp ) )
    using ( SolidBrush brush = new SolidBrush ( System.Drawing.SystemColors.ButtonShadow ) )
    {
        gfx.FillRectangle ( brush, 0, 0, 100, 1 );
    }

    for ( int i = 0; i < progress; ++i )
    {
        bmp.SetPixel ( i, 0, Color.DeepSkyBlue );
    }

    // If I don't set the resize bitmap size to height * 2, then it doesn't fill the whole image for some reason.
    pb.Image = ResizeBitmap ( bmp, pb.Width, pb.Height * 2, progress );
}

public Bitmap ResizeBitmap ( Bitmap b, int nWidth, int nHeight, int progress )
{
    Bitmap result = new Bitmap ( nWidth, nHeight );

    StringFormat sf = new StringFormat ( );
    sf.Alignment = StringAlignment.Center;
    sf.LineAlignment = StringAlignment.Center;
    Font font = new Font ( FontFamily.GenericSansSerif, 10, FontStyle.Regular );

    using ( Graphics g = Graphics.FromImage ( ( Image ) result ) )
    {
            // 20 is the height of the picturebox
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
        g.DrawImage ( b, 0, 0, nWidth, nHeight );
        g.DrawString ( progress.ToString ( ), font, Brushes.White, new RectangleF ( 0, -1, nWidth, 20 ), sf );
    }
    return result;
}

在我将 BorderStyle 设置为 FlatSingle 之前,一切看起来都很棒。它在最后创造了一个差距。我该如何解决这个问题,让它看起来仍然是全彩色的?

编辑:这就是它的外观:

在此处输入图像描述

4

1 回答 1

2

似乎添加边框会增加图片框的大小。我将您的示例设置为 BorderStyle 设置为 FixedSingle、None 和 Fixed3D,每个结果都不同。这些 PictureBox 中的每一个都从相同的位置开始,您可以看到可见宽度实际上已经改变。

在此处输入图像描述

它在 FixedSingle 上约为 4 像素,在 Fixed3D 上约为 2 像素。我不确定引擎盖下发生了什么,但你应该能够像这样围绕它进行编码。

 if (pb.BorderStyle == BorderStyle.FixedSingle)
     pb.Image = ResizeBitmap(bmp, pb.Width + 4, pb.Height * 2, progress);
 else if (pb.BorderStyle == BorderStyle.Fixed3D)
     pb.Image = ResizeBitmap(bmp, pb.Width + 2, pb.Height * 2, progress);
 else 
     pb.Image = ResizeBitmap(bmp, pb.Width, pb.Height * 2, progress);

这给出了一个看起来像这样的结果。

在此处输入图像描述


如果您查看DisplayRectangle属性,您将看到您的客户矩形在您更改 BorderStyle 时正在发生变化:

BorderStyle.None = 1000 像素
BorderStyle.Fixed3D = 996 像素
BorderStyle.FixedSingle = 998 像素

于 2012-06-09T21:32:58.273 回答