I designed the following user control to scroll SMS messages, one instance of it will work fine but when I declared two on the same form it became very very slow. Here is the OnPaint function and another function for processing smileys.protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) { base.OnPaint(e); if (bGradientEnabled) { // Draw the background LinearGradientBrush bgbrush1 = new LinearGradientBrush(new Rectangle(0, 0, Width / 2, Height), BackColor, Color.White, LinearGradientMode.Horizontal); LinearGradientBrush bgbrush2 = new LinearGradientBrush(new Rectangle((Width / 2) - 1, 0, Width / 2, Height), Color.White, BackColor, LinearGradientMode.Horizontal); e.Graphics.FillRectangle(bgbrush1, 0, 0, Width / 2, Height); e.Graphics.FillRectangle(bgbrush2, Width / 2, 0, Width / 2, Height); }
if (bBorderLineEnabled) { // Draw the upper and the lower lines Pen pen = new Pen(clrBorderLineColor, nBorderLineHeight); e.Graphics.DrawLine(pen, 0, 0, Width, 0); e.Graphics.DrawLine(pen, 0, Height, Width, Height); } if (bRTL) { //******************************** Draw String *********************************************** if ((nPosition + flMessageWidth) < 0) { nPosition = Width; }
float flPaintedPortionsWidth = 0;
for (int i = 0; i <= mDisplayingMsgQueue.Count - 1; i++) { if (((MessagePortion)(mDisplayingMsgQueue.ToArray()[i])).PortionType == MessagePortionType.TextContent) { e.Graphics.DrawString(((MessagePortion)(mDisplayingMsgQueue.ToArray()[i])).PortionContentAsString, Font, new SolidBrush(ForeColor), nPosition + flPaintedPortionsWidth, (this.Height / 2) - (e.Graphics.MeasureString(((MessagePortion)(mDisplayingMsgQueue.ToArray()[i])).PortionContentAsString, Font, new PointF(0, 0), StringFormat.GenericTypographic).Height / 2), StringFormat.GenericTypographic); flPaintedPortionsWidth += ((MessagePortion)(mDisplayingMsgQueue.ToArray()[i])).GetPortionWidth(Font); } else { e.Graphics.DrawImage(((MessagePortion)(mDisplayingMsgQueue.ToArray()[i])).PortionContentAsImage, nPosition + flPaintedPortionsWidth, (this.Height / 2) - (((MessagePortion)(mDisplayingMsgQueue.ToArray()[i])).PortionContentAsImage.Height / 2)); flPaintedPortionsWidth += ((MessagePortion)(mDisplayingMsgQueue.ToArray()[i])).GetPortionWidth(Font); } } //********************************************************************************************
//******************************** Delete Message ******************************************** if (mDisplayingMsgQueue.Count > 1) { if ((flMessageWidth >= Width) && ((nPosition + ((MessagePortion)(mDisplayingMsgQueue.Peek())).GetPortionWidth(Font)) <= 0)) { MessagePortion msg = (MessagePortion)mDisplayingMsgQueue.Dequeue(); mOldMsgQueue.Enqueue(msg); flMessageWidth -= ((MessagePortion)(msg)).GetPortionWidth(Font); nPosition += ((MessagePortion)(msg)).GetPortionWidth(Font);
if (mNewMsgQueue.Count <= 2) { EventArgs ea = new EventArgs(); OnMessageQueueEmpty(ea); } } } //********************************************************************************************
//******************************** Add Message *********************************************** if (((nPosition + flMessageWidth) <= Width) || mDisplayingMsgQueue.Count == 0) { if (mNewMsgQueue.Count == 0) { isNewStarted = false; }
if (mNewMsgQueue.Count > 0 && mDisplayingMsgQueue.Count == 0 && mOldMsgQueue.Count == 0) { MessagePortion msg = (MessagePortion)mNewMsgQueue.Dequeue(); mDisplayingMsgQueue.Enqueue(msg); flMessageWidth += ((MessagePortion)(msg)).GetPortionWidth(Font); isNewStarted = true; } else if (mNewMsgQueue.Count > 0 && mDisplayingMsgQueue.Count > 0 && mOldMsgQueue.Count == 0) { MessagePortion msg = (MessagePortion)mNewMsgQueue.Dequeue(); mDisplayingMsgQueue.Enqueue(msg); flMessageWidth += ((MessagePortion)(msg)).GetPortionWidth(Font); isNewStarted = true; } else if (mNewMsgQueue.Count == 0 && mDisplayingMsgQueue.Count > 0 && mOldMsgQueue.Count > 0) { MessagePortion msg = (MessagePortion)mOldMsgQueue.Dequeue(); mDisplayingMsgQueue.Enqueue(msg); flMessageWidth += ((MessagePortion)(msg)).GetPortionWidth(Font); } else if (mNewMsgQueue.Count > 0 && mDisplayingMsgQueue.Count > 0 && mOldMsgQueue.Count > 0) { if (((MessagePortion)(mDisplayingMsgQueue.ToArray()[mDisplayingMsgQueue.Count - 1])).PortionType == MessagePortionType.LogoContent) { MessagePortion msg = (MessagePortion)mNewMsgQueue.Dequeue(); mDisplayingMsgQueue.Enqueue(msg); flMessageWidth += ((MessagePortion)(msg)).GetPortionWidth(Font); isNewStarted = true; } else if (isNewStarted) { MessagePortion msg = (MessagePortion)mNewMsgQueue.Dequeue(); mDisplayingMsgQueue.Enqueue(msg); flMessageWidth += ((MessagePortion)(msg)).GetPortionWidth(Font); } else { MessagePortion msg = (MessagePortion)mOldMsgQueue.Dequeue(); mDisplayingMsgQueue.Enqueue(msg); flMessageWidth += ((MessagePortion)(msg)).GetPortionWidth(Font); } } } //******************************************************************************************** } else { //******************************** Draw String *********************************************** if ((nPosition - flMessageWidth) > Width) { nPosition = 0; }
for (int i = mDisplayingMsgQueue.Count - 1; i >= 0; i--) { if (((MessagePortion)(mDisplayingMsgQueue.ToArray()[i])).PortionType == MessagePortionType.TextContent) { e.Graphics.DrawString(((MessagePortion)(mDisplayingMsgQueue.ToArray()[i])).PortionContentAsString, Font, new SolidBrush(ForeColor), nPosition - flMessageWidth + flPaintedPortionsWidth, (this.Height / 2) - (e.Graphics.MeasureString(((MessagePortion)(mDisplayingMsgQueue.ToArray()[i])).PortionContentAsString, Font, new PointF(0, 0), StringFormat.GenericTypographic).Height / 2), StringFormat.GenericTypographic); flPaintedPortionsWidth += ((MessagePortion)(mDisplayingMsgQueue.ToArray()[i])).GetPortionWidth(Font); } else { PointF ulCorner = new PointF(nPosition - flMessageWidth + flPaintedPortionsWidth, (this.Height / 2) - (((MessagePortion)(mDisplayingMsgQueue.ToArray()[i])).PortionContentAsImage.Height / 2)); PointF urCorner = new PointF(nPosition - flMessageWidth + flPaintedPortionsWidth + ((MessagePortion)(mDisplayingMsgQueue.ToArray()[i])).GetPortionWidth(Font), (this.Height / 2) - (((MessagePortion)(mDisplayingMsgQueue.ToArray()[i])).PortionContentAsImage.Height / 2)); PointF llCorner = new PointF(nPosition - flMessageWidth + flPaintedPortionsWidth, (this.Height / 2) - (((MessagePortion)(mDisplayingMsgQueue.ToArray()[i])).PortionContentAsImage.Height / 2) + ((MessagePortion)(mDisplayingMsgQueue.ToArray()[i])).PortionContentAsImage.Height); PointF[] destPara = {ulCorner, urCorner, llCorner};
e.Graphics.DrawImage(((MessagePortion)(mDisplayingMsgQueue.ToArray()[i])).PortionContentAsImage, destPara); flPaintedPortionsWidth += ((MessagePortion)(mDisplayingMsgQueue.ToArray()[i])).GetPortionWidth(Font); } } //********************************************************************************************
//******************************** Delete Message ******************************************** if (mDisplayingMsgQueue.Count > 0) { if ((flMessageWidth >= Width) && ((nPosition - ((MessagePortion)(mDisplayingMsgQueue.Peek())).GetPortionWidth(Font)) >= Width)) { //MessageBox.Show("dd"); MessagePortion msg = (MessagePortion)mDisplayingMsgQueue.Dequeue(); mOldMsgQueue.Enqueue(msg); flMessageWidth -= ((MessagePortion)(msg)).GetPortionWidth(Font); nPosition -= ((MessagePortion)(msg)).GetPortionWidth(Font); if (mNewMsgQueue.Count <= 2) { EventArgs ea = new EventArgs(); OnMessageQueueEmpty(ea); } } } //******************************************************************************************** //******************************** Add Message *********************************************** if (((nPosition - flMessageWidth) >= 0) || (mDisplayingMsgQueue.Count == 0)) { if (mNewMsgQueue.Count == 0) { isNewStarted = false; } if (mNewMsgQueue.Count > 0 && mDisplayingMsgQueue.Count == 0 && mOldMsgQueue.Count == 0) { MessagePortion msg = (MessagePortion)mNewMsgQueue.Dequeue(); mDisplayingMsgQueue.Enqueue(msg); flMessageWidth += ((MessagePortion)(msg)).GetPortionWidth(Font); isNewStarted = true; } else if (mNewMsgQueue.Count > 0 && mDisplayingMsgQueue.Count > 0 && mOldMsgQueue.Count == 0) { MessagePortion msg = (MessagePortion)mNewMsgQueue.Dequeue(); mDisplayingMsgQueue.Enqueue(msg); flMessageWidth += ((MessagePortion)(msg)).GetPortionWidth(Font); isNewStarted = true; } else if (mNewMsgQueue.Count == 0 && mDisplayingMsgQueue.Count > 0 && mOldMsgQueue.Count > 0) { MessagePortion msg = (MessagePortion)mOldMsgQueue.Dequeue(); mDisplayingMsgQueue.Enqueue(msg); flMessageWidth += ((MessagePortion)(msg)).GetPortionWidth(Font); } else if (mNewMsgQueue.Count > 0 && mDisplayingMsgQueue.Count > 0 && mOldMsgQueue.Count > 0) { if (((MessagePortion)(mDisplayingMsgQueue.ToArray()[mDisplayingMsgQueue.Count - 1])).PortionType == MessagePortionType.LogoContent) { MessagePortion msg = (MessagePortion)mNewMsgQueue.Dequeue(); mDisplayingMsgQueue.Enqueue(msg); flMessageWidth += ((MessagePortion)(msg)).GetPortionWidth(Font); isNewStarted = true; } else if(isNewStarted) { MessagePortion msg = (MessagePortion)mNewMsgQueue.Dequeue(); mDisplayingMsgQueue.Enqueue(msg); flMessageWidth += ((MessagePortion)(msg)).GetPortionWidth(Font); } else { MessagePortion msg = (MessagePortion)mOldMsgQueue.Dequeue(); mDisplayingMsgQueue.Enqueue(msg); flMessageWidth += ((MessagePortion)(msg)).GetPortionWidth(Font); } } } //******************************************************************************************** }
e.Graphics.DrawImage(global::SMS2TV.Properties.Resources.box_down, new Rectangle(this.Width - ((int)(this.Height * 1.5)), 0, (int)(this.Height * 1.5), this.Height)); e.Graphics.DrawString(strShortcode, new Font(new FontFamily(this.Font.FontFamily.Name.ToString()), 30, FontStyle.Bold), new SolidBrush(Color.Black), this.Width - ((int)(this.Height * 1.5)) + ((int)(90 / 1.5)), ((int)(90 / 1.5)), StringFormat.GenericTypographic); } private System.Collections.ArrayList SplitMessage(System.Collections.ArrayList paramList, string[] CommandList, int Position, DateTime timestamp) { System.Collections.ArrayList list = new System.Collections.ArrayList(); Graphics g = this.CreateGraphics(); string strSentence = "";
if (Position == CommandList.Length) return paramList;
for (int i = 0; i <= paramList.Count - 1; i++) { if (((MessagePortion)(paramList.ToArray()[i])).PortionType == MessagePortionType.TextContent) { strSentence = ((MessagePortion)(paramList.ToArray()[i])).PortionContentAsString;
while (strSentence.Length != 0) { if (!strSentence.Contains(CommandList[Position])) { list.Add(new MessagePortion(strSentence, g, MessagePortionType.TextContent, timestamp)); strSentence = ""; }
else if (strSentence.Equals(CommandList[Position])) { list.Add(new MessagePortion(mSmiley.GetImageByCommand(CommandList[Position]), g, MessagePortionType.IconContent, timestamp)); strSentence = ""; }
else { if (!strSentence.Substring(0, strSentence.IndexOf(CommandList[Position])).Equals("")) list.Add(new MessagePortion(strSentence.Substring(0, strSentence.IndexOf(CommandList[Position])), g, MessagePortionType.TextContent, timestamp));
list.Add(new MessagePortion(mSmiley.GetImageByCommand(CommandList[Position]), g, MessagePortionType.IconContent, timestamp)); strSentence = strSentence.Substring(strSentence.IndexOf(CommandList[Position]) + CommandList[Position].Length, strSentence.Length - strSentence.IndexOf(CommandList[Position]) - CommandList[Position].Length); } } } else { list.Add((((MessagePortion)(paramList.ToArray()[i])))); } }
return SplitMessage(list, CommandList, Position + 1, timestamp); }Is this a threading model issue? Any help?