返回首页

{S0}简介
我总是喜欢在Firefox右上角的小圆形进度指示器当加载一个页面,但我找不到任何喜欢使用我的项目,所以我做了一个自己。使用代码
使用的控制是很简单的的,也有只有四个属性和两种方法,您需要知道:CircleColor - 变化的基本颜色的圆圈CircleSize - 改变圆的直径,这个值是相对的,0.1和1.0之间的控制规模和范围成正比自动启动 - 设置如果动画应该会自动启动AnimationSpeed​​ - 设置动画speednbsp;NumberOfCircles - 设置的最大数量的控制,可在绘制各界,该值必须大于0NumberOfVisibleCircles - 设置在控制中可见的圆的数目,必须始终小于或平等的NumberOfCircles百分比 - 设置可以在控制中心中的一个百分比值,此值必须介于0和100ShowPercentage - 设置一个值,允许显示或隐藏的百分比值ShowText - 设置一个值,可以显示控制文本TextDisplay - 这个属性只是一个辅助属性,它允许启用或禁用文本和一个属性的百分比 旋转 - 设置控制旋转的方向,
启动动画,只需调用start():

progressIndicator.Start(); 

和阻止它,只需调用stop():{C}控制代码绘制的圆圈
圆圈周围绘制一个周长与直径的控制。由于圆的数量是可变的,我们需要计算每圈的旋转角度。各界的最低数量必须是1,没有上限控制。使用调用RotateTransform旋转绘画位置作为一个参数传递的角度绘制的圆圈。顺序绘制的圆圈,在圆的颜色的Alpha量减少,使控制的褪色效果。以动画,控制重绘的时间间隔由一个地方总是在不断变化较暗的圆圈的位置,让运动的错觉。控制,可顺时针旋转或逆时针旋转方向乘以1或-1的角度来实现。检查代码,发现这条线是:
这段代码设置每个阶段乘以一个递增的值是由内部定时器节角旋转的开始位置。 NumberOfVisibleCircles财产是指在一个给定的的时间显示界的最大数量。此属性确定在控制绘制的各界的有效数量,这是从NumberOfCircles属性的不同。这最后一个属性集可以得出各界的数量,就像是预留空间为界,即使我们不使用它们。这使得紧缩各界一起可见各界的数量减少时的效果相反的效果时,增加。绘制的百分比和文本
的百分比是一个可选功能,因为主要目的是显示一个进度值,但东西是怎么回事。百分比文本不显示默认情况下,甚至没有原来的想法。无论如何,我已经要求新功能的人的一些意见,并给予一些很好的想法,我决定更新的控制和实施一些新的特点。其中之一是这一个。通过百分比属性的百分比,并可以启用和禁用从ShowPercentage属性。 Text属性如下同样的道理。这不是原计划的一部分,但SohjSolwin建议,可以在某些情况下有用,我们从来不知道何时何地将使用这种控制。所以,从这个版本,控制有能力吸取他们都如下所示:
string percent = GetDrawText();



if (!string.IsNullOrEmpty(percent))

{

    SizeF textSize = e.Graphics.MeasureString(percent, Font);

    float textX = (Width / 2.0F) - (textSize.Width / 2.0F);

    float textY = (Height / 2.0F) - (textSize.Height / 2.0F);

    StringFormat format = new StringFormat

    {

        Alignment = StringAlignment.Center,

        LineAlignment = StringAlignment.Center

    };



    RectangleF rectangle = new RectangleF(textX, textY, textSize.Width, textSize.Height);

        



    using (SolidBrush textBrush = new SolidBrush(ForeColor))

    {

        e.Graphics.DrawString(percent, Font, textBrush, rectangle, format);

    } 

}
为什么两个百分比和文字?
当控制被用来显示进度,itnbsp;有可能是什么,并在同一时间进度百分比显示消息。他们两人都是独立的,有不同的用途。即使他们绘制在同一时间在内部,如果我只需要改变的百分比值,它更容易做到这一点:
progressIndicator.Percentage = 50.25F;

,并让控制添加quot;%quot;签署和做其他格式。这是比这个简单,更加直观和:
另一方面,百分比属性不会允许文本,因此它需要另一个字段来设置文本绘制。最后显示的字符串,是建立在下面显示的方法使用的文字和百分比属性,方法检查_showText和_showPercentage领域的价值观和他们的价值观为基础构造一个字符串,返回一个空字符串,如果这两个领域都设置为false。
private string GetDrawText()

{

    string percent = string.Format(CultureInfo.CurrentCulture, "{0:0.##} %", _percentage);



    if (_showText && _showPercentage)

        return string.Format("{0}{1}{2}", percent, Environment.NewLine, Text);



    if (_showText)

        return Text;



    if (_showPercentage)

        return percent;



    return string.Empty;

}

控制代码的其余部分很短,简单易懂,所以我决定删除,只留下片断的文章。如果您有任何疑问,请发表评论。兴趣点
没有什么更多的。这是进度条已经很长一段时间没有作出任何的进展情况,特别是在有用的,我们要传递的消息,正在做的事情是。晚间,它已计划的乐趣。 :)积分
我想感谢他的旋转和可见各界的部分代码,我在此版本稍作修改中包括的贡献SohjSolwin,也为文本绘制的建议,而不是只显示百分比。历史第二年11月,2008年:战后初期六月二十六日,2010:更新到1.1版,新功能:可变数目的圆圈(第1版有8个固定)它可以得出一个百分比值7月1日起,2010年更新到1.2版,新功能:旋转可以顺时针或逆时针它可以在除的百分比值绘制一个文本字符串可见各界的可变数目(1.1版有一个固定数量的8)| Nitoc3

回答

评论会员:它的真棒。感谢 时间:2011/12/27
。raananv
评论会员:游客 时间:2011/12/27
Thanximgsrc=http://www.orcode.com/upimg/2011_12_27_20_56_16_1.gif
apiegoku
评论会员:简单实用的 时间:2011/12/27
VUnreal:大项目|
评论会员:redhatee2006 时间:2011/12/27
闪烁一点,但看起来不错一般
评论会员:Nitoc3 时间:2011/12/27
感谢这个进度指示器,出色的工作问题:不能让选项透明,背景色透明,但颜色返回颜色的BackColor的主要形式。
评论会员:kobymeir 时间:2011/12/27
喜redhatee2006,是应该有行为。从MSDN文档:

"Windows窗体控件不支持真正的透明度。画一个透明的Windows窗体控件的背景是其母公司。"
{A}
评论会员:玉山OZCAKIR 时间:2011/12/27
。简单有用,两岸进入我的项目
评论会员:garycoggins 时间:2011/12/27

评论会员:会员3471983 时间:2011/12/27
清洁项目,一切应该没有问题。正是我所需要的
评论会员:。SohjSolwin 时间:2011/12/27
SohjSolwin,

你已经做了一个很好的控制。有没有办法用一个BackgroundWorker,因为当我使用它,却使一个DataGridView停止工作,直到网格填充
评论会员:SohjSolwin 时间:2011/12/27
其实,Nitoc3创建的控制,我只是做了小的变化允许任一方向旋转。

一个什么你这样做虽然的问题,不会是好做的BackgroundWorker在GridView加载?由于这方面取得进展的指标是没有一个按钮或表单的GridView不同,它不会更新,如果用户界面是由GridView加载代码阻止
评论会员:。Nitoc3 时间:2011/12/27
我已经取得了一些改进,以您的控制(我提交回馈社会),想请问您的许可,看看控件添加到一个项目,我正与,]。现在能够顺时针或逆时针旋转,可见各界的数量是可调的,除了圆的数量已经可调,可放置在控制任何文字,而不是刚刚完成百分比(这种方式当前动作可以绘制控制)。


        /// <summary>

        /// An enum used to indicate the rotational direction of the control.

        /// </summary>

        public enum RotationType

        {

            /// <summary>

            /// Indicates that the rotation should move clockwise.

            /// </summary>

            Clockwise = 1,

            /// <summary>

            /// Indicates that the rotation should move counter-clockwise.

            /// </summary>

            Counter_Clockwise = -1,

        }

新增的私有字段(百分比领域被拆除和替换的文本字段)。

        private RotationType _rotation = RotationType.Clockwise;

        private int _numberOfVisibleCircles = 8;

        private string _text;

        private bool _showText;


加入公共属性

        /// <summary>

        /// Gets or sets the number of visible circles used in the animation.

        /// </summary>

        /// <exception cref="ArgumentOutOfRangeException"><c>NumberOfVisibleCircles</c> is out of range.</exception>

        [DefaultValue(8)]

        [Description("Gets or sets the number of visible circles used in the animation.")]

        [Category("Behavior")]

        public int NumberOfVisibleCircles

        {

            get { return _numberOfVisibleCircles; }

            set

            {

                if (value <= 0 || value > _numberOfCircles)

                    throw new ArgumentOutOfRangeException("value", "Number of visible circles must be a positive integer and less than or equal to the number of circles.");

 

                _numberOfVisibleCircles = value;

                Invalidate();

            }

        }

 

        /// <summary>

        /// Gets or sets the text to show on the control.

        /// </summary>

        [DefaultValue("")]

        [Description("Gets or sets the text to show on the control.")]

        [Category("Appearance")]

        public override string Text

        {

            get { return _text; }

            set

            {

                _text = value;

            }

        }

 

        /// <summary>

        /// Gets or sets a value indicating if the percentage value should be shown.

        /// </summary>

        [DefaultValue(false)]

        [Description("Gets or sets a value indicating if the text value should be shown.")]

        [Category("Behavior")]

        public bool ShowText

        {

            get { return _showText; }

            set

            {

                _showText = value;

                Invalidate();

            }

        }

 

        /// <summary>

        /// Gets or sets a value indicating if the rotation should be clockwise or counter-clockwise.

        /// </summary>

        [DefaultValue(RotationType.Clockwise)]

        [Description("Gets or sets a value indicating if the rotation should be clockwise or counter-clockwise.")]

        [Category("Behavior")]

        public RotationType Rotation 

        {

            get { return _rotation; }

            set { _rotation = value; }

        }


在OnPaint方法
内e.Graphics.Save的代码/恢复通话

            e.Graphics.TranslateTransform(Width / 2.0F, Height / 2.0F);

            e.Graphics.RotateTransform(angle * _value * (int)_rotation);

            e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;

            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

 

            for (int i = 1; i <= _numberOfCircles; i++)

            {

                int alphaValue = (255.0F * (i / (float)_numberOfVisibleCircles)) > 255.0 ? 0 : (int)(255.0F * (i / (float)_numberOfVisibleCircles));

                int alpha = _stopped ? (int)(255.0F * (1.0F / (float)_numberOfVisibleCircles)) : alphaValue;

 

                Color drawColor = Color.FromArgb(alpha, _circleColor);

 

                using (SolidBrush brush = new SolidBrush(drawColor))

                {

                    float sizeRate = 4.5F / _circleSize;

                    float size = Width / sizeRate;

 

                    float diff = (Width / 4.5F) - size;

 

                    float x = (Width / 9.0F) + diff;

                    float y = (Height / 9.0F) + diff;

                    e.Graphics.FillEllipse(brush, x, y, size, size);

                    e.Graphics.RotateTransform(angle * (int)_rotation);

                }

            }


评论会员:SohjSolwin 时间:2011/12/27
喜SohjSolwin,本文的贡献表示感谢,逆时针旋转是一个不错的主意,我会尽快更新的文章,包括它,如果你是用它确定。同时,我在这里通过在项目中使用这个控制的权限授予您长期以来一直遵循的控制已被释放(CPOL)许可证的条款。它总是很高兴知道,你的话是被人使用。
评论会员:Nitoc3 时间:2011/12/27
没问题,随时。和感谢。我一定会遵守的CPOL,我只是觉得更舒适与作者检查之前,我使用它。我要发挥与控制多一点,看看我能得到它在两个方向旋转一次,以及(主要是因为我想看看它看起来像),如果我得到它的工作我"会后的变化,以及
评论会员:。SohjSolwin 时间:2011/12/27
我觉得旋转,可在两个方向上做,如果你画一个方向,然后再在其他的,因为你必须旋转转换Graphics对象。在我看来,easyest方式。顺时针方向,绘制它还原图形,然后绘制逆时针。它可以这样工作的。尝试
评论会员:。Nitoc3 时间:2011/12/27
我周围混乱的双旋转一点点,但不是不喜欢的结果,所以我已经报废。我研究了一下标记的形状(所取得的进展圆)和其他有趣的结果(比界的形状的轮廓,如果您添加了大量的圆形,〜100,它看起来像一个不断进步的圈子,如果你添加一个轮廓时,它看起来有趣,稍令人目不暇接,如果您新增约30左右的Y大小绘制椭圆时,它开始寻找类似的圈子,看到刀片ISH设计)。

只是一个快速仅供参考,您可以删除所有的参照系统,System.Drawing,和System.Windows.Forms和建立NET 2.0,它仍然正常工作
评论会员:会员149016 时间:2011/12/27
我。 tryed 100界和控件时大,但它看起来并不在较小的尺寸这么好的效果看起来不错,它就失去了光滑的效果。大纲也给出了一个很好的线框效果。 y大小正常工作,如果控制大,再次,既然是一个固定的大小,控制尺寸减小时它会导致控制部分以外的客户端矩形裁剪椭圆绘制。对于正常工作,你应该做的东西,如大小(大小/ 2)。修改,2010年7月2日(星期五)上午10:30
评论会员:Nitoc3 时间:2011/12/27
本文乐趣。突出。如果我可以建议,你也可以作为财产,而不是恒定8圈数。我知道FF有8个,但添加的变化和乐趣,更多的各界将创建一个不同的效果。路径变得更加"扎实"。感谢
评论会员:aaronlzw_21 时间:2011/12/27
改变,如果我记得正确的,它只是需要改变旋转角度或圈数将有可能。我看,也许我会尽快发布一个更新
评论会员:。Nitoc3 时间:2011/12/27
我很开发的Windows Mobile应用程序。这将是巨大的,能够使用您的组件。我添加了dll文件到我的组件,它不允许我拉进我的移动形式的组件。可以使用
评论会员:?OKA133 时间:2011/12/27
我从来没有试图在移动应用程序,但我相信它可以与使用没有问题。你不能将其拖动到表单的原因是因为DLL是编译NET Framework中,没有紧凑的框架,您在您的项目中使用的PC版。尝试添加源文件到您的项目和测试,看看如果可以被编译
评论会员:Nitoc3 时间:2011/12/27
我看到这个版本是不兼容Compact Framework的
是否有一个版本兼容?

最好的问候