简单的说,这是因为DrawRectangle的时候要画边框,实际面积要比Rectangle多一些。
而FillRectangle,则只是填充Rectangle的实际面积。

假设一个矩形(1,1,4,4),它的长宽各为4,理论面积为16,位置为(1,1)。
那么填充的时候,需要16个像素。

而当我们画矩形的时候,需要线条,假设线条的粗细为1。公平起见,线条的一半落在矩形里,线条的一半落在矩形外。
因此,这时含边框的矩形,实际占有了25个象素的面积,比理论矩形,长宽各多出了一个像素。

为什么多出的一个像素,要偏在右下方呢?
GDI+也想公平地画在的中间。但是,这就带来了骑墙的半个象素如何处理的问题。
因此,默认上GDI+就采用了最快的取整方法。也就造成你观察到的“右下边框不见”的现象。

实际上,GDI+也可以用偏移0.5的处理方法,并用抗锯齿的方式来展现半个像素。
因此,你这样画,既可以见到边框了:

private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.SmoothingMode = SmoothingMode.HighQuality;  // 抗锯齿
            g.PixelOffsetMode = PixelOffsetMode.Half;         // 偏移0.5
            g.DrawRectangle(new Pen(Color.Red,5f), 0,0,pictureBox1.Width,pictureBox1.Height);
        }

如果代码如下

private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            //g.SmoothingMode = SmoothingMode.HighQuality;  // 抗锯齿
            //g.PixelOffsetMode = PixelOffsetMode.Half;         // 偏移0.5
            g.DrawRectangle(new Pen(Color.Red,1f), 0,0,pictureBox1.Width,pictureBox1.Height);
        }

还有一种办法是绘制矩形是的宽高比画布小一也可以完全绘制矩形。