返回首页

{A}
简介
我是一个年轻的德国学生,所以请原谅我糟糕的英语... ...今年,我安装了微软新的Office套件,并使用它从第一分钟,我真正喜欢漂亮的GUI,尤其是好看的状态栏。因为我从来没有看到一个关于如何做一个类似的背景(我看到一些教程绘制单个项目),我决定借此机会,写一个自己的教程。它是如何工作
起初,我添加了双缓冲的功能,使用此代码(初学者):

Public Sub New() 

    Me.DoubleBuffered = True 

    InitializeComponent() 

End Sub

要绘制背景,你需要On_Paint事件。唯一要做的就是绘制顶部和两个LinearGradients(工期1:2)的边界。如果SizingGrip应涂(Me.SizingGrip = TRUE),你应该这样做。要得到的边界绘制SizingGrip,您可以使用此代码:{C}使用代码
您可以简单地添加控制工具箱和使用它像一个quot; regularquot; StatusStrip。

回答

评论会员:jdgosalia 时间:2011/12/07
using System.Drawing;

using System.Drawing.Drawing2D;

using System.Windows.Forms;

 

namespace NiceStatus

{

   public class NiceStatusStrip : StatusStrip

   {

      protected override void OnPaint(PaintEventArgs e)

      {

         Graphics grfx = e.Graphics;

 

         using(Pen p = new Pen(Color.FromArgb(86, 125, 176)))

         {

           grfx.DrawLine(p, 0, 0, Width - 1, 0);

         }

         grfx.DrawLine(Pens.White, 0, 1, Width - 1, 1);

 

         int height = (Height - 1) / 3;

         Rectangle lrect = new Rectangle(0, 2, Width, height);

         using(Brush br = new LinearGradientBrush(lrect, Color.FromArgb(215, 230, 249), Color.FromArgb(199, 220, 248), LinearGradientMode.Vertical))

         {

            grfx.FillRectangle(br, lrect);

         }

 

         lrect.Y = lrect.Y + height;

         lrect.Height = Height - lrect.Y;

 

         using(Brush br = new LinearGradientBrush(lrect, Color.FromArgb(179, 208, 245), Color.FromArgb(205, 224, 247), LinearGradientMode.Vertical))

         {

            grfx.FillRectangle(br, lrect);

         }

 

         if(SizingGrip)

         {

            Rectangle sgb = SizeGripBounds;

            using(Brush fbr = new SolidBrush(Color.FromArgb(69, 93, 128)))

            {

               using(Brush bbr = new SolidBrush(Color.FromArgb(177, 201, 232)))

               {

                  //right-top

                  grfx.FillRectangle(bbr, new Rectangle(sgb.X + sgb.Width - 3, sgb.Height + sgb.Y - 13, 2, 2));

                  grfx.FillRectangle(fbr, new Rectangle(sgb.X + sgb.Width - 4, sgb.Y + sgb.Height - 14, 2, 2));

 

                  //right-middle

                  grfx.FillRectangle(bbr, new Rectangle(sgb.X + sgb.Width - 3, sgb.Height + sgb.Y - 9, 2, 2));

                  grfx.FillRectangle(fbr, new Rectangle(sgb.X + sgb.Width - 4, sgb.Y + sgb.Height - 10, 2, 2));

 

                  //right-bottom

                  grfx.FillRectangle(bbr, new Rectangle(sgb.X + sgb.Width - 3, sgb.Height + sgb.Y - 5, 2, 2));

                  grfx.FillRectangle(fbr, new Rectangle(sgb.X + sgb.Width - 4, sgb.Y + sgb.Height - 6, 2, 2));

 

                  //middle-center

                  grfx.FillRectangle(bbr, new Rectangle(sgb.X + sgb.Width - 7, sgb.Height + sgb.Y - 9, 2, 2));

                  grfx.FillRectangle(fbr, new Rectangle(sgb.X + sgb.Width - 8, sgb.Y + sgb.Height - 10, 2, 2));

 

                  //middle-bottom

                  grfx.FillRectangle(bbr, new Rectangle(sgb.X + sgb.Width - 7, sgb.Height + sgb.Y - 5, 2, 2));

                  grfx.FillRectangle(fbr, new Rectangle(sgb.X + sgb.Width - 8, sgb.Y + sgb.Height - 6, 2, 2));

 

                  //bottom left

                  grfx.FillRectangle(bbr, new Rectangle(sgb.X + sgb.Width - 11, sgb.Height + sgb.Y - 5, 2, 2));

                  grfx.FillRectangle(fbr, new Rectangle(sgb.X + sgb.Width - 12, sgb.Y + sgb.Height - 6, 2, 2));

               }

            }

         }

 

         base.OnPaint(e);

      }

   }

}



和平宁静
评论会员:cpallini 时间:2011/12/07
我觉得你的代码是非常干净的。 TerminateThread的问题根本不适用,因为你不能做任何事情


评论会员:内维尔弗兰克斯 时间:2011/12/07
cpallini写道:我觉得你的代码是非常干净的。 TerminateThread的问题根本不适用,因为你不能做任何事情

我没有看过代码,但我从来没有使用TerminateThread,并写了相当多线程代码。

这是一个很好的线程池类在CP 这里抛出一个异常,让你杀erant线程。这是一个很好的清洁解决方案。

内维尔弗兰克斯,Surfulater
作者
评论会员:cpallini 时间:2011/12/07
内维尔弗兰克斯写道:我没有看过代码
然后,请看看吧... ...

内维尔弗兰克斯写道:"我从来没有使用TerminateThread,并写了相当多线程代码您通常没有使用它,我同意,但nevertless可能发生,你必须使用它。

顺便说一句:我恨我的电脑硬复位,但有时是唯一的方法... ...
评论会员:沃尔克冯Einem 时间:2011/12/07
?你有Boost.Threads一看(http://www.boost.org/doc/html/threads.html){BR }
这是相当成熟和附近的一个标准!

欢呼声,
沃尔克

评论会员:托德史密斯 时间:2011/12/07
。升压有可能成为这条
针对性有点吃不消
顺便说一句示范项目已包含在zip吨的额外垃圾。

托德史密斯
评论会员:沃尔克冯Einem 时间:2011/12/07
。Threadding是编程中最先进的主题之一
还有很多损坏的可能。
在这种情况下,例如,类使用TerminateThread作为标准。一看,有关该说什么的MSDN:
>>
TerminateThread是一个危险的功能,只应在最极端的情况下使用的。只,如果你知道目标线程正在做什么,你应该调用TerminateThread,您可以控制​​所有的代码,目标线程可能运行在终止时。例如,TerminateThread可能会导致以下问题:


*如果目标线程拥有一个关键部分,关键部分将不会被释放。 *如果目标线程是从堆中分配的内存,堆锁不会被释放。
*如果目标线程正在执行某些KERNEL32呼叫终止时,KERNEL32线程的进程的状态可能不一致。

*如果目标线程操纵一个共享DLL的全局状态,DLL的状态可能被破坏,影响其他用户的DLL。LT,LT;

欢呼声,
沃尔克
评论会员:FlamTaps 时间:2011/12/07
TerminateThread()是不是标准的方式退出线程。以上的Terminate()的评论指出:

/ /终止 - 终止线程(如果是积极的)
。/ /不想退出线程的另一种手段,
/ /调用终止()不允许线程免费
/ /任何资源,它可容纳

在生产代码,这个类是用来作为基类的ExitableThread类。,

克里斯
评论会员:FlamTaps 时间:2011/12/07
示范项目已经在它的所有的VS2005 auxillery文件,包括符号数据库和中间文件

意味着清理那些之前我张贴......对不起,

克里斯
评论会员:FlamTaps 时间:2011/12/07
示范项目已清理和更新...

克里斯
评论会员:怀疑论者痣 时间:2011/12/07
沃尔克冯Einem写道:你有在Boost.Threads看吗?这是相当成熟和附近的一个标准!

无论是也不是!

评论会员:FlamTaps 时间:2011/12/07
文章短。我渴望看到文章#2和#3