在调用窗体的同一屏幕上从DLL弹出窗体
问题描述:
我有一个DLL:(MessageBox.DLL) 此DLL有一个看起来就像一个消息框的形式。在调用窗体的同一屏幕上从DLL弹出窗体
的MSGBOX也有类似的参数作为原始消息框,
myMsgBox("TEXT HERE")
但问题是,如果有多个屏幕,它有时会错误的屏幕
我想上弹出获取呼叫形式作为参考,不通过参数像这样
Sub myMsgBox(ByVal MsgText As String)
formMsgbox.mainText = MsgText
formMsgbox.Show()
End Sub
我想要什么做的是参考原来的形式,像这样
Sub myMsgBox(ByVal MsgText As String)
formMsgbox.mainText = MsgText
formMsgbox.size = new size (me.parent.size.x/2, me.parent.size.y/2)
Dim Current_Screen As Screen = Screen.FromControl(me.parent)
If Current_Screen.Primary = False Then
Dim HCenter = Current_Screen.Bounds.Left + _
(((Current_Screen.Bounds.Right - Current_Screen.Bounds.Left)/2) - ((formMsgbox.Width)/2))
Dim VCenter = (Current_Screen.Bounds.Bottom/2) - ((formMsgbox.Height)/2)
formMsgbox.StartPosition = FormStartPosition.Manual
formMsgbox.Location = New Point(HCenter, VCenter)
Else
formMsgbox.StartPosition = FormStartPosition.CenterScreen
End If
formMsgbox.Show()
End Sub
很显然,我能做到这一点,如果我每次都通过形式,而是试图避免这种情况。
我希望它能像原来的Microsoft Messagebox一样工作,在那里你不通过父项,它自己就能得到它。
预先感谢
答
我结束了使用
调用活性形式Form.ActiveForm
所以这现在按预期工作:
Sub myMsgBox(ByVal MsgText As String)
Dim f as Form.ActiveForm
formMsgbox.mainText = MsgText
formMsgbox.size = new size (f.size.x/2, f.size.y/2)
Dim Current_Screen As Screen = Screen.FromControl(f)
If Current_Screen.Primary = False Then
Dim HCenter = Current_Screen.Bounds.Left + _
(((Current_Screen.Bounds.Right - Current_Screen.Bounds.Left)/2) - ((formMsgbox.Width)/2))
Dim VCenter = (Current_Screen.Bounds.Bottom/2) - ((formMsgbox.Height)/2)
formMsgbox.StartPosition = FormStartPosition.Manual
formMsgbox.Location = New Point(HCenter, VCenter)
Else
formMsgbox.StartPosition = FormStartPosition.CenterScreen
End If
formMsgbox.Show()
End Sub
答
如果得到调用形式是一个要求,则必须添加其他参数。为了简化它远一点我把它变成一个extension method:
Imports System.Runtime.CompilerServices
Public Module Extensions
<Extension()> _
Public Sub myMsgBox(ByVal TargetForm As Form, ByVal MsgText As String)
formMsgbox.mainText = MsgText
formMsgbox.Size = New Size(TargetForm.Width/2, TargetForm.Height/2)
Dim Current_Screen As Screen = Screen.FromControl(TargetForm)
...the rest of your code...
End Sub
End Module
然后你可以使用它像这样:
Me.myMsgBox("Hello World!")
Me.Parent不太可能是你想到的那个。考虑Form.ActiveForm,就像MsgBox()一样。如果它*必须*是“调用形式”,那么你必须添加一个额外的参数。 –
@HansPassant谢谢,这就是我正在寻找(Form.Activeform)。请将其发布为答案,以便我可以接受 –
只需向我们展示您最终在自己的帖子中做了什么,并接受它作为答案。 –