返回首页

{A}
{S0}简介
这是一个自定义的控制内置使用VB.NET。这种控制的目的是允许用户执行任何一个过程的各个阶段,看到他们走多远,什么"phasequot;他们目前在,并选择性地表明,当用户准备移动到下一个"phasequot;背景
我一直对一个个人项目的需求管理,并已寻找到了很多不同的方式为用户提供友好和赏心悦目为用户的工作方式,只要这些软件的要求和项目管理的复杂的东西要求。我的屏幕之一,是一个总结的要求和当前quot; phasequot;我想有一些使用的颜色,是完全互动的。我不喜欢标准的长方形外观,大多数应用程序的感觉,因为,对我来说,它不指示方向。我也遇到类似的形状,才发现他们使用的是矩形重叠的多边形形状。这些结果中可以点击一个多边形(如尾巴),它会假设你的意思是其他的多边形。我也希望做一些研究自定义控件。有什么更好的方法来做到这一点,但通过创建一个。使用代码
代码分成三个主要方面:ddPhaseProgressBarItem - 类为每个多边形的信息。dmPhaseProgressBar - 自定义的控制,这是为收集ddPhaseProgressBarItem类的容器。它处理的组织,你看,感觉每个多边形的项目。它决定了quot收集选定的索引; phasesquot;演示的形式 - 这是用于实现自定义的控制,并添加自定义列表的quot; phasesquot;这是一个交互式设置为允许用户检查控制功能。步骤1:多边形项目
类ddPhaseProgressBarItem包含所需的所有信息,充分借鉴多边形。多边形的属性是一个用于绘制两个形状,FillPolygon和DrawPolygon点数组。你有Draw方法之前执行的填充,以确保边界将会对用户可见。
有四个,在此控制实现的基本形状。
注意:使用图形关闭标题的第四行看到所有三个形状集。形状设置1:一期项目
这种形状将只有一个进度条"选项卡时使用。这将是非常违反直觉,因为这是一个进度条。然而,有可能这是一个要求的时候。
这个多边形的形状是一个简单的矩形。形状设置2:两阶段项目
这种形状设置有两个特殊情况,都是从这里上了形状。左边的形状是一个五点多边形。正确的形状也是五点多边形。
第一个多边形,将是一个正确的来点半的方式向下和向外矩形方的简单的矩形。
第二个多边形将是一个简单的矩形左边来点半的方式和外来的矩形。形状设置3:三个或更多的阶段项目
这种形状设置将被用来当有3个或更多的标签。中间的选项卡将被重复,直到所有的定义阶段。
第一个和最后一个多边形形状设置#2相同。
中间的多边形是一个简单的长方形,左边来点半的方式向下和向内的矩形来点半的方式向下和向外从矩形的右侧。第2步:自定义控件
自定义控件收集ddPhaseProgressBarItems举行,整体形状是确定的。现在的形状集的定义,我们可以使用这些定义,以确定其形状设置,然后按照报告的每个多边形的状态。我们也将保持额外的状态,以便为quot; blinkingquot;,通过添加一个定时器控制,使用户可以通知未来quot; phasequot;准备。例如:当从MS Excel中导入文本,你可以在这里代表有四个主要步骤。见的底栏标题图形。
正如您可能已经猜到了,因为这是一个控制,大部分的工作是在OnPaint方法。你是对的。这些步骤完成初始化控制,并重复步骤2 - 5 OnPaint事件: 每个多边形(文本,的BorderColor的BackgroundColor等)的设置值。确定控制额外的空间之间的多边形共享。 确定每个多边形的形状。在屏幕上绘制每个多边形。绘制文本的多边形。步骤2.1:设定每个多边形的值
这一步是设置所有的值,您要更改默认值,并添加要添加到控制每个多边形的文本。我预设一些值,使开发人员可以看到在行动控制在设计时,所以你必须清除那些与clearPolygons方法。在这一点上,你产生一个新的多边形项目对象,ddPhaseProgressBarItem,设置你想要的所有值,直到添加完所有项目。
此示例显示了所有的随机值的属性:

Me.SuspendLayout()

Dim PhaseProgressBarItem As New ddPhaseProgressBar.PhaseProgressBarItem

PhaseProgressBarItem.Text = "File Selection"

PhaseProgressBarItem.Font = New Font("Arial", 10, FontStyle.Regular)

PhaseProgressBarItem.Font_Selected = New Font("Arial", 12, FontStyle.Bold)

PhaseProgressBarItem.FontColor = Color.FromArgb(&HFF000000)

PhaseProgressBarItem.FontColor_Selected = Color.FromArgb(&HFF0000FF)

PhaseProgressBarItem.BackColor = Color.FromArgb(&H78FFFFCC)

PhaseProgressBarItem.BackColor_Selected = Color.FromArgb(&H78FFFF00)

PhaseProgressBarItem.BorderColor = Color.Black

PhaseProgressBarItem.BorderColor_Selected = Color.BlueViolet

PhaseProgressBar1.AddPhase(PhaseProgressBarItem)



PhaseProgressBarItem = New ddPhaseProgressBar.PhaseProgressBarItem

PhaseProgressBarItem.Text = "Import Type"

PhaseProgressBarItem.Font = New Font("Arial", 10, FontStyle.Regular)

PhaseProgressBarItem.Font_Selected = New Font("Arial", 12, FontStyle.Bold)

PhaseProgressBarItem.FontColor = Color.FromArgb(&HFF000000)

PhaseProgressBarItem.FontColor_Selected = Color.FromArgb(&HFF0000FF)

PhaseProgressBarItem.BackColor = Color.FromArgb(&H78FFFFCC)

PhaseProgressBarItem.BackColor_Selected = Color.FromArgb(&H78FFFF00)

PhaseProgressBarItem.BorderColor = Color.Black

PhaseProgressBarItem.BorderColor_Selected = Color.Blue

PhaseProgressBar1.AddPhase(PhaseProgressBarItem)



PhaseProgressBarItem = New ddPhaseProgressBar.PhaseProgressBarItem

PhaseProgressBarItem.Text = "Delimiters"

PhaseProgressBarItem.Font = New Font("Arial", 10, FontStyle.Regular)

PhaseProgressBarItem.Font_Selected = New Font("Arial", 12, FontStyle.Bold)

PhaseProgressBarItem.FontColor = Color.FromArgb(&HFF000000)

PhaseProgressBarItem.FontColor_Selected = Color.FromArgb(&HFF0000FF)

PhaseProgressBarItem.BackColor = Color.FromArgb(&H78FFFFCC)

PhaseProgressBarItem.BackColor_Selected = Color.FromArgb(&H78FFFF00)

PhaseProgressBarItem.BorderColor = Color.Black

PhaseProgressBarItem.BorderColor_Selected = Color.DodgerBlue

PhaseProgressBar1.AddPhase(PhaseProgressBarItem)



PhaseProgressBarItem = New ddPhaseProgressBar.PhaseProgressBarItem

PhaseProgressBarItem.Text = "Sample Output"

PhaseProgressBarItem.Font = New Font("Arial", 10, FontStyle.Regular)

PhaseProgressBarItem.Font_Selected = New Font("Arial", 12, FontStyle.Bold)

PhaseProgressBarItem.FontColor = Color.FromArgb(&HFF000000)

PhaseProgressBarItem.FontColor_Selected = Color.FromArgb(&HFF0000FF)

PhaseProgressBarItem.BackColor = Color.FromArgb(&H78FFFFCC)

PhaseProgressBarItem.BackColor_Selected = Color.FromArgb(&H78FFFF00)

PhaseProgressBarItem.BorderColor = Color.Black

PhaseProgressBarItem.BorderColor_Selected = Color.IndianRed

PhaseProgressBar1.AddPhase(PhaseProgressBarItem)



Me.ResumeLayout()

我对速度的SuspendLayout和ResumeLayout的,因为我想,以尽量减少闪烁重绘控制。步骤2.2:填写额外的空间
这一步,是确定的长度,然后控制多边形的总基地长度,使我们能够确定均匀地分布到所有的多边形控制的总长度,以填补额外的空间,需要。通过这种方式,用户/程序员可以调整控制,并不会改变整体的可见空间或修改文本间隔值,以获得正确居中的文本。
我们通过测量每个多边形的文字加上预设的文本缓冲区值,加入他们一起为我打电话基地的整体长度。从控制的宽度减去的值会给予我们的quot; spacequot;需要我们中学的文本缓冲区值填充。除以多边形数量,结果,你有你的新的二次文本的缓冲区值。
使用。NET功能MeasureString(字符串来衡量,要使用的字体),我们得到一个二维的对象,让我们我们测量文本的整体高度和宽度。由于此版本控制(嘿,我不能为你做的一切:)是唯一的宽度而言,这就是我们要解决的。由于形状的设置,我选择了,我们只能处理文本的宽度加上文本缓冲区值;流入和流出的矩形的点实际上是互相恭维,以及最后的多边形并没有指出,所以我们没有为他们考虑在测量。
下面的代码功能,决定了次要的文本缓冲区(TextBufferForCentering):{C}步骤2.3:确定每个多边形的形状
这一步是确定每个多边形的形状,因为我们获得这种控制最终图纸阶段。使用前面定义的形状套(见上文),我们现在可以绘制形状使用了几件的信息。文本宽度文本缓冲区中学文本的缓冲区(TextBufferForCentering价值)控件的高度点的长度(多边形点的距离以外的矩形)
每个多边形,我们首先要确定一个起点。这是用同样的方法来完成,但在TextBufferForCentering价值,因为我们共同确定多边形的总长度的。但是,这一次,我们只能指望前面的多边形的多边形,我们目前正在例如,当我们确定的第三个多边形的起点,我们将确定的前两个多边形的总长度,将在第二个多边形的最右边点结束的起点。请记住,我们不使用点出来的矩形,因为他们是免费的。确定实际点,而不是出发点时,我们将只使用点的长度。是的,这是混乱的,但为什么有时更容易解释代码。 DeterminePhasePoly功能是完成这一努力。
本节中,我们将假设我们在绘制一个大于三个多边形的解决方案第三多边形的工作。
正如你可以看到在这个代码片断,我们确定的基于多边形的长度的多边形的起点。
Dim startPoint As Single = 0

...

For i As Integer = 2 To ItemPosition

    'measure the previous poly's text width



    iPrevious = i - 1

    sF = g.MeasureString(m_Phases.Item(iPrevious).Text, _

                         m_Phases.Item(iPrevious).CurrentFont)

    If iPrevious = 1 Then 'first tab



        startPoint += sF.Width + Me.TextBuffer + _

                      Me.TextBufferForCentering + 2

    Else ' middle tabs



        startPoint += sF.Width + Me.TextBuffer + _

                      Me.TextBufferForCentering + Me.PointLength + 2

    End If

Next i

现在,我们已经为出发点,我们可以数学确定的休息点。我们将绘制一个顺时针的方式(x和y坐标),这样的点像这样的出发点(这是我们的最复杂的聚)确定:1点:X =起点,Y = 02点:X =起点文本的宽度文本缓冲区TextCenteringBuffer点的长度,Y = 0第3点:X =点2点的长度,Y = 1 / 2控制高度第4点:X = 2点相同,但Y =控制高度5点:X =起点,Y =控制高度第6点:X =开始点长度,Y = 1 / 2控制高度
的聚点确定,我们现在分配这些值聚的对象的值。
m_Phases.Item(i).PolyPoints = DeterminePhasePoly(g, i)
步骤2.4:绘制多边形
最后一步是实际绘制的多边形和放置文本。好哇!
我们拉出的多边形,我们要画的所有的属性。我选择了从右到左绘制的多边形,因为多边形重叠。绘图时,得出的最后一件事是最上面的项目。因此,如果你想拥有的外观项目quot; stackingquot彼此顶部,则必须先绘制最底部项目,然后用自己的方式最上面的项目。每个多边形绘图时,你必须做同样的事情,太多。
penColor = m_Phases.Item(i).CurrentBorderColor

pPen = New Pen(penColor, 2)

bFontBrush = New SolidBrush(m_Phases.Item(i).CurrentFontColor)

bBrush = New SolidBrush(m_Phases.Item(i).CurrentBackColor)

fFont = m_Phases.Item(i).CurrentFont

sText = m_Phases.Item(i).Text

绘制单个的多边形时,我们必须吸取为了:背景填充文本
的兴趣点,你可能会注意到在阅读代码时,我修改了返回的颜色和文字的基础上的quot; Selectedquot;多边形的状态,CurrentBorderColor,CurrentFontColor,CurrentFont,并CurrentBackColor ddPhaseProgressBarItem。这样我就可以简化代码来绘制,因为我只要求电流值,并没有进行测试,如果多边形是quot; selectedquot;或在图纸阶段。我让对象本身决定它想要呈现什么颜色和文字。步骤2.5:放置文本
配售的文字,是需要完成的控制绘图部分的最后一个动作。但是,我们需要为中心,不只是砸任何地方和期望它雄辩地处理。
同样,我们知道我们正在处理,正确地确定文本其中心点的形状。您可能会注意到,我们实际上是在寻找文本开始的最左边的点,而不是多边形的中心。
If i = m_Phases.Count And i = 1 Then 'only one tab



    xForText = m_Phases.Item(i).polypoints(0).X + _

              (Me.TextBuffer / 2) + (Me.TextBufferForCentering / 2)

        yForText = (Me.Height - fFont.Height) / 2

ElseIf i = m_Phases.Count Then 'last tab



        xForText = m_Phases.Item(i).polypoints(0).X + _

                  (Me.TextBuffer / 2) + (Me.TextBufferForCentering / 2) + _

                   Me.PointLength

        yForText = (Me.Height - fFont.Height) / 2

ElseIf i = 1 Then 'first tab



        xForText = m_Phases.Item(i).polypoints(0).X + (Me.TextBuffer / 2) _

                   + (Me.TextBufferForCentering / 2) + (Me.PointLength / 3)

        yForText = (Me.Height - fFont.Height) / 2

Else 'all middle tabs 



        xForText = m_Phases.Item(i).polypoints(0).X + (Me.TextBuffer / 2) + _

                  (Me.TextBufferForCentering / 2) + Me.PointLength + _

                  (Me.PointLength / 3)

        yForText = (Me.Height - fFont.Height) / 2

End If

现在,在适当的位置绘制文本:
'draw the text for this polygon in its proper location

g.DrawString(sText, fFont, bFontBrush, xForText, yForText)

我们就大功告成了!现在绘制到屏幕上的控制。示范项目
我创建了一个示范项目,这将允许您,为读者/开发,获得这种控制良好的手感。我把上的形式,使用所有的控制功能的控制,再加上,我在闪烁的功能,我没去本文。这是我加入后,概述,并认为这将是一件好事,一边看我是如何建立控制自己的研究。这不是真的要使用所需的功能。
加载项目,并运行它在不改变源代码后,你应该看到匹配的顶行阶段的进度栏标题图(见上文)的控制。通过点击一个多边形,它应该改变选定的颜色和字体,并设置其权利的多边形闪烁状态。除非,当然,你是在最后阶段,那么没有多边形设置闪烁。哪些多边形用户点击?
运行演示后,它似乎,我错过了这段代码非常重要的一块。你怎么知道哪个多边形被点击,这样我就可以处理OnClick事件?好吧,我故意跳过了,因为我没有写的那部分。我发现一个很好的资源,确定一个点在多边形DAREL雷克斯芬利,位于{A2}。虽然我已转换它从C到VB.NET,它仍然是一个非常复杂的过程简单,他的研究。阅读他的文章中,要充分认识它。在写这篇文章的时,处理非常复杂的多边形,甚至与过境点的多边形创建空隙处理。 兴趣点
没有做了许多图形为基础的控制之前,我发现有趣的,有真正看我提请项目的顺序。基本上,从后到前。它还指出我在使用一个新的属性称为PenWidth(而不是在此示例代码)都互相接触,而不是重叠的多边形的方向。你会发现很多在我的计算,绘图和安置点2。这是钢笔的宽度占。
文本的位置是一个很好的的挑战,因为我结束了改变我画,因为文本可能落入的标签,这可能会导致重叠,文本和线条的点的多边形。当然,我不想这样。所以,我增加了更多空间​​均匀成基本的形状,但仍然抵消了文本推向一个小的多边形的点。
,惹恼一些我见过的控制,网络和应用程序,我的一件事是,当他们有复杂的形状,以取悦眼睛,他们不Click事件所涉及的实际形状。例如,我见过的选项卡形类似矿山点击多​​边形的点时,要么没有注册的点击,或登记错误的多边形。这是因为点击映射区域实际上是一个矩形,而不是相同的多边形。我知道这是容易做的矩形,但如果你采取的时间来产生用户看到的多边形,你应该使用相同的多边形的Click事件。
调试这一个恼人的,因为控制图形的性质。我有一个错误,竟然出现了两个选项卡环境的绘图最后一个标签的问题。我在顶部左侧的控制,而不是在最后一个标签(穷人的复制/粘贴在我的部分)结束的最后一个标签点,因为它是第一个绘制(请记住,我画从右到左),下面这是我的所有其他选项卡。问题是,当我测试使用鼠标点击DAREL的方法,我是测试由左到右。我没有一个quot;如果情况属实,打破outquot;行,所以这是一个quot;是的,在这polygonquo​​t的价值超过一个多边形:我是一个点击它下面的形不佳的多边形。评论我不想让所有的多边形绘图阶段,只显示我想要的,发现的问题,但我认为在这种控制的透明度值加入,将在未来的一件好事。错误
目前,我只看到一件事,可能被认为是一个错误的控制。
控制是不能完全处理的quot;额外的spacequot;是多边形的长度与控制的长度之间的差异。有次当控制是不是在所有的空间填充。我知道它的小数点后的地方,加起来的价值,造成像素的控制权结束的空间值得做的数学。我的工作对会计额外的空间,将最有可能把它添加到最终的多边形。这种控制的思路
由于我们是新东西的主题,以下是几个我想到的想法,可能是有趣的添加到这个控制,使其更可用。
反应,最小的高度和宽度。在最小高度和宽度为整个控制属性的加入,我们可以更好地处理形式调整大小,并引发事件,以防止太小纵向或横向的控制。我们可依据的最长可能得到控制,因为字体(大小和家庭)和实际的文字组合。为了这个工作,我们将可以有多种可能的情况下,限制功能,或帐户。一个出现在我脑海中是限制数量的多边形,可以从不同的基本字体。当一个多边形"; selectedquot,字体可能会改变,导致文本的高度和宽度的增加。这是占绘制控件时,但在逐案。控制变化的总长度,这就是为什么我添加在围绕文本的二次间隔。如果我们不限制控制,像quot事情;如果poly1和poly2被选中,然后将Xquot的最小长度;情况下会为每个运行,那么最坏的情况下长度决定的。可能只是做一个简单的答案选中与未选中,确定的最高数字的所有可能的组合,就大功告成了。但是,这是正确的?不是真的,但对政府工作非常密切。
更好的着色。我读了几篇文章,在这里,看到一个标签控制,不着色的标签,给它的光泽或玻璃反射的外观和感觉的一些数学计算。我不喜欢刚刚从标准的RGB值的拉动,但是,这种控制已经开始。把更好的色彩,符合用户的需要显示功能相当。漂亮的销售比功能更好,就看在Windows与Linux的:D
添加Visual Studio的设计时间控制功能。除了简单的属性,如文本的间距值,我想看到​​一个开发人员能够在设计时添加的阶段。 DataGridView控件一样。您可以添加列的收集,将是很好的,这样你就可以添加没有有在运行时的阶段,颜色,文字等,。我可以看到被用于如显示一个导入向导,这种性质的事情的步骤静态控制,并不一定需要在运行时动态添加/删除阶段。
全球的设定值。我认为,一些用户将受益于全球的值设置为使用此控制。如果用户可以简单的设置,而不必为每个多边形像背景颜色,选择的背景颜色,边框颜色和全球价值观,这将加快从一开始就控制编码。虽然我的演示代码显示,您可以设置所有这些项目相互独立,我当然可以看到当一个单一的背景颜色匹配quot倍; selectedquot;背景颜色,字体,和所有将设置一个单一的标准,整个控制。历史2007年3月 - 首先发布。
版权所有© 2007丹莫里斯。保留所有权利。不要发布到其他网站未经我的明确许可。按照本网站的政策和程序,链接到这篇文章。

回答

评论会员: 时间:2
|