没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|其它|编辑:郝浩|2005-12-06 10:13:00.000|阅读 1253 次
概述:
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
拟定自定义和标准图像
在我正在构建的控件中,我决定允许两种主要的图像类别:标准图像和用户提供的图像。虽然最初的控件只支持两种标准图形(圆形和正方形),但是稍后我将讨论一种将自定义图形添加到该列表中的方法。
该控件的所有绘图在 OnPaint 例程中进行处理,我重写了该例程以提供我自己的渲染代码(参见下面的示例代码)。
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
e.Graphics.Clear(Me.BackColor)
Dim imageWidth, imageHeight As Integer
imageWidth = (Me.Width-(LeftMargin + RightMargin + ( _
Me.m_ImageSpacing * (Me.m_ImageCount-1)))) \ Me.m_ImageCount
imageHeight = (Me.Height-(TopMargin + BottomMargin))
Dim start As New Point(Me.LeftMargin, Me.TopMargin)
For i As Integer = 0 To Me.ImageCount-1
Me.ItemAreas(i).X = start.X-Me.ImageSpacing \ 2
Me.ItemAreas(i).Y = start.Y
Me.ItemAreas(i).Width = imageWidth + Me.ImageSpacing \ 2
Me.ItemAreas(i).Height = imageHeight
If Me.ImageToDraw = UserSuppliedImage Then
DrawUserSuppliedImage(e.Graphics, _
start.X, start.Y, imageWidth, imageHeight, i)
Else
DrawStandardImage(e.Graphics, Me.ImageToDraw, _
start.X, start.Y, imageWidth, imageHeight, i)
End If
start.X += imageWidth + Me.ImageSpacing
Next
MyBase.OnPaint(e)
End Sub
Protected Overridable Sub DrawUserSuppliedImage( _
ByVal g As Graphics, _
ByVal x As Integer, ByVal y As Integer, _
ByVal w As Integer, ByVal h As Integer, _
ByVal currentPos As Integer)
Dim img As Image
If m_hovering And m_hoverItem > currentPos Then
img = Me.HoverImage
ElseIf Not m_hovering And m_selectedItem > currentPos Then
img = Me.FilledImage
Else
img = Me.EmptyImage
End If
If Not img Is Nothing Then
g.DrawImage(img, x, y, w, h)
Else
Me.DrawStandardImage(g, Me.Circle, x, y, w, h, currentPos)
End If
End Sub
Protected Overridable Sub DrawStandardImage( _
ByVal g As Graphics, ByVal ImageType As Integer, _
ByVal x As Integer, ByVal y As Integer, _
ByVal w As Integer, ByVal h As Integer, _
ByVal currentPos As Integer)
Dim fillBrush As Brush
Dim outlinePen As Pen = New Pen(Me.OutlineColor, 1)
If m_hovering And m_hoverItem > currentPos Then
fillBrush = New SolidBrush(Me.HoverColor)
ElseIf Not m_hovering And m_selectedItem > currentPos Then
fillBrush = New SolidBrush(Me.SelectedColor)
Else
fillBrush = New SolidBrush(Me.EmptyColor)
End If
Select Case ImageType
Case Me.Square
g.FillRectangle(fillBrush, x, y, w, h)
g.DrawRectangle(outlinePen, x, y, w, h)
Case Me.Circle
g.FillEllipse(fillBrush, x, y, w, h)
g.DrawEllipse(outlinePen, x, y, w, h)
End Select
End Sub
在该例程中,计算每个图形的位置(使用 ImageCount 属性来确定应绘制的图形数量),然后调用 DrawStandardImage(绘制圆形或正方形)或
DrawUserSuppliedImage(绘制用户提供的图形)。
这些例程并不是最有效的(例如,我始终重新绘制完整的控件,而不是只将那些受特定更新影响的区域设置为无效),但是在必要时它们会考虑绘制适当的图形(或在标准选项情况下绘制适当的彩色图形)。在控件的其余代码中,每当属性或声明发生更改引起控件外观发生更改时,都会通过调用
Me.Invalidate 触发完整的重新绘图。OnMouseMove 的重写例程是这种类型代码的一个示例:
Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
For i As Integer = 0 To Me.ImageCount-1
If Me.ItemAreas(i).Contains(e.X, e.Y) Then
Me.m_hoverItem = i + 1
Me.Invalidate()
Exit For
End If
Next
MyBase.OnMouseMove(e)
End Sub
处理和启动事件
此时,该控件运行正常,主要是因为从 System.Windows.Forms.Control
中继承了所有出色的功能。这种继承关系为控件提供了一组可用功能,包括“Click”事件和拖动到 Windows
窗体的设计表面的能力。但是所需的不只是那些标准的功能,因此,我将向几个重要域中添加新的事件和代码(参见下面的示例代码)。
Public Event SelectedItemChanged As EventHandler
Protected Overridable Sub OnSelectedItemChanged()
RaiseEvent SelectedItemChanged(Me, EventArgs.Empty)
End Sub
Public Property SelectedItem() As Integer
Get
Return m_selectedItem
End Get
Set(ByVal Value As Integer)
If Value >= 0 And Value <= Me.ImageCount + 1 Then
m_selectedItem = Value
OnSelectedItemChanged()
Else
Value = 0
End If
End Set
End Property
这个新的 SelectedItemChanged 事件提供了许多便利,它还具有很好的辅助作用,即改善数据绑定性能。如果 Windows
窗体数据绑定代码发现一个事件,该事件具有遵循 Changed 格式的名称以及具有被定义为 System.EventHandler
的签名,则它将使用该事件作为绑定属性发生更改的通知。与轮询任何更改的属性相比,监控该事件的工作量要小得多,因此,最后将获得更有效的数据绑定。
我需要向控件中添加的其他例程只有 OnMouseEnter 和 OnMouseLeave 例程的重写,以确保用户在其上悬停时我正确地显示控件。
如下面的代码所示,我还需要重写 OnClick 例程,这样,在用户选取新的等级值时,我可以正确地更新当前选定的项目。
此时,虽然我可以添加许多“装饰品”,例如指定工具箱位图以及对我的属性进行分类的属性,但是该控件基本上已经完成,并且可以很好地工作。尽管如此,下一个窍门是允许其他开发人员对我的工作进行扩展,以便为其他图形提供支持。
Protected Overrides Sub OnClick(ByVal e As System.EventArgs)
Dim pt As Point = Me.PointToClient(Me.MousePosition)
For i As Integer = 0 To Me.ImageCount-1
If Me.ItemAreas(i).Contains(pt) Then
Me.m_hoverItem = i + 1
Me.SelectedItem = i + 1
Me.Invalidate()
Exit For
End If
Next
MyBase.OnClick(e)
End Sub
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号