2012-05-28 5 views
0

Je n'arrive pas à dessiner des graphiques sous une forme simple. Mon code compile et s'exécute, mais la boîte rouge prévue n'apparaît pas.Problèmes de dessin graphique

J'utilise le plein .NET Framework 4 dans Visual Studio 2010.

ce qui se passe mal, et comment peut-il être résolu?

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: travail lent Mais le 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); 
    } 
+0

S'il vous plaît changer le nom pour dessiner des graphiques de Trouble in C# comme le premier est évidemment possible. – Jay

+0

@Jay: Les titres ne doivent pas être marqués. – Ryan

+1

* N'utilisez jamais CreateGraphics() sauf si vous avez écrit une boucle de jeu qui met à jour la fenêtre 20 fois plus d'une seconde. Toujours implémenter l'événement Paint pour dessiner vos trucs lorsque Windows vous le demande. –

Répondre

5

Vous ne devriez pas faire votre dessin en cas Load, qui est tiré avant que le formulaire est même affiché pour la première fois. La fenêtre est repeinte lorsqu'elle est affichée, ce qui efface les graphiques que vous avez dessinés. Si vous voulez un rectangle persistant, gérer l'événement Paint à la place:

private void Form1_Paint(object sender, PaintEventArgs e) 
{ 
    System.Drawing.Graphics graphicsObj = e.Graphics; 
    Pen myPen = new Pen(System.Drawing.Color.Red, 5); 
    Rectangle myRectangle = new Rectangle(20, 20, 250, 200); 
    graphicsObj.DrawRectangle(myPen, myRectangle); 
} 

Si vous ne le faites pas voulez un rectangle persistant (très douteux, mais toujours possible), essayez de traiter l'événement Shown au lieu de l'événement Load .

Si les graphiques affichés seront mis à jour fréquemment (par exemple dans un jeu), assurez-vous de mettre DoubleBuffered à true et passer outre OnPaint au lieu de gérer un événement:

protected override void OnPaint(PaintEventArgs e) 
{ 
    Graphics g = e.Graphics; 
    Pen myPen = new Pen(Color.Red, 5); 
    g.DrawRectangle(myPen, 20, 20, 250, 200); 
} 
+0

Merci pour cela, fonctionne bien, mais prend environ 0,2 seconde pour 100 objets. – Reid

+0

@Reid: Comment dessinez-vous ces objets? – Ryan

+0

en utilisant un objet rectangle dessiné en utilisant 'drawElipse' 100 fois – Reid