i have build a user control in C# 2.0 using a panel and the 2Dgraphics namespace members. it renders perfectly until i do a matrix rotation. whilst in design mode, with the control on a test form, the rotation works like it should, but when i grab the control's handles to resize it, the graphics do not stay put inside the control. they tend to drag around by some seemingly proportional factor.
i have tried many ways around this to no avail...hoping you may have some new ideas i haven't tried.
thanks in advance
here's most of the rubber-meets-the-road code:
private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
if (orient != Orient.Up)
{
panel1_Paint_Oriented(sender, e);
}//if(invertImage)
else
{
// Set up the rotation transformation
// Rotate about the middle of the page by the associated orientation degrees
System.Drawing.Drawing2D.Matrix m = new Matrix();
//Point MiddleOfPage = new Point( iMiddle_Horizontal, iMiddle_Vertical );
Point MiddleOfPage = new Point(0,iMiddle_Vertical);
m.RotateAt( angle, MiddleOfPage, MatrixOrder.Append );
e.Graphics.Transform = m;
String intercharacterGap = "0";
//surround the incoming string (barcode.code) with the requisite "*" chars to delimit a barcode
String str = '*' + code.ToUpper() + '*';
int strLength = str.Length;
//parse the string for embedded invalid characters
for (int i = 0; i < code.Length; i++)
{
if (alphabet39.IndexOf(code[i]) == -1 || code[i] == '*')
{
e.Graphics.DrawString("INVALID BAR CODE TEXT", Font, Brushes.Red, 10, 10);
//bail
return;
}
}
//everything looks copesetic...
//calculate the horizontal and vertical drawing starting points ==================================================
//determine the horizontal offsets-------------------------------------------------------------------------
//build the encoded barcode from the normal text string
String encodedString = "";
for (int i = 0; i < strLength; i++)
{
if (i > 0)
{
//stuff in a separator character
encodedString += intercharacterGap;
}//if (i > 0)
//look into the array and add the 39 code for this character to the running barcode
encodedString += coded39Char[alphabet39.IndexOf(str[i])];
}//for ( int i=0;i<strLength;i++ )
//there will be a combination of 9 "0"'s and "1"'s, plus the separator char, for each normal char
int encodedStringLength = encodedString.Length;
int widthOfBarCodeString = 0;
double wideToNarrowRatio = 3;
//determine the relative width of the rendered barcode
if (horAlign != HorAlignType.Left)
{
//
for (int i = 0; i < encodedStringLength; i++)
{
if (encodedString[i] == '1')
widthOfBarCodeString += (int)(wideToNarrowRatio * (int)weight);
else
widthOfBarCodeString += (int)weight;
}//for ( int i=0;i<encodedStringLength; i++)
}//if (horAlign != HorAlignType.Left)
//initialize our barcode drawing offsets
int x = 0;
int wid = 0;
int yTop = 0;
//determine the enclosing rectangle for the header and footer
//header dims (height & width), depending on the font used
hSize = e.Graphics.MeasureString(headerText, headerFont);
//footer dims (height & width), depending on the font used
fSize = e.Graphics.MeasureString(code, footerFont);
//header & footer drawing offsets
int headerX = 0;
int footerX = 0;
if (horAlign == HorAlignType.Left)
{
//everything starts at the left margin
x = leftMargin;
headerX = leftMargin;
footerX = leftMargin;
}
else if (horAlign == HorAlignType.Center)
{
//half the difference between the barcode width and the control's width
x = (Width - widthOfBarCodeString) / 2;
//half the difference between the header width and the control's width
headerX = (Width - (int)hSize.Width) / 2;
//half the difference between the footer width and the control's width
footerX = (Width - (int)fSize.Width) / 2;
}
else
{
//right-justified
//the whole diff between the barcode and control widths
x = Width - widthOfBarCodeString;// - leftMargin;
headerX = Width - (int)hSize.Width;// - leftMargin;
footerX = Width - (int)fSize.Width;// - leftMargin;
}
//determine the barcode's vertical offset-----------------------------------------------------------------
if (showHeader)
{
//compensate for the header size and any prescribed top margin
yTop = (int)hSize.Height + topMargin;
//go ahead and draw the header while we're here...
e.Graphics.DrawString(headerText, headerFont, Brushes.Black, headerX, topMargin);
}
else
{
yTop = topMargin;
}
//build the complete barcode by drawing each vertical bar element as we go
for (int i = 0; i < encodedStringLength; i++)
{
if (encodedString[i] == '1')
wid = (int)(wideToNarrowRatio * (int)weight);
else
wid = (int)weight;
e.Graphics.FillRectangle(i % 2 == 0 ? Brushes.Black : Brushes.White, x, yTop, wid, height);
x += wid;
}
yTop += height;
//cache the current status of the graphics
currentOrient = orient;
controlWidth = x + (LeftMargin * 2); //x=>width of rendered barcode
controlHeight = yTop; //top margin + header (if any) height + barcode height
if (showFooter)
{
e.Graphics.DrawString(code, footerFont, Brushes.Black, footerX, yTop);
//add the height of the footer to the overall graphics limits
controlHeight += (int)fSize.Height;
}//if
}
}