vb.net控件继承编程简介

构建完整的自定义组件可能是一个非常高级的项目。但是,您可以构建一个VB.NET类,该类具有工具箱组件的许多优点,而且所需的工作量要小得多。这就是为什么!...

构建完整的自定义组件可能是一个非常高级的项目。但是,您可以构建一个VB.NET类,该类具有工具箱组件的许多优点,而且所需的工作量要小得多。这就是为什么!

laptop computer

要了解创建完整的自定义组件需要做什么,请尝试以下实验:

-&燃气轮机;在VB.NET中打开新的Windows应用程序项目。->将工具箱中的复选框添加到表单中。->单击解决方案资源管理器顶部的“显示所有文件”按钮。

这将显示VisualStudio为您的项目创建的文件(因此您不必这样做)。作为一个历史脚注,VB6编译器做了很多相同的事情,但您永远无法访问代码,因为它被隐藏在已编译的“p代码”中。您也可以在VB6中开发自定义控件,但这要困难得多,并且需要Microsoft为此提供的特殊实用程序。

在Form Designer.vb文件中,您会发现以下代码已自动添加到正确的位置,以支持复选框组件。(如果您有不同版本的Visual Studio,您的代码可能会略有不同。)这是Visual Studio为您编写的代码。

'Required by the Windows Form Designer Private components _ As System.ComponentModel.IContainer'NOTE: The following procedure is required'by the Windows Form Designer'It can be modified using the Windows Form Designer.'Do not modify it using the code editor.<System.Diagnostics.DebuggerStepThrough()> _Private Sub InitializeComponent() Me.CheckBox1 = New System.Windows.Forms.CheckBox() Me.SuspendLayout() ' 'CheckBox1 ' Me.CheckBox1.AutoSize = True Me.CheckBox1.Location = New System.Drawing.Point(29, 28) Me.CheckBox1.Name = "CheckBox1". . . and so forth ...

这是您必须添加到程序中以创建自定义控件的代码。请记住,实际CheckBox控件的所有方法和属性都位于.NET Framework提供的类中:System.Windows.Forms.CheckBox。这不是项目的一部分,因为它安装在所有.NET程序的Windows中。但是有很多。

另一点需要注意的是,如果您使用的是WPF(Windows Presentation Foundation),.NET CheckBox类来自一个名为System.Windows.Controls的完全不同的库。本文仅适用于Windows窗体应用程序,但此处的继承原则适用于任何VB.NET项目。

假设您的项目需要一个与标准控件非常相似的控件。例如,一个复选框改变了颜色,或者显示了一张小小的“笑脸”,而不是显示小小的“检查”图形。我们将构建一个这样做的类,并向您展示如何将其添加到项目中。虽然这本身可能很有用,但真正的目标是演示VB.NET的继承性。

让我们开始编码吧

要开始,请更改刚刚添加到oldCheckBox的复选框的名称。(您可能希望再次停止显示“显示所有文件”以简化解决方案资源管理器。)现在向项目添加一个新类。有几种方法可以做到这一点,包括在解决方案资源管理器中右键单击项目,然后选择“添加”,然后选择“类”,或者在项目菜单项下选择“添加类”。将新类的文件名更改为newCheckBox以保持整洁。最后,打开类的“代码”窗口并添加以下代码:

Public Class newCheckBox Inherits CheckBox Private CenterSquareColor As Color = Color.Red Protected Overrides Sub OnPaint( ByVal pEvent _ As PaintEventArgs) Dim CenterSquare _ As New Rectangle(3, 4, 10, 12) MyBase.OnPaint(pEvent) If Me.Checked Then pEvent.Graphics.FillRectangle( New SolidBrush( CenterSquareColor ), CenterSquare) End If End SubEnd Class

(在本文和网站上的其他文章中,使用了许多行连续体来保持行短,以便它们能够适应网页上的可用空间。)

关于新类代码,首先要注意的是Inherits关键字。这意味着VB.NET Framework复选框的所有属性和方法都自动成为该复选框的一部分。要了解这节省了多少工作,您必须尝试从头开始编写复选框组件之类的东西。

在上面的代码中有两件关键的事情需要注意:

第一个是代码使用覆盖替换OnPaint事件将发生的标准.NET行为。只要Windows注意到必须重建部分显示,就会触发OnPaint事件。例如,当另一个窗口显示部分显示时。Windows会自动更新显示,但会在代码中调用OnPaint事件。(最初创建表单时也会调用OnPaint事件。)因此,如果我们重写OnPaint,我们可以更改屏幕上的外观。

第二个是VisualBasic创建复选框的方式。每当父项被“选中”(即Me.Checked为True)时,我们在NewCheckBox类中提供的新代码将重新选中复选框的中心,而不是绘制复选标记。

剩下的就是所谓的GDI+代码。此代码选择与复选框中心大小完全相同的矩形,并使用GDI+方法调用将其着色。实验测定了红色矩形“矩形(3,4,10,12)”的“幻数”。我只是把它改了,直到看起来合适为止。

有一个非常重要的步骤,您需要确保不会遗漏覆盖过程:

MyBase.OnPaint(pEvent)

覆盖意味着您的代码将提供事件的所有代码。但这很少是你想要的。因此,VB提供了一种运行正常的.NET代码的方法,该代码本应为事件执行。这就是这样的说法。它将非常相同的参数pEvent传递给事件代码MyBase.OnPaint,如果没有重写该参数,该代码将被执行。

使用新控件

因为我们的新控件不在工具箱中,所以必须以带有代码的形式创建它。最好的方法是在表单加载事件过程中。

打开表单加载事件过程的代码窗口并添加以下代码:

Private Sub frmCustCtrlEx_Load( ByVal sender As System.Object, ByVal e As System.EventArgs ) Handles MyBase.Load Dim customCheckBox As New newCheckBox() With customCheckBox .Text = "Custom CheckBox" .Left = oldCheckBox.Left .Top = oldCheckBox.Top + oldCheckBox.Height .Size = New Size( oldCheckBox.Size.Width + 50, oldCheckBox.Size.Height) End With Controls.Add(customCheckBox)End Sub

为了在表单上放置新复选框,我们利用了已经有一个复选框的事实,并且只使用了该复选框的大小和位置(进行了调整,以便文本属性适合)。否则,我们将不得不手动编码位置。将MyCheckBox添加到表单后,我们将其添加到控件集合。

但是这个代码不是很灵活。例如,红色是硬编码的,更改颜色需要更改程序。您可能还需要图形而不是复选标记。

这是一个新的、改进的CheckBox类。这段代码向您展示了如何在VB.NET面向对象编程中采取一些后续步骤。

Public Class betterCheckBox Inherits CheckBox Private CenterSquareColor As Color = Color.Blue Private CenterSquareImage As Bitmap Private CenterSquare As New Rectangle( 3, 4, 10, 12) Protected Overrides Sub OnPaint _ (ByVal pEvent As _ System.Windows.Forms.PaintEventArgs) MyBase.OnPaint(pEvent) If Me.Checked Then If CenterSquareImage Is Nothing Then pEvent.Graphics.FillRectangle( New SolidBrush( CenterSquareColor), CenterSquare) Else pEvent.Graphics.DrawImage( CenterSquareImage, CenterSquare) End If End If End Sub Public Property FillColor() As Color Get FillColor = CenterSquareColor End Get Set(ByVal Value As Color) CenterSquareColor = Value End Set End Property Public Property FillImage() As Bitmap Get FillImage = CenterSquareImage End Get Set(ByVal Value As Bitmap) CenterSquareImage = Value End Set End PropertyEnd Class

为什么更好的checkbox版本更好

主要改进之一是添加了两个属性。这是老班根本没有做的事。

介绍了这两个新性质

FillColor

FillImage

要了解VB.NET中的工作原理,请尝试这个简单的实验。将类添加到标准项目,然后输入代码:

Public Property Whatever Get

键入“Get”后按Enter键时,VB.NET Intellisense将填充整个属性代码块,您所要做的就是为项目编写详细代码。(从VB.NET 2010开始,Get和Set块并不总是必需的,因此您必须至少告诉Intellisense这么多才能启动它。)

Public Property Whatever Get End Get Set(ByVal value) End SetEnd Property

以上代码中已完成这些块。这些代码块的目的是允许从系统的其他部分访问属性值。

通过添加方法,您将能够很好地创建一个完整的组件。要查看非常简单的方法示例,请在betterCheckBox类的属性声明下面添加以下代码:

Public Sub Emphasize() Me.Font = New System.Drawing.Font( _ "Microsoft Sans Serif", 12.0!, _ System.Drawing.FontStyle.Bold) Me.Size = New System.Drawing.Size(200, 35) CenterSquare.Offset( CenterSquare.Left - 3, CenterSquare.Top + 3)End Sub

除了调整复选框中显示的字体外,此方法还调整复选框的大小和选中矩形的位置,以适应新的大小。要使用新方法,只需按照与任何方法相同的方式编码即可:

MyBetterEmphasizedBox.Emphasize()

就像属性一样,VisualStudio自动将新方法添加到Microsoft的Intellisense中!

这里的主要目标是简单地演示方法是如何编码的。您可能知道,标准复选框控件也允许更改字体,因此此方法实际上没有添加太多功能。

本系列的下一篇文章,编程自定义VB.NET控件-超越基础!,显示执行此操作的方法,并说明如何在自定义控件中重写方法。

  • 发表于 2021-09-11 23:52
  • 阅读 ( 182 )
  • 分类:编程

你可能感兴趣的文章

哦(oop)和流行音乐(pop)的区别

...息传递。 OOP编程有四个主要特性:抽象、封装、多态和继承。抽象的目的是只向用户显示相关信息,从而降低问题的复杂性。封装是在对象中对信息进行本地化。一个类获取另一个类的属性和功能的过程称为继承。多态性是一...

  • 发布于 2020-10-28 20:06
  • 阅读 ( 271 )

超载(overloading)和覆盖(overriding)的区别

...创建了超类方法和子类方法之间的关系。重载允许从超类继承。在重写中,子类方法代替超类。重载必须有不同的方法签名,而重写必须分配相同的签名。 &#13;

  • 发布于 2021-06-23 10:08
  • 阅读 ( 180 )

.net(.net)和asp.net(asp.net)的区别

...它是微软服务器端技术发展的下一个阶段,也是经典ASP的继承者。它与.NET框架完全集成,简化了开发、调试和部署web应用程序的任务。ASP.NET应用程序具有对所有.NET类和功能的完全无限制访问。这些应用程序基本上是基于组件的...

  • 发布于 2021-06-25 20:25
  • 阅读 ( 344 )

功能(function)和vb程序(procedure in vb)的区别

...End function语句括起来的过程。函数执行某个任务,然后将控件返回给调用代码。当它传递控件时,它还将值返回给调用代码。 程序员可以在模块、类或结构中创建函数。默认情况下,函数是公共的。因此,可以从应用程序中可...

  • 发布于 2021-07-01 18:59
  • 阅读 ( 279 )

asp公司(asp)和aspx公司(aspx)的区别

...。它们包含静态(X)HTML标记。它还包含定义服务器端Web控件和用户控件的标记。这是开发人员放置网页的所有rc内容的地方。 在ASP.netframework2.0中,引入了一种新的代码隐藏模型。这允许静态文本保留在.aspx页上,而动态代码保...

  • 发布于 2021-07-13 06:14
  • 阅读 ( 156 )

asp公司(asp)和c级#(c#)的区别

...。它们包含静态(X)HTML标记。它还包含定义服务器端Web控件和用户控件的标记。这是开发人员放置网页的所有rc内容的地方。 在ASP.netframework2.0中,引入了一种新的代码隐藏模型。这允许静态文本保留在.aspx页上,而动态代码保...

  • 发布于 2021-07-13 06:14
  • 阅读 ( 162 )

asp公司(asp)和asp.net(asp.net)的区别

...。它们包含静态(X)HTML标记。它还包含定义服务器端Web控件和用户控件的标记。这是开发人员放置网页的所有rc内容的地方。 在ASP.netframework2.0中,引入了一种新的代码隐藏模型。这允许静态文本保留在.aspx页上,而动态代码保...

  • 发布于 2021-07-13 06:18
  • 阅读 ( 165 )

vb语言(vb)和运动模拟(vb.net)的区别

...,因此VB.NET中的所有内容都被视为一个对象,所有对象都继承自基类对象。Microsoft Visual Basic.NET附带Visual Studio.NET。该语言的一个重要特性是允许垃圾收集,垃圾收集由公共语言运行库进行监督。它有助于提供更好的内存管理。...

  • 发布于 2021-07-13 21:15
  • 阅读 ( 253 )

vb.net中的强制转换和数据类型转换

...为整数类型,但可以使用DirectCast将表单类型强制转换为控件类型。 让我们检查一下微软的DirectCast示例的性能。使用上面显示的相同代码模板,替换为。。。 c = DirectCast(f, System.Windows.Forms.Control) ... 与CType和TryCast的类似替...

  • 发布于 2021-09-07 01:21
  • 阅读 ( 224 )

visual basic术语表

...须是可重用的,并且必须符合为互操作性设置的标准。 控件在Visual Basic中,用于在Visual Basic窗体上创建对象的工具。控件从工具箱中选择,然后使用鼠标指针在窗体上绘制对象。关键是要认识到控件只是用来创建GUI对象的工具...

  • 发布于 2021-09-10 22:25
  • 阅读 ( 238 )
陆子君
陆子君

0 篇文章

相关推荐