没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|其它|编辑:郝浩|2005-03-11 10:32:00.000|阅读 1544 次
概述:
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
第 4 步:绘制控件的外观
要使控件具有一个可视的外观,我们需要在 Paint 事件中放置逻辑。然后,每次控件需要刷新其可视外观时,就会运行该逻辑。
Windows 窗体中的 Paint 逻辑使用 .NET 中 GDI+ 部分中的类。这些类基本上包括了 Windows API 图形功能。由于适合
.NET,所以比 API 更易于使用。但是,有关它们的工作原理,需要理解以下几点。
在 Windows API 中,图形操作需要一个窗口句柄,有时称为 hWnd。在 GDI+ 中,它由 Graphics
对象取代,该对象不仅代表了绘图区域,还提供在该区域执行的操作(方法)。
例如,Graphics 对象具有以下方法,可用来绘制各种屏幕元素:
这些都是很容易理解的,只是可用方法的示例。一些更复杂的方法还允许旋转对象。我们将使用 DrawRectangle 方法绘制边框,使用
FillEllipse 方法绘制彩色的圆。
大多数绘图方法都要求使用 Pen 或 Brush 对象。Pen 对象用于绘制直线并确定直线的颜色和粗细。Brush
对象用于填充区域、确定填充区域所使用的颜色,以及一些特殊效果(例如,用位图填充区域)。我们将使用特殊的 Brush 效果使当前没有亮起的灯的颜色变暗。
下面是处理控件的 Paint 事件的代码:
Protected Overrides Sub OnPaint(ByVal pe As _ System.Windows.Forms.PaintEventArgs) MyBase.OnPaint(pe) Dim grfGraphics As System.Drawing.Graphics grfGraphics = pe.Graphics ' 首先绘制三个代表灯的圆。 ' 一个亮起,其余两个熄灭。 DrawLight(TrafficLightStatus.statusGreen, grfGraphics) DrawLight(TrafficLightStatus.statusYellow, grfGraphics) DrawLight(TrafficLightStatus.statusRed, grfGraphics) ' 现在绘制红绿灯周围的轮廓 ' 用画笔绘制轮廓,将它涂成黑色。 Dim penDrawingPen As New _ System.Drawing.Pen(System.Drawing.Color.Black, msngBorderWidth) ' 在控件上绘制红绿灯的轮廓。 ' 首先定义要绘制的矩形。 Dim rectBorder As System.Drawing.Rectangle rectBorder.X = 1 rectBorder.Y = 1 rectBorder.Height = Me.Height - 2 rectBorder.Width = Me.Width - 2 grfGraphics.DrawRectangle(penDrawingPen, rectBorder) ' 释放图形对象 penDrawingPen.Dispose() grfGraphics.Dispose() End Sub |
首先使用基类绘制,它通常使用控件的背景颜色绘制背景。然后,从事件参数中获取控件的 Graphics 对象。
接下来,用一个函数画出三个圆。有关该函数的内容稍后介绍。请注意,我们必须向该函数传递一个 Graphics 对象的引用,同时还要指示要画的圆(红、黄、绿)。
然后是绘制轮廓的代码。声明一个具有适当位置和大小的矩形,然后传递给 Graphics 对象的 DrawRectangle 方法。
最后,图形对象激活其 Dispose 方法。使用 GDI+ 时,最好在完成图形对象后立即释放它们。这有助于清除操作系统绘图时所用的资源。如果要在
Windows® 98 或 Windows Me 中使用控件,管理图形资源就更加重要,因为这些操作系统处理这种资源的能力较差。
下面是绘制圆的函数:
Private Sub DrawLight(ByVal LightToDraw As TrafficLightStatus, _ ByVal grfGraphics As Graphics) Dim nCircleX As Integer Dim nCircleY As Integer Dim nCircleDiameter As Integer Dim nCircleColor As Color ' 找到所有圆的 X 坐标和直径 nCircleX = CInt(Me.Size.Width * 0.02) nCircleDiameter = CInt(Me.Size.Width * 0.96) Select Case LightToDraw Case TrafficLightStatus.statusRed If LightToDraw = Me.Status Then nCircleColor = Color.OrangeRed Else nCircleColor = Color.Maroon End If nCircleY = CInt(Me.Size.Height * 0.01) Case TrafficLightStatus.statusYellow If LightToDraw = Me.Status Then nCircleColor = Color.Yellow Else nCircleColor = Color.Tan End If nCircleY = CInt(Me.Size.Height * 0.34) Case TrafficLightStatus.statusGreen If LightToDraw = Me.Status Then nCircleColor = Color.LimeGreen Else nCircleColor = Color.ForestGreen End If nCircleY = CInt(Me.Size.Height * 0.67) End Select Dim bshBrush As System.Drawing.Brush If LightToDraw = Me.Status Then bshBrush = New SolidBrush(nCircleColor) Else bshBrush = New SolidBrush(Color.FromArgb(60, nCircleColor)) End If ' 绘制代表红绿灯的圆 grfGraphics.FillEllipse(bshBrush, nCircleX, nCircleY, nCircleDiameter, nCircleDiameter) ' 释放笔刷 bshBrush.Dispose() End Sub |
这是整个控件中唯一的一个复杂图形。在 GDI+ 中,在要绘制椭圆的矩形中指定左上角的 X 坐标和 Y
坐标,然后指定矩形的高度和宽度即可绘制一个椭圆。我们分别将 X 坐标和 Y 坐标称为 nCircleX 和 nCircleY。因为我们要绘制一个圆,因此矩形的高度等于宽度,用变量
nCircleDiameter 来控制该值。
将 nCircleX 设置为刚好放到控件内(控件的宽度乘以 0.02)。nCircleY
取决于要绘制哪个灯,可以设置成靠近控件的顶部(红灯)、大约向下三分之一(黄灯)或大约向下三分之二(绿灯)。直径 nCircleDiameter
设置为等于控件宽度的 96%。
要绘制实心椭圆,还需完成一件事,即确定要使用的颜色。颜色取决于正在绘制哪个灯以及正在绘制的灯是否亮起。亮起的灯的颜色要比熄灭的灯的颜色亮。
创建绘图要使用的笔刷时需要使用这些颜色。如果正在绘制的灯是亮起的,即使用该颜色。如果绘制的灯是熄灭的,则要使用不同的方法实例化笔刷。下面是熄灭的灯所使用笔刷的代码行:
bshBrush = New SolidBrush(Color.FromArgb(60, nCircleColor)) |
这并不是 .NET 中较好的方法名,但 FromArgB 方法的作用是创建笔刷,并通过将笔刷与背景颜色相结合来淡化颜色。第一个参数使用的数字介于 0 至
255 之间,数字越小,背景颜色渗透越深。我们使用的值为
60,它将大大降低处于熄灭状态的灯的颜色。您可以尝试对该参数使用不同的值(或将它设置成可设置属性),以获得不同的效果。
最后,Graphics 对象的 DrawEllipse 方法绘制出该圆,函数结束。记住,该函数需要调用三次以绘制三个不同的圆。
第 5 步:使控件响应用户
要允许用户更改灯的颜色,必须检测到用户的鼠标单击操作。有经验的 Visual Basic
开发人员都知道,可以使用多种方法实现这一目的。我们使用最简单的一种方法,即检测 MouseUp 事件。下面是检测用户单击并更改 Status
属性以与之匹配的代码:
Private Sub TrafficLight_MouseUp(ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) _ Handles MyBase.MouseUp Dim nMidPointX As Integer = CInt(Me.Size.Width * 0.5) Dim nCircleRadius As Integer = nMidPointX If Distance(e.X, e.Y, nMidPointX, CInt(Me.Size.Height / 6)) _ < nCircleRadius Then Me.Status = TrafficLightStatus.statusRed Exit Sub End If If Distance(e.X, e.Y, nMidPointX, CInt(Me.Size.Height / 2)) _ < nCircleRadius Then Me.Status = TrafficLightStatus.statusYellow Exit Sub End If If Distance(e.X, e.Y, nMidPointX, CInt((5 * Me.Size.Height) / 6)) _ < nCircleRadius Then Me.Status = TrafficLightStatus.statusGreen End If End Sub Private Function Distance(ByVal X1 As Integer, _ ByVal Y1 As Integer, _ ByVal X2 As Integer, _ ByVal y2 As Integer) As Integer Return CInt(System.Math.Sqrt((X1 - X2) ^ 2 + (Y1 - y2) ^ 2)) End Function |
事件处理非常简单。检查鼠标单击的位置和每个圆心之间的距离。(请注意,圆心分别位于控件下方 1/6、1/2 和 5/6
的位置。如果不太明白,可以在纸上画出来看看。)如果计算出的距离小于圆的半径,则更改 Status 属性。
距离由 Distance 函数使用您可能在代数课中学过的公式计算。请注意,平方根函数是从 System.Math
命名空间中获得的,数学函数通常都保存在该命名空间中。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至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号