Hi, The exception class is System.InvalidOperationException. The Graphics class is as provided by the paint event handler (this is the overriden method protected override void OnPaint(PaintEventArgs e)). The font object is generated by:
Font activeFont = SystemFonts.DefaultFont;
if(series of conditions)
activeFont = new Font(activeFont, FontStyle.Bold);
Here is the exception information: System.InvalidOperationException was unhandled Message="Object is currently in use elsewhere." Source="System.Drawing" StackTrace: at System.Drawing.Graphics.CheckErrorStatus(Int32 status) at System.Drawing.Graphics.DrawLine(Pen pen, Single x1, Single y1, Single x2, Single y2) Whilst the above suggests that the problem is related to the 'DrawLine' method, just simply removing the 'TextFormatFlags.ModifyString' flag prevents the crash from occurring. For my particular application all I needed was a boolean value which indicates whether the output text was truncated or not. Whilst I have found a workaround for this (listed below), I am still interested to find out why this exception is being thrown...I have double-checked my code and I cannot understand how the objects are being used elsewhere because they are pretty much created each time the paint event is handled. The only things which are in common are the data item and the user control itself.
// Use text renderer to output required text.
if (extraLabelBounds.Width > 0)
TextRenderer.DrawText(ctx.Graphics, itemLabel, activeFont, Rectangle.Round(extraLabelBounds), textColour, backgroundColor, TextFormatFlags.EndEllipsis);
// NOTE: Unfortunately the following is probably less efficient than with the alternative flag...
// Measure string both with and without end ellipsis to determine if string has overflown or not.
Size measuredA = TextRenderer.MeasureText(ctx.Graphics, itemLabel, activeFont);
Size measuredB = TextRenderer.MeasureText(ctx.Graphics, itemLabel, activeFont, Size.Round(extraLabelBounds.Size), TextFormatFlags.EndEllipsis);
// If label rendered label length is different to the actual item label then a
// tooltip will be made available.
bool hasOverflown = !measuredA.Equals(measuredB);
Thanks, Lea Hayes