养生 装修 购物 美食 感冒 便秘 营销 加盟 小吃 火锅 管理 创业 搭配 减肥 培训 旅游

怎么用winform显示滚动效果C#测试好用

时间:2024-10-24 11:16:56

我用嘛术铹砾winform写了一个抽奖程序,需要把抽奖结果显示出来,由于中奖号码比较多只好采用滚动显示,我从网上找了很多,普遍的方法是采用位移然后颜色填罗嵯脶姥空方法,此方法对于少量数据可以,但是对于成百上千条数据,字体就会模糊。然后我找到了一个解决方法特此分享下,自创控件,利用局部刷新,嘿嘿成功了。

工具/原料

vs2010

方法/步骤

1、新建项目,选择Windows窗体应用程序。

怎么用winform显示滚动效果C#测试好用

2、右键该项目,再新建类,类名为ScrollingText。

怎么用winform显示滚动效果C#测试好用

3、把以下代码粘贴上去:[ToolboxBitma圬桦孰礅pAttribute(typeof(ScrollingText),&quo墉掠载牿t;ScrollingText.bmp"),DefaultEvent("TextClicked")]publicclassScrollingText:System.Windows.Forms.Control{privateTimertimer;privatestringtext="Text";privatefloatstaticTextPos=0;privatefloatyPos=0;privateScrollDirectionscrollDirection=ScrollDirection.RightToLeft;privateScrollDirectioncurrentDirection=ScrollDirection.LeftToRight;privateVerticleTextPositionverticleTextPosition=VerticleTextPosition.Center;privateintscrollPixelDistance=2;privateboolshowBorder=true;privateboolstopScrollOnMouseOver=false;privateboolscrollOn=true;privateBrushforegroundBrush=null;privateBrushbackgroundBrush=null;privateColorborderColor=Color.Black;privateRectangleFlastKnownRect;publicScrollingText(){InitializeComponent();Versionv=System.Environment.Version;if(v.Major<2){this.SetStyle(ControlStyles.DoubleBuffer,true);}else{this.SetStyle(ControlStyles.OptimizedDoubleBuffer,true);}this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);this.SetStyle(ControlStyles.UserPaint,true);this.SetStyle(ControlStyles.ResizeRedraw,true);timer=newTimer();timer.Interval=25;timer.Enabled=true;timer.Tick+=newEventHandler(Tick);}protectedoverridevoidDispose(booldisposing){if(disposing){if(foregroundBrush!=null)foregroundBrush.Dispose();if(backgroundBrush!=null)backgroundBrush.Dispose();if(timer!=null)timer.Dispose();}base.Dispose(disposing);}#regionComponentDesignergeneratedcodeprivatevoidInitializeComponent(){this.Name="ScrollingText";this.Size=newSystem.Drawing.Size(216,40);this.Click+=newSystem.EventHandler(this.ScrollingText_Click);}#endregionprivatevoidTick(objectsender,EventArgse){lastKnownRect.Inflate(10,5);RectangleFrefreshRect=lastKnownRect;refreshRect.X=Math.Max(0,lastKnownRect.X);refreshRect.Width=Math.Min(lastKnownRect.Width+lastKnownRect.X,this.Width);refreshRect.Width=Math.Min(this.Width-lastKnownRect.X,refreshRect.Width);RegionupdateRegion=newRegion(refreshRect);Invalidate(updateRegion);Update();}protectedoverridevoidOnPaint(PaintEventArgspe){DrawScrollingText(pe.Graphics);base.OnPaint(pe);}publicvoidDrawScrollingText(Graphicscanvas){canvas.SmoothingMode=SmoothingMode.HighQuality;canvas.PixelOffsetMode=PixelOffsetMode.HighQuality;SizeFstringSize=canvas.MeasureString(this.text,this.Font);if(scrollOn){CalcTextPosition(stringSize);}if(backgroundBrush!=null){canvas.FillRectangle(backgroundBrush,0,0,this.ClientSize.Width,this.ClientSize.Height);}else{canvas.Clear(this.BackColor);}if(showBorder){using(PenborderPen=newPen(borderColor))canvas.DrawRectangle(borderPen,0,0,this.ClientSize.Width-1,this.ClientSize.Height-1);}if(foregroundBrush==null){using(BrushtempForeBrush=newSystem.Drawing.SolidBrush(this.ForeColor))canvas.DrawString(this.text,this.Font,tempForeBrush,staticTextPos,yPos);}else{canvas.DrawString(this.text,this.Font,foregroundBrush,staticTextPos,yPos);}lastKnownRect=newRectangleF(staticTextPos,yPos,stringSize.Width,stringSize.Height);EnableTextLink(lastKnownRect);}privatevoidCalcTextPosition(SizeFstringSize){switch(scrollDirection){caseScrollDirection.RightToLeft:if(staticTextPos<(-1*(stringSize.Width)))staticTextPos=this.ClientSize.Width-1;elsestaticTextPos-=scrollPixelDistance;break;caseScrollDirection.LeftToRight:if(staticTextPos>this.ClientSize.Width)staticTextPos=-1*stringSize.Width;elsestaticTextPos+=scrollPixelDistance;break;caseScrollDirection.Bouncing:if(currentDirection==ScrollDirection.RightToLeft){if(staticTextPos<0)currentDirection=ScrollDirection.LeftToRight;elsestaticTextPos-=scrollPixelDistance;}elseif(currentDirection==ScrollDirection.LeftToRight){if(staticTextPos>this.ClientSize.Width-stringSize.Width)currentDirection=ScrollDirection.RightToLeft;elsestaticTextPos+=scrollPixelDistance;}break;}switch(verticleTextPosition){caseVerticleTextPosition.Top:yPos=2;break;caseVerticleTextPosition.Center:yPos=(this.ClientSize.Height/2)-(stringSize.Height/2);break;caseVerticleTextPosition.Botom:yPos=this.ClientSize.Height-stringSize.Height;break;}}#regionMouseover,textlinklogicprivatevoidEnableTextLink(RectangleFtextRect){PointcurPt=this.PointToClient(Cursor.Position);if(textRect.Contains(curPt)){if(stopScrollOnMouseOver)scrollOn=false;this.Cursor=Cursors.Hand;}else{scrollOn=true;this.Cursor=Cursors.Default;}}privatevoidScrollingText_Click(objectsender,System.EventArgse){if(this.Cursor==Cursors.Hand)OnTextClicked(this,newEventArgs());}publicdelegatevoidTextClickEventHandler(objectsender,EventArgsargs);publiceventTextClickEventHandlerTextClicked;privatevoidOnTextClicked(objectsender,EventArgsargs){if(TextClicked!=null)TextClicked(sender,args);}#endregion#regionProperties[Browsable(true),CategoryAttribute("ScrollingText"),Description("Thetimerintervalthatdetermineshowoftenthecontrolisrepainted")]publicintTextScrollSpeed{set{timer.Interval=value;}get{returntimer.Interval;}}[Browsable(true),CategoryAttribute("ScrollingText"),Description("HowmanypixelswillthetextbemovedperPaint")]publicintTextScrollDistance{set{scrollPixelDistance=value;}get{returnscrollPixelDistance;}}[Browsable(true),CategoryAttribute("ScrollingText"),Description("Thetextthatwillscrollaccrosthecontrol")]publicstringScrollText{set{text=value;this.Invalidate();this.Update();}get{returntext;}}[Browsable(true),CategoryAttribute("ScrollingText"),Description("Whatdirectionthetextwillscroll:LefttoRight,RighttoLeft,orBouncing")]publicScrollDirectionScrollDirection{set{scrollDirection=value;}get{returnscrollDirection;}}[Browsable(true),CategoryAttribute("ScrollingText"),Description("Theverticlealignmentofthetext")]publicVerticleTextPositionVerticleTextPosition{set{verticleTextPosition=value;}get{returnverticleTextPosition;}}[Browsable(true),CategoryAttribute("ScrollingText"),Description("Turnstheborderonoroff")]publicboolShowBorder{set{showBorder=value;}get{returnshowBorder;}}[Browsable(true),CategoryAttribute("ScrollingText"),Description("Thecoloroftheborder")]publicColorBorderColor{set{borderColor=value;}get{returnborderColor;}}[Browsable(true),CategoryAttribute("ScrollingText"),Description("Determinesifthetextwillstopscrollingiftheuser'smousemovesoverthetext")]publicboolStopScrollOnMouseOver{set{stopScrollOnMouseOver=value;}get{returnstopScrollOnMouseOver;}}[Browsable(true),CategoryAttribute("Behavior"),Description("Indicateswhetherthecontrolisenabled")]newpublicboolEnabled{set{timer.Enabled=value;base.Enabled=value;}get{returnbase.Enabled;}}[Browsable(false)]publicBrushForegroundBrush{set{foregroundBrush=value;}get{returnforegroundBrush;}}[ReadOnly(true)]publicBrushBackgroundBrush{set{backgroundBrush=value;}get{returnbackgroundBrush;}}#endregion}publicenumScrollDirection{RightToLeft,LeftToRight,Bouncing}publicenumVerticleTextPosition{Top,Center,Botom}注意引用也添加:usingSystem.Collections;usingSystem.ComponentModel;usingSystem.Drawing;usingSystem.Drawing.Drawing2D;usingSystem.Data;usingSystem.Windows.Forms;

怎么用winform显示滚动效果C#测试好用

4、到Form1窗口,发现左边的工具栏多了ScrollingText控件,该控件就是刚才创建的控件。

怎么用winform显示滚动效果C#测试好用

5、拖动新创建的控件,可以当作lable使用,不同的区别是里面的文档可以滚动。

怎么用winform显示滚动效果C#测试好用

6、特别说明,几个属性的值可以实现滚动屏的需求。ScrollText:显示的内容。TextScrollSpeed:设置滚动的速度,数越小滚动越快。

怎么用winform显示滚动效果C#测试好用

© 一点知识