2014-01-26 2 views
1

Я хочу нарисовать текст над PictureBox в цикле foreach. Это код, который отвечает за предоставление (GG является PictureBox, что в настоящее время в петле)Graphics.DrawString не работает

if (GG != null) 
     { 
      ((PictureBox)GG).Image = (Image)obj; 
      using (Graphics g = ((PictureBox)GG).CreateGraphics()) { 
      g.DrawString(i["amount"].ToString(), kryptonRichTextBox1.Font, 
      new SolidBrush(Color.Gold), new Point(16, 18)); 
     } 

} 

Но, к сожалению, текст не отображается. Если я прокомментирую

//((PictureBox)GG).Image = (Image)obj; 

линия, это действительно работает! Я понятия не имею, как заставить его работать.

Я хотел использовать TextRenderer, но я не знаю, как получить IDeviceContext элемента управления (и все примеры, которые я вижу в Интернете, используют PaintEventArgs.Graphics в событии Paint).

Также, если это имеет значение, GG PictureBox является дочерним элементом другого графического ящика и имеет прозрачный фон.

Я пытался обновить окно после недействительности, рабочий код:

if (GG != null) 
     { 
      ((PictureBox)GG).Image = (Image)obj; 
      ((PictureBox)GG).Invalidate(); 
      ((PictureBox)GG).Refresh(); 
      using (Graphics g = ((PictureBox)GG).CreateGraphics()) { 
      g.DrawString(i["amount"].ToString(), kryptonRichTextBox1.Font, 
      new SolidBrush(Color.Gold), new Point(16, 18)); 
     } 

} 

ответ

2

Вы изменили содержание изображения, но PictureBox совершенно не знают об этом. Вы не переназначили его свойство Image. Вам нужно будет сказать, что ему нужно перерисовать изображение, отображаемое на экране. Добавьте эту строку кода:

GG.Invalidate(); 
+0

Я попытался добавить это ниже ((PictureBox) GG) .Image = (Image) obj; line, и текст мигает в течение секунды и исчезает. – niklon

+0

Решенный, ответьте на вопрос. – niklon

+0

Хмм, нет, вы все еще ошибаетесь, заставляя перекрашивать * до того, как вы изменили изображение. Используйте Invalidate(), никогда не используйте пункт Refresh(). –

1

Просто рисовать на Bitmap и показать его в PictureBox:

// A new bitmap with the same size as the PictureBox 
var bitmap = new Bitmap(pictureBox.Width, pictureBox.Height); 

//Get the graphics objectm which we can use to draw 
var graphics = Graphics.FromImage(bitmap); 

//Draw stuff 
graphics.DrawString(i["amount"].ToString(), kryptonRichTextBox1.Font, 
     new SolidBrush(Color.Gold), new Point(16, 18)); 

//Show the bitmap with graphics image in the PictureBox 
pictureBox.Image = bitmap; 
0
 Image digidashboard = new Bitmap(Properties.Resources.digidashboard); 
     //using (Graphics g = ((PictureBox)pictureBoxDashboard).CreateGraphics()) 
     //{ 
     // g.DrawString("80.00", this.Font, new SolidBrush(Color.Red), 3, 6); 
     // pictureBoxUnlock.Image = digidashboard; 
     // pictureBoxDashboard.Invalidate(); 
     //} 
     Graphics g = Graphics.FromImage(digidashboard); 
     g.DrawString("80.00", this.Font, new SolidBrush(Color.Red), 3, 6); 
     pictureBoxDashboard.Image = digidashboard; 

Согласно ответу StevenHouben, я наклеить мой C# версии. Он работает нормально. Спасибо @StevenHouben.

Смежные вопросы