Jquery中文网 www.jquerycn.cn
Jquery中文网 >  脚本编程  >  Asp.net  >  正文 Winform 下无闪烁走马灯效果实现

Winform 下无闪烁走马灯效果实现

发布时间:2017-10-22   编辑:www.jquerycn.cn
jquery中文网为您提供Winform 下无闪烁走马灯效果实现等资源,欢迎您收藏本站,我们将为您提供最新的Winform 下无闪烁走马灯效果实现资源

<span style="FONT-SIZE: 24pt"><span style="FONT-SIZE: 24pt"><span style="FONT-SIZE: 18pt">Winform 下无闪烁走马灯效果实现</span></span></span>

作者:肖波
    最近需要在Winform项目中实现一个走马灯的效果,一开始用了一些办法比如移动Label控件,效果总是不太好,移动文本时总有闪烁的现象。后来找了一个国外的开源控件,应用了一下,效果还不错。仔细阅读了一下代码,发现还有一些地方值得改进,现把代码以及改动说明贴出来,和大家分享。
    控件出处:http://www.codeproject.com/KB/miscctrl/ScrollingTextControlArtic.aspx
    我的改动:
    1、DoubleBuffer 的设置
   原代码中用的是 this.SetStyle(ControlStyles.DoubleBuffer, true); 但一些网友反映这个标志在.net 2.0 以上版本无效。说句老实话,我也不是特别确信,MSDN上也没有说明这一点。在我的.net 2.0 系统中,两种设置的效果似乎没有太多区别。在一个国外网站上找到他们的区别,下面是原文:

<span>

ControlStyles == CS
AllPaintingInWMPaint == APWMP
OptimizedDoubleBuffer = ODB
DoubleBuffer = DB

An earlier permutation of the design called for ODB to simply be a combination of DB, APWMP and UserPaint. Through several design changes, the two control styles are nearly synonymous, but they still have differences.  Now that we''ve broken that, we may consider un-deprecating CS.DB to retain . Here is a more complete summary of the current design:

<table style="WIDTH: 100%" cellspacing="1" cellpadding="1" border="1"> <tbody> <tr> <td>Mechanism</td> <td>Side effects</td> <td>Other flags required to work</td> <td>Require APWMP?</td> <td>Notes</td> </tr> <tr> <td>ControlStyle
.DB
</td> <td>

none

</td> <td>

APWMP, UserPaint

</td> <td>

Yes

</td> <td>We are considering NOT deprecating this flag because ODB isn''t an exact replacement for DB.</td> </tr> <tr> <td>ControlStyle
.ODB
</td> <td>

none

</td> <td>

none

</td> <td>

No

</td> <td>Works, but without APWMP set you''ll buffer foreground and background separately and will still see flicker.</td> </tr> <tr> <td>Control
.DoubleBuffered
</td> <td>

sets CS.ODB, CS.APWMP

</td> <td>

none

</td> <td>

No

</td> <td>Works for most mainstream buffering needs. Getter is peculiar in that it only checks CS.ODB.</td> </tr> </tbody></table>


I''m following up on the need for deprecating CS.DB and Control.DoubleBuffered''s getter and will post here.
</span>
总之保险起见,还是判一下版本号,下面是判断代码

<span style="COLOR: #000000">            Version v </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> System.Environment.Version;

            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (v.Major </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">2</span><span style="COLOR: #000000">)
            </span><span id="Codehighlighter1_94_174_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_94_174_Open_Text"><span style="COLOR: #000000">{
                </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.SetStyle(ControlStyles.DoubleBuffer, </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);
            }</span></span><span style="COLOR: #000000">
            </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">
            </span><span id="Codehighlighter1_204_293_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_204_293_Open_Text"><span style="COLOR: #000000">{
                </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.SetStyle(ControlStyles.OptimizedDoubleBuffer, </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);
            }</span></span>
    2、刷新区域
    原代码中刷新区域是这样设置的

<span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> Tick(</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000"> sender, EventArgs e)
        </span><span id="Codehighlighter1_50_395_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_50_395_Open_Text"><span style="COLOR: #000000">{
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">update rectangle to include where to paint for new position            
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">lastKnownRect.X -= 10;
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">lastKnownRect.Width  = 20;            </span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            lastKnownRect.Inflate(</span><span style="COLOR: #800080">10</span><span style="COLOR: #000000">, </span><span style="COLOR: #800080">5</span><span style="COLOR: #000000">);

            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">create region based on updated rectangle</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            Region updateRegion </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Region(lastKnownRect);            
           
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">repaint the control            </span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            Invalidate(updateRegion);
            Update();
        }</span></span>
lastKnownRect是文字的整个区域,如果文字较长,这个刷新区域就会比较大,但实际上我们只需要刷新控件显示范围内的区域就可以了。
所以这里改动如下:


<span style="COLOR: #000000">        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Controls the animation of the text.</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> Tick(</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000"> sender, EventArgs e)
        </span><span id="Codehighlighter1_90_833_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_90_833_Open_Text"><span style="COLOR: #000000">{
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">update rectangle to include where to paint for new position            
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">lastKnownRect.X -= 10;
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">lastKnownRect.Width  = 20;            </span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            lastKnownRect.Inflate(</span><span style="COLOR: #800080">10</span><span style="COLOR: #000000">, </span><span style="COLOR: #800080">5</span><span style="COLOR: #000000">);

            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">get the display rectangle</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            RectangleF refreshRect </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> lastKnownRect;
            refreshRect.X </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Math.Max(</span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">, lastKnownRect.X);
            refreshRect.Width </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Math.Min(lastKnownRect.Width </span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"> lastKnownRect.X, </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Width);
            refreshRect.Width </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Math.Min(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Width </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> lastKnownRect.X, refreshRect.Width);

            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">create region based on updated rectangle
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Region updateRegion = new Region(lastKnownRect);            </span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            Region updateRegion </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Region(refreshRect);        
            
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">repaint the control            </span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            Invalidate(updateRegion);
            Update();
        }</span></span>
    2、修改Enabled属性
   
当Enabled设置为false时,原控件依然会滚动,觉得还是不让它滚动更好一些。
    修改代码如下:

<span style="COLOR: #000000">        [
        Browsable(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">),
        CategoryAttribute(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Behavior</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">),
        Description(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Indicates whether the control is enabled</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">)
        ]
        </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> Enabled
        </span><span id="Codehighlighter1_188_402_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_188_402_Open_Text"><span style="COLOR: #000000">{
            </span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">
            </span><span id="Codehighlighter1_218_310_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_218_310_Open_Text"><span style="COLOR: #000000">{
                timer.Enabled </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> value;
                </span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">.Enabled </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> value;
            }</span></span><span style="COLOR: #000000">

            </span><span style="COLOR: #0000ff">get</span><span style="COLOR: #000000">
            </span><span id="Codehighlighter1_340_392_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_340_392_Open_Text"><span style="COLOR: #000000">{
                </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">.Enabled;
            }</span></span><span style="COLOR: #000000">
        }</span></span>
下面给出修改后完整的控件代码,代码原作者为jconwell,原始代码见前面提到的控件出处


<span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System;
</span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System.Collections;
</span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System.ComponentModel;
</span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System.Drawing;
</span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System.Drawing.Drawing2D;
</span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System.Data;
</span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System.Windows.Forms;

</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> ScrollingTextControl
</span><span id="Codehighlighter1_202_12172_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_202_12172_Open_Text"><span style="COLOR: #000000">{
    </span><span id="Codehighlighter1_205_286_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_205_286_Open_Text"><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080"><summary></span><span style="COLOR: #008000">
    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> Summary description for ScrollingTextControl.
    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080"></summary></span></span>
<span style="COLOR: #000000">    [
    ToolboxBitmapAttribute(</span><span style="COLOR: #0000ff">typeof</span><span style="COLOR: #000000">(ScrollingTextControl.ScrollingText), </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">ScrollingText.bmp</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">),
    DefaultEvent(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">TextClicked</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">)
    ]
    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ScrollingText : System.Windows.Forms.Control
    </span><span id="Codehighlighter1_471_12003_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_471_12003_Open_Text"><span style="COLOR: #000000">{
        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Timer timer;                            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Timer for text animation.</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> text </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Text</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">;                    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Scrolling text</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> staticTextPos </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">;                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> The running x pos of the text</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> yPos </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">;                            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> The running y pos of the text</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> ScrollDirection scrollDirection </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ScrollDirection.RightToLeft;                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> The direction the text will scroll</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> ScrollDirection currentDirection </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ScrollDirection.LeftToRight;                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Used for text bouncing </span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> VerticleTextPosition verticleTextPosition </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> VerticleTextPosition.Center;    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Where will the text be vertically placed</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> scrollPixelDistance </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">2</span><span style="COLOR: #000000">;            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> How far the text scrolls per timer event</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> showBorder </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;                    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Show a border or not</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> stopScrollOnMouseOver </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Flag to stop the scroll if the user mouses over the text</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> scrollOn </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;                    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Internal flag to stop / start the scrolling of the text</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Brush foregroundBrush </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Allow the user to set a custom Brush to the text Font</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Brush backgroundBrush </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Allow the user to set a custom Brush to the background</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Color borderColor </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Color.Black;        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Allow the user to set the color of the control border</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> RectangleF lastKnownRect;                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> The last known position of the text</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">
        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> ScrollingText()
        </span><span id="Codehighlighter1_1821_2629_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_1821_2629_Open_Text"><span style="COLOR: #000000">{
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Setup default properties for ScrollingText control</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            InitializeComponent();
            
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">This turns off internal double buffering of all custom GDI  drawing</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            
            Version v </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> System.Environment.Version;

            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (v.Major </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">2</span><span style="COLOR: #000000">)
            </span><span id="Codehighlighter1_2090_2170_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_2090_2170_Open_Text"><span style="COLOR: #000000">{
                </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.SetStyle(ControlStyles.DoubleBuffer, </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);
            }</span></span><span style="COLOR: #000000">
            </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">
            </span><span id="Codehighlighter1_2200_2289_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_2200_2289_Open_Text"><span style="COLOR: #000000">{
                </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.SetStyle(ControlStyles.OptimizedDoubleBuffer, </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);
            }</span></span><span style="COLOR: #000000">
            
            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.SetStyle(ControlStyles.AllPaintingInWmPaint, </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);
            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.SetStyle(ControlStyles.UserPaint, </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);
            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.SetStyle(ControlStyles.ResizeRedraw, </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);

            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">setup the timer object</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            timer </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Timer();
            timer.Interval </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">25</span><span style="COLOR: #000000">;    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">default timer interval</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            timer.Enabled </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;
            timer.Tick </span><span style="COLOR: #000000"> =</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> EventHandler(Tick);            
        }</span></span><span style="COLOR: #000000">

        </span><span id="Codehighlighter1_2633_2705_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_2633_2705_Open_Text"><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080"><summary></span><span style="COLOR: #008000">
        </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> Clean up any resources being used.
        </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080"></summary></span></span>
<span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">override</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> Dispose( </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> disposing )
        </span><span id="Codehighlighter1_2759_3126_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_2759_3126_Open_Text"><span style="COLOR: #000000">{
            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">( disposing )
            </span><span id="Codehighlighter1_2783_3092_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_2783_3092_Open_Text"><span style="COLOR: #000000">{
                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Make sure our brushes are cleaned up</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">                </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (foregroundBrush </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)
                    foregroundBrush.Dispose();

                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Make sure our brushes are cleaned up</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">                </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (backgroundBrush </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)
                    backgroundBrush.Dispose();

                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Make sure our timer is cleaned up</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">                </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (timer </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)
                    timer.Dispose();
            }</span></span><span style="COLOR: #000000">
            </span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">.Dispose( disposing );
        }</span></span><span style="COLOR: #000000">

        </span><span id="Codehighlighter1_3130_3554_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">Component Designer generated code</span><span id="Codehighlighter1_3130_3554_Open_Text" style="DISPLAY: none"><span style="COLOR: #0000ff">#region</span><span style="COLOR: #000000"> Component Designer generated code</span><span style="COLOR: #000000">
        </span><span id="Codehighlighter1_3174_3321_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_3174_3321_Open_Text"><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080"><summary></span><span style="COLOR: #008000">
        </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> Required method for Designer support - do not modify 
        </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> the contents of this method with the code editor.
        </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080"></summary></span></span>
<span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> InitializeComponent()
        </span><span id="Codehighlighter1_3360_3541_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_3360_3541_Open_Text"><span style="COLOR: #000000">{
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">ScrollingText            </span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Name </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">ScrollingText</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">;
            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Size </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> System.Drawing.Size(</span><span style="COLOR: #800080">216</span><span style="COLOR: #000000">, </span><span style="COLOR: #800080">40</span><span style="COLOR: #000000">);
            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Click </span><span style="COLOR: #000000"> =</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> System.EventHandler(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.ScrollingText_Click);                    
        }</span></span><span style="COLOR: #000000">
        </span><span style="COLOR: #0000ff">#endregion</span></span><span style="COLOR: #000000">
    
        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Controls the animation of the text.</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> Tick(</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000"> sender, EventArgs e)
        </span><span id="Codehighlighter1_3647_4390_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_3647_4390_Open_Text"><span style="COLOR: #000000">{
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">update rectangle to include where to paint for new position            
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">lastKnownRect.X -= 10;
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">lastKnownRect.Width  = 20;            </span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            lastKnownRect.Inflate(</span><span style="COLOR: #800080">10</span><span style="COLOR: #000000">, </span><span style="COLOR: #800080">5</span><span style="COLOR: #000000">);

            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">get the display rectangle</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            RectangleF refreshRect </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> lastKnownRect;
            refreshRect.X </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Math.Max(</span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">, lastKnownRect.X);
            refreshRect.Width </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Math.Min(lastKnownRect.Width </span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"> lastKnownRect.X, </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Width);
            refreshRect.Width </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Math.Min(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Width </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> lastKnownRect.X, refreshRect.Width);

            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">create region based on updated rectangle
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Region updateRegion = new Region(lastKnownRect);            </span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            Region updateRegion </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Region(refreshRect);        
            
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">repaint the control            </span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            Invalidate(updateRegion);
            Update();
        }</span></span><span style="COLOR: #000000">

        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Paint the ScrollingTextCtrl.</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">override</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> OnPaint(PaintEventArgs pe)
        </span><span id="Codehighlighter1_4480_4779_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_4480_4779_Open_Text"><span style="COLOR: #000000">{
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Console.WriteLine(pe.ClipRectangle.X   ",  "   pe.ClipRectangle.Y   ",  "   pe.ClipRectangle.Width   ",  "   pe.ClipRectangle.Height);

            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Paint the text to its new position</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            DrawScrollingText(pe.Graphics);

            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">pass on the graphics obj to the base Control class</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">.OnPaint(pe);
        }</span></span><span style="COLOR: #000000">

        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Draw the scrolling text on the control        </span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> DrawScrollingText(Graphics canvas)
        </span><span id="Codehighlighter1_4877_6421_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_4877_6421_Open_Text"><span style="COLOR: #000000">{
            canvas.SmoothingMode </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> SmoothingMode.HighQuality;
            canvas.PixelOffsetMode </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> PixelOffsetMode.HighQuality;

            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">measure the size of the string for placement calculation</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            SizeF stringSize </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> canvas.MeasureString(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.text, </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Font);
        
            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Calculate the begining x position of where to paint the text</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (scrollOn)
            </span><span id="Codehighlighter1_5225_5266_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_5225_5266_Open_Text"><span style="COLOR: #000000">{
                CalcTextPosition(stringSize);    
            }</span></span><span style="COLOR: #000000">

            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Clear the control with user set BackColor</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (backgroundBrush </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)
            </span><span id="Codehighlighter1_5368_5491_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_5368_5491_Open_Text"><span style="COLOR: #000000">{
                canvas.FillRectangle(backgroundBrush, </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.ClientSize.Width, </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.ClientSize.Height);
            }</span></span><span style="COLOR: #000000">
            </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">
            </span><span id="Codehighlighter1_5521_5582_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_5521_5582_Open_Text"><span style="COLOR: #000000">{
                canvas.Clear(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.BackColor);
            }</span></span><span style="COLOR: #000000">

            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Draw the border</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (showBorder)
            </span><span id="Codehighlighter1_5646_5836_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_5646_5836_Open_Text"><span style="COLOR: #000000">{
                </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (Pen borderPen </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Pen(borderColor))
                    canvas.DrawRectangle(borderPen, </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.ClientSize.Width </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.ClientSize.Height </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">);
            }</span></span><span style="COLOR: #000000">

            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Draw the text string in the bitmap in memory</span><span style="COLOR: #008000">
</span><span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (foregroundBrush </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)
            </span><span id="Codehighlighter1_5942_6146_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span>

您可能感兴趣的文章:
js实现网页标题栏的闪烁效果(示例)
js实现网页标题闪烁效果
js实现Div闪烁效果代码
360浏览器闪屏怎么办 360浏览器闪烁解决方法
自绘效率曲线控件
JS函数实现网页标题(title)闪动效果
联想智能插线板常见问题介绍
让新消息在网页标题闪烁提示的jQuery代码
fool.js
显示器一闪一闪黑屏问题解决办法

[关闭]