kjward 7 Newbie Poster

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


            }
        }