【问题标题】:Popping up form from DLL on same screen as calling form在与调用表单相同的屏幕上从 DLL 弹出表单
【发布时间】:2017-09-25 18:15:58
【问题描述】:

我有一个 DLL: (MessageBox.DLL) 这个 DLL 有一个看起来就像一个消息框的表单。

msgbox的参数和原来的messagebox类似,

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

显然,如果我每次都通过 Form,我可以做到这一点,但要尽量避免这种情况。

我希望它像原始的 Microsoft Messagebox 一样工作,您不传递父级,它自己获取它。

提前致谢

【问题讨论】:

  • Me.Parent 不太可能是您想到的那个。考虑 Form.ActiveForm,就像 MsgBox() 一样。如果它必须是“调用形式”,那么你必须添加一个额外的参数。
  • @HansPassant 谢谢,这就是我要找的 (Form.Activeform) 。请将其发布为答案,以便我接受它
  • 只需在自己的帖子中向我们展示您最终做了什么并接受它作为答案。

标签: c# vb.net forms dll


【解决方案1】:

我最终使用

调用了活动表单
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

【讨论】:

    【解决方案2】:

    如果需要调用表单,那么您必须添加另一个参数。为了进一步简化,我会将它变成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!")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 2017-05-04
      • 1970-01-01
      相关资源
      最近更新 更多