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 に設定して例を設定しましたが、結果はそれぞれ異なりました。これらの各 PictureBoxes は、表示される幅が実際に変更されていることがわかるように、同じ位置から開始しています。

ここに画像の説明を入力

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 に答える