admin 管理员组

文章数量: 1184232


2024年3月7日发(作者:霹雳布袋戏官方微博)

……………… ………………………………………… 实用第一 智慧密集 .. , … … 利用VB2005制作颜色渐变的进度条 杨龆 摘要:在Windows XP环境下.使用VB2005制作一个漂亮的颜色渐变的进度条组件。 关键词:VB2005:数据库:颜色渐变 1 引言 颜色渐变进度条的显示相当于使用许多颜色相近的“画 笔”在窗体上绘制方框。这些“画笔”就相当于一个画笔数 组。首先要建立颜色数组,初始的时候放人一些颜色值,然后 根据平滑度的设置来重新设置颜色数组。依次取出颜色数组中 两个相邻的颜色值,计算这两个颜色经过混合后的颜色.再放 入到两个颜色的中间。例子中颜色数组中有8种颜色。平滑度 的值从0开始循环,最高是7。每经过一次循环,颜色数组中 就增加了一些过渡颜色。平滑度设置得越大,则颜色过渡得越 柔和。产生的效果越漂亮。颜色数组生成之后,画笔数组就确 定了,它得大小和颜色数组一致。有了画笔数组,下面的问题 就是在窗体上进行绘图操作了。 2原理 在绘图操作之前,要重载基类中的窗体的消息处理事件 WndProe,窗体大小变化事件OnResize和窗体重绘事件 OnPaint。加入以下属性设置: Minimum.表示进度条的最小值,默认是O。 Maximum,表示进度条的最大值,默认是100。 Value.表示了进度条的当前值,默认是0。 Smoothness,表示了进度条颜色渐变的平滑度,默认是0。 在初始化的时候,设置了以上四个属性后,相应的画笔数 组产生了。当前值的每次改变都要触发OnPaint事件。触发事 件后,首先绘制进度条的外部边框,接着得到内部边框的总宽 度和高度。根据当前值、最小值和最大值计算完成百分比,由 完成百分比乘以总宽度得到当前值占用的宽度。总宽度除以画 笔数组的个数得到每个画笔所占用的宽度。然后就是从初始宽 度循环到当前值占用的宽度,从画笔数组巾依次使用画笔按照 每个画笔所占用的宽度和高度填充颜色。循环结束后,如果百 分比为100%.则使用画笔数组中的最后一个画笔绘制颜色, 进度条显示完毕。 3步骤 打开VS2005,点击“文件”一“新建项目”,在打开的窗 体中. “项目类型”选择“Visual Basic”, “模板”选择 “Windows控件库”。在左下角,“名称”改为 “GradientProcessBar”。按下“确定”按钮,新建工程。在“解 决方案资源管理器”窗口中,将文件名UserControl1.vb改为 GradientProcessBar.vb。将下面完整的代码加入到 GradientProcessBar.vb文件中: Option Strict On Option Explicit On Imports System.Drawing Imports System.Windows.Forms Public Class GradientPr0cessBar Inherits UserControI Public Const MinSmoothness As Integer=0 最小平滑魔 Public Const MaxSmoothness As Integer=7 最大平滑度 Private Const BorderWidth As Integer=2 边界宽度| lPrivate IstDefault As List(Of Color) 颜色数组} i Private IstBrushes As List(Of SolidBrush) 画笔数组 Private m_Value As Integer=0 当前进度值 Private m—M mum As Integer:0 最小进度值 Private m—Maximum As I nteger=1 O0 最大进度值 Private m—Smoothness As Integer=0 平滑度 进度值设置 Public Property Value()As Integer Get Return m—Value End Get Set(ByVal value As Integer) m_Vatue=value If m—Value<m—M_njmum Then m_Value= mMinimum If mValue>m—Maximum Then m_Value= mMaximum Me.Invalidate(FaIse) End Set End Property 最小值设置 Public Property M mum()As Integer Get Return m—Minimum End Get Set(ByVal value As Integer) 

, COMPUTER PROGRAMMING MAINTENANCE一・ m M mum=value lf mM n mum>m—Maximum Then Swap (m—M mum,m—Maximum) If m_Value<m—M mum Then m—_Value= m M mum Me.1nvaIidate(FaIse) End Set End Property 最大值设置 Public Prope ̄y Maximum()As lnteger Get Return m Maximum End Get Set(ByVal value As Integer) m Maximum=value lf m Minimum>m Maximum Then Swap (m—M mum,m—Maximum) lf mValue>mMaximum Then mValue= m Maximum Me lnvaIidate(FaIse) End Set End Property 平滑度设置 Public PropeEy Smoothness()As Integer Get Return m Smoothness End Get Set(ByVal value As Integer) If value<GradientPrOcessBar.MinSmoothness Then value=MinSmoothness If value>GradientPrOcessBar.MaxSmoothness Then value=MaxSmoothness m Smoothness:value BuildColorList(IstDefault) Me.tnvalidate(False) End Set End Property 交换值 Private Sub Swap(ByRef val1 As Integer,ByRef val2 As Integer) Dim temp As Integer temp=vail vaI1=val2 val2=temp End Sub Public Sub New() InitializeComponent() Me.BorderStyle = Windows Forms.BorderStyle Fixed3D 设置窗体为凹陷的效果 最简单的实现双缓冲绘图 AIIPaintinglnWmPaint忽略系统消息,防止图像闪烁 DoubleBuffer设置双缓冲,防止图像抖动 UserPaint自己为控件做昕有的绘图操作 Opaque使窗体绘制时,不绘制背景 Me SetStyle(ControlStyles.AllPaintinglnWmPaint Or ControIStyles.UserPaint Or ControlStyles.DoubleBuffer Or ControlStyles.Opaque,True) 更新风格 Me.UpdateStyles() 新建颜色列表,加入红色,桔黄色,黄色,绿色,蓝绿色,蓝 色,深蓝色,紫色 IstDefault=New List(Of Color) IstDefault.Add(Color.Red) IstDefault Add(Color.Orange) IstDefault Add(Color.Yellow) IstDefault.Add(Color Green) IstDefault.Add(Color Cyan) IstDefault Add(Color.Blue) IstDefault Add(Color Indigo) IstDefault。Add(Color Violet) Value=M nimum End Sub 将两个颜色值混合成一个新的颜色。 Private Function MixColors(ByVal color1 As Color,ByVal color2 As Color)As Color Return Color.FromArgb(Clnt《(Clnt(color1.R)-I-Clnt (color2 R))/2),CI nt(《Cl nt(colo门.G)+Clnt(color2.G))/2),Clnt ((Clnt(colorl B)+Clnt(color2 B))/2)) End Function 建立颜色数组和画笔数组 Private Sub BuildColorList(ByRef IstAdd As List(Of Color)) Dim C As Color Dim IstColors As New List(Of Color) IstBrushes=New List(Of SolidBrush) For Each C In IstAdd IstColors Add(c) Next Dim idx As Integer 颜色数组索引 Dim cnt As Integer 颜色数组长度 Dim sdc As Integer 平滑度索引 根据平衡度的不同创建颜色数组 For sdc=0 To mSmoothness Step 1 idx=0 cnt:IstColors.Count一1 While idx<cnt IstColors.InseE(idx+1.MixColors《IstCotors《idx) IstColors(idx+1))} idx+=2 cnt+=1 End While Next sdc 根据颜色数组创建画笔数组 For Each C In IstColors IstBrushes.Add(New SoIldBrush(c)) 瞬 i 奠鳙藉2渡010圬,与3囊 83

。 … 。 ‘ ‘‘‘‘ 。‘‘‘‘’’‘‘ t’ 实用第一/智慧密集 Ne×t If idxColor<tstBrushes.Count Then idxColor+=1 End If Next End Sub 重载消息处理事件。 Protected Overrides Sub WndProc(ByRef m As System Windows.Forms.Message) If m.Msg=&H14Then Return End If MyBase.WndProc(m) End Sub 重载窗口寸改变事件 Protected Overrides Sub OnResize(ByVal e As System EventArgs) MyBase.OnResize(e) Me.1nvalidate(FaIse) End Sub 重载窗口绘制事件 Protected Overrides Sub 0nPaint《ByVal e As System Windows.FOrms.PaintEventArgs) MyBase.OnPaint(e) 绘制外框 e.Graphics.FillRectangle (New SolidBrush(Me BackColo ̄,Me.ClientRectangte) 完成百分比 Dim percentComplete As Single=CSng f(m_Value— m—Mjnimum)/(m_Maximum—m—M nimum)) lf percentComplete<:0,OF Then Exit Sub If percentComplete>1.OF Then percentComplete= 1.OF Dim fullWidth As Single 总宽度 fullWidth=CSng(Me.CfientRectangfe.Width~ BorderWidth) 当前百分比所占用的宽度 Dim totalWidth As Single=fullWidth percentComplete 每个画笔填充颜色占用的宽度 Dim ba r\^, h As Single barWidth=fullWidth barWidth/=CSng(IstBrushes.Count) Dim height As Single 起始宽度 Dim halfBorder As Single=CSng(BorderWidth/2) Dim idxColor As Integer:0 Dim XAs Single 每个画笔填充颜色占用的宽度 height=CSng(Me.ClientRectangIe.Height— BorderWidth) 根据当前百分比所占用的宽度使用画笔填充颜色 For X=halfBorder To totalWidth Step barWidth e.Graphics.FillRectangle(IstBrushes fidxColor) ×, halfBorder,barWidth,height) ,010藿. 3 \: .//鼍l-l-技巧与 当进度为100% ̄,使用最后一个画笔填充颜色一 :i≯ If《×<(Me.ClientRectangle.Width—halfBorder)) percentComptete=1.0 Then If idxColor<IstBrushes.Count Then 0 e.Graphics.FillRectangle(IstBrushes(idxCoIo halfBorder,((Me.CtientRectangle.Width—halfBorde ̄}一 height) End If End If End Sub End Class 保存项目后,按下“生成”菜单中的“生成 GradientProcessBar”选项,生成了组件GradientProcessBar.dII。 4测试 点击“文件”一“新建项目”,在打开的窗体中, “项目 类型”选择“Visual Basic”。 “模板”选择“Windows应用程 序”。在左下角,“名称”改为“Test”。按下“确定”按钮,新 建工程。在打开的窗体Form1.vb中,加入一个Button控件, 设置属性Text=启动。在Label控件,设置属性Text--当前进 度。在Timer控件。点击“工具”菜单下的“选择工具箱项”。 点击“.NET Framework组件”页,点击“浏览”按钮,选择 刚才生成的组件GradientProcessBar.dll加入到窗体中,如图l 所示 rtEY Fr ̄e*ork 件lⅫ …一~ 一一 {唧一一一… 回Fot ̄tBialog System ̄i=dows Forms Syst ̄fInd…ron 全腮} 口Yoz ̄tDJ 。g^rr 一】cr竹oft yl¥tll1BjsI c Co M】a ̄rosoft yj s-I1B 全J陋j 团Form System W VI mobl1.Cont syst_Ifeb|obil*(垒脾f 口F…11l …lder F Point Ln SpreId F ̄xPoint n卸r・-d 垒腿f 口FormulaTe ̄tBox Fa计o1nt Tin Spre“ P*xPoinL n sIr・‘a全脆E 回Form ̄iew Syst钿 ebⅡ ebco=trol Syst ̄lY*b口0 0 0)垒腿£ 口FpSpread F Polnt fin SprtId F ̄Point Wia Spr.Id垒肥 ■ 融器 ) 擘 : 纂 ’ 图1加载组件 点击 “确定”按钮,则在工具箱中有了 GradientProcessBar控件。在窗体上加入一个GradientProcessBar 控件。设置属性Name:Pbl。在Form1.vb中添加如下代码: Public Class Form1 Private Sub Bu ̄onl~Click(ByVal sender As 

…… C0啊PUTERPROG胁M啊lHGMAINTENANCE.………… -.…一-”…--… .… ...…一 ... .. ,.…,…………… Object,ByVal e As System.EventArgs)Handles Button1 Click 设置进度条初始值 Pbl,Mjnjmum=0 Pb1.Maximum=1OO Pb1.Value=0 Pb1.Smoothness:4 启动进度条 Timer1.1nterval=10 Timer1 Enabled=True End Sub Private Sub Timer1 Tick(ByVal sender As System.Object ByVal e As System.EventArgs)Handles Timer1.Tick 显示当前进度。 Pb1.Value+=1 Label1.Text=”当前进度:“+CStr(Clnt(Pb1.Value/Pbl Maximum 100))+“%” End Sub End Class 按“F5”键运行程序,显示如图2所示窗体。 按下“启动”按钮,显示当前进度,如图3所示。 图2程序演示 进度条显示完后,如图4所示。 5 结语 图4程序执行结束 对基于VB2005实现颜色渐变进度条作了详细分析,并对 组件编程技术作了初步的介绍,关于这方面的技术.有兴趣的 读者可以参考相关的资料,为以后能开发出更多更好的组件打 下一定的基础。 f收稿日期:2009—11—25) 枷她 是 地 枷蛐 ■ 用友推AIl_in—One是跳跃式发展的前奏P¥7 § 乏 借助经济危机,抄底收购,实现跳跃式发展是很多企业亳 遇到的产业机遇。2009年腾中重工收购悍马,吉利洽谈收购 沃尔沃,一大批中国企业开始走出国门抄底收购,实现跳跃 式发展。而还有-- ̄tL企业根据自身需要,在国内同行范围展 开收购。例如用友软件,在2008、2009等相继大手笔收购 下大批国内软件企业和区域型软件分销服务商。用友收购成 批软件企业意欲何为? 1月16日,用友终于揭开了其系列收购的首个成果一 u8 All—in—One产品。这款号称能满足中小企业全面信息化嚣 需求的产品,整合了2008 fi-收购的特博深CRM(客户关系簪 管理软件)、整合了前不久收购的重庆迈特的PLM(产品生命 亏周期管理软件),以及用友内部自主研发的致远协同办公、用亳 友U8一HR、用友BI、用友分销零售等多套软件系统。并通冬 至过用友UAP平台实现整合。毒  EBu总经理向奇汉被提升为高级副总裁将主管U8 All一 in—One和U9业务发展 向奇汉表示: “U8 All—in—One为用 户提供全面信息化应用同时不妨碍用户继续选择用友U8或 用友PLM等产品局部信息化应用。U8 All~in—One是一个松 耦合产品组合。其最大的优势是能给用户更大的选择空间。 用户选择用友后,既可以满足当前局部应用需求,同时也不 用担心今后拓展应用中.会遇到某些新应用不能和老系统对 萋接的问题。” 谈起竞争对手,向奇汉说: “目前国内U8的竞争对手, 都还没有能够提供U8 All—in—One相似的产品组合.剑指这 些企业将无法再与U8实现市场竞争。”没有资本整合实力, 萎  单独依靠内部创新已经不能满足当前管理软件市场竞争的需 求。 此外,本次发布的u8 All—in—One,在名称j二,与SAP 宴在国内,面向巾小企业市场推广的A1,全称SAP All in One 乏一致,用友方面未对名称闯车给出解释。但可以看出用友在 市场定位上,全面竞争国际巨头,与国内企业甩开距离的意 图。 萤 计世资讯副总经理曹开彬在会上指出:2009年整个中国 通用管理软件市场规模已经达到146.6亿,它的增长率达到 16.5%。可以细分为:ERP、BI、HR、CRM、SCM、财务软 件等等,ERP在09年是89个亿.占了60%的比例。其次是 ,42财务软件、供应链、HR、BI。从增长情况来看,我们看到一 个比较有意思的现象,现在HR、BI这样的软件增长率增加, 从去年来看增长最快的是BI,其次是HR。 奠一 耋 


本文标签: 颜色 数组 收购 用友 画笔