我有一个包含三个按钮的表单,每个按钮都向表单的绘图区域添加一个矩形(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中复制此代码,以便我可以以模块化方式使用它?
答案 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的代码。
或者只是在解决方案中添加一个类库子项目。
确保选择最佳方法来实现目标。您始终可以在任何项目/解决方案中添加指向类/模块源的链接,并重用已经可用的代码而无需创建DLL !代码只是在您的可执行文件中编译。
PS:顺便说一下,如果你是C ++,我会建议你继续使用C#。