在调用窗体的同一屏幕上从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一样工作,在那里你不通过父项,它自己就能得到它。

预先感谢

+2

Me.Parent不太可能是你想到的那个。考虑Form.ActiveForm,就像MsgBox()一样。如果它*必须*是“调用形式”,那么你必须添加一个额外的参数。 –

+0

@HansPassant谢谢,这就是我正在寻找(Form.Activeform)。请将其发布为答案,以便我可以接受 –

+0

只需向我们展示您最终在自己的帖子中做了什么,并接受它作为答案。 –

我结束了使用

调用活性形式
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!")