I am having trouble drawing graphics on a simple form. My code compiles and runs, but the intended red box does not show up.
I am using the full .NET Framework 4 in Visual Studio 2010.
What is going wrong, and how can it be fixed?
private void Form1_Load(object sender, EventArgs e)
{
System.Drawing.Graphics graphicsObj;
graphicsObj = this.CreateGraphics();
Pen myPen = new Pen(System.Drawing.Color.Red, 5);
Rectangle myRectangle = new Rectangle(20, 20, 250, 200);
graphicsObj.DrawRectangle(myPen, myRectangle);
}
EDIT: Working But Slow Code
void BatteryPaint(object sender, EventArgs e)
{
TabPage page = (TabPage)sender;
if (!controlsSetup)
{
populateBatteryTab(page);
controlsSetup = true;
}
//Create the items
Rectangle busBar = new Rectangle();
Rectangle batPack = new Rectangle();
Rectangle pack1Outline = new Rectangle();
Rectangle pack2Outline = new Rectangle();
Rectangle pack3Outline = new Rectangle();
Rectangle pack4Outline = new Rectangle();
Color GreenZone = Color.FromArgb(150, 0, 255, 0);
Color YellowZone = Color.FromArgb(150, 255, 255, 0);
Color RedZone = Color.FromArgb(150, 255, 0, 0);
Color greyZone = Color.FromArgb(200, 200, 200, 200);
Graphics graphicControl = page.CreateGraphics();
SolidBrush busBarBrush = new SolidBrush(Color.Peru);
SolidBrush GreenBrush = new SolidBrush(GreenZone);
SolidBrush GreyBrush = new SolidBrush(greyZone);
Pen packPen = new Pen(Color.LightGray, (float)8);
Point busBarTop = new Point(page.Width / 64, page.Height / 32);
Point busBarBottom = new Point(busBarTop.X, busBarTop.Y + page.Height / 6);
//change the properties
//Bus Bar Top
busBar.Width = page.Width*153 / 640;
busBar.Height = page.Height / 64;
busBar.Location = busBarTop;
graphicControl.FillRectangle(busBarBrush, busBar);
//Bus Bar Bottom
busBar.Location = busBarBottom;
graphicControl.FillRectangle(busBarBrush, busBar);
//Pack 1
batPack.Width = page.Width / 20;
batPack.Height = (busBarBottom.Y + busBar.Height) - busBarTop.Y;
batPack.Location = new Point(busBarTop.X + page.Width / packSpacingMultiplier, busBarTop.Y);
pack1Outline.Width = batOutlineWidth;
graphicControl.FillRectangle(GreenBrush, batPack);
pack1Outline.Height = (3 * (Battery.Width + page.Width / batSpacingMultiplier) + page.Width / batSpacingMultiplier);
pack1Outline.Location = new Point(BatPack1.X - (page.Width / batSpacingMultiplier), BatPack1.Y - (page.Width / batSpacingMultiplier));
for(int numBats = 0; numBats < 30; numBats++)
{
Battery.Location = new Point(BatPack1.X + ((numBats % 10) * (Battery.Width + page.Width / batSpacingMultiplier)), BatPack1.Y + ((numBats / 10) * (Battery.Width + page.Width / batSpacingMultiplier)));
graphicControl.FillEllipse(new SolidBrush(BatteryZone(0.00)), Battery);
}
//Pack 2
batPack.Location = new Point(batPack.Location.X + batPack.Width + page.Width / packSpacingMultiplier, batPack.Location.Y);
graphicControl.FillRectangle(GreenBrush, batPack);
pack2Outline.Width = batOutlineWidth;
pack2Outline.Height = (3 * (Battery.Width + page.Width / batSpacingMultiplier) + page.Width / batSpacingMultiplier);
pack2Outline.Location = new Point(BatPack2.X - (page.Width / batSpacingMultiplier), BatPack2.Y - (page.Width / batSpacingMultiplier));
for(int numBats = 0; numBats < 30; numBats++)
{
Battery.Location = new Point(BatPack2.X + ((numBats % 10) * (Battery.Width + page.Width / batSpacingMultiplier)), BatPack2.Y + ((numBats / 10) * (Battery.Width + page.Width / batSpacingMultiplier)));
graphicControl.FillEllipse(new SolidBrush(BatteryZone(0.00)), Battery);
}
//Pack 3
batPack.Location = new Point(batPack.Location.X + batPack.Width + page.Width / packSpacingMultiplier, batPack.Location.Y);
graphicControl.FillRectangle(GreenBrush, batPack);
pack3Outline.Width = batOutlineWidth;
pack3Outline.Height = (3 * (Battery.Width + page.Width / batSpacingMultiplier) + page.Width / batSpacingMultiplier);
pack3Outline.Location = new Point(BatPack3.X - (page.Width / batSpacingMultiplier), BatPack3.Y - (page.Width / batSpacingMultiplier));
for(int numBats = 0; numBats < 30; numBats++)
{
Battery.Location = new Point(BatPack3.X + ((numBats % 10) * (Battery.Width + page.Width / batSpacingMultiplier)), BatPack3.Y + ((numBats / 10) * (Battery.Width + page.Width / batSpacingMultiplier)));
graphicControl.FillEllipse(new SolidBrush(BatteryZone(0.00)), Battery);
}
//Pack 4
batPack.Location = new Point(batPack.Location.X + batPack.Width + page.Width / packSpacingMultiplier, batPack.Location.Y);
graphicControl.FillRectangle(GreyBrush, batPack);
pack4Outline.Width = batOutlineWidth;
pack4Outline.Height = (3 * (Battery.Width + page.Width / batSpacingMultiplier) + page.Width / batSpacingMultiplier);
pack4Outline.Location = new Point(BatPack4.X - (page.Width / batSpacingMultiplier), BatPack4.Y - (page.Width / batSpacingMultiplier));
for(int numBats = 0; numBats < 30; numBats++)
{
Battery.Location = new Point(BatPack4.X + ((numBats % 10) * (Battery.Width + page.Width / batSpacingMultiplier)), BatPack4.Y + ((numBats / 10) * (Battery.Width + page.Width / batSpacingMultiplier)));
graphicControl.FillEllipse(new SolidBrush(BatteryZone(0.00)), Battery);
}
//add the controls
graphicControl.DrawRectangle(packPen, pack1Outline);
graphicControl.DrawRectangle(packPen, pack2Outline);
graphicControl.DrawRectangle(packPen, pack3Outline);
graphicControl.DrawRectangle(packPen, pack4Outline);
}
You shouldn’t do your drawing in the
Loadevent, which is fired before your form is even displayed for the first time. The window is repainted when it is displayed, which clears the graphics you’ve drawn. If you want a persistent rectangle, handle thePaintevent instead:If you don’t want a persistent rectangle (highly doubtful, but still possible), try handling the
Shownevent instead of theLoadevent.If the graphics displayed will be updated frequently (e.g. in a game), make sure to set
DoubleBufferedtotrueand overrideOnPaintinstead of handling an event: