Ниже приведено решение, которое я в итоге придумала. Это некрасиво и, вероятно, может быть упрощено, но это работает. Идея состоит в том, чтобы создать объект BufferedGraphics на основе исходного объекта Graphics (то есть экрана). В объекте BufferedGraphics TextRenderer.DrawText () отобразит текст точно так же, как если бы он рисовал на экране. Затем я создаю обычный графический объект, копирую объект Buffered Graphics в обычный графический объект и, наконец, рисую обычный графический объект на экране.
Rectangle inner = new Rectangle(Point.Empty, ContentRectangle.Size);
using (BufferedGraphics bg = BufferedGraphicsManager.Current.Allocate(e.Graphics, inner)) {
using (Bitmap bmp = new Bitmap(inner.Width, inner.Height, bg.Graphics)) {
using (Graphics bmpg = Graphics.FromImage(bmp)) {
bg.Graphics.Clear(BackColor);
do_my_drawing(bg.Graphics);
bg.Graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
e.Graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
bmpg.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
bg.Render(bmpg);
e.Graphics.DrawImageUnscaledAndClipped(bmp, ContentRectangle);
}
}
}
Установка всех атрибутов CompositingMode, вероятно, не является необходимой, но как только я начал работать, я не стал проверять все перестановки, чтобы выяснить, какие из них, если таковые имеются, необходимы.