在VB.Net 2010中创建用于绘制矩形的DLL

时间:2014-11-17 04:01:16

标签: vb.net graphics modularity

关于项目

我有一个包含三个按钮的表单,每个按钮都向表单的绘图区域添加一个矩形(SplitContainer.Panel2)。如您所见,将此代码多次添加到不同的按钮变得非常繁琐和混乱。我想知道我是否可以调用函数来执行此代码。我知道如何创建函数以及如何调用它们,但我了解如何引用表单中的控件(例如面板)。

项目的屏幕截图(点击几个按钮后):

http://i61.tinypic.com/2q9kr5y.png(低代表,不得不使用网址)

我的代码从“添加移动”按钮调用:

Dim objGraphics As Graphics
    Dim rect = New Rectangle(intX, intY, 50, 50)
    Dim objFont As Font
    Dim objFont2 As Font
    Dim intFontSize As Integer = 12
    Dim intTextX As Integer = intX
    Dim intTextY As Integer = intY

    ' Create a graphics object using the memory bitmap
    objGraphics = Graphics.FromImage(m_objDrawingSurface)

    objGraphics.FillRectangle(Brushes.Plum, rect)
    objGraphics.DrawRectangle(Pens.Black, rect)

    objFont = New System.Drawing.Font("Arial", intFontSize, _
                                      FontStyle.Bold Or FontStyle.Italic)

    objFont2 = New System.Drawing.Font("Arial", intFontSize - 5, _
                                      FontStyle.Bold Or FontStyle.Italic)

    ' Draw user's text
    objGraphics.DrawString("Move", objFont, _
                           System.Drawing.Brushes.White, intTextX, intTextY)

    objGraphics.DrawString("(" & MousePosition.X & ", " & MousePosition.Y & ")", objFont2, _
                           System.Drawing.Brushes.White, intTextX, intTextY + 17)


    ' Clean up
    objGraphics.Dispose()

    ' Force the form to paint itself. This triggers the Paint Event
    SplitContainer1.Panel2.Invalidate()

    intX += 50

    If intX >= SplitContainer1.Panel2.Width Then
        intY += 50
        intX = 0
    End If

目标

我希望能够以更模块化的方式分离我的代码。我来自C ++,其中调制就是一切,没有这里,我的代码就会大大增加。任何帮助将不胜感激。

编辑:要直截了当,我如何在类库或DLL中复制此代码,以便我可以以模块化方式使用它?

1 个答案:

答案 0 :(得分:1)

一个DLL有点矫枉过正IMHO

但我想知道:如果你可以创建一个函数,你应该能够编译包含该函数的DLL ...问题是什么?

创建函数非常简单,假设您的函数可以访问控制对象,即SplitContainer.Panel2或任何其他 定义的 控件(Button,Panel)等等)你想改变这幅画。 即,您必须将该控件传递给该函数。

Public Function DrawRectangleOn(ByRef SplitContainerPanel As SplitterPanel) As Boolean
    ' ... Do the drawings.

如果你有一些布局条件,你必须通过标准来控制以及这些条件。

Public Function DrawRectangleOn( _
    ByRef SplitContainerPanel As SplitterPanel, _
    ByVal PlotX As Int32, _
    ByVal PlotY As Int32, _
    ByVal FrameColor As Color, _
    ByVal FrameBackground As Color, _
    ByVal Caption As String, _
    ByVal MousePosX As Int32, _
    ByVal MousePosY As Int32, _
    ByVal ... etc. etc. etc.) As Boolean
    ' ... Do the drawings.

如果您不需要获取操作的返回值/结果值,则不必使用Function(VB意义),而是Method:< / p>

Public Sub DrawRectangleOn( ... )

然而,有一件事,你的函数/方法应该知道要操作的对象的类型是什么。这意味着,如果你想操纵几个控件,你必须:

a)使用强制类型参数创建多个函数:

Public Function DrawRectangleOn(ByRef SplitContainerPanel As SplitterPanel, ...)
Public Overloads Function DrawRectangleOn(ByRef ControlButton As Button, ...)
Public Overloads Function DrawRectangleOn(ByRef ControlPanel As Panel, ...)

b)或通过传递类型参数来定义该函数内对象的类型:

Public Function DrawRectangleOn(ByRef PassedControl As Control, ...)
    Select Case True
        Case TypeOf(PassedControl) Is SplitterPanel:
            Dim ControlSplitterPanel As SplitterPanel = _
                DirectCast(PassedControl, SplitterPanel)
            ' ... Manipulate a SplitterPanel here.

            Return True

        Case TypeOf(PassedControl) Is Button:
            Dim ControlButton As Button = _
                DirectCast(PassedControl, Button)
            ' ... Manipulate a Button here.

            Return True

        Case Else:
            Throw New ArgumentException("Unable to handle Object of type " + PassedControl.GetType().ToString())

    End Select
End Function

如果您创建了DLL,我确定您知道每次更改该DLL的源代码时,您都必须重新编译它并重新分发它才能更新任何项目/解决方案/应用程序使用它。 DLL应该是工作的最终目标,在编写代码之前应该很好地设想,而不是在编码过程中你想到的要求。

这就是为什么我说一个DLL有点矫枉过正的XD。 DLL(应该)具有版本编号,并且应该向后兼容,否则您将在以前使用它们的应用程序中具有不可预测的行为...


我有点好奇:你想用自定义绘制的所有框架做什么?

你现在所做的一切都是在控制上。但是能够点击矩形/框架并调用特定的方法/函数是有意义的...当鼠标位于一帧之上时通知用户也是有意义的,如更改框架背景例如......

=&GT;我没有告诉你实施上述内容。你不必回答上面的问题,你想做的事情取决于你。我只是告诉您定义 在决定使用哪些工具 之前应考虑的所有功能(即你好吗?要编写代码,使用哪些组件等

您可以尝试其他方法:

  • CustomSplitContainer创建继承SplitContainer。然后通过添加公共方法和函数以及属性和事件来处理内部UI。
  • 使用UserControl从头开始创建SplitContainer然后处理内部的UI行为,或者就像上面一样,创建公共成员以便能够控制外部UI。
  • 创建控件Extensions System.Runtime.CompilerServices - 在实例化对象/控件上扩展的用户定义函数和方法 - 需要相应的dotNet框架)
  • 创建一个Public Module,其中包含您可以从项目中的任何位置调用的成员。
  • 创建一个custom Class哪个构造函数引用要处理的Control。然后,处理每次点击,鼠标悬停等,并从该类内部绘制适当的UI。
  • (...比如使用代表)

自定义类示例是我最常使用的示例:我知道我需要的所有内容都在该类中,只能执行它应该对强类型成员执行的操作。还有一些控制成员我通常不需要照顾,而对于精确和重复的任务,比如改变UI,将控件封装在类中更容易,并创建持久属性,方法,功能和事件。在实例化时,AddHandler非常有用于捕获鼠标和键盘输入,处理自定义拖放等(但是,这些自定义类应该在不再需要时被正确销毁)


无论如何,您可以根据自己的选择编写DLL的代码。

  • 通过选择&#34;类库&#34; &lt; - 这将回答您的问题来创建项目..
  • 使用相应或必需的更改复制您在该库项目中完成的代码(我上面所说的内容:您必须传递对该DLL函数的任何必需引用)
  • 构建
  • 在当前项目的Debug / Release文件夹中找到DLL
  • 将其复制到将使用DLL的最终项目
  • 以通常的方式导入参考。

或者只是在解决方案中添加一个类库子项目。

确保选择最佳方法来实现目标。您始终可以在任何项目/解决方案中添加指向类/模块源的链接,并重用已经可用的代码而无需创建DLL !代码只是在您的可执行文件中编译。

PS:顺便说一下,如果你是C ++,我会建议你继续使用C#。