2013-04-09 9 views
5

C'è un modo per centrare un MessageBox senza sottoclassi o hooking?Mostra un MessageBox centrato nel modulo

Sto cercando il codice VB.NET.

+0

possibile duplicato di [MessageBox centrale in formato padre] (http://stackoverflow.com/questions/1732443/center-messagebox-in-parent-form) – harriyott

+0

Grazie per il consiglio e le informazioni di quel post, ora ho modificato la mia risposta per non essere un duplicato. – ElektroStudios

+0

http://stackoverflow.com/questions/2576156/winforms-how-can-i-make-messagebox-appear-centered-on-mainform –

risposta

6

La soluzione per VB.NET:

Questo codice è preso e tradotto da un asnwer di @Hans Passant: Winforms-How can I make MessageBox appear centered on MainForm?

Centered_MessageBox.vb

Imports System.Text 
Imports System.Drawing 
Imports System.Windows.Forms 
Imports System.Runtime.InteropServices 

Class Centered_MessageBox 
    Implements IDisposable 
    Private mTries As Integer = 0 
    Private mOwner As Form 

    Public Sub New(owner As Form) 
     mOwner = owner 
     owner.BeginInvoke(New MethodInvoker(AddressOf findDialog)) 
    End Sub 

    Private Sub findDialog() 
     ' Enumerate windows to find the message box 
     If mTries < 0 Then 
      Return 
     End If 
     Dim callback As New EnumThreadWndProc(AddressOf checkWindow) 
     If EnumThreadWindows(GetCurrentThreadId(), callback, IntPtr.Zero) Then 
      If System.Threading.Interlocked.Increment(mTries) < 10 Then 
       mOwner.BeginInvoke(New MethodInvoker(AddressOf findDialog)) 
      End If 
     End If 
    End Sub 
    Private Function checkWindow(hWnd As IntPtr, lp As IntPtr) As Boolean 
     ' Checks if <hWnd> is a dialog 
     Dim sb As New StringBuilder(260) 
     GetClassName(hWnd, sb, sb.Capacity) 
     If sb.ToString() <> "#32770" Then 
      Return True 
     End If 
     ' Got it 
     Dim frmRect As New Rectangle(mOwner.Location, mOwner.Size) 
     Dim dlgRect As RECT 
     GetWindowRect(hWnd, dlgRect) 
     MoveWindow(hWnd, frmRect.Left + (frmRect.Width - dlgRect.Right + dlgRect.Left) \ 2, frmRect.Top + (frmRect.Height - dlgRect.Bottom + dlgRect.Top) \ 2, dlgRect.Right - dlgRect.Left, dlgRect.Bottom - dlgRect.Top, True) 
     Return False 
    End Function 
    Public Sub Dispose() Implements IDisposable.Dispose 
     mTries = -1 
    End Sub 

    ' P/Invoke declarations 
    Private Delegate Function EnumThreadWndProc(hWnd As IntPtr, lp As IntPtr) As Boolean 
    <DllImport("user32.dll")> _ 
    Private Shared Function EnumThreadWindows(tid As Integer, callback As EnumThreadWndProc, lp As IntPtr) As Boolean 
    End Function 
    <DllImport("kernel32.dll")> _ 
    Private Shared Function GetCurrentThreadId() As Integer 
    End Function 
    <DllImport("user32.dll")> _ 
    Private Shared Function GetClassName(hWnd As IntPtr, buffer As StringBuilder, buflen As Integer) As Integer 
    End Function 
    <DllImport("user32.dll")> _ 
    Private Shared Function GetWindowRect(hWnd As IntPtr, ByRef rc As RECT) As Boolean 
    End Function 
    <DllImport("user32.dll")> _ 
    Private Shared Function MoveWindow(hWnd As IntPtr, x As Integer, y As Integer, w As Integer, h As Integer, repaint As Boolean) As Boolean 
    End Function 
    Private Structure RECT 
     Public Left As Integer 
     Public Top As Integer 
     Public Right As Integer 
     Public Bottom As Integer 
    End Structure 
End Class 

Uso:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Using New Centered_MessageBox(Me) 
     MessageBox.Show("Test Text", "Test Title", MessageBoxButtons.OK) 
    End Using 
End Sub 
+0

Convertito usando [Convertitore di codice Telerik] (http://converter.telerik.com/), scommetto. – mbomb007

1

Purtroppo non esiste un modo per centrare uno MessageBox su un genitore. Si centra sullo schermo per impostazione predefinita e non può essere modificato.