65.9K
CodeProject 正在变化。 阅读更多。
Home

一些 C# 控件 - 启动画面、PixelProgressBar、PieGraph

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.03/5 (16投票s)

2006年2月15日

4分钟阅读

viewsIcon

75661

downloadIcon

2875

一些易于使用的控件,用 C# 编写

Progress Bar and Pie Chart

SplashScreen

引言

好的!我用 C# 编写了几个控件,我相信全世界都会对它们感兴趣!第一个是一个启动画面,只需要两行代码就可以使用。第二个是一个进度条,它用图像代替矩形来绘制,我觉得这样很好看。第三个是一个饼图控件,我实际上在工作中需要它来做一些事情。

背景

这段代码对于任何想要一个简单的 C# 控件制作示例的人来说都应该相当有趣。CP 上可能有很多更复杂的例子,但我对简单的事物感兴趣。因为我就是这么简单……

使用代码

代码应该很容易使用。与所有控件一样,您可以将 DLL 拖到 Visual C# 或您使用的任何开发环境的工具箱中。然后,您可以将控件拖到您的窗体上。我将分别介绍每个控件的代码。

控件,而该控件又负责动画。

SplashScreen 类使用起来非常简单。您需要做的就是创建一个对象,通过调用构造函数并传入图像文件的名称,然后调用 ShowSplashScreen 方法。您可以将您希望显示启动画面的时间(以毫秒为单位)传递给该方法,它就会显示那么长时间。此外,如果用户在时间到期前单击启动画面,它将自行销毁并将其控制权返回给您的应用程序。
// I'd put this code in your form's constructor, right after InitializeComponent()
SplashScreen splash = new SplashScreen(@"..\..\wdilogo.png");
splash.ShowSplashScreen(3000);

您可能会说,“启动画面的意义不就是在我应用程序加载时显示图像吗?”没错,但我的应用程序加载速度极快,因为我是一个如此优秀的程序员。我仍然想体验制作启动画面的乐趣,所以写了这个类。您可以创建一个线程来初始化您的应用程序,然后显示启动画面。

PixelProgressBar

这个很有意思。我在这里看到了很多关于进度条的精彩文章,但我想要一些更通用的东西。所以,我创建了这个类来显示进度,但随着进度的增加,它会逐渐显示一张图像。另外,我非常喜欢这种等距像素艺术风格,所以我让它显示其中一张这样的图像。我使用的图像可能还需要一些改进,但我不是艺术家。总之,使用方法如下:在这段代码中,我设置了一个名为 timer1 的计时器。下面是启动进度的代码
pixelProgressBar1.Max = max;
timer1.Enabled = true;

所以您只需要设置进度条的最大值,然后打开计时器。显然,您还需要在计时器滴答时做一些事情。

if (!pixelProgressBar1.Step())
{
  timer1.Enabled = false;
  MessageBox.Show("Done!");
}

Step 方法返回进度条的状态,所以当它返回 false 时,我们就知道完成了,可以关闭计时器并显示一条消息。

PieGraph

这个相当不错。我想要一个简单易用的饼图控件。所以,我写了这个。要使用它,您只需要给它一个百分比数组和一个字符串描述数组。像这样
double[] v = { 25.0, 15.0, 30.0, 30.0 };
string[] t = { "twenty-five", "fifteen", "thirty", "forty" };
pieGraph1.SetValues(v, t);
是不是很简单!?

猜猜怎么着!还有更多!这个控件的一个附加功能是它可以返回当前图表状态的 Bitmap 对象。然后,您可以将图表保存到文件,如下所示

string filename = @"..\..\pie.bmp";
Bitmap pie = pieGraph1.GetBitmap();
pie.Save(filename);
哇!

关注点

PieGraph 中的有趣之处

编写这个控件对我来说很有趣。我学到了 GDI+ 的一些新知识,这些知识我可能永远也不会学到。首先是 Graphics.FillPie 方法。我绞尽脑汁想办法画一个饼图扇形,直到我找到了这个方法。您只需要告诉它一个角度和一个边界框,它就会为您画好!

// last_angle is the start angle, and vals[i] is the sweep angle
g.FillPie(brushes[i], 0, 0, this.Width, this.Height, last_angle, (float)vals[i]);

绘制旋转文本也是一个有趣的尝试。下面的代码会在指定的角度绘制文本

Font f = new Font("Helvetica", 14.0f);
Point center = new Point(this.Width / 2, this.Height / 2);
g.TranslateTransform(center.X, center.Y);
last_angle = 0.0f;
float x = 0.0f;
for (int i = 0; i < vals.Length; i++)
{
   string s = t[i];
   g.RotateTransform((float)vals[i]);
   StringFormat sf = new StringFormat(StringFormatFlags.NoClip);
   sf.Alignment = StringAlignment.Near;
   sf.LineAlignment = StringAlignment.Far;
   SizeF str_size = g.MeasureString(s, f, 150, sf);
   x = (this.Width / 2) - str_size.Width;
   g.DrawString(s, f, Brushes.White, x, 0, sf);
}
您可能还会注意到其中的字符串测量代码。那是因为我希望将描述右对齐地绘制在饼图扇形中。最初,我把所有的字符串都放在圆的中心开始绘制,但这使得图表看起来太拥挤了。将它们移到边缘使图表看起来更好,正如您在本文开头的截图中所看到的。

历史

更新

在一些用户评论的帮助下,我在 SplashScreen 的绘制方法中发现了一个错误。
e.Graphics.DrawImageUnscaled(image, 0, 0); 在绘制之前缩放了图像!

没有改进!一切都很完美!

实际上,我已经知道一些问题了。比如,如果您将最大值设置为 > 300,进度条将永远不会前进,而且饼图不会检查您是否输入了总和大于 100 的百分比。如果有人使用此代码,我会考虑修复这些问题。

© . All rights reserved.