【问题标题】:Create And Implement a Custom Form in VB.NET在 VB.NET 中创建和实现自定义表单
【发布时间】:2014-06-25 17:18:57
【问题描述】:

我正在尝试在 VB.NET 中创建自定义表单类 (CustomBorderlessForm)。

我的进步

  1. 我创建了一个新类并将其命名为 CustomBorderlessForm.vb
  2. 然后我开始编写以下代码:

CustomBorderlessForm.vb

    Public Class CustomBorderlessForm

        Inherits Form
        Dim _form As Form = Nothing

        Public Sub New(form As Form)
            _form = form
            MsgBox("Testing: New()")
        End Sub

        Protected Overrides Sub OnMouseMove(e As MouseEventArgs)
            MyBase.OnMouseMove(e)
            MsgBox("Testing OnMouseMove()")
        End Sub

    End Class

Form1.vb

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim form As New CustomBorderlessForm(Me)
    End Sub

End Class

进展结果

  • 加载时会显示一个消息框“Testing: New()”
  • 鼠标移动时不显示任何内容

如你所见,我的问题在于事件

问题

  1. 是否可以创建一个表单对象并使用它来代替预填充表单?
    • 如果是这样,我是否可以像任何其他自定义对象/类一样为该表单提供自定义属性,例如边框和一些布尔值(阴影...等)?
  2. 我目前的方法做错了什么?
    • 为什么 OnMouseMove 没有被覆盖?
    • 我是不是初始化类错了?
    • 这样也能做到吗?

【问题讨论】:

  • 如果您最终添加自定义属性或事件,您将不得不做一些不同的事情。在这种情况下,您需要将基类添加到 ClassLib,以便 IDE 可以从已编译版本运行。到目前为止,它看起来主要是装饰性的。

标签: vb.net forms class custom-controls


【解决方案1】:

创建表单后,您还需要显示它。将您的逻辑更改为:

Dim form As New CustomBorderlessForm(Me)
form.Show()

在您这样做之前,我建议您将MsgBox 更改为Console.WriteLine(),否则您可能会遇到有趣/令人沮丧的小猫捉老鼠游戏。

编辑

基于 cmets,如果您从 VS 执行了“添加新的 Windows 窗体”,则只需右键单击项目,选择属性,然后在应用程序选项卡上将启动对象更改为新窗体。 VS 只允许您使用它为您创建的表单来执行此操作(默认情况下,稍后会详细介绍)。

如果您手动编写该文件(这绝对没问题),您可以像我上面那样执行Show() 并调用Me.Hide() 来隐藏“父”表单。不幸的是,Load 事件在Show 事件之前被触发,所以如果你把它放在Form1_Load() 中它不会起作用。相反,您可以像这样使用Shown 事件:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim form As New CustomBorderlessForm(Me)
    form.Show()
End Sub

Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    Me.Hide()
End Sub

另一个选项与“应用程序框架”有关。您可以read about it here 但它基本上处理其他语言必须手动实现的应用程序事件。如果您进入您的项目属性,您可以取消选中“启用应用程序框架”复选框。这将在“启动对象”下拉列表中为您提供更多选项。如果您将以下代码添加到您的项目中,则 Startup object 下拉菜单中的一项现在应该是“Loader”

Public Module Loader
    <STAThread()>
    Public Sub Main()
        Dim form As New CustomBorderlessForm(Nothing)
        form.ShowDialog()
    End Sub
End Module

你会注意到上面的代码完全绕过了Form1。另外,我使用的是ShowDialog(),而不是Show(),否则表单会显示然后程序结束。

【讨论】:

  • 啊……我明白了。所以我必须在这段代码之后关闭初始表单?如果是这样,我将无法在设计器模式下添加对象...
  • 您可以显示任意数量的表单。只是New 本身不会使表单可见。
  • 它创建了一种“子表单”,它与父表单一起关闭。我不想展示 2 个表单:(
  • 我想我明白你想要做什么。你在用VS吗?如果是这样,您是让 VS 为您创建表单还是尝试手动完成?
  • 我正在尝试创建一个自定义表单,这样我就可以像使用设计器中的默认表单一样使用它并处理它的事件。是的,我正在使用 VS,如果您问我在创建项目时是否选择了“Windows 窗体应用程序”,是的,我选择了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 2017-06-17
相关资源
最近更新 更多