Graphics.DrawString не работает
Я хочу нарисовать текст поверх PictureBox в цикле foreach. Это код, который отвечает за рендеринг (GG - это PictureBox, который в данный момент находится в цикле)
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 является дочерним элементом другого 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));
}
}
3 ответа
Вы изменили содержимое изображения, но PictureBox совершенно не знает об этом. Вы не переназначили его свойство Image. Вам нужно будет сказать ему, что ему нужно перерисовать изображение, отображаемое на экране. Добавьте эту строку кода:
GG.Invalidate();
Просто нарисуйте 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;
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;
Согласно ответу Стивена Хоубена, я вставляю свою версию C#. Работает нормально. Спасибо @StevenHouben.