返回首页

{A}{S0}简介
,在这篇文章中我将显示您的自定义进度控制,我作为替代常规Visual Studio ProgressBar组件。所以,我们将讨论: 如何创建一个自定义组件如何创建自定义事件和属性显示在属性窗口如何使用Paint事件的绘图和图形,以及如何使用渐变画笔背景
自定义控件从一个UserControl继承。一个UserControl称为漆事件,也就是所谓的控制每次需要重绘。我们将利用这个事件来绘制的进展。创建这个组件是非常简单:我们只需要绘制一个椭圆形(将剩余的时间)和馅饼(将所用的时间),下面的代码:

e.Graphics.FillEllipse(t_oBrushRemainingTime, t_oRectangle);

e.Graphics.FillPie(t_oBrushElapsedTime, t_oRectangle, -90f,

   (float)(360 * m_iElapsedTime / m_iTotalTime));

可以使用图形绘制的事情,最需要的是一个矩形,画的界限。此矩形被定义为组件的大小相同。{C}
要创建一个渐变的视觉效果涂装前的椭圆形,馅饼,两个不同的画笔变量定义剩余的时间和所用的时间来创建不同的视觉效果,如下所示:
我们将继续跟踪两个变量:m_iElapsedTime(保持实际价值ProgressBar的财产价值一样吗??)和m_iTotalTime(即保持的时间同样为ProgressBar的最大财产?? )。这两个变量是用来计算的角度表示经过时间的馅饼。因为任何人都知道,一个完整的圆360 °。为了得到实际的角度,我们只是m_iElapsedTime / m_iTotalTime * 360。
书面的唯一方法是递增()方法。它有一个整数作为参数,它是将被添加到m_iElapsedTime数量。但在此之前,我们只是检查是否m_iElapsedTime是m_iTotalTime更大。如果是这样,这意味着任务完成,并且该方法返回。如果不是更大,它被选中,如果要添加的值加m_iElapsedTime是大于或等于比m_iTotalTime。如果是这样,我们m_iElapsedTime平等m_iTotalTime,更新的控制和提高这两个事件,PCIncremented和PCComplete。如果不是更大,我们增加m_iElapsedTime,更新组件和提高PCIncremented事件。见下面的代码:
if (m_iElapsedTime > m_iTotalTime)

    return;



if (m_iElapsedTime + a_iValue >= m_iTotalTime)

{

    m_iElapsedTime = m_iTotalTime;

    this.Refresh();

    if (m_EventIncremented != null)

        m_EventIncremented(this, null);

    if (m_EventCompleted != null)

        m_EventCompleted(this, null);

}

else

{

    m_iElapsedTime += a_iValue;

    this.Refresh();

    if (m_EventIncremented != null)

        m_EventIncremented(this, null);

}

创建这些自定义事件(PCIncremented和PCComplete),我们创建一个名为EventHandler的委托。在此委托,现在我们声明两个变量的类型的EventHandler称为m_EventIncremented和m_EventCompleted,与修改事件,如下所示:
public delegate void EventHandler(object sender, string message);

public event EventHandler m_EventIncremented;

public event EventHandler m_EventCompleted;

引发一个事件,我们只需要检查,如果变量初始化,然后调用它。见下文:
if (m_EventCompleted != null)

    m_EventCompleted(this, null);

为了使这些事件可浏览在属性窗口的事件列表中,我们需要为他们创造的属性,并把摆在它面前的括号内的几个属性。主要属性是类别(),并设置它时会显示,在分类类别。其他属性的说明(),在属性窗口的底部显示一个简要说明。各自的属性的两个自定义事件的属性如下:
[Category("ProgressCircle"), Description(

    "Event raised everytime the component is incremented." +

    "Author: Sergio Augusto Bitencourt Petrovcic")]

public event EventHandler PCIncremented

{

    add { m_EventIncremented += new EventHandler(value); }

    remove { m_EventIncremented -= new EventHandler(value); }

}



[Category("ProgressCircle"), Description(

    "Event raised when the component get completed." +

    "Author: Sergio Augusto Bitencourt Petrovcic")]

public event EventHandler PCCompleted

{

    add { m_EventCompleted += new EventHandler(value); }

    remove { m_EventCompleted -= new EventHandler(value); }

}
使用代码
的源代码有两个项目。第一个实现组件,并生成一个程序集。第二个是一个测试项目,即第一个作为参考。所以,如果我们开放的测试项目的主要形式和工具箱,我们会看到组件。我们只需要拖放到下降的形式。
如果你想在自己的项目中使用这个组件,您只需将组件添加到项目的工具箱。只需右键单击工具箱,单击"选择项。然后单击浏览和搜索ProgressCircle.dll。单击打开和确定。之后,只需拖放到表单中。
要配置的组件,您可以使用属性窗口来改变颜色,其余的和经过时间的梯度变化的线性渐变模式,组件,并设置事件和经过时间。你的任务流,只需调用递增()传递参数THA值递增。这是所有!因为这只是简单的。历史
* 2008年4月 - 首先发布。
版权所有© 2007塞尔吉奥A. B. Petrovcic。保留所有权利。不要发布到其他网站未经我的明确许可。按照本网站的政策和程序,链接到这篇文章。 | sergioabp

回答

评论会员:游客 时间:2011/12/16
您好,我不知道如何停止滚动系列主题?我尝试您的演示代码,当我点击右上角的关闭按钮,在任务管理器演示程序STIL存在
zhujinlong19840913
评论会员:酷 时间:2011/12/16
格林
评论会员:游客 时间:2011/12/16
我还没有下载你的代码,但我运行演示程序。我有一个良好的图形卡的高端至强工作站,但通知CPU使用率是15%左右,运行时在其默认的窗口大小(小)。WPFRollingMonitorDemonstration.exe最大化窗口增加CPU使用率55%。据我所知,主CPU没有真正参与在WPF应用程序的渲染过程,除非有没有硬件的DirectX支持(在这种情况下发生的软件仿真工作做了GPU)因此,CPU使用率不应该依赖于WPF窗口的大小,不应该吗?你能否解释一下这个
德里克Bartram
评论会员:游客 时间:2011/12/16
。NET3.5下有没有硬件支持,所以CPU做所有的工作。这应该是明显的,因为调整窗口大小改变CPU的使用量。后来3.x版本将解决这个问题,但我不知道此刻的硬件支持的当前状态
|你做了这个程序就使用了"真实数据饲料。PeterKovach:"什么 - 例如:轮询串口,从一个文件实时读取数据等

谢谢 - 很好的工作!
评论会员:德里克Bartram 时间:2011/12/16
这取决于你真的"真实数据饲料"的意思... ...我亲自用于监控连接数和线程池的监测。绝对没有任何理由,我能想到的为什么这个控制,将不会用于其他用途,如串口等
评论会员:PeterKovach 时间:2011/12/16
当你提到线程池以"监督",什么样的数据是你处理/如何工作?

我真的想调查的串行端口的数据,但可以做一个文件读/写
评论会员:德里克Bartram 时间:2011/12/16
PeterKovach写道:"当你提到线程池以"监督",什么样的数据处理/如何?

*关我的头顶... ...
我周围的ThreadPool的包装,并已在使用的线程数(通过RollingSeries.NextValueDelegate()相连);简单但非常有效的一个方法返回。实际上是在CIRIP它的屏幕,上面的文章中拍摄。连接监视器类似,只不过NextValue返回使用中的连接数。

PeterKovach写道:"我真的想调查的串行端口的数据,但可以做一个文件读/写

我真的不知道这个库是你想要什么。这个库是用于显示实时连续统计的东西。也许在串行端口的情况下,你可以显示出类似的数据传输速率?你能给正是你正在尝试做一些更多的信息,我会尽力帮助
评论会员:。PeterKovach 时间:2011/12/16
我觉得你的应用程序是相当多,除了数据索里正是我想要的{ BR}
我想读的是一个文件,其中包含一个聚集"实时"数据流值(相当于读一个传感器,可以为每个读数的整数值)。数据实际上可能是"读"从设备,然后显示一步一步,加入图形,就像你这样做,因为数据需要的设备上飞",并上传到然后聚集以后显示设备。我想,就是这样"后事实"的数据显示在一个滚动显示,代表速度的"类似"这是什么
收集的数据
说真的,从你的应用程序的唯一的区别是,而不是产生一个虚拟随机数,我要流数据从一个文件

希望有意义

感谢你如此迅速地应对!
评论会员:基思规则 时间:2011/12/16
这是一个不错的开始在WPF图表记录。正如您所指出的,你真的需要把Y轴。此外,自动缩放并不难,如果你的缓冲区可见数据的。

还有一件事要注意的是,我用图表记录的经验是,你通常需要多个数据源的记录一次。你已经做了覆盖不同的数据源。然而,有一个图表,允许每个数据源的每一个独立的轴和X轴相关的独立的图表线条将是非常有用的的。

同样,一个很好的开始。我期待着你填写的功能。

基思规则
评论会员:德里克Bartram 时间:2011/12/16
谢谢你的意见

基思规则写道:另外,自动缩放不难,如果你的缓冲区可见数据的。

我知道...只是没有避开它。
基思规则写道:"然而,有一个图表,允许每个数据源的每一个独立的轴和X轴相关的独立的图表线条将是非常有用的的。

有趣的是,我将有一个,想。你会怎样InVisage公司的Y轴喜欢但如果是这样的话?
评论会员:PeterKovach 时间:2011/12/16
我说,"Y轴"带状图显示真正作为一个单独的部件属于"。你不希望它来显示/ upate反正图表。只要一个简单的部件,它的Y规模的图纸和重新调整
评论会员:。 时间:2011/12/16